From 8863d6d785358680d05b4b34b35ca09a15cccb82 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Sat, 11 Mar 2023 14:49:07 +0100 Subject: [PATCH] Properly scale some icons for HiDPI (#12695) --- src/frontends/qt/GuiApplication.cpp | 25 +++++++++++++++++++++++++ src/frontends/qt/GuiApplication.h | 3 +++ src/frontends/qt/GuiDocument.cpp | 18 ++++++++++++------ src/frontends/qt/GuiLyXFiles.cpp | 26 ++++++++++++++++++-------- src/frontends/qt/PanelStack.cpp | 3 ++- 5 files changed, 60 insertions(+), 15 deletions(-) diff --git a/src/frontends/qt/GuiApplication.cpp b/src/frontends/qt/GuiApplication.cpp index c31645658d..cee49ad468 100644 --- a/src/frontends/qt/GuiApplication.cpp +++ b/src/frontends/qt/GuiApplication.cpp @@ -114,6 +114,7 @@ #include #include #include +#include #include #include #include @@ -2666,6 +2667,30 @@ bool GuiApplication::unhide(Buffer * buf) } +QPixmap GuiApplication::getScaledPixmap(QString imagedir, QString name) const +{ + qreal dpr = 1.0; + // Consider device/pixel ratio (HiDPI) + if (currentView()) + dpr = currentView()->devicePixelRatio(); + // We render SVG directly for HiDPI scalability + QPixmap pm = getPixmap(imagedir, name, "svgz,png"); + FileName fname = imageLibFileSearch(imagedir, name, "svgz,png"); + QString fpath = toqstr(fname.absFileName()); + if (!fpath.isEmpty()) { + QSvgRenderer svgRenderer(fpath); + if (svgRenderer.isValid()) { + pm = QPixmap(pm.size() * dpr); + pm.fill(Qt::transparent); + QPainter painter(&pm); + svgRenderer.render(&painter); + pm.setDevicePixelRatio(dpr); + } + } + return pm; +} + + Clipboard & GuiApplication::clipboard() { return d->clipboard_; diff --git a/src/frontends/qt/GuiApplication.h b/src/frontends/qt/GuiApplication.h index f0483c315a..3eab5ecd77 100644 --- a/src/frontends/qt/GuiApplication.h +++ b/src/frontends/qt/GuiApplication.h @@ -94,6 +94,9 @@ public: /// Return true if current position is RTL of if no document is open and interface if RTL bool rtlContext() const; + /// Scale Pixmaps properly (also for HiDPI) + QPixmap getScaledPixmap(QString imagedir, QString name) const; + /// Clipboard & clipboard(); /// diff --git a/src/frontends/qt/GuiDocument.cpp b/src/frontends/qt/GuiDocument.cpp index 3a8ae85796..f92c129c27 100644 --- a/src/frontends/qt/GuiDocument.cpp +++ b/src/frontends/qt/GuiDocument.cpp @@ -614,7 +614,8 @@ void PreambleModule::editExternal() { preambleTE->setReadOnly(true); theFormats().edit(*current_id_, tempfilename, format); editPB->setText(qt_("&End Edit")); - QIcon warn(getPixmap("images/", "emblem-shellescape", "svgz,png")); + QIcon warn(guiApp ? guiApp->getScaledPixmap("images/", "emblem-shellescape-user") + : getPixmap("images/", "emblem-shellescape", "svgz,png")); editPB->setIcon(warn); changed(); } @@ -793,7 +794,8 @@ void LocalLayout::editExternal() { locallayoutTE->setReadOnly(true); theFormats().edit(*current_id_, tempfilename, format); editPB->setText(qt_("&End Edit")); - QIcon warn(getPixmap("images/", "emblem-shellescape", "svgz,png")); + QIcon warn(guiApp ? guiApp->getScaledPixmap("images/", "emblem-shellescape-user") + : getPixmap("images/", "emblem-shellescape", "svgz,png")); editPB->setIcon(warn); validatePB->setEnabled(false); hideConvert(); @@ -1960,8 +1962,10 @@ void GuiDocument::filterModules(QString const & str) return 0 < b.name.localeAwareCompare(a.name); }); - QIcon user_icon(getPixmap("images/", "lyxfiles-user", "svgz,png")); - QIcon system_icon(getPixmap("images/", "lyxfiles-system", "svgz,png")); + QIcon user_icon(guiApp ? guiApp->getScaledPixmap("images/", "lyxfiles-user") + : getPixmap("images/", "lyxfiles-user", "svgz,png")); + QIcon system_icon(guiApp ? guiApp->getScaledPixmap("images/", "lyxfiles-system") + : getPixmap("images/", "lyxfiles-system", "svgz,png")); int i = 0; for (modInfoStruct const & m : modInfoList) { @@ -4672,8 +4676,10 @@ void GuiDocument::updateAvailableModules() modInfoList.sort([](modInfoStruct const & a, modInfoStruct const & b) { return 0 < b.name.localeAwareCompare(a.name); }); - QIcon user_icon(getPixmap("images/", "lyxfiles-user", "svgz,png")); - QIcon system_icon(getPixmap("images/", "lyxfiles-system", "svgz,png")); + QIcon user_icon(guiApp ? guiApp->getScaledPixmap("images/", "lyxfiles-user") + : getPixmap("images/", "lyxfiles-user", "svgz,png")); + QIcon system_icon(guiApp ? guiApp->getScaledPixmap("images/", "lyxfiles-system") + : getPixmap("images/", "lyxfiles-system", "svgz,png")); int i = 0; QFont catfont; catfont.setBold(true); diff --git a/src/frontends/qt/GuiLyXFiles.cpp b/src/frontends/qt/GuiLyXFiles.cpp index 1bfbdbb5ce..ed2b399dcd 100644 --- a/src/frontends/qt/GuiLyXFiles.cpp +++ b/src/frontends/qt/GuiLyXFiles.cpp @@ -214,8 +214,10 @@ GuiLyXFiles::GuiLyXFiles(GuiView & lv) //filesLW->setViewMode(QListView::ListMode); filesLW->setIconSize(QSize(22, 22)); - QIcon user_icon(getPixmap("images/", "lyxfiles-user", "svgz,png")); - QIcon system_icon(getPixmap("images/", "lyxfiles-system", "svgz,png")); + QIcon user_icon(guiApp ? guiApp->getScaledPixmap("images/", "lyxfiles-user") + : getPixmap("images/", "lyxfiles-user", "svgz,png")); + QIcon system_icon(guiApp ? guiApp->getScaledPixmap("images/", "lyxfiles-system") + : getPixmap("images/", "lyxfiles-system", "svgz,png")); fileTypeCO->addItem(qt_("User and System Files"), toqstr("all")); fileTypeCO->addItem(user_icon, qt_("User Files Only"), toqstr("user")); fileTypeCO->addItem(system_icon, qt_("System Files Only"), toqstr("system")); @@ -308,8 +310,10 @@ void GuiLyXFiles::on_filesLW_itemClicked(QTreeWidgetItem * item, int) setLanguage(); QString const realpath = getRealPath(); filesLW->currentItem()->setData(0, Qt::ToolTipRole, realpath); - QIcon user_icon(getPixmap("images/", "lyxfiles-user", "svgz,png")); - QIcon system_icon(getPixmap("images/", "lyxfiles-system", "svgz,png")); + QIcon user_icon(guiApp ? guiApp->getScaledPixmap("images/", "lyxfiles-user") + : getPixmap("images/", "lyxfiles-user", "svgz,png")); + QIcon system_icon(guiApp ? guiApp->getScaledPixmap("images/", "lyxfiles-system") + : getPixmap("images/", "lyxfiles-system", "svgz,png")); QIcon file_icon = (realpath.startsWith(toqstr(package().user_support().absFileName()))) ? user_icon : system_icon; item->setIcon(0, file_icon); @@ -410,10 +414,16 @@ void GuiLyXFiles::updateContents() languageCO->model()->sort(0); filesLW->clear(); - QIcon user_icon(getPixmap("images/", "lyxfiles-user", "svgz,png")); - QIcon system_icon(getPixmap("images/", "lyxfiles-system", "svgz,png")); - QIcon user_folder_icon(getPixmap("images/", "lyxfiles-user-folder", "svgz,png")); - QIcon system_folder_icon(getPixmap("images/", "lyxfiles-system-folder", "svgz,png")); + + QIcon user_icon(guiApp ? guiApp->getScaledPixmap("images/", "lyxfiles-user") + : getPixmap("images/", "lyxfiles-user", "svgz,png")); + QIcon system_icon(guiApp ? guiApp->getScaledPixmap("images/", "lyxfiles-system") + : getPixmap("images/", "lyxfiles-system", "svgz,png")); + QIcon user_folder_icon(guiApp ? guiApp->getScaledPixmap("images/", "lyxfiles-user-folder") + : getPixmap("images/", "lyxfiles-user-folder", "svgz,png")); + QIcon system_folder_icon(guiApp ? guiApp->getScaledPixmap("images/", "lyxfiles-system-folder") + : getPixmap("images/", "lyxfiles-system-folder", "svgz,png")); + QStringList cats; QMap::const_iterator it = files.constBegin(); QFont capfont; diff --git a/src/frontends/qt/PanelStack.cpp b/src/frontends/qt/PanelStack.cpp index 9b6cb639c8..4649b97b11 100644 --- a/src/frontends/qt/PanelStack.cpp +++ b/src/frontends/qt/PanelStack.cpp @@ -155,7 +155,8 @@ void PanelStack::markPanelValid(QString const & name, bool valid) item->setIcon(0, QIcon()); item->setToolTip(0, QString()); } else { - QIcon warn(getPixmap("images/", "emblem-shellescape", "svgz,png")); + QIcon warn(guiApp ? guiApp->getScaledPixmap("images/", "emblem-shellescape-user") + : getPixmap("images/", "emblem-shellescape", "svgz,png")); item->setIcon(0, warn); item->setToolTip(0, qt_("This section contains invalid input. Please fix!")); } -- 2.39.5