Allow to scale GUI on high DPI screens

This commit is contained in:
Klaus Basan
2018-05-24 11:15:54 +02:00
parent 26dcc547e6
commit 86d02716a2
6 changed files with 42 additions and 12 deletions

View File

@@ -85,6 +85,7 @@ namespace BlackGui
{ {
this->addWindowModeOption(); this->addWindowModeOption();
this->addWindowResetSizeOption(); this->addWindowResetSizeOption();
this->addWindowScaleSizeOption();
// notify when app goes down // notify when app goes down
connect(qGuiApp, &QGuiApplication::lastWindowClosed, this, &CGuiApplication::gracefulShutdown); connect(qGuiApp, &QGuiApplication::lastWindowClosed, this, &CGuiApplication::gracefulShutdown);
@@ -117,9 +118,7 @@ namespace BlackGui
void CGuiApplication::addWindowModeOption() void CGuiApplication::addWindowModeOption()
{ {
m_cmdWindowMode = QCommandLineOption(QStringList() << "w" << "window", m_cmdWindowMode = QCommandLineOption({"w", "window"}, QCoreApplication::translate("main", "Windows: (n)ormal, (f)rameless, (t)ool."), "windowtype");
QCoreApplication::translate("main", "Windows: (n)ormal, (f)rameless, (t)ool."),
"windowtype");
this->addParserOption(m_cmdWindowMode); this->addParserOption(m_cmdWindowMode);
} }
@@ -129,6 +128,14 @@ namespace BlackGui
this->addParserOption(m_cmdWindowSizeReset); 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() void CGuiApplication::addWindowStateOption()
{ {
m_cmdWindowStateMinimized = QCommandLineOption({{"m", "minimized"}, QCoreApplication::translate("main", "Start minimized in system tray.")}); m_cmdWindowStateMinimized = QCommandLineOption({{"m", "minimized"}, QCoreApplication::translate("main", "Start minimized in system tray.")});
@@ -259,7 +266,7 @@ namespace BlackGui
else else
{ {
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // DPI support 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); const QString sf = QString::number(scaleFactor, 'f', 2);
qputenv("QT_SCALE_FACTOR", sf.toLatin1()); qputenv("QT_SCALE_FACTOR", sf.toLatin1());
} }
@@ -371,6 +378,22 @@ namespace BlackGui
return html; 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 bool CGuiApplication::cmdLineErrorMessage(const QString &errorMessage, bool retry) const
{ {
const QString helpText(beautifyHelpMessage(m_parser.helpText())); const QString helpText(beautifyHelpMessage(m_parser.helpText()));

View File

@@ -93,9 +93,12 @@ namespace BlackGui
//! CMD line arguments //! CMD line arguments
void addWindowModeOption(); void addWindowModeOption();
//! CMD line arguments //! CMD line arguments (reset size store)
void addWindowResetSizeOption(); void addWindowResetSizeOption();
//! CMD line arguments (scale size on DPI screens)
void addWindowScaleSizeOption();
//! Window state //! Window state
Qt::WindowState getWindowState() const; Qt::WindowState getWindowState() const;
@@ -234,6 +237,9 @@ namespace BlackGui
//! Uses the high DPI support? //! Uses the high DPI support?
static bool isUsingHighDpiScreenSupport(); static bool isUsingHighDpiScreenSupport();
//! Parse scale factor if any
static qreal parseScaleFactor(int argc, char *argv[]);
signals: signals:
//! Style sheet changed //! Style sheet changed
void styleSheetsChanged(); void styleSheetsChanged();
@@ -276,8 +282,9 @@ namespace BlackGui
int m_minWidthChars = -1; //!< min. width characters (based on current font metrics) int m_minWidthChars = -1; //!< min. width characters (based on current font metrics)
int m_minHeightChars = -1; //!< min. height 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_cmdWindowStateMinimized { "empty" }; //!< window state (minimized)
QCommandLineOption m_cmdWindowMode { "empty" }; //!< window mode (flags: frameless ...) QCommandLineOption m_cmdWindowMode { "empty" }; //!< window mode (flags: frameless ...)
QCommandLineOption m_cmdWindowSizeReset { "empty" }; //!< window size resizing QCommandLineOption m_cmdWindowSizeReset { "empty" }; //!< window size reset
QCommandLineOption m_cmdWindowScaleSize { "empty" }; //!< window scale size
CStyleSheetUtility m_styleSheetUtility {{}, this}; //!< style sheet utility CStyleSheetUtility m_styleSheetUtility {{}, this}; //!< style sheet utility
bool m_uiSetupCompleted = false; //!< ui setup completed bool m_uiSetupCompleted = false; //!< ui setup completed
bool m_saveMainWidgetState = true; //!< save/restore main widget's state bool m_saveMainWidgetState = true; //!< save/restore main widget's state

View File

@@ -26,7 +26,7 @@ using namespace BlackGui;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
//! [SwiftApplicationDemo] //! [SwiftApplicationDemo]
CGuiApplication::highDpiScreenSupport(); CGuiApplication::highDpiScreenSupport(CGuiApplication::parseScaleFactor(argc, argv));
QApplication qa(argc, argv); QApplication qa(argc, argv);
Q_UNUSED(qa); // init of qa is required, but qa not used Q_UNUSED(qa); // init of qa is required, but qa not used
CGuiApplication a(CApplicationInfo::swiftCore(), CApplicationInfo::PilotClientCore, CIcons::swiftCore24()); CGuiApplication a(CApplicationInfo::swiftCore(), CApplicationInfo::PilotClientCore, CIcons::swiftCore24());

View File

@@ -24,7 +24,7 @@ using namespace BlackGui;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
CGuiApplication::highDpiScreenSupport(); CGuiApplication::highDpiScreenSupport(CGuiApplication::parseScaleFactor(argc, argv));
QApplication qa(argc, argv); QApplication qa(argc, argv);
Q_UNUSED(qa); Q_UNUSED(qa);
CGuiApplication a(CApplicationInfo::swiftMappingTool(), CApplicationInfo::MappingTool, CIcons::swiftDatabase48()); CGuiApplication a(CApplicationInfo::swiftMappingTool(), CApplicationInfo::MappingTool, CIcons::swiftDatabase48());

View File

@@ -23,7 +23,7 @@ using namespace BlackCore;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
//! [SwiftApplicationDemo] //! [SwiftApplicationDemo]
CGuiApplication::highDpiScreenSupport(); CGuiApplication::highDpiScreenSupport(CGuiApplication::parseScaleFactor(argc, argv));
QApplication qa(argc, argv); QApplication qa(argc, argv);
Q_UNUSED(qa); // application init needed Q_UNUSED(qa); // application init needed
CSwiftGuiStdApplication a; // application with contexts CSwiftGuiStdApplication a; // application with contexts

View File

@@ -30,12 +30,12 @@ using namespace BlackCore::Db;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
//! [SwiftApplicationDemo] //! [SwiftApplicationDemo]
CGuiApplication::highDpiScreenSupport(); CGuiApplication::highDpiScreenSupport(CGuiApplication::parseScaleFactor(argc, argv));
QApplication qa(argc, argv); // needed QApplication qa(argc, argv); // needed
Q_UNUSED(qa); Q_UNUSED(qa);
CGuiApplication a(CApplicationInfo::swiftLauncher(), CApplicationInfo::Laucher, CIcons::swiftLauncher1024()); CGuiApplication a(CApplicationInfo::swiftLauncher(), CApplicationInfo::Laucher, CIcons::swiftLauncher1024());
a.addVatlibOptions(); // so it can be passed (hand over) to started applications 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; } if (!a.parseAndSynchronizeSetup()) { return EXIT_FAILURE; }
a.useWebDataServices(BlackCore::CWebReaderFlags::AllSwiftDbReaders, CDatabaseReaderConfigList::forLauncher()); a.useWebDataServices(BlackCore::CWebReaderFlags::AllSwiftDbReaders, CDatabaseReaderConfigList::forLauncher());
if (!a.start()) if (!a.start())