2008-11-04 00:08:39 +01:00
|
|
|
/*
|
|
|
|
* Copyright 2006-2007 Aaron Seigo <aseigo@kde.org>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Library General Public License as
|
|
|
|
* published by the Free Software Foundation; either version 2, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this program; if not, write to the
|
|
|
|
* Free Software Foundation, Inc.,
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef PLASMA_THEME_H
|
|
|
|
#define PLASMA_THEME_H
|
|
|
|
|
|
|
|
#include <QtCore/QObject>
|
|
|
|
#include <QtGui/QFont>
|
|
|
|
#include <QtGui/QFontMetrics>
|
|
|
|
|
2009-05-18 14:28:19 +02:00
|
|
|
#include <kplugininfo.h>
|
2008-11-04 03:04:34 +01:00
|
|
|
#include <ksharedconfig.h>
|
2008-11-04 00:08:39 +01:00
|
|
|
|
|
|
|
#include <plasma/plasma_export.h>
|
|
|
|
#include <plasma/packagestructure.h>
|
|
|
|
|
|
|
|
namespace Plasma
|
|
|
|
{
|
2009-05-01 18:28:10 +02:00
|
|
|
|
2008-11-04 00:08:39 +01:00
|
|
|
class ThemePrivate;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @class Theme plasma/theme.h <Plasma/Theme>
|
|
|
|
*
|
|
|
|
* @short Interface to the Plasma theme
|
|
|
|
*
|
|
|
|
* Accessed via Plasma::Theme::defaultTheme() e.g:
|
|
|
|
* \code
|
|
|
|
* QString imagePath = Plasma::Theme::defaultTheme()->imagePath("widgets/clock")
|
|
|
|
* \endcode
|
|
|
|
*
|
|
|
|
* Plasma::Theme provides access to a common and standardized set of graphic
|
|
|
|
* elements stored in SVG format. This allows artists to create single packages
|
|
|
|
* of SVGs that will affect the look and feel of all workspace components.
|
|
|
|
*
|
|
|
|
* Plasma::Svg uses Plasma::Theme internally to locate and load the appropriate
|
|
|
|
* SVG data. Alternatively, Plasma::Theme can be used directly to retrieve
|
|
|
|
* file system paths to SVGs by name.
|
|
|
|
*/
|
|
|
|
class PLASMA_EXPORT Theme : public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
Q_PROPERTY(QString themeName READ themeName)
|
|
|
|
|
|
|
|
public:
|
|
|
|
enum ColorRole {
|
|
|
|
TextColor = 0, /**< the text color to be used by items resting on the background */
|
|
|
|
HighlightColor = 1, /**< the text higlight color to be used by items resting
|
|
|
|
on the background */
|
|
|
|
BackgroundColor = 2, /**< the default background color */
|
|
|
|
ButtonTextColor = 4, /** text color for buttons */
|
2009-07-08 21:25:20 +02:00
|
|
|
ButtonBackgroundColor = 8, /** background color for buttons*/
|
|
|
|
LinkColor = 16, /** color for clickable links */
|
2010-10-01 18:04:34 +02:00
|
|
|
VisitedLinkColor = 32, /** color visited clickable links */
|
|
|
|
ButtonHoverColor = 64, /** color for hover effect on buttons */
|
|
|
|
ButtonFocusColor = 128, /** color for focus effect on buttons */
|
|
|
|
ViewTextColor = 256, /** text color for views */
|
|
|
|
ViewBackgroundColor = 512 /** background color for views */
|
2008-11-04 00:08:39 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
enum FontRole {
|
|
|
|
DefaultFont = 0, /**< The standard text font */
|
|
|
|
DesktopFont /**< The standard text font */
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Singleton pattern accessor
|
|
|
|
**/
|
|
|
|
static Theme *defaultTheme();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Default constructor. Usually you want to use the singleton instead.
|
2009-05-18 14:28:19 +02:00
|
|
|
* @see defaultTheme
|
|
|
|
* @arg parent the parent object
|
2008-11-04 00:08:39 +01:00
|
|
|
*/
|
|
|
|
explicit Theme(QObject *parent = 0);
|
2009-05-18 14:28:19 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Construct a theme. Usually you want to use the singleton instead.
|
|
|
|
* @see defaultTheme
|
|
|
|
* @arg themeName the name of the theme to create
|
|
|
|
* @arg parent the parent object
|
|
|
|
* @since 4.3
|
|
|
|
*/
|
|
|
|
explicit Theme(const QString &themeName, QObject *parent = 0);
|
|
|
|
|
2008-11-04 00:08:39 +01:00
|
|
|
~Theme();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return a package structure representing a Theme
|
|
|
|
*/
|
|
|
|
static PackageStructure::Ptr packageStructure();
|
|
|
|
|
2009-05-18 14:28:19 +02:00
|
|
|
/**
|
|
|
|
* @return a list of all known themes
|
|
|
|
* @since 4.3
|
|
|
|
*/
|
|
|
|
static KPluginInfo::List listThemeInfo();
|
|
|
|
|
2008-11-04 00:08:39 +01:00
|
|
|
/**
|
|
|
|
* Sets the current theme being used.
|
|
|
|
*/
|
|
|
|
void setThemeName(const QString &themeName);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return the name of the theme.
|
|
|
|
*/
|
|
|
|
QString themeName() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve the path for an SVG image in the current theme.
|
|
|
|
*
|
|
|
|
* @arg name the name of the file in the theme directory (without the
|
|
|
|
* ".svg" part or a leading slash)
|
|
|
|
* @return the full path to the requested file for the current theme
|
|
|
|
*/
|
|
|
|
Q_INVOKABLE QString imagePath(const QString &name) const;
|
|
|
|
|
2010-04-28 19:40:29 +02:00
|
|
|
/**
|
|
|
|
* Retrieves the path for the script file that contains a given
|
|
|
|
* Javascript animation.
|
|
|
|
* @arg the name of the animation
|
|
|
|
* @return the full path to the script file, or an emptry string on failure
|
|
|
|
* @since 4.5
|
|
|
|
*/
|
|
|
|
Q_INVOKABLE QString animationPath(const QString &name) const;
|
|
|
|
|
2008-11-04 00:08:39 +01:00
|
|
|
/**
|
2009-12-10 10:16:30 +01:00
|
|
|
* Retrieves the default wallpaper associated with this theme.
|
2008-11-04 00:08:39 +01:00
|
|
|
*
|
|
|
|
* @arg size the target height and width of the wallpaper; if an invalid size
|
|
|
|
* is passed in, then a default size will be provided instead.
|
|
|
|
* @return the full path to the wallpaper image
|
|
|
|
*/
|
|
|
|
Q_INVOKABLE QString wallpaperPath(const QSize &size = QSize()) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks if this theme has an image named in a certain way
|
|
|
|
*
|
|
|
|
* @arg name the name of the file in the theme directory (without the
|
|
|
|
* ".svg" part or a leading slash)
|
|
|
|
* @return true if the image exists for this theme
|
|
|
|
*/
|
|
|
|
Q_INVOKABLE bool currentThemeHasImage(const QString &name) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the color scheme configurationthat goes along this theme.
|
|
|
|
* This can be used with KStatefulBrush and KColorScheme to determine
|
|
|
|
* the proper colours to use along with the visual elements in this theme.
|
|
|
|
*/
|
|
|
|
Q_INVOKABLE KSharedConfigPtr colorScheme() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the text color to be used by items resting on the background
|
|
|
|
*
|
|
|
|
* @arg role which role (usage pattern) to get the color for
|
|
|
|
*/
|
|
|
|
Q_INVOKABLE QColor color(ColorRole role) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the default font to be used with themed items. Defaults to
|
|
|
|
* the application wide default font.
|
|
|
|
*
|
|
|
|
* @arg font the new font
|
|
|
|
* @arg role which role (usage pattern) to set the font for
|
|
|
|
*/
|
|
|
|
Q_INVOKABLE void setFont(const QFont &font, FontRole role = DefaultFont);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the font to be used by themed items
|
|
|
|
*
|
|
|
|
* @arg role which role (usage pattern) to get the font for
|
|
|
|
*/
|
|
|
|
Q_INVOKABLE QFont font(FontRole role) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the font metrics for the font to be used by themed items
|
|
|
|
*/
|
|
|
|
Q_INVOKABLE QFontMetrics fontMetrics() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns if the window manager effects (e.g. translucency, compositing) is active or not
|
|
|
|
*/
|
|
|
|
Q_INVOKABLE bool windowTranslucencyEnabled() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Tells the theme whether to follow the global settings or use application
|
|
|
|
* specific settings
|
|
|
|
*
|
|
|
|
* @arg useGlobal pass in true to follow the global settings
|
|
|
|
*/
|
|
|
|
void setUseGlobalSettings(bool useGlobal);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return true if the global settings are followed, false if application
|
|
|
|
* specific settings are used.
|
|
|
|
*/
|
|
|
|
bool useGlobalSettings() const;
|
|
|
|
|
2009-02-24 23:42:06 +01:00
|
|
|
/**
|
|
|
|
* @return true if the native widget styles should be used instead of themed
|
|
|
|
* widgets. Defaults is false.
|
|
|
|
*/
|
|
|
|
bool useNativeWidgetStyle() const;
|
|
|
|
|
2010-05-11 10:23:41 +02:00
|
|
|
/**
|
|
|
|
* Provides a Plasma::Theme-themed stylesheet for hybrid (web / native Plasma) widgets.
|
|
|
|
*
|
|
|
|
* You can use this method to retrieve a basic default stylesheet, or to theme your
|
|
|
|
* custom stylesheet you use for example in Plasma::WebView. The QString you can pass
|
|
|
|
* into this method does not have to be a valid stylesheet, in fact you can use this
|
|
|
|
* method to replace color placeholders with the theme's color in any QString.
|
|
|
|
*
|
|
|
|
* In order to use this method with a custom stylesheet, just put for example %textcolor
|
|
|
|
* in your QString and it will be replaced with the theme's text (or foreground) color.
|
|
|
|
*
|
|
|
|
* Just like in many other methods for retrieving theme information, do not forget to
|
|
|
|
* update your stylesheet upon the themeChanged() signal.
|
|
|
|
*
|
|
|
|
* The following tags will be replaced by corresponding colors from Plasma::Theme:
|
|
|
|
*
|
|
|
|
* %textcolor
|
|
|
|
* %backgroundcolor
|
|
|
|
* %buttonbackgroundcolor
|
|
|
|
*
|
|
|
|
* %link
|
|
|
|
* %activatedlink
|
|
|
|
* %hoveredlink
|
|
|
|
* %visitedlink
|
|
|
|
*
|
|
|
|
* %fontfamily
|
|
|
|
* %fontsize
|
|
|
|
* %smallfontsize
|
|
|
|
*
|
|
|
|
* @param css a stylesheet to theme, leave empty for a default stylesheet containing
|
|
|
|
* theming for some commonly used elements, body text and links, for example.
|
|
|
|
*
|
|
|
|
* @return a piece of CSS that sets the most commonly used style elements to a theme
|
|
|
|
* matching Plasma::Theme.
|
|
|
|
*
|
|
|
|
* @since 4.5
|
|
|
|
*/
|
|
|
|
Q_INVOKABLE QString styleSheet(const QString &css = QString()) const;
|
|
|
|
|
|
|
|
|
2008-11-04 00:08:39 +01:00
|
|
|
/**
|
|
|
|
* Tries to load pixmap with the specified key from cache.
|
2009-04-10 21:27:42 +02:00
|
|
|
*
|
|
|
|
* @param key the name to use in the cache for this image
|
|
|
|
* @param pix the pixmap object to populate with the resulting data if found
|
|
|
|
*
|
2008-11-04 00:08:39 +01:00
|
|
|
* @return true when pixmap was found and loaded from cache, false otherwise
|
|
|
|
**/
|
|
|
|
bool findInCache(const QString &key, QPixmap &pix);
|
|
|
|
|
2009-03-17 22:08:48 +01:00
|
|
|
/**
|
|
|
|
* This is an overloaded member provided to check with file timestamp
|
|
|
|
* where cache is still valid.
|
2009-04-10 21:27:42 +02:00
|
|
|
*
|
|
|
|
* @param key the name to use in the cache for this image
|
|
|
|
* @param pix the pixmap object to populate with the resulting data if found
|
|
|
|
* @param lastModified if non-zero, the time stamp is also checked on the file,
|
|
|
|
* and must be newer than the timestamp to be loaded
|
|
|
|
*
|
2009-03-17 22:08:48 +01:00
|
|
|
* @return true when pixmap was found and loaded from cache, false otherwise
|
|
|
|
* @since 4.3
|
|
|
|
**/
|
|
|
|
bool findInCache(const QString &key, QPixmap &pix, unsigned int lastModified);
|
|
|
|
|
2008-11-04 00:08:39 +01:00
|
|
|
/**
|
|
|
|
* Insert specified pixmap into the cache.
|
|
|
|
* If the cache already contains pixmap with the specified key then it is
|
2009-04-10 21:27:42 +02:00
|
|
|
* overwritten.
|
|
|
|
*
|
|
|
|
* @param key the name to use in the cache for this pixmap
|
|
|
|
* @param pix the pixmap data to store in the cache
|
2008-11-04 00:08:39 +01:00
|
|
|
**/
|
|
|
|
void insertIntoCache(const QString& key, const QPixmap& pix);
|
|
|
|
|
2009-07-20 22:30:07 +02:00
|
|
|
/**
|
|
|
|
* Insert specified pixmap into the cache.
|
|
|
|
* If the cache already contains pixmap with the specified key then it is
|
|
|
|
* overwritten.
|
|
|
|
* The actual insert is delayed for optimization reasons and the id
|
|
|
|
* parameter is used to discard repeated inserts in the delay time, useful
|
|
|
|
* when for instance the graphics to inser comes from a quickly resizing
|
|
|
|
* object: the frames between the start and destination sizes aren't
|
|
|
|
* useful in the cache and just cause overhead.
|
|
|
|
*
|
|
|
|
* @param key the name to use in the cache for this pixmap
|
|
|
|
* @param pix the pixmap data to store in the cache
|
2010-02-15 23:34:34 +01:00
|
|
|
* @param id a name that identifies the caller class of this function in an unique fashion.
|
|
|
|
* This is needed to limit disk writes of the cache.
|
|
|
|
* If an image with the same id changes quickly,
|
|
|
|
* only the last size where insertIntoCache was called is actually stored on disk
|
2009-07-20 22:30:07 +02:00
|
|
|
* @since 4.3
|
|
|
|
**/
|
|
|
|
void insertIntoCache(const QString& key, const QPixmap& pix, const QString& id);
|
|
|
|
|
2008-11-04 00:08:39 +01:00
|
|
|
/**
|
|
|
|
* Sets the maximum size of the cache (in kilobytes). If cache gets bigger
|
|
|
|
* the limit then some entries are removed
|
|
|
|
* Setting cache limit to 0 disables automatic cache size limiting.
|
|
|
|
*
|
|
|
|
* Note that the cleanup might not be done immediately, so the cache might
|
|
|
|
* temporarily (for a few seconds) grow bigger than the limit.
|
|
|
|
**/
|
|
|
|
void setCacheLimit(int kbytes);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Tries to load the rect of a sub element from a disk cache
|
|
|
|
*
|
|
|
|
* @arg image path of the image we want to check
|
|
|
|
* @arg element sub element we want to retrieve
|
|
|
|
* @arg rect output parameter of the element rect found in cache
|
|
|
|
* if not found or if we are sure it doesn't exist it will be QRect()
|
|
|
|
* @return true if the element was found in cache or if we are sure the element doesn't exist
|
|
|
|
**/
|
|
|
|
bool findInRectsCache(const QString &image, const QString &element, QRectF &rect) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Inserts a rectangle of a sub element of an image into a disk cache
|
|
|
|
*
|
|
|
|
* @arg image path of the image we want to insert information
|
|
|
|
* @arg element sub element we want insert the rect
|
|
|
|
* @arg rect element rectangle
|
|
|
|
**/
|
|
|
|
void insertIntoRectsCache(const QString& image, const QString &element, const QRectF &rect);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Discards all the information about a given image from the rectangle disk cache
|
2008-12-11 03:45:45 +01:00
|
|
|
*
|
|
|
|
* @arg image the path to the image the cache is assoiated with
|
2008-11-04 00:08:39 +01:00
|
|
|
**/
|
2008-12-11 03:45:45 +01:00
|
|
|
void invalidateRectsCache(const QString &image);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Frees up memory used by cached information for a given image without removing
|
|
|
|
* the permenant record of it on disk.
|
|
|
|
* @see invalidateRectsCache
|
|
|
|
*
|
|
|
|
* @arg image the path to the image the cache is assoiated with
|
|
|
|
*/
|
|
|
|
void releaseRectsCache(const QString &image);
|
2008-11-04 00:08:39 +01:00
|
|
|
|
|
|
|
Q_SIGNALS:
|
|
|
|
/**
|
|
|
|
* Emitted when the user changes the theme. SVGs should be reloaded at
|
|
|
|
* that point
|
|
|
|
*/
|
|
|
|
void themeChanged();
|
|
|
|
|
|
|
|
public Q_SLOTS:
|
|
|
|
/**
|
|
|
|
* Notifies the Theme object that the theme settings have changed
|
|
|
|
* and should be read from the config file
|
|
|
|
**/
|
|
|
|
void settingsChanged();
|
|
|
|
|
|
|
|
private:
|
|
|
|
friend class ThemeSingleton;
|
|
|
|
friend class ThemePrivate;
|
|
|
|
ThemePrivate *const d;
|
|
|
|
|
|
|
|
Q_PRIVATE_SLOT(d, void compositingChanged())
|
2008-12-19 02:48:42 +01:00
|
|
|
Q_PRIVATE_SLOT(d, void colorsChanged())
|
2009-01-26 07:22:44 +01:00
|
|
|
Q_PRIVATE_SLOT(d, void settingsFileChanged(const QString &))
|
2009-05-30 05:08:33 +02:00
|
|
|
Q_PRIVATE_SLOT(d, void scheduledCacheUpdate())
|
2010-03-04 23:28:39 +01:00
|
|
|
Q_PRIVATE_SLOT(d, void onAppExitCleanup())
|
2008-11-04 00:08:39 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
} // Plasma namespace
|
|
|
|
|
|
|
|
#endif // multiple inclusion guard
|
|
|
|
|