summaryrefslogtreecommitdiffstats
path: root/src/gui/image
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2020-08-24 11:31:13 +0200
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2020-08-26 01:13:19 +0200
commit872e37b2ff59af2f444c191f038366281d9d70d4 (patch)
tree298fd99fc58d6c9d9c096ed925ec526e9ad426c1 /src/gui/image
parent2cb8568ab2a173fdc4d00d603df236078886802e (diff)
Implement QAbstractFileIconProvider to use theme and mime databases
This doesn't give useful defaults on all platforms; icon themes are not provided on platforms other than Linux, and the mime database doesn't always return user-friendly names based on file names. However, both icon themes and the mime database can be customized by application developers by shipping a data file side-by-side with the application, without the need for reimplementing the provider class. Change-Id: Ie4b18ac1b861e2da64f01d1f209986b27fbe6bd5 Task-number: QTBUG-66177 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/gui/image')
-rw-r--r--src/gui/image/qabstractfileiconprovider.cpp50
-rw-r--r--src/gui/image/qabstractfileiconprovider_p.h3
2 files changed, 42 insertions, 11 deletions
diff --git a/src/gui/image/qabstractfileiconprovider.cpp b/src/gui/image/qabstractfileiconprovider.cpp
index aa9f5bd0f0..7872aed4d5 100644
--- a/src/gui/image/qabstractfileiconprovider.cpp
+++ b/src/gui/image/qabstractfileiconprovider.cpp
@@ -40,6 +40,10 @@
#include "qabstractfileiconprovider.h"
#include <qguiapplication.h>
+#include <qicon.h>
+#include <qmimedatabase.h>
+
+
#include <private/qabstractfileiconprovider_p.h>
#include <private/qfilesystementry_p.h>
@@ -127,23 +131,50 @@ QAbstractFileIconProvider::Options QAbstractFileIconProvider::options() const
}
/*!
- Returns an icon set for the given \a type.
+ Returns an icon set for the given \a type, using the current
+ icon theme.
+
+ \sa QIcon::fromTheme
*/
QIcon QAbstractFileIconProvider::icon(IconType type) const
{
Q_UNUSED(type);
- return {};
+ switch (type) {
+ case Computer:
+ return QIcon::fromTheme(QLatin1String("computer"));
+ case Desktop:
+ return QIcon::fromTheme(QLatin1String("user-desktop"));
+ case Trashcan:
+ return QIcon::fromTheme(QLatin1String("user-trash"));
+ case Network:
+ return QIcon::fromTheme(QLatin1String("network-workgroup"));
+ case Drive:
+ return QIcon::fromTheme(QLatin1String("drive-harddisk"));
+ case Folder:
+ return QIcon::fromTheme(QLatin1String("folder"));
+ case File:
+ return QIcon::fromTheme(QLatin1String("text-x-generic"));
+ // no default on purpose; we want warnings when the type enum is extended
+ }
+ return QIcon::fromTheme(QLatin1String("text-x-generic"));
}
/*!
- Returns an icon for the file described by \a info.
+ Returns an icon for the file described by \a info, using the
+ current icon theme.
+
+ \sa QIcon::fromTheme
*/
QIcon QAbstractFileIconProvider::icon(const QFileInfo &info) const
{
- Q_UNUSED(info);
- return {};
+ Q_D(const QAbstractFileIconProvider);
+ if (info.isRoot())
+ return icon(Drive);
+ if (info.isDir())
+ return icon(Folder);
+ return QIcon::fromTheme(d->mimeDatabase.mimeTypeForFile(info).iconName());
}
/*!
@@ -152,6 +183,7 @@ QIcon QAbstractFileIconProvider::icon(const QFileInfo &info) const
QString QAbstractFileIconProvider::type(const QFileInfo &info) const
{
+ Q_D(const QAbstractFileIconProvider);
/* ### Qt 6 These string translations being in the QFileDialog context is not ideal,
but translating them in QFileDialog context only in the QFileIconProvider subclass
isn't either (it basically requires a duplication of the entire function).
@@ -162,12 +194,8 @@ QString QAbstractFileIconProvider::type(const QFileInfo &info) const
if (QFileSystemEntry::isRootPath(info.absoluteFilePath()))
return QGuiApplication::translate("QFileDialog", "Drive");
if (info.isFile()) {
- // ### could use QMimeDatabase::mimeTypeForFile(const QFileInfo&) here
- if (!info.suffix().isEmpty()) {
- //: %1 is a file name suffix, for example txt
- return QGuiApplication::translate("QFileDialog", "%1 File").arg(info.suffix());
- }
- return QGuiApplication::translate("QFileDialog", "File");
+ const QMimeType mimeType = d->mimeDatabase.mimeTypeForFile(info);
+ return mimeType.comment().isEmpty() ? mimeType.name() : mimeType.comment();
}
if (info.isDir())
diff --git a/src/gui/image/qabstractfileiconprovider_p.h b/src/gui/image/qabstractfileiconprovider_p.h
index db7ac6db1b..53ad4826eb 100644
--- a/src/gui/image/qabstractfileiconprovider_p.h
+++ b/src/gui/image/qabstractfileiconprovider_p.h
@@ -52,6 +52,7 @@
//
#include <QtGui/private/qtguiglobal_p.h>
+#include <QtCore/QMimeDatabase>
#include "qabstractfileiconprovider.h"
QT_BEGIN_NAMESPACE
@@ -66,6 +67,8 @@ public:
QAbstractFileIconProvider *q_ptr = nullptr;
QAbstractFileIconProvider::Options options = {};
+
+ QMimeDatabase mimeDatabase;
};
QT_END_NAMESPACE