summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2016-07-27 11:57:46 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2016-08-04 14:31:15 +0000
commit40bb2d29b92c28c662a94b77a8170567aba087ab (patch)
tree8bf2ae8ceed43013b04b9d59682b2d80f142d0b7
parent2079081dcf6968690d0c8c50c46531c31989ffd4 (diff)
Add QPlatformTheme::fileIcon()
Add a way to return an icon instead of a pixmap of a specific size for a file for usage by QFileIconProvider, etc. Fall back to fileIconPixmap() if fileIcon() returns a null icon. This allows for supporting XDG theme icons and Qt Quick applications accessing file icons. Change-Id: I9ffbd6602e1a6a490c0046d950636447c5127474 Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
-rw-r--r--src/gui/kernel/qplatformtheme.cpp19
-rw-r--r--src/gui/kernel/qplatformtheme.h3
-rw-r--r--src/widgets/itemviews/qfileiconprovider.cpp23
3 files changed, 36 insertions, 9 deletions
diff --git a/src/gui/kernel/qplatformtheme.cpp b/src/gui/kernel/qplatformtheme.cpp
index 32ad057452..a00c572e07 100644
--- a/src/gui/kernel/qplatformtheme.cpp
+++ b/src/gui/kernel/qplatformtheme.cpp
@@ -44,6 +44,7 @@
#include <QtCore/QVariant>
#include <QtCore/QStringList>
#include <QtCore/qfileinfo.h>
+#include <qicon.h>
#include <qpalette.h>
#include <qtextformat.h>
#include <private/qiconloader_p.h>
@@ -405,6 +406,24 @@ QPixmap QPlatformTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) co
return QPixmap();
}
+/*!
+ \brief Return an icon for \a fileInfo, observing \a iconOptions.
+
+ This function is queried by QFileIconProvider and similar classes to obtain
+ an icon for a file. If it does not return a non-null icon, fileIconPixmap()
+ is queried for a specific size.
+
+ \since 5.8
+*/
+
+QIcon QPlatformTheme::fileIcon(const QFileInfo &fileInfo, QPlatformTheme::IconOptions iconOptions) const
+{
+ Q_UNUSED(fileInfo);
+ Q_UNUSED(iconOptions);
+ // TODO Should return QCommonStyle pixmaps?
+ return QIcon();
+}
+
QPixmap QPlatformTheme::fileIconPixmap(const QFileInfo &fileInfo, const QSizeF &size,
QPlatformTheme::IconOptions iconOptions) const
{
diff --git a/src/gui/kernel/qplatformtheme.h b/src/gui/kernel/qplatformtheme.h
index b16fdd7939..c04ebd2190 100644
--- a/src/gui/kernel/qplatformtheme.h
+++ b/src/gui/kernel/qplatformtheme.h
@@ -55,6 +55,7 @@
QT_BEGIN_NAMESPACE
+class QIcon;
class QIconEngine;
class QMenu;
class QMenuBar;
@@ -301,6 +302,8 @@ public:
virtual QVariant themeHint(ThemeHint hint) const;
virtual QPixmap standardPixmap(StandardPixmap sp, const QSizeF &size) const;
+ virtual QIcon fileIcon(const QFileInfo &fileInfo,
+ QPlatformTheme::IconOptions iconOptions = 0) const;
virtual QPixmap fileIconPixmap(const QFileInfo &fileInfo, const QSizeF &size,
QPlatformTheme::IconOptions iconOptions = 0) const;
diff --git a/src/widgets/itemviews/qfileiconprovider.cpp b/src/widgets/itemviews/qfileiconprovider.cpp
index 78ff5f79ab..5638e438d5 100644
--- a/src/widgets/itemviews/qfileiconprovider.cpp
+++ b/src/widgets/itemviews/qfileiconprovider.cpp
@@ -62,6 +62,14 @@ QT_BEGIN_NAMESPACE
static bool isCacheable(const QFileInfo &fi);
+static QPlatformTheme::IconOptions toThemeIconOptions(QFileIconProvider::Options options)
+{
+ QPlatformTheme::IconOptions result;
+ if (options & QFileIconProvider::DontUseCustomDirectoryIcons)
+ result |= QPlatformTheme::DontUseCustomDirectoryIcons;
+ return result;
+}
+
class QFileIconEngine : public QPixmapIconEngine
{
public:
@@ -91,11 +99,7 @@ public:
return pixmap;
}
- QPlatformTheme::IconOptions iconOptions;
- if (m_fipOpts & QFileIconProvider::DontUseCustomDirectoryIcons)
- iconOptions |= QPlatformTheme::DontUseCustomDirectoryIcons;
-
- pixmap = theme->fileIconPixmap(m_fileInfo, size, iconOptions);
+ pixmap = theme->fileIconPixmap(m_fileInfo, size, toThemeIconOptions(m_fipOpts));
if (!pixmap.isNull()) {
if (cacheable)
QPixmapCache::insert(keyBase + QString::number(size.width()), pixmap);
@@ -345,11 +349,12 @@ QIcon QFileIconProviderPrivate::getIcon(const QFileInfo &fi) const
if (!theme)
return QIcon();
- QList<int> sizes = theme->themeHint(QPlatformTheme::IconPixmapSizes).value<QList<int> >();
- if (sizes.isEmpty())
- return QIcon();
+ QIcon themeFileIcon = theme->fileIcon(fi, toThemeIconOptions(options));
+ if (!themeFileIcon.isNull())
+ return themeFileIcon;
- return QIcon(new QFileIconEngine(fi, options));
+ QList<int> sizes = theme->themeHint(QPlatformTheme::IconPixmapSizes).value<QList<int> >();
+ return sizes.isEmpty() ? QIcon() : QIcon(new QFileIconEngine(fi, options));
}
/*!