From 710ff392d95fb2888c14ea273f4d65ced908fe49 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 26 Aug 2016 11:57:21 +0200 Subject: QIcon::addFile(): Invoke QMimeDatabase when matching by suffix fails This will detect image files correctly even if case resource aliases without suffixed are used. Task-number: QTBUG-55388 Change-Id: I337ca1f6be7126fe731e5e278b23aaef6cdfd9ef Reviewed-by: Eirik Aavitsland --- src/gui/image/qicon.cpp | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/gui/image/qicon.cpp b/src/gui/image/qicon.cpp index 62ec8e93b2..716a7c52c2 100644 --- a/src/gui/image/qicon.cpp +++ b/src/gui/image/qicon.cpp @@ -47,6 +47,8 @@ #include "private/qiconloader_p.h" #include "qpainter.h" #include "qfileinfo.h" +#include +#include #include "qpixmapcache.h" #include "qvariant.h" #include "qcache.h" @@ -976,6 +978,18 @@ void QIcon::addPixmap(const QPixmap &pixmap, Mode mode, State state) d->engine->addPixmap(pixmap, mode, state); } +static QIconEngine *iconEngineFromSuffix(const QString &fileName, const QString &suffix) +{ + if (!suffix.isEmpty()) { + const int index = loader()->indexOf(suffix); + if (index != -1) { + if (QIconEnginePlugin *factory = qobject_cast(loader()->instance(index))) { + return factory->create(fileName); + } + } + } + return nullptr; +} /*! Adds an image from the file with the given \a fileName to the icon, as a specialization for \a size, \a mode and \a state. The @@ -1013,25 +1027,15 @@ void QIcon::addFile(const QString &fileName, const QSize &size, Mode mode, State return; detach(); if (!d) { + QFileInfo info(fileName); - QString suffix = info.suffix(); - if (!suffix.isEmpty()) { - // first try version 2 engines.. - const int index = loader()->indexOf(suffix); - if (index != -1) { - if (QIconEnginePlugin *factory = qobject_cast(loader()->instance(index))) { - if (QIconEngine *engine = factory->create(fileName)) { - d = new QIconPrivate; - d->engine = engine; - } - } - } - } - // ...then fall back to the default engine - if (!d) { - d = new QIconPrivate; - d->engine = new QPixmapIconEngine; - } + QIconEngine *engine = iconEngineFromSuffix(fileName, info.suffix()); +#ifndef QT_NO_MIMETYPE + if (!engine) + engine = iconEngineFromSuffix(fileName, QMimeDatabase().mimeTypeForFile(info).preferredSuffix()); +#endif // !QT_NO_MIMETYPE + d = new QIconPrivate; + d->engine = engine ? engine : new QPixmapIconEngine; } d->engine->addFile(fileName, size, mode, state); -- cgit v1.2.3