qfileiconprovider.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/widgets/itemviews/qfileiconprovider.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4static bool isCacheable(const QFileInfo &fi);-
5-
6class QFileIconEngine : public QPixmapIconEngine-
7{-
8public:-
9 QFileIconEngine(const QFileInfo &info, QFileIconProvider::Options opts)-
10 : QPixmapIconEngine(), m_fileInfo(info), m_fipOpts(opts)-
11 { }-
12-
13 QPixmap pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state) override-
14 {-
15 (void)mode;;-
16 (void)state;;-
17 QPixmap pixmap;-
18-
19 if (!size.isValid())-
20 return pixmap;-
21-
22 const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme();-
23 if (!theme)-
24 return pixmap;-
25-
26 const QString &keyBase = QLatin1String("qt_.") + m_fileInfo.suffix().toUpper();-
27-
28 bool cacheable = isCacheable(m_fileInfo);-
29 if (cacheable) {-
30 QPixmapCache::find(keyBase + QString::number(size.width()), pixmap);-
31 if (!pixmap.isNull())-
32 return pixmap;-
33 }-
34-
35 QPlatformTheme::IconOptions iconOptions;-
36 if (m_fipOpts & QFileIconProvider::DontUseCustomDirectoryIcons)-
37 iconOptions |= QPlatformTheme::DontUseCustomDirectoryIcons;-
38-
39 pixmap = theme->fileIconPixmap(m_fileInfo, size, iconOptions);-
40 if (!pixmap.isNull()) {-
41 if (cacheable)-
42 QPixmapCache::insert(keyBase + QString::number(size.width()), pixmap);-
43 }-
44-
45 return pixmap;-
46 }-
47-
48 QList<QSize> availableSizes(QIcon::Mode mode = QIcon::Normal, QIcon::State state = QIcon::Off) const override-
49 {-
50 (void)mode;;-
51 (void)state;;-
52 static QList<QSize> sizes;-
53 static QPlatformTheme *theme = 0;-
54 if (!theme) {-
55 theme = QGuiApplicationPrivate::platformTheme();-
56 if (!theme)-
57 return sizes;-
58-
59 QList<int> themeSizes = theme->themeHint(QPlatformTheme::IconPixmapSizes).value<QList<int> >();-
60 if (themeSizes.isEmpty())-
61 return sizes;-
62-
63 sizes.reserve(themeSizes.count());-
64 for (QForeachContainer<typename QtPrivate::remove_reference<decltype(themeSizes)>::type> _container_((themeSizes)); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1) for (int size = *_container_.i; _container_.control; _container_.control = 0)-
65 sizes << QSize(size, size);-
66 }-
67 return sizes;-
68 }-
69-
70 QSize actualSize(const QSize &size, QIcon::Mode mode, QIcon::State state) override-
71 {-
72 const QList<QSize> &sizes = availableSizes(mode, state);-
73 const int numberSizes = sizes.length();-
74 if (numberSizes == 0)-
75 return QSize();-
76-
77-
78-
79-
80 const int sizeArea = size.width() * size.height();-
81 QSize actualSize = sizes.first();-
82 int actualArea = actualSize.width() * actualSize.height();-
83 for (int i = 1; i < numberSizes; ++i) {-
84 const QSize &s = sizes.at(i);-
85 const int a = s.width() * s.height();-
86 if ((sizeArea <= a && a < actualArea) || (actualArea < sizeArea && actualArea < a)) {-
87 actualSize = s;-
88 actualArea = a;-
89 }-
90 }-
91-
92 if (!actualSize.isNull() && (actualSize.width() > size.width() || actualSize.height() > size.height()))-
93 actualSize.scale(size, Qt::KeepAspectRatio);-
94-
95 return actualSize;-
96 }-
97-
98private:-
99 QFileInfo m_fileInfo;-
100 QFileIconProvider::Options m_fipOpts;-
101};-
102QFileIconProviderPrivate::QFileIconProviderPrivate(QFileIconProvider *q) :-
103 q_ptr(q), homePath(QDir::home().absolutePath())-
104{-
105}-
106-
107QIcon QFileIconProviderPrivate::getIcon(QStyle::StandardPixmap name) const-
108{-
109 switch (name) {-
110 case QStyle::SP_FileIcon:-
111 if (file.isNull())-
112 file = QApplication::style()->standardIcon(name);-
113 return file;-
114 case QStyle::SP_FileLinkIcon:-
115 if (fileLink.isNull())-
116 fileLink = QApplication::style()->standardIcon(name);-
117 return fileLink;-
118 case QStyle::SP_DirIcon:-
119 if (directory.isNull())-
120 directory = QApplication::style()->standardIcon(name);-
121 return directory;-
122 case QStyle::SP_DirLinkIcon:-
123 if (directoryLink.isNull())-
124 directoryLink = QApplication::style()->standardIcon(name);-
125 return directoryLink;-
126 case QStyle::SP_DriveHDIcon:-
127 if (harddisk.isNull())-
128 harddisk = QApplication::style()->standardIcon(name);-
129 return harddisk;-
130 case QStyle::SP_DriveFDIcon:-
131 if (floppy.isNull())-
132 floppy = QApplication::style()->standardIcon(name);-
133 return floppy;-
134 case QStyle::SP_DriveCDIcon:-
135 if (cdrom.isNull())-
136 cdrom = QApplication::style()->standardIcon(name);-
137 return cdrom;-
138 case QStyle::SP_DriveNetIcon:-
139 if (network.isNull())-
140 network = QApplication::style()->standardIcon(name);-
141 return network;-
142 case QStyle::SP_ComputerIcon:-
143 if (computer.isNull())-
144 computer = QApplication::style()->standardIcon(name);-
145 return computer;-
146 case QStyle::SP_DesktopIcon:-
147 if (desktop.isNull())-
148 desktop = QApplication::style()->standardIcon(name);-
149 return desktop;-
150 case QStyle::SP_TrashIcon:-
151 if (trashcan.isNull())-
152 trashcan = QApplication::style()->standardIcon(name);-
153 return trashcan;-
154 case QStyle::SP_DirHomeIcon:-
155 if (home.isNull())-
156 home = QApplication::style()->standardIcon(name);-
157 return home;-
158 default:-
159 return QIcon();-
160 }-
161 return
dead code: return QIcon();
QIcon();
dead code: return QIcon();
-
162}-
163-
164-
165-
166-
167-
168QFileIconProvider::QFileIconProvider()-
169 : d_ptr(new QFileIconProviderPrivate(this))-
170{-
171}-
172-
173-
174-
175-
176-
177-
178QFileIconProvider::~QFileIconProvider()-
179{-
180}-
181-
182-
183-
184-
185-
186-
187-
188void QFileIconProvider::setOptions(QFileIconProvider::Options options)-
189{-
190 QFileIconProviderPrivate * const d = d_func();-
191 d->options = options;-
192}-
193QFileIconProvider::Options QFileIconProvider::options() const-
194{-
195 const QFileIconProviderPrivate * const d = d_func();-
196 return d->options;-
197}-
198-
199-
200-
201-
202-
203QIcon QFileIconProvider::icon(IconType type) const-
204{-
205 const QFileIconProviderPrivate * const d = d_func();-
206 switch (type) {-
207 case Computer:-
208 return d->getIcon(QStyle::SP_ComputerIcon);-
209 case Desktop:-
210 return d->getIcon(QStyle::SP_DesktopIcon);-
211 case Trashcan:-
212 return d->getIcon(QStyle::SP_TrashIcon);-
213 case Network:-
214 return d->getIcon(QStyle::SP_DriveNetIcon);-
215 case Drive:-
216 return d->getIcon(QStyle::SP_DriveHDIcon);-
217 case Folder:-
218 return d->getIcon(QStyle::SP_DirIcon);-
219 case File:-
220 return d->getIcon(QStyle::SP_FileIcon);-
221 default:-
222 break;-
223 };-
224 return QIcon();-
225}-
226-
227static bool isCacheable(const QFileInfo &fi)-
228{-
229 if (!fi.isFile())-
230 return false;-
231 return !fi.isExecutable() && !fi.isSymLink();-
232-
233}-
234-
235QIcon QFileIconProviderPrivate::getIcon(const QFileInfo &fi) const-
236{-
237 const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme();-
238 if (!theme)-
239 return QIcon();-
240-
241 QList<int> sizes = theme->themeHint(QPlatformTheme::IconPixmapSizes).value<QList<int> >();-
242 if (sizes.isEmpty())-
243 return QIcon();-
244-
245 return QIcon(new QFileIconEngine(fi, options));-
246}-
247-
248-
249-
250-
251-
252QIcon QFileIconProvider::icon(const QFileInfo &info) const-
253{-
254 const QFileIconProviderPrivate * const d = d_func();-
const QByteArray desktopEnvironment = QGuiApplicationPrivate::platformIntegration()->services()->desktopEnvironment();
255-
256 if (desktopEnvironment != ([]() -> QByteArray { enum { Size = sizeof("KDE") - 1 }; static const QStaticByteArrayData<Size> qbytearray_literal = { { { { -1 } }, Size, 0, 0, sizeof(QByteArrayData) }, "KDE" }; QByteArrayDataPtr holder = { qbytearray_literal.data_ptr() }; const QByteArray ba(holder); return ba; }())) {-
QIcon gtkIcon = QGtkStylePrivate::getFilesystemIcon(info);
if (!gtkIcon.isNull())
return gtkIcon;
}QIcon retIcon = d->getIcon(info);
257 if (!retIcon.isNull()
!retIcon.isNull()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
258 return
never executed: return retIcon;
retIcon;
never executed: return retIcon;
0
259-
260 if (info.isRoot()
info.isRoot()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
261 return
never executed: return d->getIcon(QStyle::SP_DriveHDIcon);
d->getIcon(QStyle::SP_DriveHDIcon);
never executed: return d->getIcon(QStyle::SP_DriveHDIcon);
0
262-
263-
264 if (info.isFile()
info.isFile()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
265 if (info.isSymLink()
info.isSymLink()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
266 return
never executed: return d->getIcon(QStyle::SP_FileLinkIcon);
d->getIcon(QStyle::SP_FileLinkIcon);
never executed: return d->getIcon(QStyle::SP_FileLinkIcon);
0
267 else-
268 return
never executed: return d->getIcon(QStyle::SP_FileIcon);
d->getIcon(QStyle::SP_FileIcon);
never executed: return d->getIcon(QStyle::SP_FileIcon);
0
269 }-
270 if (info.isDir()
info.isDir()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
271 if (info.isSymLink()
info.isSymLink()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
272 return
never executed: return d->getIcon(QStyle::SP_DirLinkIcon);
d->getIcon(QStyle::SP_DirLinkIcon);
never executed: return d->getIcon(QStyle::SP_DirLinkIcon);
0
273 } else {-
274 if (info.absoluteFilePath() == d->homePath
info.absoluteF...== d->homePathDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
275 return
never executed: return d->getIcon(QStyle::SP_DirHomeIcon);
d->getIcon(QStyle::SP_DirHomeIcon);
never executed: return d->getIcon(QStyle::SP_DirHomeIcon);
0
276 } else {-
277 return
never executed: return d->getIcon(QStyle::SP_DirIcon);
d->getIcon(QStyle::SP_DirIcon);
never executed: return d->getIcon(QStyle::SP_DirIcon);
0
278 }-
279 }-
280 }-
281 return
never executed: return QIcon();
QIcon();
never executed: return QIcon();
0
282}-
283-
284-
285-
286-
287-
288QString QFileIconProvider::type(const QFileInfo &info) const-
289{-
290 if (info.isRoot())-
291 return QApplication::translate("QFileDialog", "Drive");-
292 if (info.isFile()) {-
293 if (!info.suffix().isEmpty()) {-
294-
295 return QApplication::translate("QFileDialog", "%1 File").arg(info.suffix());-
296 }-
297 return QApplication::translate("QFileDialog", "File");-
298 }-
299-
300 if (info.isDir())-
301-
302-
303-
304 return QApplication::translate("QFileDialog", "Folder", "All other platforms");-
305-
306-
307-
308-
309-
310-
311 if (info.isSymLink())-
312-
313-
314-
315 return QApplication::translate("QFileDialog", "Shortcut", "All other platforms");-
316-
317-
318-
319-
320-
321-
322 return QApplication::translate("QFileDialog", "Unknown");-
323}-
324-
325-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9