From 86d02716a2f53163fef2e89425047ac466a5290c Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 24 May 2018 11:15:54 +0200 Subject: [PATCH] Allow to scale GUI on high DPI screens --- src/blackgui/guiapplication.cpp | 31 +++++++++++++++++++++++++++---- src/blackgui/guiapplication.h | 13 ++++++++++--- src/swiftcore/main.cpp | 2 +- src/swiftdata/main.cpp | 2 +- src/swiftguistandard/main.cpp | 2 +- src/swiftlauncher/main.cpp | 4 ++-- 6 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/blackgui/guiapplication.cpp b/src/blackgui/guiapplication.cpp index 039e25e2d..fd86d8dfe 100644 --- a/src/blackgui/guiapplication.cpp +++ b/src/blackgui/guiapplication.cpp @@ -85,6 +85,7 @@ namespace BlackGui { this->addWindowModeOption(); this->addWindowResetSizeOption(); + this->addWindowScaleSizeOption(); // notify when app goes down connect(qGuiApp, &QGuiApplication::lastWindowClosed, this, &CGuiApplication::gracefulShutdown); @@ -117,9 +118,7 @@ namespace BlackGui void CGuiApplication::addWindowModeOption() { - m_cmdWindowMode = QCommandLineOption(QStringList() << "w" << "window", - QCoreApplication::translate("main", "Windows: (n)ormal, (f)rameless, (t)ool."), - "windowtype"); + m_cmdWindowMode = QCommandLineOption({"w", "window"}, QCoreApplication::translate("main", "Windows: (n)ormal, (f)rameless, (t)ool."), "windowtype"); this->addParserOption(m_cmdWindowMode); } @@ -129,6 +128,14 @@ namespace BlackGui this->addParserOption(m_cmdWindowSizeReset); } + void CGuiApplication::addWindowScaleSizeOption() + { + // just added here to display it in help + // parseScaleFactor() is used since it is needed upfront (before application is created) + m_cmdWindowScaleSize = QCommandLineOption("scale", QCoreApplication::translate("main", "Scale: number."), "scalevalue"); + this->addParserOption(m_cmdWindowScaleSize); + } + void CGuiApplication::addWindowStateOption() { m_cmdWindowStateMinimized = QCommandLineOption({{"m", "minimized"}, QCoreApplication::translate("main", "Start minimized in system tray.")}); @@ -259,7 +266,7 @@ namespace BlackGui else { QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // DPI support - QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); //HiDPI pixmaps + QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); // HiDPI pixmaps const QString sf = QString::number(scaleFactor, 'f', 2); qputenv("QT_SCALE_FACTOR", sf.toLatin1()); } @@ -371,6 +378,22 @@ namespace BlackGui return html; } + qreal CGuiApplication::parseScaleFactor(int argc, char *argv[]) + { + for (int i = 1; i < argc; ++i) + { + if (qstrcmp(argv[i], "--scale") == 0 || qstrcmp(argv[i], "-scale") == 0) + { + if (i + 1 >= argc) { return -1.0; } // no value + const QString factor(argv[i + 1]); + bool ok; + qreal f = factor.toFloat(&ok); + return ok ? f : -1.0; + } + } + return -1.0; + } + bool CGuiApplication::cmdLineErrorMessage(const QString &errorMessage, bool retry) const { const QString helpText(beautifyHelpMessage(m_parser.helpText())); diff --git a/src/blackgui/guiapplication.h b/src/blackgui/guiapplication.h index c8b2ed26d..c10c9f2ce 100644 --- a/src/blackgui/guiapplication.h +++ b/src/blackgui/guiapplication.h @@ -93,9 +93,12 @@ namespace BlackGui //! CMD line arguments void addWindowModeOption(); - //! CMD line arguments + //! CMD line arguments (reset size store) void addWindowResetSizeOption(); + //! CMD line arguments (scale size on DPI screens) + void addWindowScaleSizeOption(); + //! Window state Qt::WindowState getWindowState() const; @@ -234,6 +237,9 @@ namespace BlackGui //! Uses the high DPI support? static bool isUsingHighDpiScreenSupport(); + //! Parse scale factor if any + static qreal parseScaleFactor(int argc, char *argv[]); + signals: //! Style sheet changed void styleSheetsChanged(); @@ -276,8 +282,9 @@ namespace BlackGui int m_minWidthChars = -1; //!< min. width characters (based on current font metrics) int m_minHeightChars = -1; //!< min. height characters (based on current font metrics) QCommandLineOption m_cmdWindowStateMinimized { "empty" }; //!< window state (minimized) - QCommandLineOption m_cmdWindowMode { "empty" }; //!< window mode (flags: frameless ...) - QCommandLineOption m_cmdWindowSizeReset { "empty" }; //!< window size resizing + QCommandLineOption m_cmdWindowMode { "empty" }; //!< window mode (flags: frameless ...) + QCommandLineOption m_cmdWindowSizeReset { "empty" }; //!< window size reset + QCommandLineOption m_cmdWindowScaleSize { "empty" }; //!< window scale size CStyleSheetUtility m_styleSheetUtility {{}, this}; //!< style sheet utility bool m_uiSetupCompleted = false; //!< ui setup completed bool m_saveMainWidgetState = true; //!< save/restore main widget's state diff --git a/src/swiftcore/main.cpp b/src/swiftcore/main.cpp index 74a395c9e..72466e62e 100644 --- a/src/swiftcore/main.cpp +++ b/src/swiftcore/main.cpp @@ -26,7 +26,7 @@ using namespace BlackGui; int main(int argc, char *argv[]) { //! [SwiftApplicationDemo] - CGuiApplication::highDpiScreenSupport(); + CGuiApplication::highDpiScreenSupport(CGuiApplication::parseScaleFactor(argc, argv)); QApplication qa(argc, argv); Q_UNUSED(qa); // init of qa is required, but qa not used CGuiApplication a(CApplicationInfo::swiftCore(), CApplicationInfo::PilotClientCore, CIcons::swiftCore24()); diff --git a/src/swiftdata/main.cpp b/src/swiftdata/main.cpp index 79be35bd8..f0ee87020 100644 --- a/src/swiftdata/main.cpp +++ b/src/swiftdata/main.cpp @@ -24,7 +24,7 @@ using namespace BlackGui; int main(int argc, char *argv[]) { - CGuiApplication::highDpiScreenSupport(); + CGuiApplication::highDpiScreenSupport(CGuiApplication::parseScaleFactor(argc, argv)); QApplication qa(argc, argv); Q_UNUSED(qa); CGuiApplication a(CApplicationInfo::swiftMappingTool(), CApplicationInfo::MappingTool, CIcons::swiftDatabase48()); diff --git a/src/swiftguistandard/main.cpp b/src/swiftguistandard/main.cpp index 7e3673b7f..48ad52770 100644 --- a/src/swiftguistandard/main.cpp +++ b/src/swiftguistandard/main.cpp @@ -23,7 +23,7 @@ using namespace BlackCore; int main(int argc, char *argv[]) { //! [SwiftApplicationDemo] - CGuiApplication::highDpiScreenSupport(); + CGuiApplication::highDpiScreenSupport(CGuiApplication::parseScaleFactor(argc, argv)); QApplication qa(argc, argv); Q_UNUSED(qa); // application init needed CSwiftGuiStdApplication a; // application with contexts diff --git a/src/swiftlauncher/main.cpp b/src/swiftlauncher/main.cpp index f877a71dc..693c164d9 100644 --- a/src/swiftlauncher/main.cpp +++ b/src/swiftlauncher/main.cpp @@ -30,12 +30,12 @@ using namespace BlackCore::Db; int main(int argc, char *argv[]) { //! [SwiftApplicationDemo] - CGuiApplication::highDpiScreenSupport(); + CGuiApplication::highDpiScreenSupport(CGuiApplication::parseScaleFactor(argc, argv)); QApplication qa(argc, argv); // needed Q_UNUSED(qa); CGuiApplication a(CApplicationInfo::swiftLauncher(), CApplicationInfo::Laucher, CIcons::swiftLauncher1024()); a.addVatlibOptions(); // so it can be passed (hand over) to started applications - a.addParserOption({{"i", "installer"}, QCoreApplication::translate("main", "Installer setup.") }); + a.addParserOption({{"i", "installer"}, QCoreApplication::translate("main", "Installer setup.")}); if (!a.parseAndSynchronizeSetup()) { return EXIT_FAILURE; } a.useWebDataServices(BlackCore::CWebReaderFlags::AllSwiftDbReaders, CDatabaseReaderConfigList::forLauncher()); if (!a.start())