Krita Source Code Documentation
Loading...
Searching...
No Matches
Digikam::ThemeManager Class Reference

#include <thememanager.h>

+ Inheritance diagram for Digikam::ThemeManager:

Classes

class  ThemeManagerPriv
 

Signals

void signalThemeChanged ()
 

Public Member Functions

QString currentThemeName () const
 
void registerThemeActions (KisKActionCollection *actionCollection)
 
void setCurrentTheme (const QString &name)
 
void setThemeMenuAction (KActionMenu *const action)
 
 ThemeManager (const QString &theme="", QObject *parent=0)
 ThemeManager.
 
 ~ThemeManager () override
 

Private Slots

void slotChangePalette ()
 

Private Member Functions

QPixmap createSchemePreviewIcon (const KSharedConfigPtr &config)
 
void populateThemeMap ()
 
void populateThemeMenu ()
 

Private Attributes

ThemeManagerPriv *const d
 

Detailed Description

Definition at line 35 of file thememanager.h.

Constructor & Destructor Documentation

◆ ThemeManager()

Digikam::ThemeManager::ThemeManager ( const QString & theme = "",
QObject * parent = 0 )
explicit

ThemeManager.

Parameters
themethe currently active theme: the palette will not be changed to this theme
parent

Definition at line 78 of file thememanager.cpp.

79 : QObject(parent)
80 , d(new ThemeManagerPriv)
81{
82 //qDebug() << "Creating theme manager with theme" << theme;
83 d->currentThemeName = theme;
85}
ThemeManagerPriv *const d

References Digikam::ThemeManager::ThemeManagerPriv::currentThemeName, d, and populateThemeMap().

◆ ~ThemeManager()

Digikam::ThemeManager::~ThemeManager ( )
override

Definition at line 87 of file thememanager.cpp.

88{
89 delete d;
90}

References d.

Member Function Documentation

◆ createSchemePreviewIcon()

QPixmap Digikam::ThemeManager::createSchemePreviewIcon ( const KSharedConfigPtr & config)
private

Definition at line 259 of file thememanager.cpp.

260{
261 // code taken from kdebase/workspace/kcontrol/colors/colorscm.cpp
262 const uchar bits1[] = { 0xff, 0xff, 0xff, 0x2c, 0x16, 0x0b };
263 const uchar bits2[] = { 0x68, 0x34, 0x1a, 0xff, 0xff, 0xff };
264 const QSize bitsSize(24, 2);
265 const QBitmap b1 = QBitmap::fromData(bitsSize, bits1);
266 const QBitmap b2 = QBitmap::fromData(bitsSize, bits2);
267
268 QPixmap pixmap(23, 16);
269 pixmap.fill(Qt::black); // FIXME use some color other than black for borders?
270
271 KConfigGroup group(config, "WM");
272 QPainter p(&pixmap);
273 KColorScheme windowScheme(QPalette::Active, KColorScheme::Window, config);
274 p.fillRect(1, 1, 7, 7, windowScheme.background());
275 p.fillRect(2, 2, 5, 2, QBrush(windowScheme.foreground().color(), b1));
276
277 KColorScheme buttonScheme(QPalette::Active, KColorScheme::Button, config);
278 p.fillRect(8, 1, 7, 7, buttonScheme.background());
279 p.fillRect(9, 2, 5, 2, QBrush(buttonScheme.foreground().color(), b1));
280
281 p.fillRect(15, 1, 7, 7, group.readEntry("activeBackground", QColor(96, 148, 207)));
282 p.fillRect(16, 2, 5, 2, QBrush(group.readEntry("activeForeground", QColor(255, 255, 255)), b1));
283
284 KColorScheme viewScheme(QPalette::Active, KColorScheme::View, config);
285 p.fillRect(1, 8, 7, 7, viewScheme.background());
286 p.fillRect(2, 12, 5, 2, QBrush(viewScheme.foreground().color(), b2));
287
288 KColorScheme selectionScheme(QPalette::Active, KColorScheme::Selection, config);
289 p.fillRect(8, 8, 7, 7, selectionScheme.background());
290 p.fillRect(9, 12, 5, 2, QBrush(selectionScheme.foreground().color(), b2));
291
292 p.fillRect(15, 8, 7, 7, group.readEntry("inactiveBackground", QColor(224, 223, 222)));
293 p.fillRect(16, 12, 5, 2, QBrush(group.readEntry("inactiveForeground", QColor(20, 19, 18)), b2));
294
295 p.end();
296 return pixmap;
297}
const Params2D p

