QIconEngine: move away from virtual_hook usage

Upgrade existing functions to be virtual functions:
  - virtual QString iconName()
  - virtual bool isNull()
  - virtual QPixmap scaledPixmap(...)
  - virtual QList<QSize> availableSizes(...)

Make all of them non-const and remove the const_casts in
the implementation. Keep the default implementation
which calls virtual_hook(), for compatibility.

Note: availableSizes was already virtual, but now loses
the “const”. Port two overrides in the platform themes.

Keep virutal_hook() around for future expansion.

Task-number: QTBUG-85885
Change-Id: I76d0c9f75bfd6ca870c669047d4ef18b82c692e5
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Morten Johan Sørvig 2020-08-11 22:35:55 +02:00
parent fc4a73aa54
commit 462b36c3de
5 changed files with 15 additions and 17 deletions

View File

@ -876,10 +876,9 @@ QPixmap QIcon::pixmap(const QSize &size, qreal devicePixelRatio, Mode mode, Stat
} }
// Try get a pixmap that is big enough to be displayed at device pixel resolution. // Try get a pixmap that is big enough to be displayed at device pixel resolution.
QIconEngine::ScaledPixmapArgument scalePixmapArg = { size * devicePixelRatio, mode, state, devicePixelRatio, QPixmap() }; QPixmap pixmap = d->engine->scaledPixmap(size * devicePixelRatio, mode, state, devicePixelRatio);
d->engine->virtual_hook(QIconEngine::ScaledPixmapHook, reinterpret_cast<void*>(&scalePixmapArg)); pixmap.setDevicePixelRatio(d->pixmapDevicePixelRatio(devicePixelRatio, size, pixmap.size()));
scalePixmapArg.pixmap.setDevicePixelRatio(d->pixmapDevicePixelRatio(devicePixelRatio, size, scalePixmapArg.pixmap.size())); return pixmap;
return scalePixmapArg.pixmap;
} }
/*! /*!

View File

@ -342,12 +342,12 @@ void QIconEngine::virtual_hook(int id, void *data)
\include qiconengine-virtualhookhelper.qdocinc \include qiconengine-virtualhookhelper.qdocinc
*/ */
QList<QSize> QIconEngine::availableSizes(QIcon::Mode mode, QIcon::State state) const QList<QSize> QIconEngine::availableSizes(QIcon::Mode mode, QIcon::State state)
{ {
AvailableSizesArgument arg; AvailableSizesArgument arg;
arg.mode = mode; arg.mode = mode;
arg.state = state; arg.state = state;
const_cast<QIconEngine *>(this)->virtual_hook(QIconEngine::AvailableSizesHook, reinterpret_cast<void*>(&arg)); this->virtual_hook(QIconEngine::AvailableSizesHook, reinterpret_cast<void*>(&arg));
return arg.sizes; return arg.sizes;
} }
@ -358,10 +358,10 @@ QList<QSize> QIconEngine::availableSizes(QIcon::Mode mode, QIcon::State state) c
\include qiconengine-virtualhookhelper.qdocinc \include qiconengine-virtualhookhelper.qdocinc
*/ */
QString QIconEngine::iconName() const QString QIconEngine::iconName()
{ {
QString name; QString name;
const_cast<QIconEngine *>(this)->virtual_hook(QIconEngine::IconNameHook, reinterpret_cast<void*>(&name)); virtual_hook(QIconEngine::IconNameHook, reinterpret_cast<void*>(&name));
return name; return name;
} }
@ -372,10 +372,10 @@ QString QIconEngine::iconName() const
\include qiconengine-virtualhookhelper.qdocinc \include qiconengine-virtualhookhelper.qdocinc
*/ */
bool QIconEngine::isNull() const bool QIconEngine::isNull()
{ {
bool isNull = false; bool isNull = false;
const_cast<QIconEngine *>(this)->virtual_hook(QIconEngine::IsNullHook, &isNull); virtual_hook(QIconEngine::IsNullHook, &isNull);
return isNull; return isNull;
} }

View File

@ -74,11 +74,11 @@ public:
}; };
virtual QList<QSize> availableSizes(QIcon::Mode mode = QIcon::Normal, virtual QList<QSize> availableSizes(QIcon::Mode mode = QIcon::Normal,
QIcon::State state = QIcon::Off) const; QIcon::State state = QIcon::Off);
virtual QString iconName() const; virtual QString iconName();
bool isNull() const; // ### Qt6 make virtual virtual bool isNull();
QPixmap scaledPixmap(const QSize &size, QIcon::Mode mode, QIcon::State state, qreal scale); // ### Qt6 make virtual virtual QPixmap scaledPixmap(const QSize &size, QIcon::Mode mode, QIcon::State state, qreal scale);
struct ScaledPixmapArgument struct ScaledPixmapArgument
{ {
@ -89,7 +89,6 @@ public:
QPixmap pixmap; QPixmap pixmap;
}; };
// ### Qt6: move content to proper virtual functions
virtual void virtual_hook(int id, void *data); virtual void virtual_hook(int id, void *data);
protected: protected:

View File

@ -477,7 +477,7 @@ public:
return QAbstractFileIconEngine::toSizeList(sizes, sizes + sizeof(sizes) / sizeof(sizes[0])); return QAbstractFileIconEngine::toSizeList(sizes, sizes + sizeof(sizes) / sizeof(sizes[0]));
} }
QList<QSize> availableSizes(QIcon::Mode = QIcon::Normal, QIcon::State = QIcon::Off) const override QList<QSize> availableSizes(QIcon::Mode = QIcon::Normal, QIcon::State = QIcon::Off) override
{ return QCocoaFileIconEngine::availableIconSizes(); } { return QCocoaFileIconEngine::availableIconSizes(); }
protected: protected:

View File

@ -888,7 +888,7 @@ public:
explicit QWindowsFileIconEngine(const QFileInfo &info, QPlatformTheme::IconOptions opts) : explicit QWindowsFileIconEngine(const QFileInfo &info, QPlatformTheme::IconOptions opts) :
QAbstractFileIconEngine(info, opts) {} QAbstractFileIconEngine(info, opts) {}
QList<QSize> availableSizes(QIcon::Mode = QIcon::Normal, QIcon::State = QIcon::Off) const override QList<QSize> availableSizes(QIcon::Mode = QIcon::Normal, QIcon::State = QIcon::Off) override
{ return QWindowsTheme::instance()->availableFileIconSizes(); } { return QWindowsTheme::instance()->availableFileIconSizes(); }
protected: protected: