diff options
author | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2023-10-15 13:56:26 +0200 |
---|---|---|
committer | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2023-10-29 12:06:24 +0200 |
commit | 8eaf01ef818c1b980e2bbce1e8ddd2de638f5028 (patch) | |
tree | 4a8c4e6d67b1f783a1a9ffbf7c7593eaf7006340 /src/widgets/styles | |
parent | 2636258b29fb09551f78a26512790dc66a4a3036 (diff) |
QCommonStyle: cleanup standardIcon()/standardPixmap() [2/2]
Factor out the four code paths for standardIcon() (windows, mac,
application and resource theme) and use those functions also for
standardPixmap() so the returned pixmap is correctly scaled with the
current devicePixelRatio.
Part 2: move functionality into own functions
Task-number: QTBUG-118122
Change-Id: I0763c4db9e7aecf4c52bf0f5770bd3dd87c4a8a4
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Samuel Gaist <samuel.gaist@idiap.ch>
Diffstat (limited to 'src/widgets/styles')
-rw-r--r-- | src/widgets/styles/qcommonstyle.cpp | 672 | ||||
-rw-r--r-- | src/widgets/styles/qcommonstyle_p.h | 16 |
2 files changed, 233 insertions, 455 deletions
diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp index c9c894e055..b86d840959 100644 --- a/src/widgets/styles/qcommonstyle.cpp +++ b/src/widgets/styles/qcommonstyle.cpp @@ -5525,206 +5525,33 @@ static constexpr auto pngIconSizes = {16, 32, 128}; static constexpr auto mediaIconSizes = {16, 32}; #endif // imageformat_png -#if defined(Q_OS_WIN) || QT_CONFIG(imageformat_png) -static QIcon clearTextIcon(bool rtl) -{ - const QString directionalThemeName = rtl - ? QStringLiteral("edit-clear-locationbar-ltr") : QStringLiteral("edit-clear-locationbar-rtl"); - if (QIcon::hasThemeIcon(directionalThemeName)) - return QIcon::fromTheme(directionalThemeName); - const QString themeName = QStringLiteral("edit-clear"); - if (QIcon::hasThemeIcon(themeName)) - return QIcon::fromTheme(themeName); - - QIcon icon; -#ifndef QT_NO_IMAGEFORMAT_PNG - addIconFiles(u"cleartext-", {16, 32}, icon); -#endif // !QT_NO_IMAGEFORMAT_PNG - return icon; -} -#endif - /*! \reimp */ QPixmap QCommonStyle::standardPixmap(StandardPixmap sp, const QStyleOption *option, const QWidget *widget) const { - const bool rtl = (option && option->direction == Qt::RightToLeft) || (!option && QGuiApplication::isRightToLeft()); -#ifdef QT_NO_IMAGEFORMAT_PNG - Q_UNUSED(widget); - Q_UNUSED(sp); -#else - QPixmap pixmap; + Q_D(const QCommonStyle); + QIcon icon; - if (QGuiApplication::desktopSettingsAware() && !QIcon::themeName().isEmpty()) { - switch (sp) { - case QStyle::SP_DialogYesButton: - case QStyle::SP_DialogOkButton: - pixmap = QIcon::fromTheme("dialog-ok"_L1).pixmap(16); - break; - case QStyle::SP_DialogApplyButton: - pixmap = QIcon::fromTheme("dialog-ok-apply"_L1).pixmap(16); - break; - case QStyle::SP_DialogDiscardButton: - pixmap = QIcon::fromTheme("edit-delete"_L1).pixmap(16); - break; - case QStyle::SP_DialogCloseButton: - pixmap = QIcon::fromTheme("dialog-close"_L1).pixmap(16); - break; - case QStyle::SP_DirHomeIcon: - pixmap = QIcon::fromTheme("user-home"_L1).pixmap(16); - break; - case QStyle::SP_MessageBoxInformation: - pixmap = QIcon::fromTheme("messagebox_info"_L1).pixmap(16); - break; - case QStyle::SP_MessageBoxWarning: - pixmap = QIcon::fromTheme("messagebox_warning"_L1).pixmap(16); - break; - case QStyle::SP_MessageBoxCritical: - pixmap = QIcon::fromTheme("messagebox_critical"_L1).pixmap(16); - break; - case QStyle::SP_MessageBoxQuestion: - pixmap = QIcon::fromTheme("help"_L1).pixmap(16); - break; - case QStyle::SP_DialogOpenButton: - case QStyle::SP_DirOpenIcon: - pixmap = QIcon::fromTheme("folder-open"_L1).pixmap(16); - break; - case QStyle::SP_FileIcon: - pixmap = QIcon::fromTheme("text-x-generic"_L1, QIcon::fromTheme("empty"_L1)).pixmap(16); - break; - case QStyle::SP_DirClosedIcon: - case QStyle::SP_DirIcon: - pixmap = QIcon::fromTheme("folder"_L1).pixmap(16); - break; - case QStyle::SP_DriveFDIcon: - pixmap = QIcon::fromTheme("media-floppy"_L1, - QIcon::fromTheme("3floppy_unmount"_L1)).pixmap(16); - break; - case QStyle::SP_ComputerIcon: - pixmap = QIcon::fromTheme("computer"_L1, QIcon::fromTheme("system"_L1)).pixmap(16); - break; - case QStyle::SP_DesktopIcon: - pixmap = QIcon::fromTheme("user-desktop"_L1, - QIcon::fromTheme("desktop"_L1)).pixmap(16); - break; - case QStyle::SP_TrashIcon: - pixmap = QIcon::fromTheme("user-trash"_L1, - QIcon::fromTheme("trashcan_empty"_L1)).pixmap(16); - break; - case QStyle::SP_DriveCDIcon: - case QStyle::SP_DriveDVDIcon: - pixmap = QIcon::fromTheme("media-optical"_L1, - QIcon::fromTheme("cdrom_unmount"_L1)).pixmap(16); - break; - case QStyle::SP_DriveHDIcon: - pixmap = QIcon::fromTheme("drive-harddisk"_L1, - QIcon::fromTheme("hdd_unmount"_L1)).pixmap(16); - break; - case QStyle::SP_FileDialogToParent: - pixmap = QIcon::fromTheme("go-up"_L1, QIcon::fromTheme("up"_L1)).pixmap(16); - break; - case QStyle::SP_FileDialogNewFolder: - pixmap = QIcon::fromTheme("folder_new"_L1).pixmap(16); - break; - case QStyle::SP_ArrowUp: - pixmap = QIcon::fromTheme("go-up"_L1, - QIcon::fromTheme("up"_L1)).pixmap(16); - break; - case QStyle::SP_ArrowDown: - pixmap = QIcon::fromTheme("go-down"_L1, QIcon::fromTheme("down"_L1)).pixmap(16); - break; - case QStyle::SP_ArrowRight: - pixmap = QIcon::fromTheme("go-next"_L1, QIcon::fromTheme("forward"_L1)).pixmap(16); - break; - case QStyle::SP_ArrowLeft: - pixmap = QIcon::fromTheme("go-previous"_L1, QIcon::fromTheme("back"_L1)).pixmap(16); - break; - case QStyle::SP_FileDialogDetailedView: - pixmap = QIcon::fromTheme("view_detailed"_L1).pixmap(16); - break; - case QStyle::SP_FileDialogListView: - pixmap = QIcon::fromTheme("view_icon"_L1).pixmap(16); - break; - case QStyle::SP_BrowserReload: - pixmap = QIcon::fromTheme("reload"_L1).pixmap(16); - break; - case QStyle::SP_BrowserStop: - pixmap = QIcon::fromTheme("process-stop"_L1).pixmap(16); - break; - case QStyle::SP_MediaPlay: - pixmap = QIcon::fromTheme("media-playback-start"_L1).pixmap(16); - break; - case QStyle::SP_MediaPause: - pixmap = QIcon::fromTheme("media-playback-pause"_L1).pixmap(16); - break; - case QStyle::SP_MediaStop: - pixmap = QIcon::fromTheme("media-playback-stop"_L1).pixmap(16); - break; - case QStyle::SP_MediaSeekForward: - pixmap = QIcon::fromTheme("media-seek-forward"_L1).pixmap(16); - break; - case QStyle::SP_MediaSeekBackward: - pixmap = QIcon::fromTheme("media-seek-backward"_L1).pixmap(16); - break; - case QStyle::SP_MediaSkipForward: - pixmap = QIcon::fromTheme("media-skip-forward"_L1).pixmap(16); - break; - case QStyle::SP_MediaSkipBackward: - pixmap = QIcon::fromTheme("media-skip-backward"_L1).pixmap(16); - break; - case QStyle::SP_DialogResetButton: - pixmap = QIcon::fromTheme("edit-clear"_L1).pixmap(24); - break; - case QStyle::SP_DialogHelpButton: - pixmap = QIcon::fromTheme("help-contents"_L1).pixmap(24); - break; - case QStyle::SP_DialogNoButton: - case QStyle::SP_DialogCancelButton: - pixmap = QIcon::fromTheme("dialog-cancel"_L1, - QIcon::fromTheme("process-stop"_L1)).pixmap(24); - break; - case QStyle::SP_DialogSaveButton: - pixmap = QIcon::fromTheme("document-save"_L1).pixmap(24); - break; - case QStyle::SP_FileLinkIcon: - pixmap = QIcon::fromTheme("emblem-symbolic-link"_L1).pixmap(16); - if (!pixmap.isNull()) { - QPixmap fileIcon = QIcon::fromTheme("text-x-generic"_L1).pixmap(16); - if (fileIcon.isNull()) - fileIcon = QIcon::fromTheme("empty"_L1).pixmap(16); - if (!fileIcon.isNull()) { - QPainter painter(&fileIcon); - painter.drawPixmap(0, 0, 16, 16, pixmap); - return fileIcon; - } - } - break; - case QStyle::SP_DirLinkIcon: - pixmap = QIcon::fromTheme("emblem-symbolic-link"_L1).pixmap(16); - if (!pixmap.isNull()) { - QPixmap dirIcon = QIcon::fromTheme("folder"_L1).pixmap(16); - if (!dirIcon.isNull()) { - QPainter painter(&dirIcon); - painter.drawPixmap(0, 0, 16, 16, pixmap); - return dirIcon; - } - } - break; - case QStyle::SP_LineEditClearButton: - pixmap = clearTextIcon(rtl).pixmap(16); - break; - default: - break; - } - } + icon = d->iconFromWindowsTheme(sp, option, widget); + if (!icon.isNull()) + return icon.pixmap(QSize(16, 16), qt_getDevicePixelRatio(widget)); + + icon = d->iconFromApplicationTheme(sp, option, widget); + if (!icon.isNull()) + return icon.pixmap(QSize(16, 16), qt_getDevicePixelRatio(widget)); + + icon = d->iconFromMacTheme(sp, option, widget); + if (!icon.isNull()) + return icon.pixmap(QSize(16, 16), qt_getDevicePixelRatio(widget)); + + icon = d->iconFromResourceTheme(sp, option, widget); + if (!icon.isNull()) + return icon.pixmap(QSize(16, 16), qt_getDevicePixelRatio(widget)); - if (!pixmap.isNull()) - return pixmap; -#endif //QT_NO_IMAGEFORMAT_PNG - switch (sp) { #ifndef QT_NO_IMAGEFORMAT_XPM + switch (sp) { case QStyle::SP_ToolBarHorizontalExtensionButton: - if (rtl) { + if (d->rtl(option)) { auto im = QImage(tb_extension_arrow_h_xpm).convertToFormat(QImage::Format_ARGB32).mirrored(true, false); return QPixmap::fromImage(std::move(im)); } @@ -5735,122 +5562,6 @@ QPixmap QCommonStyle::standardPixmap(StandardPixmap sp, const QStyleOption *opti return cachedPixmapFromXPM(filedialog_start_xpm); case QStyle::SP_FileDialogEnd: return cachedPixmapFromXPM(filedialog_end_xpm); -#endif -#ifndef QT_NO_IMAGEFORMAT_PNG - case QStyle::SP_CommandLink: - case QStyle::SP_ArrowForward: - if (rtl) - return proxy()->standardPixmap(SP_ArrowLeft, option, widget); - return proxy()->standardPixmap(SP_ArrowRight, option, widget); - case QStyle::SP_ArrowBack: - if (rtl) - return proxy()->standardPixmap(SP_ArrowRight, option, widget); - return proxy()->standardPixmap(SP_ArrowLeft, option, widget); - case QStyle::SP_ArrowLeft: - return QPixmap(":/qt-project.org/styles/commonstyle/images/left-16.png"_L1); - case QStyle::SP_ArrowRight: - return QPixmap(":/qt-project.org/styles/commonstyle/images/right-16.png"_L1); - case QStyle::SP_ArrowUp: - return QPixmap(":/qt-project.org/styles/commonstyle/images/up-16.png"_L1); - case QStyle::SP_ArrowDown: - return QPixmap(":/qt-project.org/styles/commonstyle/images/down-16.png"_L1); - case QStyle::SP_FileDialogToParent: - return proxy()->standardPixmap(SP_ArrowUp, option, widget); - case QStyle::SP_FileDialogNewFolder: - return QPixmap(":/qt-project.org/styles/commonstyle/images/newdirectory-16.png"_L1); - case QStyle::SP_FileDialogDetailedView: - return QPixmap(":/qt-project.org/styles/commonstyle/images/viewdetailed-16.png"_L1); - case QStyle::SP_FileDialogInfoView: - return QPixmap(":/qt-project.org/styles/commonstyle/images/fileinfo-16.png"_L1); - case QStyle::SP_FileDialogContentsView: - return QPixmap(":/qt-project.org/styles/commonstyle/images/filecontents-16.png"_L1); - case QStyle::SP_FileDialogListView: - return QPixmap(":/qt-project.org/styles/commonstyle/images/viewlist-16.png"_L1); - case QStyle::SP_FileDialogBack: - return proxy()->standardPixmap(SP_ArrowBack, option, widget); - case QStyle::SP_DriveHDIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/harddrive-16.png"_L1); - case QStyle::SP_TrashIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/trash-16.png"_L1); - case QStyle::SP_DriveFDIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/floppy-16.png"_L1); - case QStyle::SP_DriveNetIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/networkdrive-16.png"_L1); - case QStyle::SP_DesktopIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/desktop-16.png"_L1); - case QStyle::SP_ComputerIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/computer-16.png"_L1); - case QStyle::SP_DriveCDIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/cdr-16.png"_L1); - case QStyle::SP_DriveDVDIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/dvd-16.png"_L1); - case QStyle::SP_DirHomeIcon: - case QStyle::SP_DirOpenIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/diropen-16.png"_L1); - case QStyle::SP_DirIcon: - case QStyle::SP_DirClosedIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/dirclosed-16.png"_L1); - case QStyle::SP_DirLinkIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/dirlink-16.png"_L1); - case QStyle::SP_FileIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/file-16.png"_L1); - case QStyle::SP_FileLinkIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/filelink-16.png"_L1); - case QStyle::SP_DialogOkButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-ok-16.png"_L1); - case QStyle::SP_DialogCancelButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-cancel-16.png"_L1); - case QStyle::SP_DialogHelpButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-help-16.png"_L1); - case QStyle::SP_DialogOpenButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-open-16.png"_L1); - case QStyle::SP_DialogSaveButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-save-16.png"_L1); - case QStyle::SP_DialogCloseButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-close-16.png"_L1); - case QStyle::SP_DialogApplyButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-apply-16.png"_L1); - case QStyle::SP_DialogResetButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-clear-16.png"_L1); - case QStyle::SP_DialogDiscardButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-delete-16.png"_L1); - case QStyle::SP_DialogYesButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-yes-16.png"_L1); - case QStyle::SP_DialogNoButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-no-16.png"_L1); - case QStyle::SP_BrowserReload: - return QPixmap(":/qt-project.org/styles/commonstyle/images/refresh-24.png"_L1); - case QStyle::SP_BrowserStop: - return QPixmap(":/qt-project.org/styles/commonstyle/images/stop-24.png"_L1); - case QStyle::SP_MediaPlay: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-play-32.png"_L1); - case QStyle::SP_MediaPause: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-pause-32.png"_L1); - case QStyle::SP_MediaStop: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-stop-32.png"_L1); - case QStyle::SP_MediaSeekForward: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-seek-forward-32.png"_L1); - case QStyle::SP_MediaSeekBackward: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-seek-backward-32.png"_L1); - case QStyle::SP_MediaSkipForward: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-skip-forward-32.png"_L1); - case QStyle::SP_MediaSkipBackward: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-skip-backward-32.png"_L1); - case QStyle::SP_MediaVolume: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-volume-16.png"_L1); - case QStyle::SP_MediaVolumeMuted: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-volume-muted-16.png"_L1); - case QStyle::SP_LineEditClearButton: - return clearTextIcon(rtl).pixmap(16); - case QStyle::SP_TabCloseButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-closetab-16.png"_L1); -#endif // QT_NO_IMAGEFORMAT_PNG - default: - break; - } - -#ifndef QT_NO_IMAGEFORMAT_XPM - switch (sp) { case QStyle::SP_TitleBarMenuButton: return titleBarMenuCachedPixmapFromXPM(); case QStyle::SP_TitleBarShadeButton: @@ -5882,22 +5593,16 @@ QPixmap QCommonStyle::standardPixmap(StandardPixmap sp, const QStyleOption *opti } #endif //QT_NO_IMAGEFORMAT_XPM -#if !QT_CONFIG(imageformat_png) && !QT_CONFIG(imageformat_xpm) && !QT_CONFIG(imageformat_png) - Q_UNUSED(rtl); -#endif - return QPixmap(); } -/*! - \internal -*/ -QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption *option, - const QWidget *widget) const +QIcon QCommonStylePrivate::iconFromWindowsTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const { - QIcon icon; - const bool rtl = (option && option->direction == Qt::RightToLeft) || (!option && QGuiApplication::isRightToLeft()); - + Q_UNUSED(option); + Q_UNUSED(widget); + QIcon icon;; #ifdef Q_OS_WIN switch (standardIcon) { case QStyle::SP_DriveCDIcon: @@ -5926,8 +5631,8 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption case QStyle::SP_DirLinkIcon: if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) { QPlatformTheme::StandardPixmap spOff = static_cast<QPlatformTheme::StandardPixmap>(standardIcon); - QPlatformTheme::StandardPixmap spOn = standardIcon == SP_DirIcon ? QPlatformTheme::DirOpenIcon : - QPlatformTheme::DirLinkOpenIcon; + QPlatformTheme::StandardPixmap spOn = standardIcon == QStyle::SP_DirIcon ? QPlatformTheme::DirOpenIcon + : QPlatformTheme::DirLinkOpenIcon; for (int size = 16 ; size <= 32 ; size += 16) { QSizeF pixSize(size, size); QPixmap pixmap = theme->standardPixmap(spOff, pixSize); @@ -5937,204 +5642,186 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption } } break; - case QStyle::SP_LineEditClearButton: - icon = clearTextIcon(rtl); - break; default: break; } - if (!icon.isNull()) - return icon; - +#else + Q_UNUSED(standardIcon) #endif + return icon; +} +QIcon QCommonStylePrivate::iconFromApplicationTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const +{ if (QGuiApplication::desktopSettingsAware() && !QIcon::themeName().isEmpty()) { switch (standardIcon) { case QStyle::SP_DirHomeIcon: - icon = QIcon::fromTheme("user-home"_L1); - break; + return QIcon::fromTheme("user-home"_L1); case QStyle::SP_MessageBoxInformation: - icon = QIcon::fromTheme("dialog-information"_L1); - break; + return QIcon::fromTheme("dialog-information"_L1); case QStyle::SP_MessageBoxWarning: - icon = QIcon::fromTheme("dialog-warning"_L1); - break; + return QIcon::fromTheme("dialog-warning"_L1); case QStyle::SP_MessageBoxCritical: - icon = QIcon::fromTheme("dialog-error"_L1); - break; + return QIcon::fromTheme("dialog-error"_L1); case QStyle::SP_MessageBoxQuestion: - icon = QIcon::fromTheme("dialog-question"_L1); - break; + return QIcon::fromTheme("dialog-question"_L1); case QStyle::SP_DialogOpenButton: case QStyle::SP_DirOpenIcon: - icon = QIcon::fromTheme("folder-open"_L1); - break; + return QIcon::fromTheme("folder-open"_L1); case QStyle::SP_DialogSaveButton: - icon = QIcon::fromTheme("document-save"_L1); - break; + return QIcon::fromTheme("document-save"_L1); case QStyle::SP_DialogApplyButton: - icon = QIcon::fromTheme("dialog-ok-apply"_L1); - break; + return QIcon::fromTheme("dialog-ok-apply"_L1); case QStyle::SP_DialogYesButton: case QStyle::SP_DialogOkButton: - icon = QIcon::fromTheme("dialog-ok"_L1); - break; + return QIcon::fromTheme("dialog-ok"_L1); case QStyle::SP_DialogDiscardButton: - icon = QIcon::fromTheme("edit-delete"_L1); - break; + return QIcon::fromTheme("edit-delete"_L1); case QStyle::SP_DialogResetButton: - icon = QIcon::fromTheme("edit-clear"_L1); - break; + return QIcon::fromTheme("edit-clear"_L1); case QStyle::SP_DialogHelpButton: - icon = QIcon::fromTheme("help-contents"_L1); - break; + return QIcon::fromTheme("help-contents"_L1); case QStyle::SP_FileIcon: - icon = QIcon::fromTheme("text-x-generic"_L1); - break; + return QIcon::fromTheme("text-x-generic"_L1); case QStyle::SP_DirClosedIcon: case QStyle::SP_DirIcon: - icon = QIcon::fromTheme("folder"_L1); - break; + return QIcon::fromTheme("folder"_L1); case QStyle::SP_DriveFDIcon: - icon = QIcon::fromTheme("floppy_unmount"_L1); - break; + return QIcon::fromTheme("floppy_unmount"_L1); case QStyle::SP_ComputerIcon: - icon = QIcon::fromTheme("computer"_L1, QIcon::fromTheme("system"_L1)); - break; + return QIcon::fromTheme("computer"_L1, QIcon::fromTheme("system"_L1)); case QStyle::SP_DesktopIcon: - icon = QIcon::fromTheme("user-desktop"_L1); - break; + return QIcon::fromTheme("user-desktop"_L1); case QStyle::SP_TrashIcon: - icon = QIcon::fromTheme("user-trash"_L1); - break; + return QIcon::fromTheme("user-trash"_L1); case QStyle::SP_DriveCDIcon: case QStyle::SP_DriveDVDIcon: - icon = QIcon::fromTheme("media-optical"_L1); - break; + return QIcon::fromTheme("media-optical"_L1); case QStyle::SP_DriveHDIcon: - icon = QIcon::fromTheme("drive-harddisk"_L1); - break; + return QIcon::fromTheme("drive-harddisk"_L1); case QStyle::SP_FileDialogToParent: - icon = QIcon::fromTheme("go-up"_L1); - break; + return QIcon::fromTheme("go-up"_L1); case QStyle::SP_FileDialogNewFolder: - icon = QIcon::fromTheme("folder-new"_L1); - break; + return QIcon::fromTheme("folder-new"_L1); case QStyle::SP_ArrowUp: - icon = QIcon::fromTheme("go-up"_L1); - break; + return QIcon::fromTheme("go-up"_L1); case QStyle::SP_ArrowDown: - icon = QIcon::fromTheme("go-down"_L1); - break; + return QIcon::fromTheme("go-down"_L1); case QStyle::SP_ArrowRight: - icon = QIcon::fromTheme("go-next"_L1); - break; + return QIcon::fromTheme("go-next"_L1); case QStyle::SP_ArrowLeft: - icon = QIcon::fromTheme("go-previous"_L1); - break; + return QIcon::fromTheme("go-previous"_L1); case QStyle::SP_DialogNoButton: case QStyle::SP_DialogCancelButton: - icon = QIcon::fromTheme("dialog-cancel"_L1, QIcon::fromTheme("process-stop"_L1)); - break; + return QIcon::fromTheme("dialog-cancel"_L1, QIcon::fromTheme("process-stop"_L1)); case QStyle::SP_DialogCloseButton: - icon = QIcon::fromTheme("window-close"_L1); - break; + return QIcon::fromTheme("window-close"_L1); case QStyle::SP_FileDialogDetailedView: - icon = QIcon::fromTheme("view-list-details"_L1); - break; + return QIcon::fromTheme("view-list-details"_L1); case QStyle::SP_FileDialogListView: - icon = QIcon::fromTheme("view-list-icons"_L1); - break; + return QIcon::fromTheme("view-list-icons"_L1); case QStyle::SP_BrowserReload: - icon = QIcon::fromTheme("view-refresh"_L1); - break; + return QIcon::fromTheme("view-refresh"_L1); case QStyle::SP_BrowserStop: - icon = QIcon::fromTheme("process-stop"_L1); - break; + return QIcon::fromTheme("process-stop"_L1); case QStyle::SP_MediaPlay: - icon = QIcon::fromTheme("media-playback-start"_L1); - break; + return QIcon::fromTheme("media-playback-start"_L1); case QStyle::SP_MediaPause: - icon = QIcon::fromTheme("media-playback-pause"_L1); - break; + return QIcon::fromTheme("media-playback-pause"_L1); case QStyle::SP_MediaStop: - icon = QIcon::fromTheme("media-playback-stop"_L1); - break; + return QIcon::fromTheme("media-playback-stop"_L1); case QStyle::SP_MediaSeekForward: - icon = QIcon::fromTheme("media-seek-forward"_L1); - break; + return QIcon::fromTheme("media-seek-forward"_L1); case QStyle::SP_MediaSeekBackward: - icon = QIcon::fromTheme("media-seek-backward"_L1); - break; + return QIcon::fromTheme("media-seek-backward"_L1); case QStyle::SP_MediaSkipForward: - icon = QIcon::fromTheme("media-skip-forward"_L1); - break; + return QIcon::fromTheme("media-skip-forward"_L1); case QStyle::SP_MediaSkipBackward: - icon = QIcon::fromTheme("media-skip-backward"_L1); - break; + return QIcon::fromTheme("media-skip-backward"_L1); case QStyle::SP_MediaVolume: - icon = QIcon::fromTheme("audio-volume-medium"_L1); - break; + return QIcon::fromTheme("audio-volume-medium"_L1); case QStyle::SP_MediaVolumeMuted: - icon = QIcon::fromTheme("audio-volume-muted"_L1); - break; + return QIcon::fromTheme("audio-volume-muted"_L1); case QStyle::SP_ArrowForward: - if (rtl) - return QCommonStyle::standardIcon(SP_ArrowLeft, option, widget); - return QCommonStyle::standardIcon(SP_ArrowRight, option, widget); + return iconFromApplicationTheme(rtl(option) ? QStyle::SP_ArrowLeft + : QStyle::SP_ArrowRight, + option, widget); case QStyle::SP_ArrowBack: - if (rtl) - return QCommonStyle::standardIcon(SP_ArrowRight, option, widget); - return QCommonStyle::standardIcon(SP_ArrowLeft, option, widget); - case QStyle::SP_FileLinkIcon: - { - QIcon linkIcon = QIcon::fromTheme("emblem-symbolic-link"_L1); - if (!linkIcon.isNull()) { - QIcon baseIcon = QCommonStyle::standardIcon(SP_FileIcon, option, widget); - const QList<QSize> sizes = baseIcon.availableSizes(QIcon::Normal, QIcon::Off); - for (int i = 0 ; i < sizes.size() ; ++i) { - int size = sizes[i].width(); - QPixmap basePixmap = baseIcon.pixmap(QSize(size, size), qt_getDevicePixelRatio(widget)); - QPixmap linkPixmap = linkIcon.pixmap(QSize(size / 2, size / 2), qt_getDevicePixelRatio(widget)); + return iconFromApplicationTheme(rtl(option) ? QStyle::SP_ArrowRight + : QStyle::SP_ArrowLeft, + option, widget); + case QStyle::SP_FileLinkIcon: { + QIcon icon; + const QIcon linkIcon = QIcon::fromTheme("emblem-symbolic-link"_L1); + const QIcon baseIcon = iconFromApplicationTheme(QStyle::SP_FileIcon, + option, widget); + if (!linkIcon.isNull() || !baseIcon.isNull()) { + const auto sizes = baseIcon.availableSizes(QIcon::Normal, QIcon::Off); + const auto dpr = qt_getDevicePixelRatio(widget); + for (const auto size : sizes) { + QPixmap basePixmap = baseIcon.pixmap(size, dpr); + QPixmap linkPixmap = linkIcon.pixmap(size / 2, dpr); QPainter painter(&basePixmap); - painter.drawPixmap(size/2, size/2, linkPixmap); + const auto w = size.width() / 2; + painter.drawPixmap(w, w, linkPixmap); icon.addPixmap(basePixmap); } } + return icon; } break; - case QStyle::SP_DirLinkIcon: - { - QIcon linkIcon = QIcon::fromTheme("emblem-symbolic-link"_L1); - if (!linkIcon.isNull()) { - QIcon baseIcon = QCommonStyle::standardIcon(SP_DirIcon, option, widget); - const QList<QSize> sizes = baseIcon.availableSizes(QIcon::Normal, QIcon::Off); - for (int i = 0 ; i < sizes.size() ; ++i) { - int size = sizes[i].width(); - QPixmap basePixmap = baseIcon.pixmap(QSize(size, size), qt_getDevicePixelRatio(widget)); - QPixmap linkPixmap = linkIcon.pixmap(QSize(size / 2, size / 2), qt_getDevicePixelRatio(widget)); + case QStyle::SP_DirLinkIcon: { + QIcon icon; + const QIcon linkIcon = QIcon::fromTheme("emblem-symbolic-link"_L1); + const QIcon baseIcon = iconFromApplicationTheme(QStyle::SP_DirIcon, + option, widget); + if (!linkIcon.isNull() || !baseIcon.isNull()) { + const auto sizes = baseIcon.availableSizes(QIcon::Normal, QIcon::Off); + const auto dpr = qt_getDevicePixelRatio(widget); + for (const auto size : sizes) { + QPixmap basePixmap = baseIcon.pixmap(size, dpr); + QPixmap linkPixmap = linkIcon.pixmap(size / 2, dpr); QPainter painter(&basePixmap); - painter.drawPixmap(size/2, size/2, linkPixmap); + const auto w = size.width() / 2; + painter.drawPixmap(w, w, linkPixmap); icon.addPixmap(basePixmap); } } - } + return icon; + } break; + case QStyle::SP_LineEditClearButton: { + const QString directionalThemeName = rtl(option) + ? QStringLiteral("edit-clear-locationbar-ltr") : QStringLiteral("edit-clear-locationbar-rtl"); + if (QIcon::hasThemeIcon(directionalThemeName)) + return QIcon::fromTheme(directionalThemeName); + const QString themeName = QStringLiteral("edit-clear"); + if (QIcon::hasThemeIcon(themeName)) + return QIcon::fromTheme(themeName); + break; + } default: break; } } // if (QGuiApplication::desktopSettingsAware() && !QIcon::themeName().isEmpty()) - if (!icon.isNull()) - return icon; + return {}; +} -#if defined(Q_OS_MAC) +QIcon QCommonStylePrivate::iconFromMacTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const +{ +#ifdef Q_OS_DARWIN + Q_Q(const QCommonStyle); if (QGuiApplication::desktopSettingsAware()) { switch (standardIcon) { case QStyle::SP_DirIcon: { // A rather special case - QIcon closeIcon = QCommonStyle::standardIcon(SP_DirClosedIcon, option, widget); - QIcon openIcon = QCommonStyle::standardIcon(SP_DirOpenIcon, option, widget); + QIcon closeIcon = q->standardIcon(QStyle::SP_DirClosedIcon, option, widget); + QIcon openIcon = q->standardIcon(QStyle::SP_DirOpenIcon, option, widget); closeIcon.addPixmap(openIcon.pixmap(16, 16), QIcon::Normal, QIcon::On); closeIcon.addPixmap(openIcon.pixmap(32, 32), QIcon::Normal, QIcon::On); closeIcon.addPixmap(openIcon.pixmap(64, 64), QIcon::Normal, QIcon::On); @@ -6145,7 +5832,7 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption case QStyle::SP_TitleBarNormalButton: case QStyle::SP_TitleBarCloseButton: { QIcon titleBarIcon; - QString prefix = standardIcon == SP_TitleBarCloseButton + QString prefix = standardIcon == QStyle::SP_TitleBarCloseButton ? QStringLiteral(":/qt-project.org/styles/macstyle/images/closedock-") : QStringLiteral(":/qt-project.org/styles/macstyle/images/dockdock-"); for (const auto size : dockTitleIconSizes) { @@ -6190,18 +5877,29 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption retIcon.addPixmap(mainIcon); } - if (!retIcon.isNull()) - return retIcon; + return retIcon; } default: break; } } // if (QGuiApplication::desktopSettingsAware()) -#endif // Q_OS_MAC +#else // Q_OS_DARWIN + Q_UNUSED(standardIcon); + Q_UNUSED(option); + Q_UNUSED(widget); +#endif // Q_OS_DARWIN + return {}; +} - switch (standardIcon) { +QIcon QCommonStylePrivate::iconFromResourceTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const +{ + Q_Q(const QCommonStyle); + QIcon icon; #ifndef QT_NO_IMAGEFORMAT_PNG + switch (standardIcon) { case QStyle::SP_TitleBarMinButton: addIconFiles(u"titlebar-min-", titleBarSizes, icon); break; @@ -6221,9 +5919,9 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption addIconFiles(u"newdirectory-", pngIconSizes, icon); break; case QStyle::SP_FileDialogBack: - return proxy()->standardIcon(SP_ArrowBack, option, widget); + return q->proxy()->standardIcon(QStyle::SP_ArrowBack, option, widget); case QStyle::SP_FileDialogToParent: - return proxy()->standardIcon(SP_ArrowUp, option, widget); + return q->proxy()->standardIcon(QStyle::SP_ArrowUp, option, widget); case QStyle::SP_FileDialogDetailedView: addIconFiles(u"viewdetailed-", pngIconSizes, icon); break; @@ -6270,9 +5968,13 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption addIconFiles(u"standardbutton-no-", pngIconSizes, icon); break; case QStyle::SP_ArrowForward: - return proxy()->standardIcon(rtl ? SP_ArrowLeft : SP_ArrowRight, option, widget); + return q->proxy()->standardIcon(rtl(option) ? QStyle::SP_ArrowLeft + : QStyle::SP_ArrowRight, + option, widget); case QStyle::SP_ArrowBack: - return proxy()->standardIcon(rtl ? SP_ArrowRight : SP_ArrowLeft, option, widget); + return q->proxy()->standardIcon(rtl(option) ? QStyle::SP_ArrowRight + : QStyle::SP_ArrowLeft, + option, widget); case QStyle::SP_ArrowLeft: addIconFiles(u"left-", pngIconSizes, icon); break; @@ -6293,18 +5995,30 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption case QStyle::SP_DriveCDIcon: addIconFiles(u"cdr-", pngIconSizes, icon); break; + case QStyle::SP_DriveHDIcon: + addIconFiles(u"harddrive-", pngIconSizes, icon); + break; case QStyle::SP_DriveDVDIcon: addIconFiles(u"dvd-", pngIconSizes, icon); break; + case QStyle::SP_DriveNetIcon: + addIconFiles(u"networkdrive-", pngIconSizes, icon); + break; case QStyle::SP_FileIcon: addIconFiles(u"file-", pngIconSizes, icon); break; case QStyle::SP_FileLinkIcon: addIconFiles(u"filelink-", pngIconSizes, icon); break; + case QStyle::SP_DesktopIcon: + addIconFiles(u"desktop-", {16, 32}, icon); + break; case QStyle::SP_TrashIcon: addIconFiles(u"trash-", pngIconSizes, icon); break; + case QStyle::SP_ComputerIcon: + addIconFiles(u"computer-", {16, 32}, icon); + break; case QStyle::SP_BrowserReload: addIconFiles(u"refresh-", {24, 32}, icon); break; @@ -6339,6 +6053,7 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption addIconFiles(u"media-volume-muted-", {16}, icon); break; case QStyle::SP_TitleBarCloseButton: + case QStyle::SP_DockWidgetCloseButton: addIconFiles(u"closedock-", dockTitleIconSizes, icon); break; case QStyle::SP_TitleBarMenuButton: @@ -6351,7 +6066,7 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption addIconFiles(u"normalizedockup-", dockTitleIconSizes, icon); break; case QStyle::SP_ToolBarHorizontalExtensionButton: - addIconFiles(rtl ? u"toolbar-ext-h-rtl-" : u"toolbar-ext-h-", toolBarExtHSizes, icon); + addIconFiles(rtl(option) ? u"toolbar-ext-h-rtl-" : u"toolbar-ext-h-", toolBarExtHSizes, icon); break; case QStyle::SP_ToolBarVerticalExtensionButton: addIconFiles(u"toolbar-ext-v-", toolBarExtVSizes, icon); @@ -6361,11 +6076,58 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption addIconFiles(u"standardbutton-closetab-down-", {16, 32}, icon, QIcon::Normal, QIcon::On); addIconFiles(u"standardbutton-closetab-hover-", {16, 32}, icon, QIcon::Active, QIcon::Off); break; + case QStyle::SP_LineEditClearButton: + addIconFiles(u"cleartext-", {16, 32}, icon); + break; + default: + break; + } +#else // QT_NO_IMAGEFORMAT_PNG + Q_UNUSED(standardIcon); + Q_UNUSED(option); + Q_UNUSED(widget); #endif // QT_NO_IMAGEFORMAT_PNG + return icon; +} + + +/*! + \internal +*/ +QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption *option, + const QWidget *widget) const +{ + Q_D(const QCommonStyle); + QIcon icon; + + icon = d->iconFromWindowsTheme(standardIcon, option, widget); + if (!icon.isNull()) + return icon; + + icon = d->iconFromApplicationTheme(standardIcon, option, widget); + if (!icon.isNull()) + return icon; + + icon = d->iconFromMacTheme(standardIcon, option, widget); + if (!icon.isNull()) + return icon; + + icon = d->iconFromResourceTheme(standardIcon, option, widget); + if (!icon.isNull()) + return icon; + +#ifndef QT_NO_IMAGEFORMAT_XPM + switch (standardIcon) { + case QStyle::SP_TitleBarMenuButton: + icon.addPixmap(titleBarMenuCachedPixmapFromXPM()); + break; default: - icon.addPixmap(proxy()->standardPixmap(standardIcon, option, widget)); break; } + if (!icon.isNull()) + return icon; +#endif + icon = proxy()->standardPixmap(standardIcon, option, widget); return icon; } diff --git a/src/widgets/styles/qcommonstyle_p.h b/src/widgets/styles/qcommonstyle_p.h index 9d07408e22..45381ecc9e 100644 --- a/src/widgets/styles/qcommonstyle_p.h +++ b/src/widgets/styles/qcommonstyle_p.h @@ -97,6 +97,22 @@ public: void stopAnimation(const QObject *target) const; void removeAnimation(const QObject *target) const; + QIcon iconFromWindowsTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const; + QIcon iconFromMacTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const; + QIcon iconFromApplicationTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const; + QIcon iconFromResourceTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const; + static bool inline rtl(const QStyleOption *option) { + return (option && option->direction == Qt::RightToLeft) || + (!option && QGuiApplication::isRightToLeft()); + } private: mutable QHash<const QObject*, QStyleAnimation*> animations; #endif // animation |