References KColorScheme::background(), KColorScheme::Button, KColorScheme::foreground(), p, KColorScheme::Selection, KColorScheme::View, and KColorScheme::Window.

◆ currentThemeName()

QString Digikam::ThemeManager::currentThemeName ( ) const

Definition at line 92 of file thememanager.cpp.

93{
94 //qDebug() << "getting current themename";
95 QString themeName;
97
98 QAction* action = d->themeMenuActionGroup->checkedAction();
99 if (action) {
100 themeName = action->text().remove('&');
101 }
102
103 //qDebug() << "\tthemename from action" << themeName;
104 }
105 else if (!d->currentThemeName.isEmpty()) {
106
107 //qDebug() << "\tcurrent themename" << d->currentThemeName;
108 themeName = d->currentThemeName;
109 }
110 if (themeName.isEmpty()) {
111 //qDebug() << "\tfallback";
112 themeName = "Krita dark";
113 }
114 //qDebug() << "\tresult" << themeName;
115 return themeName;
116}

References Digikam::ThemeManager::ThemeManagerPriv::currentThemeName, d, Digikam::ThemeManager::ThemeManagerPriv::themeMenuAction, and Digikam::ThemeManager::ThemeManagerPriv::themeMenuActionGroup.

◆ populateThemeMap()

void Digikam::ThemeManager::populateThemeMap ( )
private

Definition at line 299 of file thememanager.cpp.

300{
301 QStringList schemeFiles = KoResourcePaths::findAllAssets("data", "color-schemes/*.colors");
302 schemeFiles += KoResourcePaths::findAllAssets("genericdata", "color-schemes/*.colors");
303
304 for (int i = 0; i < schemeFiles.size(); ++i) {
305 const QString filename = schemeFiles.at(i);
306 const QFileInfo info(filename);
307 KSharedConfigPtr config = KSharedConfig::openConfig(filename);
308 KConfigGroup group(config, "General");
309 const QString name = group.readEntry("Name", info.completeBaseName());
310 d->themeMap.insert(name, filename);
311 }
312
313
314}
static QStringList findAllAssets(const QString &type, const QString &filter=QString(), SearchOptions options=NoSearchOptions)
const char * name(StandardAction id)

References d, KoResourcePaths::findAllAssets(), and Digikam::ThemeManager::ThemeManagerPriv::themeMap.

◆ populateThemeMenu()

void Digikam::ThemeManager::populateThemeMenu ( )
private

Definition at line 210 of file thememanager.cpp.

