prototype of more flexyble svg stylesheets
experiment in dynamic repacement of Text and Background colors, in order to be able to generate icons of different colors based on where they are (for instance if the normal background is dark and the button background is light at the moment supported an option to invert colors, one to use the "highlight" color (if we want colored icons on mouse over)
This commit is contained in:
parent
e558e44658
commit
cac2704d50
@ -163,6 +163,13 @@ void IconItem::setActive(bool active)
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_svgIcon) {
|
||||
if (active) {
|
||||
m_svgIcon->setStyleHints(Plasma::Svg::Inverted|Plasma::Svg::Highlighted);
|
||||
} else {
|
||||
m_svgIcon->setStyleHints(Plasma::Svg::Normal);
|
||||
}
|
||||
}
|
||||
m_active = active;
|
||||
m_loadPixmapTimer.start();
|
||||
emit activeChanged();
|
||||
|
@ -106,6 +106,7 @@ public:
|
||||
QSizeF size;
|
||||
QSizeF naturalSize;
|
||||
QChar styleCrc;
|
||||
Svg::StyleHints styleHints;
|
||||
unsigned int lastModified;
|
||||
qreal devicePixelRatio;
|
||||
bool multipleImages : 1;
|
||||
|
@ -427,14 +427,29 @@ const QString ThemePrivate::processStyleSheet(const QString &css)
|
||||
return stylesheet;
|
||||
}
|
||||
|
||||
const QString ThemePrivate::svgStyleSheet()
|
||||
{
|
||||
QString stylesheet = cachedStyleSheets.value(SVGSTYLE);
|
||||
const QString ThemePrivate::svgStyleSheet(Plasma::Svg::StyleHints hints)
|
||||
{qWarning()<<"BBBBB"<<hints<<(SVGSTYLE+(int)hints);
|
||||
QString stylesheet = cachedStyleSheets.value(SVGSTYLE+(int)hints);
|
||||
if (stylesheet.isEmpty()) {
|
||||
QString skel = QStringLiteral(".ColorScheme-%1{color:%2;}");
|
||||
|
||||
stylesheet += skel.arg(QStringLiteral("Text"), QStringLiteral("%textcolor"));
|
||||
stylesheet += skel.arg(QStringLiteral("Background"), QStringLiteral("%backgroundcolor"));
|
||||
if ((hints & Svg::Highlighted) && (hints & Svg::Inverted)) {
|
||||
stylesheet += skel.arg(QStringLiteral("Text"), QStringLiteral("%highlightcolor"));
|
||||
} else if ((hints & Svg::Inverted) || (hints & Svg::Highlighted)) {
|
||||
stylesheet += skel.arg(QStringLiteral("Text"), QStringLiteral("%backgroundcolor"));
|
||||
//Normal
|
||||
} else {
|
||||
stylesheet += skel.arg(QStringLiteral("Text"), QStringLiteral("%textcolor"));
|
||||
}
|
||||
|
||||
if ((hints & Svg::Highlighted) && !(hints & Svg::Inverted)) {
|
||||
stylesheet += skel.arg(QStringLiteral("Background"), QStringLiteral("%highlightcolor"));
|
||||
} else if (hints & Svg::Inverted) {
|
||||
stylesheet += skel.arg(QStringLiteral("Background"), QStringLiteral("%textcolor"));
|
||||
//Normal
|
||||
} else {
|
||||
stylesheet += skel.arg(QStringLiteral("Background"), QStringLiteral("%backgroundcolor"));
|
||||
}
|
||||
|
||||
stylesheet += skel.arg(QStringLiteral("Highlight"), QStringLiteral("%highlightcolor"));
|
||||
|
||||
@ -449,7 +464,7 @@ const QString ThemePrivate::svgStyleSheet()
|
||||
stylesheet += skel.arg(QStringLiteral("ViewFocus"), QStringLiteral("%viewfocuscolor"));
|
||||
|
||||
stylesheet = processStyleSheet(stylesheet);
|
||||
cachedStyleSheets.insert(SVGSTYLE, stylesheet);
|
||||
cachedStyleSheets.insert(SVGSTYLE+(int)hints, stylesheet);
|
||||
}
|
||||
|
||||
return stylesheet;
|
||||
@ -501,7 +516,7 @@ QColor ThemePrivate::color(Theme::ColorRole role) const
|
||||
return colorScheme.foreground(KColorScheme::NormalText).color();
|
||||
|
||||
case Theme::HighlightColor:
|
||||
return colorScheme.decoration(KColorScheme::HoverColor).color();
|
||||
return colorScheme.decoration(KColorScheme::FocusColor).color();
|
||||
|
||||
case Theme::BackgroundColor:
|
||||
return colorScheme.background(KColorScheme::NormalBackground).color();
|
||||
|
@ -22,6 +22,7 @@
|
||||
#define PLASMA_THEME_P_H
|
||||
|
||||
#include "theme.h"
|
||||
#include "svg.h"
|
||||
#include <QHash>
|
||||
|
||||
#include <QDebug>
|
||||
@ -82,7 +83,7 @@ public:
|
||||
void processContrastSettings(KConfigBase *metadata);
|
||||
|
||||
const QString processStyleSheet(const QString &css);
|
||||
const QString svgStyleSheet();
|
||||
const QString svgStyleSheet(Plasma::Svg::StyleHints hints);
|
||||
QColor color(Theme::ColorRole role) const;
|
||||
|
||||
public Q_SLOTS:
|
||||
@ -133,7 +134,7 @@ public:
|
||||
QHash<QString, QPixmap> pixmapsToCache;
|
||||
QHash<QString, QString> keysToCache;
|
||||
QHash<QString, QString> idsToCache;
|
||||
QHash<styles, QString> cachedStyleSheets;
|
||||
QHash<int, QString> cachedStyleSheets;
|
||||
QHash<QString, QString> discoveries;
|
||||
QTimer *pixmapSaveTimer;
|
||||
QTimer *rectSaveTimer;
|
||||
|
@ -128,13 +128,14 @@ bool SharedSvgRenderer::load(
|
||||
}
|
||||
|
||||
#define QLSEP QLatin1Char('_')
|
||||
#define CACHE_ID_WITH_SIZE(size, id, devicePixelRatio) QString::number(int(size.width())) % QLSEP % QString::number(int(size.height())) % QLSEP % id % QLSEP % QString::number(int(devicePixelRatio))
|
||||
#define CACHE_ID_NATURAL_SIZE(id, devicePixelRatio) QLatin1Literal("Natural") % QLSEP % id % QLSEP % QString::number(int(devicePixelRatio))
|
||||
#define CACHE_ID_WITH_SIZE(size, id, devicePixelRatio, styleHints) QString::number(int(size.width())) % QLSEP % QString::number(int(size.height())) % QLSEP % id % QLSEP % QString::number(int(devicePixelRatio)) % QLSEP % QString::number(styleHints)
|
||||
#define CACHE_ID_NATURAL_SIZE(id, devicePixelRatio, styleHints) QLatin1Literal("Natural") % QLSEP % id % QLSEP % QString::number(int(devicePixelRatio)) % QLSEP % QString::number(styleHints)
|
||||
|
||||
SvgPrivate::SvgPrivate(Svg *svg)
|
||||
: q(svg),
|
||||
renderer(0),
|
||||
styleCrc(0),
|
||||
styleHints(Plasma::Svg::Normal),
|
||||
lastModified(0),
|
||||
devicePixelRatio(1.0),
|
||||
multipleImages(false),
|
||||
@ -155,16 +156,17 @@ SvgPrivate::~SvgPrivate()
|
||||
QString SvgPrivate::cacheId(const QString &elementId)
|
||||
{
|
||||
if (size.isValid() && size != naturalSize) {
|
||||
return CACHE_ID_WITH_SIZE(size, elementId, devicePixelRatio);
|
||||
//the size won't change with another style
|
||||
return CACHE_ID_WITH_SIZE(size, elementId, devicePixelRatio, 0);
|
||||
} else {
|
||||
return CACHE_ID_NATURAL_SIZE(elementId, devicePixelRatio);
|
||||
return CACHE_ID_NATURAL_SIZE(elementId, devicePixelRatio, 0);
|
||||
}
|
||||
}
|
||||
|
||||
//This function is meant for the pixmap cache
|
||||
QString SvgPrivate::cachePath(const QString &path, const QSize &size)
|
||||
{
|
||||
return CACHE_ID_WITH_SIZE(size, path, devicePixelRatio);
|
||||
return CACHE_ID_WITH_SIZE(size, path, devicePixelRatio, styleHints);
|
||||
}
|
||||
|
||||
bool SvgPrivate::setImagePath(const QString &imagePath)
|
||||
@ -278,7 +280,7 @@ QPixmap SvgPrivate::findInCache(const QString &elementId, const QSizeF &s)
|
||||
if (elementsWithSizeHints.isEmpty()) {
|
||||
// Fetch all size hinted element ids from the theme's rect cache
|
||||
// and store them locally.
|
||||
QRegExp sizeHintedKeyExpr(CACHE_ID_NATURAL_SIZE("(\\d+)-(\\d+)-(.+)", devicePixelRatio));
|
||||
QRegExp sizeHintedKeyExpr(CACHE_ID_NATURAL_SIZE("(\\d+)-(\\d+)-(.+)", devicePixelRatio, 0));
|
||||
|
||||
foreach (const QString &key, cacheAndColorsTheme()->listCachedRectKeys(path)) {
|
||||
if (sizeHintedKeyExpr.exactMatch(key)) {
|
||||
@ -415,7 +417,7 @@ void SvgPrivate::createRenderer()
|
||||
//qDebug() << "FAIL! **************************";
|
||||
//qDebug() << path << "**";
|
||||
|
||||
QString styleSheet = cacheAndColorsTheme()->d->svgStyleSheet();
|
||||
QString styleSheet = cacheAndColorsTheme()->d->svgStyleSheet(styleHints);
|
||||
styleCrc = qChecksum(styleSheet.toUtf8(), styleSheet.size());
|
||||
|
||||
QHash<QString, SharedSvgRenderer::Ptr>::const_iterator it = s_renderers.constFind(styleCrc + path);
|
||||
@ -438,7 +440,7 @@ void SvgPrivate::createRenderer()
|
||||
const QString &elementId = i.key();
|
||||
const QRectF &elementRect = i.value();
|
||||
|
||||
const QString cacheId = CACHE_ID_NATURAL_SIZE(elementId, devicePixelRatio);
|
||||
const QString cacheId = CACHE_ID_NATURAL_SIZE(elementId, devicePixelRatio, styleHints);
|
||||
localRectCache.insert(cacheId, elementRect);
|
||||
cacheAndColorsTheme()->insertIntoRectsCache(path, cacheId, elementRect);
|
||||
}
|
||||
@ -685,6 +687,22 @@ qreal Svg::devicePixelRatio()
|
||||
return d->devicePixelRatio;
|
||||
}
|
||||
|
||||
void Svg::setStyleHints(Svg::StyleHints hints)
|
||||
{
|
||||
if (d->styleHints == hints) {
|
||||
return;
|
||||
}
|
||||
|
||||
d->styleHints = hints;
|
||||
d->renderer = 0;
|
||||
emit styleHintsChanged();
|
||||
}
|
||||
|
||||
Svg::StyleHints Svg::styleHints() const
|
||||
{
|
||||
return d->styleHints;
|
||||
}
|
||||
|
||||
QPixmap Svg::pixmap(const QString &elementID)
|
||||
{
|
||||
if (elementID.isNull() || d->multipleImages) {
|
||||
|
@ -61,8 +61,16 @@ class PLASMA_EXPORT Svg : public QObject
|
||||
Q_PROPERTY(bool multipleImages READ containsMultipleImages WRITE setContainsMultipleImages)
|
||||
Q_PROPERTY(QString imagePath READ imagePath WRITE setImagePath NOTIFY imagePathChanged)
|
||||
Q_PROPERTY(bool usingRenderingCache READ isUsingRenderingCache WRITE setUsingRenderingCache)
|
||||
Q_PROPERTY(StyleHints styleHints READ styleHints WRITE setStyleHints NOTIFY styleHintsChanged);
|
||||
|
||||
public:
|
||||
enum StyleHint{
|
||||
Normal = 0,
|
||||
Inverted = 1,
|
||||
Highlighted = 2
|
||||
};
|
||||
Q_DECLARE_FLAGS(StyleHints, StyleHint)
|
||||
|
||||
/**
|
||||
* Constructs an SVG object that implicitly shares and caches rendering.
|
||||
*
|
||||
@ -93,6 +101,9 @@ public:
|
||||
*/
|
||||
qreal devicePixelRatio();
|
||||
|
||||
void setStyleHints(StyleHints hint);
|
||||
StyleHints styleHints() const;
|
||||
|
||||
/**
|
||||
* Returns a pixmap of the SVG represented by this object.
|
||||
*
|
||||
@ -398,6 +409,11 @@ Q_SIGNALS:
|
||||
*/
|
||||
void imagePathChanged();
|
||||
|
||||
/**
|
||||
* Emitted whenever the style hints are changed.
|
||||
*/
|
||||
void styleHintsChanged();
|
||||
|
||||
private:
|
||||
SvgPrivate *const d;
|
||||
bool eventFilter(QObject *watched, QEvent *event);
|
||||
@ -412,5 +428,7 @@ private:
|
||||
|
||||
} // Plasma namespace
|
||||
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(Plasma::Svg::StyleHints)
|
||||
|
||||
#endif // multiple inclusion guard
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user