diff --git a/CMakeLists.txt b/CMakeLists.txt index 0407c06..c480bdf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -134,6 +134,7 @@ add_executable(orbithub WIN32 MACOSX_BUNDLE ${ORBITHUB_SOURCES}) target_link_libraries(orbithub PRIVATE Qt6::Widgets Qt6::Sql) target_link_libraries(orbithub PRIVATE KodoTerm::KodoTerm) +target_compile_definitions(orbithub PRIVATE ORBITHUB_VERSION_STRING="${PROJECT_VERSION}") if(TARGET freerdp AND TARGET winpr) target_compile_definitions(orbithub PRIVATE ORBITHUB_HAS_FREERDP) target_include_directories(orbithub PRIVATE diff --git a/src/about_dialog.cpp b/src/about_dialog.cpp index fac03f4..d59d181 100644 --- a/src/about_dialog.cpp +++ b/src/about_dialog.cpp @@ -8,6 +8,31 @@ #include #include +namespace { +// palette(mid) is meant for 3D bevel/shadow decoration, not text — it has +// poor contrast against the window background in dark themes (barely +// legible). Blend the widget's actual text and window colors instead, so +// the result is reliably readable — de-emphasized relative to full-strength +// text, but never low-contrast — in either a light or dark theme. +QColor mutedTextColor(const QWidget* widget) +{ + const QPalette pal = widget->palette(); + const QColor text = pal.color(QPalette::WindowText); + const QColor background = pal.color(QPalette::Window); + constexpr qreal kTextWeight = 0.65; + + auto blend = [kTextWeight](int textChannel, int backgroundChannel) { + return qBound(0, + qRound(textChannel * kTextWeight + backgroundChannel * (1.0 - kTextWeight)), + 255); + }; + + return QColor(blend(text.red(), background.red()), + blend(text.green(), background.green()), + blend(text.blue(), background.blue())); +} +} + AboutDialog::AboutDialog(QWidget* parent) : QDialog(parent) { setWindowTitle(QStringLiteral("About OrbitHub")); @@ -34,7 +59,7 @@ AboutDialog::AboutDialog(QWidget* parent) : QDialog(parent) QStringLiteral("Unified remote session manager for SSH, RDP, and VNC workflows."), this); subtitle->setWordWrap(true); - subtitle->setStyleSheet(QStringLiteral("color: palette(mid);")); + subtitle->setStyleSheet(QStringLiteral("color: %1;").arg(mutedTextColor(this).name())); const QString version = QCoreApplication::applicationVersion().trimmed().isEmpty() ? QStringLiteral("Development build") @@ -42,7 +67,7 @@ AboutDialog::AboutDialog(QWidget* parent) : QDialog(parent) auto* buildLine = new QLabel( QStringLiteral("Version: %1 | Qt runtime linked dynamically").arg(version), this); - buildLine->setStyleSheet(QStringLiteral("color: palette(mid);")); + buildLine->setStyleSheet(QStringLiteral("color: %1;").arg(mutedTextColor(this).name())); titleColumn->addWidget(title); titleColumn->addWidget(subtitle); diff --git a/src/main.cpp b/src/main.cpp index a6ce793..3e024f1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,6 +10,9 @@ int main(int argc, char* argv[]) QApplication app(argc, argv); app.setOrganizationName(QStringLiteral("FireBugIT")); app.setApplicationName(QStringLiteral("OrbitHub")); +#ifdef ORBITHUB_VERSION_STRING + app.setApplicationVersion(QStringLiteral(ORBITHUB_VERSION_STRING)); +#endif app.setWindowIcon(createOrbitHubAppIcon()); SessionWindow window;