211{
212 if (!d->themeMenuAction) return;
213
214 d->themeMenuAction->menu()->clear();
215 delete d->themeMenuActionGroup;
216
217 d->themeMenuActionGroup = new QActionGroup(d->themeMenuAction);
218 connect(d->themeMenuActionGroup, SIGNAL(triggered(QAction*)),
219 this, SLOT(slotChangePalette()));
220
221 QAction * action;
222 QStringList schemeFiles = KoResourcePaths::findAllAssets("data", "color-schemes/*.colors");
223 schemeFiles += KoResourcePaths::findAllAssets("genericdata", "color-schemes/*.colors");
224
225 QMap<QString, QAction*> actionMap;
226 for (int i = 0; i < schemeFiles.size(); ++i) {
227 const QString filename = schemeFiles.at(i);
228 const QFileInfo info(filename);
229 KSharedConfigPtr config = KSharedConfig::openConfig(filename);
230 QIcon icon = createSchemePreviewIcon(config);
231 KConfigGroup group(config, "General");
232 const QString name = group.readEntry("Name", info.completeBaseName());
233 action = new QAction(name, d->themeMenuActionGroup);
234 action->setIcon(icon);
235 action->setCheckable(true);
236 actionMap.insert(name, action);
237 }
238
239#ifdef Q_OS_MAC
240 // Add a "System" theme, which resets the palette to system colors
241 // It only seems to work as expected on macOS.
242 action = new QAction("System", d->themeMenuActionGroup);
243 action->setCheckable(true);
244 actionMap.insert("System", action);
245#endif
246
247 // sort the list
248 QStringList actionMapKeys = actionMap.keys();
249 actionMapKeys.sort();
250
251 Q_FOREACH (const QString& name, actionMapKeys) {
252 if ( name == currentThemeName()) {
253 actionMap.value(name)->setChecked(true);
254 }
255 d->themeMenuAction->addAction(actionMap.value(name));
256 }
257}
QPixmap createSchemePreviewIcon(const KSharedConfigPtr &config)
QString currentThemeName() const

References createSchemePreviewIcon(), currentThemeName(), d, KoResourcePaths::findAllAssets(), slotChangePalette(), Digikam::ThemeManager::ThemeManagerPriv::themeMenuAction, and Digikam::ThemeManager::ThemeManagerPriv::themeMenuActionGroup.

◆ registerThemeActions()

void Digikam::ThemeManager::registerThemeActions ( KisKActionCollection * actionCollection)

Definition at line 204 of file thememanager.cpp.

205{
206 if (!d->themeMenuAction) return;
207 actionCollection->addAction("theme_menu", d->themeMenuAction);
208}
Q_INVOKABLE QAction * addAction(const QString &name, QAction *action)

References KisKActionCollection::addAction(), d, and Digikam::ThemeManager::ThemeManagerPriv::themeMenuAction.

◆ setCurrentTheme()

void Digikam::ThemeManager::setCurrentTheme ( const QString & name)

Definition at line 118 of file thememanager.cpp.

119{
120 //qDebug() << "setCurrentTheme();" << d->currentThemeName << "to" << name;
122
124 QList<QAction*> list = d->themeMenuActionGroup->actions();
125 Q_FOREACH (QAction* action, list) {
126 if (action->text().remove('&') == name) {
127 action->setChecked(true);
128 }
129 }
130 }
132}

References Digikam::ThemeManager::ThemeManagerPriv::currentThemeName, d, slotChangePalette(), Digikam::ThemeManager::ThemeManagerPriv::themeMenuAction, and Digikam::ThemeManager::ThemeManagerPriv::themeMenuActionGroup.

◆ setThemeMenuAction()

void Digikam::ThemeManager::setThemeMenuAction ( KActionMenu *const action)

◆ signalThemeChanged

void Digikam::ThemeManager::signalThemeChanged ( )
signal

◆ slotChangePalette

void Digikam::ThemeManager::slotChangePalette ( )
privateslot

Definition at line 134 of file thememanager.cpp.

