1/*
2 This file is part of the KDE project, module kdecore.
3 SPDX-FileCopyrightText: 2000 Geert Jansen <jansen@kde.org>
4 SPDX-FileCopyrightText: 2000 Antonio Larrosa <larrosa@kde.org>
5
6 SPDX-License-Identifier: LGPL-2.0-only
7*/
8
9#ifndef KICONLOADER_P_H
10#define KICONLOADER_P_H
11
12#include <QCache>
13#include <QElapsedTimer>
14#include <QPixmap>
15#include <QSize>
16#include <QString>
17#include <QStringList>
18
19#include "kiconcolors.h"
20#include "kiconeffect.h"
21#include "kiconloader.h"
22
23class KIconThemeNode;
24
25/* KIconGroup: Icon type description. */
26
27struct KIconGroup {
28 int size;
29};
30
31/*
32 * Holds a QPixmap for this process, along with its associated path on disk.
33 */
34struct PixmapWithPath {
35 QPixmap pixmap;
36 QString path;
37};
38
39class KIconLoaderPrivate
40{
41public:
42 KIconLoaderPrivate(const QString &_appname, const QStringList &extraSearchPaths, KIconLoader *qq);
43 ~KIconLoaderPrivate();
44
45 static KIconLoaderPrivate *get(KIconLoader *loader);
46
47 void clear();
48
49 void init(const QString &_appname, const QStringList &extraSearchPaths = QStringList());
50
51 void initIconThemes();
52
53 /*
54 * tries to find an icon with the name. It tries some extension and
55 * match strategies
56 */
57 QString findMatchingIcon(const QString &name, int size, qreal scale) const;
58
59 /*
60 * tries to find an icon with the name.
61 * This is one layer above findMatchingIcon -- it also implements generic fallbacks
62 * such as generic icons for mimetypes.
63 */
64 QString findMatchingIconWithGenericFallbacks(const QString &name, int size, qreal scale) const;
65
66 /*
67 * returns the preferred icon path for an icon with the name.
68 * Can be used for a quick "hasIcon" check since it caches
69 * that an icon was not found.
70 */
71 QString preferredIconPath(const QString &name);
72
73 /*
74 * Adds themes installed in the application's directory.
75 **/
76 void addAppThemes(const QString &appname, const QString &themeBaseDir = QString());
77
78 /*
79 * Adds all themes that are part of this node and the themes
80 * below (the fallbacks of the theme) into the tree.
81 */
82 void addBaseThemes(KIconThemeNode *node, const QString &appname);
83
84 /*
85 * Recursively adds all themes that are specified in the "Inherits"
86 * property of the given theme into the tree.
87 */
88 void addInheritedThemes(KIconThemeNode *node, const QString &appname);
89
90 /*
91 * Creates a KIconThemeNode out of a theme name, and adds this theme
92 * as well as all its inherited themes into the tree. Themes that already
93 * exist in the tree will be ignored and not added twice.
94 */
95 void addThemeByName(const QString &themename, const QString &appname);
96
97 /*
98 * Adds all the default themes from other desktops at the end of
99 * the list of icon themes.
100 */
101 void addExtraDesktopThemes();
102
103 /*
104 * return the path for the unknown icon in that size
105 */
106 QString unknownIconPath(int size, qreal scale) const;
107
108 /*
109 * Used with KIconLoader::loadIcon to convert the given name, size, group,
110 * and icon state information to valid states. All parameters except the
111 * name can be modified as well to be valid.
112 */
113 void normalizeIconMetadata(KIconLoader::Group &group, QSize &size, int &state) const;
114
115 /*
116 * Used with KIconLoader::loadIcon to get a base key name from the given
117 * icon metadata. Ensure the metadata is normalized first.
118 */
119 QString makeCacheKey(const QString &name,
120 KIconLoader::Group group,
121 const QStringList &overlays,
122 const QSize &size,
123 qreal scale,
124 int state,
125 const KIconColors &colors) const;
126
127 /*
128 * If the icon is an SVG file, process it generating a stylesheet
129 * following the current color scheme. in this case the icon can use named colors
130 * as text color, background color, highlight color, positive/neutral/negative color
131 * \sa KColorScheme
132 */
133 QByteArray processSvg(const QString &path, KIconLoader::States state, const KIconColors &colors) const;
134
135 /*
136 * Creates the QImage for \apath, using SVG rendering as appropriate.
137 * \a size is only used for scalable images, but if non-zero non-scalable
138 * images will be resized anyways.
139 */
140 QImage createIconImage(const QString &path, const QSize &size, qreal scale, KIconLoader::States state, const KIconColors &colors);
141
142 /*
143 * Adds an QPixmap with its associated path to the shared icon cache.
144 */
145 void insertCachedPixmapWithPath(const QString &key, const QPixmap &data, const QString &path);
146
147 /*
148 * Retrieves the path and pixmap of the given key from the shared
149 * icon cache.
150 */
151 bool findCachedPixmapWithPath(const QString &key, QPixmap &data, QString &path);
152
153 /*
154 * Find the given file in the search paths.
155 */
156 QString locate(const QString &fileName);
157
158 /*
159 * React to a global icon theme change
160 */
161 void _k_refreshIcons(int group);
162
163 bool shouldCheckForUnknownIcons();
164
165 KIconLoader *const q;
166
167 QStringList mThemesInTree;
168 std::vector<KIconGroup> mpGroups;
169 KIconThemeNode *mpThemeRoot = nullptr;
170 QStringList searchPaths;
171#if KICONTHEMES_BUILD_DEPRECATED_SINCE(6, 5)
172 KIconEffect mpEffect;
173#endif
174 QList<KIconThemeNode *> links;
175
176 // This caches rendered QPixmaps in just this process.
177 QCache<QString, PixmapWithPath> mPixmapCache;
178
179 bool extraDesktopIconsLoaded : 1;
180 // lazy loading: initIconThemes() is only needed when the "links" list is needed
181 // mIconThemeInited is used inside initIconThemes() to init only once
182 bool mIconThemeInited : 1;
183 QString m_appname;
184
185 void drawOverlays(const KIconLoader *loader, KIconLoader::Group group, int state, QPixmap &pix, const QStringList &overlays);
186
187 QHash<QString, QString> mIconAvailability; // icon name -> actual icon name (not null if known to be available)
188 QElapsedTimer mLastUnknownIconCheck; // recheck for unknown icons after kiconloader_ms_between_checks
189 // the colors used to recolor svg icons stylesheets
190 KIconColors mColors;
191 QPalette mPalette;
192 // to keep track if we are using a custom palette or just falling back to qApp;
193 bool mCustomColors = false;
194};
195
196#endif // KICONLOADER_P_H
197

source code of kiconthemes/src/kiconloader_p.h