From 6c06e14a49773ce5572935864ed6b9be219c6103 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <ogoffart@woboq.com>
Date: Mon, 14 May 2012 18:02:16 +0200
Subject: [PATCH] QIcon: move back to QtGui

 -  Move the files and tests
git mv src/widgets/kernel/qicon* qrc/gui/image/
git mv tests/auto/widgets/kernel/qicon/ tests/auto/gui/image/

 - update the include of QIcon
git grep -O"sed -i s,QtWidgets/qicon,QtGui/qicon," "QtWidgets/qicon"
git grep -O"sed -i s,QtWidgets/QIcon,QtGui/QIcon," "QtWidgets/QIcon"

 - Adapt QIcon \ingroup documentation
sed -i s/QtWidgets/QtGui/ src/gui/images/qicon*

 - Adapt export macro
sed -i s/Q_WIDGETS_EXPORT/Q_GUI_EXPORT/g src/gui/image/qicon*

 - Update .pri and .pro files

 - Remove the use of QStyle::alignedRect by copying its content (and
   adapt slightly

 - Use QGuiApplication::palette() instead of QApplication::palette()

 - Add a hook in QGuiApplicationPrivate to call the
   QStyle::generatedIconPixmap() from QtWidgets

Another commit follows to adjust QMetaType::Icon and move the QVariant
and QMetaType icon handler back in QtGui

Change-Id: I1b63759f892ebc02dfc30f41bb6e76e0b7451182
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Reviewed-by: Girish Ramakrishnan <girish.1.ramakrishnan@nokia.com>
---
 src/gui/image/image.pri                       |  12 ++++-
 src/{widgets/kernel => gui/image}/qicon.cpp   |  41 ++++++++++++------
 src/{widgets/kernel => gui/image}/qicon.h     |  12 ++---
 src/{widgets/kernel => gui/image}/qicon_p.h   |   4 +-
 .../kernel => gui/image}/qiconengine.cpp      |   4 +-
 .../kernel => gui/image}/qiconengine.h        |   4 +-
 .../image}/qiconengineplugin.cpp              |   2 +-
 .../kernel => gui/image}/qiconengineplugin.h  |   4 +-
 .../kernel => gui/image}/qiconloader.cpp      |  16 +++----
 .../kernel => gui/image}/qiconloader_p.h      |   6 +--
 src/gui/kernel/qguiapplication_p.h            |   4 ++
 src/testlib/qtest_gui.h                       |   2 +-
 src/widgets/dialogs/qfilesystemmodel.h        |   2 +-
 src/widgets/dialogs/qmessagebox.cpp           |   2 +-
 src/widgets/itemviews/qfileiconprovider.h     |   2 +-
 src/widgets/itemviews/qstandarditemmodel.h    |   2 +-
 src/widgets/kernel/kernel.pri                 |   9 ----
 src/widgets/kernel/qaction.h                  |   2 +-
 src/widgets/kernel/qapplication.cpp           |   8 ++++
 src/widgets/kernel/qapplication_p.h           |   1 +
 src/widgets/styles/qstyle.h                   |   2 +-
 src/widgets/styles/qstyleoption.h             |   2 +-
 src/widgets/util/qsystemtrayicon.h            |   2 +-
 src/widgets/util/qundoview.cpp                |   2 +-
 src/widgets/widgets/qabstractbutton.h         |   2 +-
 src/widgets/widgets/qmenu.h                   |   2 +-
 src/widgets/widgets/qtabwidget.h              |   2 +-
 src/widgets/widgets/qtoolbox.h                |   2 +-
 tests/auto/gui/image/image.pro                |   1 +
 .../kernel => gui/image}/qicon/.gitignore     |   0
 .../16x16/actions/appointment-new.png         | Bin
 .../22x22/actions/appointment-new.png         | Bin
 .../32x32/actions/appointment-new.png         | Bin
 .../image}/qicon/icons/testtheme/index.theme  |   0
 .../testtheme/scalable/actions/svg-only.svg   |   0
 .../16x16/actions/address-book-new.png        | Bin
 .../16x16/actions/appointment-new.png         | Bin
 .../22x22/actions/address-book-new.png        | Bin
 .../22x22/actions/appointment-new.png         | Bin
 .../32x32/actions/address-book-new.png        | Bin
 .../32x32/actions/appointment-new.png         | Bin
 .../qicon/icons/themeparent/index.theme       |   0
 .../scalable/actions/address-book-new.svg     |   0
 .../scalable/actions/appointment-new.svg      |   0
 .../kernel => gui/image}/qicon/image.png      | Bin
 .../kernel => gui/image}/qicon/qicon.pro      |   0
 .../kernel => gui/image}/qicon/rect.png       | Bin
 .../kernel => gui/image}/qicon/tst_qicon.cpp  |   0
 .../kernel => gui/image}/qicon/tst_qicon.qrc  |   0
 tests/auto/widgets/kernel/kernel.pro          |   1 -
 50 files changed, 92 insertions(+), 65 deletions(-)
 rename src/{widgets/kernel => gui/image}/qicon.cpp (95%)
 rename src/{widgets/kernel => gui/image}/qicon.h (92%)
 rename src/{widgets/kernel => gui/image}/qicon_p.h (98%)
 rename src/{widgets/kernel => gui/image}/qiconengine.cpp (99%)
 rename src/{widgets/kernel => gui/image}/qiconengine.h (97%)
 rename src/{widgets/kernel => gui/image}/qiconengineplugin.cpp (99%)
 rename src/{widgets/kernel => gui/image}/qiconengineplugin.h (93%)
 rename src/{widgets/kernel => gui/image}/qiconloader.cpp (97%)
 rename src/{widgets/kernel => gui/image}/qiconloader_p.h (98%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/.gitignore (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/icons/testtheme/16x16/actions/appointment-new.png (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/icons/testtheme/22x22/actions/appointment-new.png (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/icons/testtheme/32x32/actions/appointment-new.png (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/icons/testtheme/index.theme (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/icons/testtheme/scalable/actions/svg-only.svg (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/icons/themeparent/16x16/actions/address-book-new.png (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/icons/themeparent/16x16/actions/appointment-new.png (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/icons/themeparent/22x22/actions/address-book-new.png (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/icons/themeparent/22x22/actions/appointment-new.png (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/icons/themeparent/32x32/actions/address-book-new.png (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/icons/themeparent/32x32/actions/appointment-new.png (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/icons/themeparent/index.theme (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/icons/themeparent/scalable/actions/address-book-new.svg (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/icons/themeparent/scalable/actions/appointment-new.svg (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/image.png (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/qicon.pro (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/rect.png (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/tst_qicon.cpp (100%)
 rename tests/auto/{widgets/kernel => gui/image}/qicon/tst_qicon.qrc (100%)

diff --git a/src/gui/image/image.pri b/src/gui/image/image.pri
index 737b7fcbd46..6b306ddaad4 100644
--- a/src/gui/image/image.pri
+++ b/src/gui/image/image.pri
@@ -23,6 +23,11 @@ HEADERS += \
         image/qpixmapcache_p.h \
         image/qplatformpixmap.h \
         image/qimagepixmapcleanuphooks_p.h \
+        image/qicon.h \
+        image/qicon_p.h \
+        image/qiconloader_p.h \
+        image/qiconengine.h \
+        image/qiconengineplugin.h \
 
 SOURCES += \
         image/qbitmap.cpp \
@@ -40,7 +45,12 @@ SOURCES += \
         image/qpixmap_raster.cpp \
         image/qpixmap_blitter.cpp \
         image/qnativeimage.cpp \
-        image/qimagepixmapcleanuphooks.cpp
+        image/qimagepixmapcleanuphooks.cpp \
+        image/qicon.cpp \
+        image/qiconloader.cpp \
+        image/qiconengine.cpp \
+        image/qiconengineplugin.cpp \
+
 
 win32: SOURCES += image/qpixmap_win.cpp
 
diff --git a/src/widgets/kernel/qicon.cpp b/src/gui/image/qicon.cpp
similarity index 95%
rename from src/widgets/kernel/qicon.cpp
rename to src/gui/image/qicon.cpp
index 448b6a8cfd2..c2139c33369 100644
--- a/src/widgets/kernel/qicon.cpp
+++ b/src/gui/image/qicon.cpp
@@ -45,15 +45,13 @@
 #include "qiconengineplugin.h"
 #include "private/qfactoryloader_p.h"
 #include "private/qiconloader_p.h"
-#include "qstyleoption.h"
 #include "qpainter.h"
 #include "qfileinfo.h"
-#include "qstyle.h"
 #include "qpixmapcache.h"
 #include "qvariant.h"
 #include "qcache.h"
 #include "qdebug.h"
-#include "qapplication.h"
+#include "qpalette.h"
 
 #ifdef Q_WS_MAC
 #include <private/qt_mac_p.h>
@@ -61,6 +59,7 @@
 #endif
 
 #include "private/qhexstring_p.h"
+#include "private/qguiapplication_p.h"
 
 #ifndef QT_NO_ICON
 QT_BEGIN_NAMESPACE
@@ -265,11 +264,10 @@ QPixmap QPixmapIconEngine::pixmap(const QSize &size, QIcon::Mode mode, QIcon::St
     if (!actualSize.isNull() && (actualSize.width() > size.width() || actualSize.height() > size.height()))
         actualSize.scale(size, Qt::KeepAspectRatio);
 
-    // #### Qt5 no idea what this really does, but we need to remove the QApp and style references
     QString key = QLatin1String("qt_")
                   % HexString<quint64>(pm.cacheKey())
                   % HexString<uint>(pe->mode)
-                  % HexString<quint64>(QApplication::palette().cacheKey())
+                  % HexString<quint64>(QGuiApplication::palette().cacheKey())
                   % HexString<uint>(actualSize.width())
                   % HexString<uint>(actualSize.height());
 
@@ -277,9 +275,9 @@ QPixmap QPixmapIconEngine::pixmap(const QSize &size, QIcon::Mode mode, QIcon::St
         if (QPixmapCache::find(key % HexString<uint>(mode), pm))
             return pm; // horray
         if (QPixmapCache::find(key % HexString<uint>(QIcon::Normal), pm)) {
-            QStyleOption opt(0);
-            opt.palette = QApplication::palette();
-            QPixmap active = QApplication::style()->generatedIconPixmap(QIcon::Active, pm, &opt);
+            QPixmap active = pm;
+            if (QGuiApplication *guiApp = qobject_cast<QGuiApplication *>(qApp))
+                active = static_cast<QGuiApplicationPrivate*>(QObjectPrivate::get(guiApp))->applyQIconStyleHelper(QIcon::Active, pm);
             if (pm.cacheKey() == active.cacheKey())
                 return pm;
         }
@@ -289,9 +287,9 @@ QPixmap QPixmapIconEngine::pixmap(const QSize &size, QIcon::Mode mode, QIcon::St
         if (pm.size() != actualSize)
             pm = pm.scaled(actualSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
         if (pe->mode != mode && mode != QIcon::Normal) {
-            QStyleOption opt(0);
-            opt.palette = QApplication::palette();
-            QPixmap generated = QApplication::style()->generatedIconPixmap(mode, pm, &opt);
+            QPixmap generated = pm;
+            if (QGuiApplication *guiApp = qobject_cast<QGuiApplication *>(qApp))
+                generated = static_cast<QGuiApplicationPrivate*>(QObjectPrivate::get(guiApp))->applyQIconStyleHelper(mode, pm);
             if (!generated.isNull())
                 pm = generated;
         }
@@ -457,7 +455,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
 
   \ingroup painting
   \ingroup shared
-  \inmodule QtWidgets
+  \inmodule QtGui
 
   A QIcon can generate smaller, larger, active, and disabled pixmaps
   from the set of pixmaps it is given. Such pixmaps are used by Qt
@@ -710,7 +708,24 @@ void QIcon::paint(QPainter *painter, const QRect &rect, Qt::Alignment alignment,
 {
     if (!d || !painter)
         return;
-    QRect alignedRect = QStyle::alignedRect(painter->layoutDirection(), alignment, d->engine->actualSize(rect.size(), mode, state), rect);
+
+    // Copy of QStyle::alignedRect
+    const QSize size = d->engine->actualSize(rect.size(), mode, state);
+    alignment = QGuiApplicationPrivate::visualAlignment(painter->layoutDirection(), alignment);
+    int x = rect.x();
+    int y = rect.y();
+    int w = size.width();
+    int h = size.height();
+    if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter)
+        y += rect.size().height()/2 - h/2;
+    else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom)
+        y += rect.size().height() - h;
+    if ((alignment & Qt::AlignRight) == Qt::AlignRight)
+        x += rect.size().width() - w;
+    else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter)
+        x += rect.size().width()/2 - w/2;
+    QRect alignedRect(x, y, w, h);
+
     d->engine->paint(painter, alignedRect, mode, state);
 }
 
diff --git a/src/widgets/kernel/qicon.h b/src/gui/image/qicon.h
similarity index 92%
rename from src/widgets/kernel/qicon.h
rename to src/gui/image/qicon.h
index c6e07ba3e25..264b672c8c0 100644
--- a/src/widgets/kernel/qicon.h
+++ b/src/gui/image/qicon.h
@@ -55,7 +55,7 @@ QT_BEGIN_NAMESPACE
 class QIconPrivate;
 class QIconEngine;
 
-class Q_WIDGETS_EXPORT QIcon
+class Q_GUI_EXPORT QIcon
 {
 public:
     enum Mode { Normal, Disabled, Active, Selected };
@@ -118,8 +118,8 @@ public:
 private:
     QIconPrivate *d;
 #if !defined(QT_NO_DATASTREAM)
-    friend Q_WIDGETS_EXPORT QDataStream &operator<<(QDataStream &, const QIcon &);
-    friend Q_WIDGETS_EXPORT QDataStream &operator>>(QDataStream &, QIcon &);
+    friend Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QIcon &);
+    friend Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QIcon &);
 #endif
 
 public:
@@ -131,12 +131,12 @@ Q_DECLARE_SHARED(QIcon)
 Q_DECLARE_TYPEINFO(QIcon, Q_MOVABLE_TYPE);
 
 #if !defined(QT_NO_DATASTREAM)
-Q_WIDGETS_EXPORT QDataStream &operator<<(QDataStream &, const QIcon &);
-Q_WIDGETS_EXPORT QDataStream &operator>>(QDataStream &, QIcon &);
+Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QIcon &);
+Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QIcon &);
 #endif
 
 #ifndef QT_NO_DEBUG_STREAM
-Q_WIDGETS_EXPORT QDebug operator<<(QDebug dbg, const QIcon &);
+Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QIcon &);
 #endif
 
 QT_END_NAMESPACE
diff --git a/src/widgets/kernel/qicon_p.h b/src/gui/image/qicon_p.h
similarity index 98%
rename from src/widgets/kernel/qicon_p.h
rename to src/gui/image/qicon_p.h
index 37c4b7cb1f4..b8b1f001fe8 100644
--- a/src/widgets/kernel/qicon_p.h
+++ b/src/gui/image/qicon_p.h
@@ -57,8 +57,8 @@
 #include <QtCore/qsize.h>
 #include <QtCore/qlist.h>
 #include <QtGui/qpixmap.h>
-#include <QtWidgets/qicon.h>
-#include <QtWidgets/qiconengine.h>
+#include <QtGui/qicon.h>
+#include <QtGui/qiconengine.h>
 
 #ifndef QT_NO_ICON
 QT_BEGIN_NAMESPACE
diff --git a/src/widgets/kernel/qiconengine.cpp b/src/gui/image/qiconengine.cpp
similarity index 99%
rename from src/widgets/kernel/qiconengine.cpp
rename to src/gui/image/qiconengine.cpp
index 0a2d92ed699..2b7fdb9bdc7 100644
--- a/src/widgets/kernel/qiconengine.cpp
+++ b/src/gui/image/qiconengine.cpp
@@ -50,7 +50,7 @@ QT_BEGIN_NAMESPACE
   \brief The QIconEngine class provides an abstract base class for QIcon renderers.
 
   \ingroup painting
-  \inmodule QtWidgets
+  \inmodule QtGui
 
   An icon engine provides the rendering functions for a QIcon. Each icon has a
   corresponding icon engine that is responsible for drawing the icon with a
@@ -158,7 +158,7 @@ void QIconEngine::addFile(const QString &/*fileName*/, const QSize &/*size*/, QI
     \class QIconEngine::AvailableSizesArgument
     \since 4.5
 
-    \inmodule QtWidgets
+    \inmodule QtGui
 
     This struct represents arguments to virtual_hook() function when
     \a id parameter is QIconEngine::AvailableSizesHook.
diff --git a/src/widgets/kernel/qiconengine.h b/src/gui/image/qiconengine.h
similarity index 97%
rename from src/widgets/kernel/qiconengine.h
rename to src/gui/image/qiconengine.h
index acadef97c33..e47f86713a1 100644
--- a/src/widgets/kernel/qiconengine.h
+++ b/src/gui/image/qiconengine.h
@@ -44,14 +44,14 @@
 
 #include <QtCore/qglobal.h>
 #include <QtCore/qlist.h>
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 
 QT_BEGIN_HEADER
 
 QT_BEGIN_NAMESPACE
 
 
-class Q_WIDGETS_EXPORT QIconEngine
+class Q_GUI_EXPORT QIconEngine
 {
 public:
     virtual ~QIconEngine();
diff --git a/src/widgets/kernel/qiconengineplugin.cpp b/src/gui/image/qiconengineplugin.cpp
similarity index 99%
rename from src/widgets/kernel/qiconengineplugin.cpp
rename to src/gui/image/qiconengineplugin.cpp
index 26c9e7890a4..29953a468e8 100644
--- a/src/widgets/kernel/qiconengineplugin.cpp
+++ b/src/gui/image/qiconengineplugin.cpp
@@ -49,7 +49,7 @@ QT_BEGIN_NAMESPACE
     \brief The QIconEnginePlugin class provides an abstract base for custom QIconEngine plugins.
 
     \ingroup plugins
-    \inmodule QtWidgets
+    \inmodule QtGui
 
     \b {Use QIconEnginePluginV2 instead.}
 
diff --git a/src/widgets/kernel/qiconengineplugin.h b/src/gui/image/qiconengineplugin.h
similarity index 93%
rename from src/widgets/kernel/qiconengineplugin.h
rename to src/gui/image/qiconengineplugin.h
index a30c5475ba6..93334006094 100644
--- a/src/widgets/kernel/qiconengineplugin.h
+++ b/src/gui/image/qiconengineplugin.h
@@ -52,7 +52,7 @@ QT_BEGIN_NAMESPACE
 
 class QIconEngine;
 
-struct Q_WIDGETS_EXPORT QIconEngineFactoryInterface : public QFactoryInterface
+struct Q_GUI_EXPORT QIconEngineFactoryInterface : public QFactoryInterface
 {
     virtual QIconEngine *create(const QString &filename = QString()) = 0;
 };
@@ -61,7 +61,7 @@ struct Q_WIDGETS_EXPORT QIconEngineFactoryInterface : public QFactoryInterface
     "org.qt-project.Qt.QIconEngineFactoryInterface"
 Q_DECLARE_INTERFACE(QIconEngineFactoryInterface, QIconEngineFactoryInterface_iid)
 
-class Q_WIDGETS_EXPORT QIconEnginePlugin : public QObject, public QIconEngineFactoryInterface
+class Q_GUI_EXPORT QIconEnginePlugin : public QObject, public QIconEngineFactoryInterface
 {
     Q_OBJECT
     Q_INTERFACES(QIconEngineFactoryInterface:QFactoryInterface)
diff --git a/src/widgets/kernel/qiconloader.cpp b/src/gui/image/qiconloader.cpp
similarity index 97%
rename from src/widgets/kernel/qiconloader.cpp
rename to src/gui/image/qiconloader.cpp
index acbf7c1d074..71b286b2ff6 100644
--- a/src/widgets/kernel/qiconloader.cpp
+++ b/src/gui/image/qiconloader.cpp
@@ -43,14 +43,12 @@
 
 #include <private/qguiapplication_p.h>
 #include <private/qicon_p.h>
-#include <private/qguiapplication_p.h>
 
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QIconEnginePlugin>
+#include <QtGui/QIconEnginePlugin>
 #include <QtGui/QPixmapCache>
 #include <qpa/qplatformtheme.h>
-#include <QtWidgets/QIconEngine>
-#include <QtWidgets/QStyleOption>
+#include <QtGui/QIconEngine>
+#include <QtGui/QPalette>
 #include <QtCore/QList>
 #include <QtCore/QHash>
 #include <QtCore/QDir>
@@ -510,16 +508,16 @@ QPixmap PixmapEntry::pixmap(const QSize &size, QIcon::Mode mode, QIcon::State st
     QString key = QLatin1String("$qt_theme_")
                   % HexString<qint64>(basePixmap.cacheKey())
                   % HexString<int>(mode)
-                  % HexString<qint64>(qApp->palette().cacheKey())
+                  % HexString<qint64>(QGuiApplication::palette().cacheKey())
                   % HexString<int>(actualSize);
 
     QPixmap cachedPixmap;
     if (QPixmapCache::find(key, &cachedPixmap)) {
         return cachedPixmap;
     } else {
-        QStyleOption opt(0);
-        opt.palette = qApp->palette();
-        cachedPixmap = qApp->style()->generatedIconPixmap(mode, basePixmap, &opt);
+        cachedPixmap = basePixmap;
+        if (QGuiApplication *guiApp = qobject_cast<QGuiApplication *>(qApp))
+            cachedPixmap = static_cast<QGuiApplicationPrivate*>(QObjectPrivate::get(guiApp))->applyQIconStyleHelper(mode, basePixmap);
         QPixmapCache::insert(key, cachedPixmap);
     }
     return cachedPixmap;
diff --git a/src/widgets/kernel/qiconloader_p.h b/src/gui/image/qiconloader_p.h
similarity index 98%
rename from src/widgets/kernel/qiconloader_p.h
rename to src/gui/image/qiconloader_p.h
index 1b9043675bb..bd990d0d53b 100644
--- a/src/widgets/kernel/qiconloader_p.h
+++ b/src/gui/image/qiconloader_p.h
@@ -54,8 +54,8 @@
 // We mean it.
 //
 
-#include <QtWidgets/QIcon>
-#include <QtWidgets/QIconEngine>
+#include <QtGui/QIcon>
+#include <QtGui/QIconEngine>
 #include <QtGui/QPixmapCache>
 #include <private/qicon_p.h>
 #include <private/qfactoryloader_p.h>
@@ -153,7 +153,7 @@ private:
     bool m_valid;
 };
 
-class QIconLoader : public QObject
+class Q_GUI_EXPORT QIconLoader : public QObject
 {
 public:
     QIconLoader();
diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h
index ff1a88051c8..bab3ecc997c 100644
--- a/src/gui/kernel/qguiapplication_p.h
+++ b/src/gui/kernel/qguiapplication_p.h
@@ -52,6 +52,7 @@
 #include <QWindowSystemInterface>
 #include "private/qwindowsysteminterface_qpa_p.h"
 #include "private/qshortcutmap_p.h"
+#include <qicon.h>
 
 QT_BEGIN_HEADER
 
@@ -213,6 +214,9 @@ public:
 
     const QDrawHelperGammaTables *gammaTables();
 
+    // hook reimplemented in QApplication to apply the QStyle function on the QIcon
+    virtual QPixmap applyQIconStyleHelper(QIcon::Mode, const QPixmap &basePixmap) const { return basePixmap; }
+
 protected:
     virtual void notifyThemeChanged();
 
diff --git a/src/testlib/qtest_gui.h b/src/testlib/qtest_gui.h
index 24abd00e0fc..684b876fcda 100644
--- a/src/testlib/qtest_gui.h
+++ b/src/testlib/qtest_gui.h
@@ -61,7 +61,7 @@
 #include <QtGui/qimage.h>
 
 #ifdef QT_WIDGETS_LIB
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 #endif
 
 #if 0
diff --git a/src/widgets/dialogs/qfilesystemmodel.h b/src/widgets/dialogs/qfilesystemmodel.h
index 875044e7857..8e1d8b973b7 100644
--- a/src/widgets/dialogs/qfilesystemmodel.h
+++ b/src/widgets/dialogs/qfilesystemmodel.h
@@ -45,7 +45,7 @@
 #include <QtCore/qabstractitemmodel.h>
 #include <QtCore/qpair.h>
 #include <QtCore/qdir.h>
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 #include <QtCore/qdiriterator.h>
 
 QT_BEGIN_HEADER
diff --git a/src/widgets/dialogs/qmessagebox.cpp b/src/widgets/dialogs/qmessagebox.cpp
index cb32de4bca3..2b1d516ab7c 100644
--- a/src/widgets/dialogs/qmessagebox.cpp
+++ b/src/widgets/dialogs/qmessagebox.cpp
@@ -54,7 +54,7 @@
 #include <QtWidgets/qdesktopwidget.h>
 #include <QtWidgets/qpushbutton.h>
 #include <QtGui/qaccessible.h>
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 #include <QtGui/qtextdocument.h>
 #include <QtWidgets/qapplication.h>
 #include <QtWidgets/qtextedit.h>
diff --git a/src/widgets/itemviews/qfileiconprovider.h b/src/widgets/itemviews/qfileiconprovider.h
index 85cbf32abc7..a78ccbeda23 100644
--- a/src/widgets/itemviews/qfileiconprovider.h
+++ b/src/widgets/itemviews/qfileiconprovider.h
@@ -44,7 +44,7 @@
 
 #include <QtCore/qfileinfo.h>
 #include <QtCore/qscopedpointer.h>
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 
 QT_BEGIN_HEADER
 
diff --git a/src/widgets/itemviews/qstandarditemmodel.h b/src/widgets/itemviews/qstandarditemmodel.h
index 767665fd945..2f449ab97a2 100644
--- a/src/widgets/itemviews/qstandarditemmodel.h
+++ b/src/widgets/itemviews/qstandarditemmodel.h
@@ -45,7 +45,7 @@
 #include <QtCore/qabstractitemmodel.h>
 #include <QtGui/qbrush.h>
 #include <QtGui/qfont.h>
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 #ifndef QT_NO_DATASTREAM
 #include <QtCore/qdatastream.h>
 #endif
diff --git a/src/widgets/kernel/kernel.pri b/src/widgets/kernel/kernel.pri
index 9e3d82ea122..c4853bd369c 100644
--- a/src/widgets/kernel/kernel.pri
+++ b/src/widgets/kernel/kernel.pri
@@ -15,11 +15,6 @@ HEADERS += \
 	kernel/qdesktopwidget.h \
 	kernel/qformlayout.h \
 	kernel/qgridlayout.h \
-        kernel/qicon.h \
-        kernel/qicon_p.h \
-        kernel/qiconloader_p.h \
-        kernel/qiconengine.h \
-        kernel/qiconengineplugin.h \
         kernel/qlayout.h \
 	kernel/qlayout_p.h \
 	kernel/qlayoutengine_p.h \
@@ -52,10 +47,6 @@ SOURCES += \
         kernel/qboxlayout.cpp \
 	kernel/qformlayout.cpp \
 	kernel/qgridlayout.cpp \
-        kernel/qicon.cpp \
-        kernel/qiconloader.cpp \
-        kernel/qiconengine.cpp \
-        kernel/qiconengineplugin.cpp \
         kernel/qlayout.cpp \
 	kernel/qlayoutengine.cpp \
 	kernel/qlayoutitem.cpp \
diff --git a/src/widgets/kernel/qaction.h b/src/widgets/kernel/qaction.h
index 485b5928b0b..bb7de852c11 100644
--- a/src/widgets/kernel/qaction.h
+++ b/src/widgets/kernel/qaction.h
@@ -46,7 +46,7 @@
 #include <QtCore/qstring.h>
 #include <QtWidgets/qwidget.h>
 #include <QtCore/qvariant.h>
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 
 QT_BEGIN_HEADER
 
diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp
index fc6768efd06..cfad6fb5f9b 100644
--- a/src/widgets/kernel/qapplication.cpp
+++ b/src/widgets/kernel/qapplication.cpp
@@ -4510,6 +4510,14 @@ QGestureManager* QGestureManager::instance()
 }
 #endif // QT_NO_GESTURES
 
+QPixmap QApplicationPrivate::applyQIconStyleHelper(QIcon::Mode mode, const QPixmap& base) const
+{
+    Q_Q(const QApplication);
+    QStyleOption opt(0);
+    opt.palette = q->palette();
+    return q->style()->generatedIconPixmap(mode, base, &opt);
+}
+
 QT_END_NAMESPACE
 
 #include "moc_qapplication.cpp"
diff --git a/src/widgets/kernel/qapplication_p.h b/src/widgets/kernel/qapplication_p.h
index 63862269d6e..891d71a7378 100644
--- a/src/widgets/kernel/qapplication_p.h
+++ b/src/widgets/kernel/qapplication_p.h
@@ -374,6 +374,7 @@ public:
                                        ulong timestamp);
     static void translateTouchCancel(QTouchDevice *device, ulong timestamp);
 
+    QPixmap applyQIconStyleHelper(QIcon::Mode mode, const QPixmap& base) const;
 private:
 #ifdef Q_WS_QWS
     QHash<const QScreen*, QRect> maxWindowRects;
diff --git a/src/widgets/styles/qstyle.h b/src/widgets/styles/qstyle.h
index aebfea3620a..f56919a37fa 100644
--- a/src/widgets/styles/qstyle.h
+++ b/src/widgets/styles/qstyle.h
@@ -45,7 +45,7 @@
 #include <QtCore/qobject.h>
 #include <QtCore/qrect.h>
 #include <QtCore/qsize.h>
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 #include <QtGui/qpixmap.h>
 #include <QtGui/qpalette.h>
 #include <QtWidgets/qsizepolicy.h>
diff --git a/src/widgets/styles/qstyleoption.h b/src/widgets/styles/qstyleoption.h
index 588898637f0..ea039fff198 100644
--- a/src/widgets/styles/qstyleoption.h
+++ b/src/widgets/styles/qstyleoption.h
@@ -44,7 +44,7 @@
 
 #include <QtCore/qvariant.h>
 #include <QtWidgets/qabstractspinbox.h>
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 #include <QtGui/qmatrix.h>
 #include <QtWidgets/qslider.h>
 #include <QtWidgets/qstyle.h>
diff --git a/src/widgets/util/qsystemtrayicon.h b/src/widgets/util/qsystemtrayicon.h
index 96f9a1d2f4f..b2ca5f0a34e 100644
--- a/src/widgets/util/qsystemtrayicon.h
+++ b/src/widgets/util/qsystemtrayicon.h
@@ -46,7 +46,7 @@
 
 #ifndef QT_NO_SYSTEMTRAYICON
 
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 
 QT_BEGIN_HEADER
 
diff --git a/src/widgets/util/qundoview.cpp b/src/widgets/util/qundoview.cpp
index 2a88b509170..e169437af3a 100644
--- a/src/widgets/util/qundoview.cpp
+++ b/src/widgets/util/qundoview.cpp
@@ -47,7 +47,7 @@
 #include "qundogroup.h"
 #include <QtCore/qabstractitemmodel.h>
 #include <QtCore/qpointer.h>
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 #include <private/qlistview_p.h>
 
 QT_BEGIN_NAMESPACE
diff --git a/src/widgets/widgets/qabstractbutton.h b/src/widgets/widgets/qabstractbutton.h
index 37a37f6de4a..5be27a2ecbb 100644
--- a/src/widgets/widgets/qabstractbutton.h
+++ b/src/widgets/widgets/qabstractbutton.h
@@ -42,7 +42,7 @@
 #ifndef QABSTRACTBUTTON_H
 #define QABSTRACTBUTTON_H
 
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 #include <QtGui/qkeysequence.h>
 #include <QtWidgets/qwidget.h>
 
diff --git a/src/widgets/widgets/qmenu.h b/src/widgets/widgets/qmenu.h
index e98df595d11..5f4b2138221 100644
--- a/src/widgets/widgets/qmenu.h
+++ b/src/widgets/widgets/qmenu.h
@@ -44,7 +44,7 @@
 
 #include <QtWidgets/qwidget.h>
 #include <QtCore/qstring.h>
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 #include <QtWidgets/qaction.h>
 
 #ifdef Q_OS_WINCE
diff --git a/src/widgets/widgets/qtabwidget.h b/src/widgets/widgets/qtabwidget.h
index 4e8d4d4583a..8fc3bfa05d4 100644
--- a/src/widgets/widgets/qtabwidget.h
+++ b/src/widgets/widgets/qtabwidget.h
@@ -43,7 +43,7 @@
 #define QTABWIDGET_H
 
 #include <QtWidgets/qwidget.h>
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 
 QT_BEGIN_HEADER
 
diff --git a/src/widgets/widgets/qtoolbox.h b/src/widgets/widgets/qtoolbox.h
index 5732668b8f1..42f8b01f7b3 100644
--- a/src/widgets/widgets/qtoolbox.h
+++ b/src/widgets/widgets/qtoolbox.h
@@ -43,7 +43,7 @@
 #define QTOOLBOX_H
 
 #include <QtWidgets/qframe.h>
-#include <QtWidgets/qicon.h>
+#include <QtGui/qicon.h>
 
 QT_BEGIN_HEADER
 
diff --git a/tests/auto/gui/image/image.pro b/tests/auto/gui/image/image.pro
index 5a03063f47c..1ef52df4ba0 100644
--- a/tests/auto/gui/image/image.pro
+++ b/tests/auto/gui/image/image.pro
@@ -9,6 +9,7 @@ SUBDIRS=\
    qimagewriter \
    qmovie \
    qpicture \
+   qicon \
 
 !contains(QT_CONFIG, private_tests): SUBDIRS -= \
            qpixmapcache \
diff --git a/tests/auto/widgets/kernel/qicon/.gitignore b/tests/auto/gui/image/qicon/.gitignore
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/.gitignore
rename to tests/auto/gui/image/qicon/.gitignore
diff --git a/tests/auto/widgets/kernel/qicon/icons/testtheme/16x16/actions/appointment-new.png b/tests/auto/gui/image/qicon/icons/testtheme/16x16/actions/appointment-new.png
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/icons/testtheme/16x16/actions/appointment-new.png
rename to tests/auto/gui/image/qicon/icons/testtheme/16x16/actions/appointment-new.png
diff --git a/tests/auto/widgets/kernel/qicon/icons/testtheme/22x22/actions/appointment-new.png b/tests/auto/gui/image/qicon/icons/testtheme/22x22/actions/appointment-new.png
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/icons/testtheme/22x22/actions/appointment-new.png
rename to tests/auto/gui/image/qicon/icons/testtheme/22x22/actions/appointment-new.png
diff --git a/tests/auto/widgets/kernel/qicon/icons/testtheme/32x32/actions/appointment-new.png b/tests/auto/gui/image/qicon/icons/testtheme/32x32/actions/appointment-new.png
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/icons/testtheme/32x32/actions/appointment-new.png
rename to tests/auto/gui/image/qicon/icons/testtheme/32x32/actions/appointment-new.png
diff --git a/tests/auto/widgets/kernel/qicon/icons/testtheme/index.theme b/tests/auto/gui/image/qicon/icons/testtheme/index.theme
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/icons/testtheme/index.theme
rename to tests/auto/gui/image/qicon/icons/testtheme/index.theme
diff --git a/tests/auto/widgets/kernel/qicon/icons/testtheme/scalable/actions/svg-only.svg b/tests/auto/gui/image/qicon/icons/testtheme/scalable/actions/svg-only.svg
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/icons/testtheme/scalable/actions/svg-only.svg
rename to tests/auto/gui/image/qicon/icons/testtheme/scalable/actions/svg-only.svg
diff --git a/tests/auto/widgets/kernel/qicon/icons/themeparent/16x16/actions/address-book-new.png b/tests/auto/gui/image/qicon/icons/themeparent/16x16/actions/address-book-new.png
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/icons/themeparent/16x16/actions/address-book-new.png
rename to tests/auto/gui/image/qicon/icons/themeparent/16x16/actions/address-book-new.png
diff --git a/tests/auto/widgets/kernel/qicon/icons/themeparent/16x16/actions/appointment-new.png b/tests/auto/gui/image/qicon/icons/themeparent/16x16/actions/appointment-new.png
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/icons/themeparent/16x16/actions/appointment-new.png
rename to tests/auto/gui/image/qicon/icons/themeparent/16x16/actions/appointment-new.png
diff --git a/tests/auto/widgets/kernel/qicon/icons/themeparent/22x22/actions/address-book-new.png b/tests/auto/gui/image/qicon/icons/themeparent/22x22/actions/address-book-new.png
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/icons/themeparent/22x22/actions/address-book-new.png
rename to tests/auto/gui/image/qicon/icons/themeparent/22x22/actions/address-book-new.png
diff --git a/tests/auto/widgets/kernel/qicon/icons/themeparent/22x22/actions/appointment-new.png b/tests/auto/gui/image/qicon/icons/themeparent/22x22/actions/appointment-new.png
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/icons/themeparent/22x22/actions/appointment-new.png
rename to tests/auto/gui/image/qicon/icons/themeparent/22x22/actions/appointment-new.png
diff --git a/tests/auto/widgets/kernel/qicon/icons/themeparent/32x32/actions/address-book-new.png b/tests/auto/gui/image/qicon/icons/themeparent/32x32/actions/address-book-new.png
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/icons/themeparent/32x32/actions/address-book-new.png
rename to tests/auto/gui/image/qicon/icons/themeparent/32x32/actions/address-book-new.png
diff --git a/tests/auto/widgets/kernel/qicon/icons/themeparent/32x32/actions/appointment-new.png b/tests/auto/gui/image/qicon/icons/themeparent/32x32/actions/appointment-new.png
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/icons/themeparent/32x32/actions/appointment-new.png
rename to tests/auto/gui/image/qicon/icons/themeparent/32x32/actions/appointment-new.png
diff --git a/tests/auto/widgets/kernel/qicon/icons/themeparent/index.theme b/tests/auto/gui/image/qicon/icons/themeparent/index.theme
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/icons/themeparent/index.theme
rename to tests/auto/gui/image/qicon/icons/themeparent/index.theme
diff --git a/tests/auto/widgets/kernel/qicon/icons/themeparent/scalable/actions/address-book-new.svg b/tests/auto/gui/image/qicon/icons/themeparent/scalable/actions/address-book-new.svg
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/icons/themeparent/scalable/actions/address-book-new.svg
rename to tests/auto/gui/image/qicon/icons/themeparent/scalable/actions/address-book-new.svg
diff --git a/tests/auto/widgets/kernel/qicon/icons/themeparent/scalable/actions/appointment-new.svg b/tests/auto/gui/image/qicon/icons/themeparent/scalable/actions/appointment-new.svg
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/icons/themeparent/scalable/actions/appointment-new.svg
rename to tests/auto/gui/image/qicon/icons/themeparent/scalable/actions/appointment-new.svg
diff --git a/tests/auto/widgets/kernel/qicon/image.png b/tests/auto/gui/image/qicon/image.png
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/image.png
rename to tests/auto/gui/image/qicon/image.png
diff --git a/tests/auto/widgets/kernel/qicon/qicon.pro b/tests/auto/gui/image/qicon/qicon.pro
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/qicon.pro
rename to tests/auto/gui/image/qicon/qicon.pro
diff --git a/tests/auto/widgets/kernel/qicon/rect.png b/tests/auto/gui/image/qicon/rect.png
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/rect.png
rename to tests/auto/gui/image/qicon/rect.png
diff --git a/tests/auto/widgets/kernel/qicon/tst_qicon.cpp b/tests/auto/gui/image/qicon/tst_qicon.cpp
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/tst_qicon.cpp
rename to tests/auto/gui/image/qicon/tst_qicon.cpp
diff --git a/tests/auto/widgets/kernel/qicon/tst_qicon.qrc b/tests/auto/gui/image/qicon/tst_qicon.qrc
similarity index 100%
rename from tests/auto/widgets/kernel/qicon/tst_qicon.qrc
rename to tests/auto/gui/image/qicon/tst_qicon.qrc
diff --git a/tests/auto/widgets/kernel/kernel.pro b/tests/auto/widgets/kernel/kernel.pro
index e1c245d9d10..c2540ec2294 100644
--- a/tests/auto/widgets/kernel/kernel.pro
+++ b/tests/auto/widgets/kernel/kernel.pro
@@ -13,7 +13,6 @@ SUBDIRS=\
    qwidget \
    qwidget_window \
    qwidgetaction \
-   qicon \
    qshortcut \
 
 SUBDIRS -= qsound
-- 
GitLab