135{
136 if (currentThemeName() == "System") {
137 qApp->setPalette(QPalette());
138 Q_EMIT signalThemeChanged();
139 return;
140 }
141
142 //qDebug() << "slotChangePalette" << sender();
143
144 // We must clear the icon cache before the palette is changed. That way
145 // The widgets can change the icons properly when they receive the
146 // PaletteChange event if needed.
148
149 QString theme(currentThemeName());
150 QString filename = d->themeMap.value(theme);
151 KSharedConfigPtr config = KSharedConfig::openConfig(filename);
152
153 QPalette palette = qApp->palette();
154 QPalette::ColorGroup states[3] = { QPalette::Active, QPalette::Inactive, QPalette::Disabled };
155 // TT thinks tooltips shouldn't use active, so we use our active colors for all states
156 KColorScheme schemeTooltip(QPalette::Active, KColorScheme::Tooltip, config);
157
158 for ( int i = 0; i < 3 ; ++i ) {
159
160 QPalette::ColorGroup state = states[i];
161 KColorScheme schemeView(state, KColorScheme::View, config);
162 KColorScheme schemeWindow(state, KColorScheme::Window, config);
163 KColorScheme schemeButton(state, KColorScheme::Button, config);
164 KColorScheme schemeSelection(state, KColorScheme::Selection, config);
165
166 palette.setBrush(state, QPalette::WindowText, schemeWindow.foreground());
167 palette.setBrush(state, QPalette::Window, schemeWindow.background());
168 palette.setBrush(state, QPalette::Base, schemeView.background());
169 palette.setBrush(state, QPalette::Text, schemeView.foreground());
170 palette.setBrush(state, QPalette::Button, schemeButton.background());
171 palette.setBrush(state, QPalette::ButtonText, schemeButton.foreground());
172 palette.setBrush(state, QPalette::Highlight, schemeSelection.background());
173 palette.setBrush(state, QPalette::HighlightedText, schemeSelection.foreground());
174 palette.setBrush(state, QPalette::ToolTipBase, schemeTooltip.background());
175 palette.setBrush(state, QPalette::ToolTipText, schemeTooltip.foreground());
176 palette.setBrush(state, QPalette::PlaceholderText, schemeView.foreground(KColorScheme::InactiveText));
177
178 palette.setColor(state, QPalette::Light, schemeWindow.shade(KColorScheme::LightShade));
179 palette.setColor(state, QPalette::Midlight, schemeWindow.shade(KColorScheme::MidlightShade));
180 palette.setColor(state, QPalette::Mid, schemeWindow.shade(KColorScheme::MidShade));
181 palette.setColor(state, QPalette::Dark, schemeWindow.shade(KColorScheme::DarkShade));
182 palette.setColor(state, QPalette::Shadow, schemeWindow.shade(KColorScheme::ShadowShade));
183
184 palette.setBrush(state, QPalette::AlternateBase, schemeView.background(KColorScheme::AlternateBackground));
185 palette.setBrush(state, QPalette::Link, schemeView.foreground(KColorScheme::LinkText));
186 palette.setBrush(state, QPalette::LinkVisited, schemeView.foreground(KColorScheme::VisitedText));
187 }
188
189 //qDebug() << ">>>>>>>>>>>>>>>>>> going to set palette on app" << theme;
190 // hint for the style to synchronize the color scheme with the window manager/compositor
191 qApp->setProperty("KDE_COLOR_SCHEME_PATH", filename);
192 qApp->setPalette(palette);
194
195 Q_EMIT signalThemeChanged();
196}
static KisConfigNotifier * instance()
void notifyColorThemeChanged(const QString &filename)
rgba palette[MAX_PALETTE]
Definition palette.c:35

References KColorScheme::AlternateBackground, KColorScheme::background(), KColorScheme::Button, KisIconUtils::clearIconCache(), currentThemeName(), d, KColorScheme::DarkShade, KColorScheme::foreground(), KColorScheme::InactiveText, KisConfigNotifier::instance(), KColorScheme::LightShade, KColorScheme::LinkText, KColorScheme::MidlightShade, KColorScheme::MidShade, KisConfigNotifier::notifyColorThemeChanged(), palette, KColorScheme::Selection, KColorScheme::shade(), KColorScheme::ShadowShade, signalThemeChanged(), Digikam::ThemeManager::ThemeManagerPriv::themeMap, KColorScheme::Tooltip, KColorScheme::View, KColorScheme::VisitedText, and KColorScheme::Window.

Member Data Documentation

◆ d

ThemeManagerPriv* const Digikam::ThemeManager::d
private

Definition at line 71 of file thememanager.h.


The documentation for this class was generated from the following files: