diff --git a/src/blackgui/components/aboutdialog.cpp b/src/blackgui/components/aboutdialog.cpp index c53eeaff5..e2a17c147 100644 --- a/src/blackgui/components/aboutdialog.cpp +++ b/src/blackgui/components/aboutdialog.cpp @@ -8,7 +8,9 @@ #include "aboutdialog.h" #include "ui_aboutdialog.h" + #include "blackgui/guiapplication.h" +#include "blackgui/guiutility.h" namespace BlackGui { @@ -27,10 +29,13 @@ namespace BlackGui void CAboutDialog::init() { + if (!sGui || sGui->isShuttingDown()) { return; } ui->lbl_VersionValue->setText(sGui->getApplicationNameVersionDetailed()); ui->pte_Info->setPlainText(sGui->getInfoString("\n")); ui->pte_Info->appendPlainText("\nSetup follows:\n----"); ui->pte_Info->appendPlainText(sGui->getGlobalSetup().convertToQString("\n", true)); + ui->pte_Info->appendPlainText("\nScreen info follows:\n----"); + ui->pte_Info->appendPlainText(CGuiUtility::screenInformation("\n")); } } // ns } // ns diff --git a/src/blackgui/components/scalescreenfactor.cpp b/src/blackgui/components/scalescreenfactor.cpp index 449a6fe56..95e064b85 100644 --- a/src/blackgui/components/scalescreenfactor.cpp +++ b/src/blackgui/components/scalescreenfactor.cpp @@ -8,6 +8,10 @@ #include "scalescreenfactor.h" #include "ui_scalescreenfactor.h" +#include "guiutility.h" + +#include +#include #include namespace BlackGui @@ -21,8 +25,23 @@ namespace BlackGui ui->setupUi(this); this->setMinMax(50, 150); - connect(ui->hs_Factor, &QSlider::valueChanged, this, &CScaleScreenFactor::onSliderChanged); + connect(ui->hs_Factor, &QSlider::valueChanged, this, &CScaleScreenFactor::onSliderChanged); connect(ui->le_Factor, &QLineEdit::editingFinished, this, &CScaleScreenFactor::onEditFinished); + + const QDesktopWidget *w = qApp->desktop(); + this->setToolTip( + QStringLiteral( + "Scaling only works on High DPI screens\n" + "Width/height: %1/%2 Ratio: %3\n" + "Logical DPI x/y: %4/%5\n" + "Physical DPI x/y: %6/%7\n" + "width/height MM: %8/%9" + ). + arg(w->width()).arg(w->height()).arg(QString::number(CGuiUtility::mainApplicationWidgetPixelRatio(), 'f', 2)). + arg(w->logicalDpiX()).arg(w->logicalDpiY()). + arg(w->physicalDpiX()).arg(w->physicalDpiY()). + arg(w->widthMM()).arg(w->heightMM()) + ); } CScaleScreenFactor::~CScaleScreenFactor() diff --git a/src/blackgui/components/scalescreenfactor.h b/src/blackgui/components/scalescreenfactor.h index bff468bed..063125bc4 100644 --- a/src/blackgui/components/scalescreenfactor.h +++ b/src/blackgui/components/scalescreenfactor.h @@ -32,7 +32,7 @@ namespace BlackGui explicit CScaleScreenFactor(QWidget *parent = nullptr); //! Destructor - virtual ~CScaleScreenFactor(); + virtual ~CScaleScreenFactor() override; //! Minimum/maximum values void setMinMax(int min, int max); diff --git a/src/blackgui/components/scalescreenfactor.ui b/src/blackgui/components/scalescreenfactor.ui index 2d6d85bd8..5da2c6b1a 100644 --- a/src/blackgui/components/scalescreenfactor.ui +++ b/src/blackgui/components/scalescreenfactor.ui @@ -13,6 +13,9 @@ Scale screen factor + + Scaling works only on High DPI screens + 1 diff --git a/src/blackgui/guiutility.cpp b/src/blackgui/guiutility.cpp index fbbadc134..8fd97201d 100644 --- a/src/blackgui/guiutility.cpp +++ b/src/blackgui/guiutility.cpp @@ -32,11 +32,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -118,6 +120,81 @@ namespace BlackGui return (mw && mw->isFrameless()); } + QString CGuiUtility::screenInformation(const QString &separator) + { + QString i = u"Number of screens: " % QString::number(QGuiApplication::screens().size()) % separator % + u"Primary screen: " % QGuiApplication::primaryScreen()->name(); + + for (const QScreen *screen : QGuiApplication::screens()) + { + i += separator % + u"Information for screen: " % screen->name() % separator % + u"Available geometry: " % rectAsString(screen->availableGeometry()) % separator % + u"Available size: " % sizeAsString(screen->availableSize()) % separator % + u"Available virtual geometry: " % rectAsString(screen->availableVirtualGeometry()) % separator % + u"Available virtual size: " % sizeAsString(screen->availableVirtualSize()) % separator % + u"Device ratio: " % QString::number(screen->devicePixelRatio()) % separator % + u"Depth: " % QString::number(screen->depth()) % u"bits" % separator % + u"Geometry: " % rectAsString(screen->geometry()) % separator % + u"Logical DPI: " % QString::number(screen->logicalDotsPerInch()) % separator % + u"Logical DPI X: " % QString::number(screen->logicalDotsPerInchX()) % separator % + u"Logical DPI Y: " % QString::number(screen->logicalDotsPerInchY()) % separator % + u"Orientation: " % orientationAsString(screen->orientation()) % separator % + u"Physical DPI: " % QString::number(screen->physicalDotsPerInch()) % separator % + u"Physical DPI X: " % QString::number(screen->physicalDotsPerInchX()) % separator % + u"Physical DPI Y: " % QString::number(screen->physicalDotsPerInchY()) % separator % + u"Physical size: " % sizeAsString(screen->physicalSize()) % u"mm" % separator % + u"Primary orientation: " % orientationAsString(screen->primaryOrientation()) % separator % + u"Refresh rate: " % QString::number(screen->refreshRate()) % u"Hz" % + u"Size: " % sizeAsString(screen->size()) % separator % + u"Virtual geometry: " % rectAsString(screen->virtualGeometry()) % separator % + u"Virtual size: " % sizeAsString(screen->virtualSize()); + } + return i; + } + + const QString &CGuiUtility::orientationAsString(Qt::ScreenOrientation orientation) + { + static const QString pr("Primary"); + static const QString la("Landscape"); + static const QString po("Portrait"); + static const QString il("Inverted landscape"); + static const QString ip("Inverted portrait"); + + switch (orientation) + { + case Qt::PrimaryOrientation : return pr; + case Qt::LandscapeOrientation : return la; + case Qt::PortraitOrientation : return po; + case Qt::InvertedLandscapeOrientation : return il; + case Qt::InvertedPortraitOrientation : return ip; + default : break; + } + + static const QString unknown("Unknown"); + return unknown; + } + + const QString CGuiUtility::rectAsString(const QRect &rect) + { + return QStringLiteral("x: %1 y: %2 w: %3 h: %4").arg(rect.x()).arg(rect.y()).arg(rect.width()).arg(rect.height()); + } + + const QString CGuiUtility::rectAsString(const QRectF &rect) + { + return QStringLiteral("x: %1 y: %2 w: %3 h: %4").arg(rect.x()).arg(rect.y()).arg(rect.width()).arg(rect.height()); + } + + const QString CGuiUtility::sizeAsString(const QSize &size) + { + return QStringLiteral("w: %1 h: %2").arg(size.width()).arg(size.height()); + } + + const QString CGuiUtility::sizeAsString(const QSizeF &size) + { + return QStringLiteral("w: %1 h: %2").arg(size.width()).arg(size.height()); + } + static QThreadStorage tsRegex; bool CGuiUtility::lenientTitleComparison(const QString &title, const QString &comparison) diff --git a/src/blackgui/guiutility.h b/src/blackgui/guiutility.h index 101cc4d6f..1accdaf67 100644 --- a/src/blackgui/guiutility.h +++ b/src/blackgui/guiutility.h @@ -69,6 +69,19 @@ namespace BlackGui //! Is main window frameless? static bool isMainWindowFrameless(); + //! Info about screens + static QString screenInformation(const QString &separator = "\n"); + + //! Orientation as string + static const QString &orientationAsString(Qt::ScreenOrientation orientation); + + //! QRect, QSize as string @{ + static const QString rectAsString(const QRect &rect); + static const QString rectAsString(const QRectF &rect); + static const QString sizeAsString(const QSize &size); + static const QString sizeAsString(const QSizeF &size); + //! @} + //! Top level widgets with names static QWidgetList topLevelApplicationWidgetsWithName();