diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index de821e2a..7f1710fd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -106,6 +106,14 @@ if(APPLE) psicons.icns ) +elseif(WIN32) + add_executable( + ${PROJECT_NAME} WIN32 + ${PACKETSENDER_SRCS} + ${PACKETSENDER_UI_HEADERS} + ${PACKETSENDER_UIS} + ${PACKETSENDER_QRC} + ) else() add_executable( ${PROJECT_NAME} diff --git a/src/main.cpp b/src/main.cpp index 2f3c4400..65768966 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,7 +12,9 @@ #include "globals.h" #ifndef CONSOLE_BUILD #include + #include #include + #include #include #include #if QT_VERSION > QT_VERSION_CHECK(6, 0, 0) @@ -138,6 +140,26 @@ void debugThemeFiles(bool debugMode) { } void applyTheme(bool isDark, bool debugMode, QApplication *app, MainWindow *mainWin = nullptr) { + if(isDark) { + app->setPalette(app->style()->standardPalette()); + } else { + QPalette lightPalette; + lightPalette.setColor(QPalette::Window, QColor(250, 250, 250)); + lightPalette.setColor(QPalette::WindowText, Qt::black); + lightPalette.setColor(QPalette::Base, Qt::white); + lightPalette.setColor(QPalette::AlternateBase, QColor(245, 245, 245)); + lightPalette.setColor(QPalette::ToolTipBase, Qt::white); + lightPalette.setColor(QPalette::ToolTipText, Qt::black); + lightPalette.setColor(QPalette::Text, Qt::black); + lightPalette.setColor(QPalette::Button, QColor(245, 245, 245)); + lightPalette.setColor(QPalette::ButtonText, Qt::black); + lightPalette.setColor(QPalette::BrightText, Qt::red); + lightPalette.setColor(QPalette::Link, QColor(0, 80, 160)); + lightPalette.setColor(QPalette::Highlight, QColor(255, 249, 196)); + lightPalette.setColor(QPalette::HighlightedText, Qt::black); + app->setPalette(lightPalette); + } + debugThemeFiles(debugMode); QFile file(isDark ? Settings::DARK_STYLE_SHEET_NAME : Settings::LIGHT_STYLE_SHEET_NAME); diff --git a/src/packetsender.css b/src/packetsender.css index 4b7badbb..b3637182 100644 --- a/src/packetsender.css +++ b/src/packetsender.css @@ -27,8 +27,52 @@ QTableWidget::item:hover { background-color: #fffbda; } -QLineEdit { - border: 1px solid grey; - border-radius: 4px; - padding: 4px; -} \ No newline at end of file +QLineEdit { + border: 1px solid grey; + border-radius: 4px; + padding: 4px; +} + +QMenuBar { + background-color: #fafafa; + color: #111111; +} + +QMenuBar::item { + background: transparent; + color: #111111; + padding: 4px 8px; +} + +QMenuBar::item:selected { + background-color: #ececec; + border-radius: 4px; +} + +QMenuBar::item:pressed { + background-color: #e0e0e0; + border-radius: 4px; +} + +QMenu { + background-color: #fafafa; + color: #111111; + border: 1px solid #cfcfcf; +} + +QMenu::item { + background-color: transparent; + color: #111111; + padding: 6px 24px 6px 28px; +} + +QMenu::item:selected { + background-color: #fff9c4; + color: #111111; +} + +QMenu::separator { + height: 1px; + background-color: #d8d8d8; + margin: 4px 8px; +} diff --git a/src/settings.cpp b/src/settings.cpp index 4103dbd6..41f6c376 100755 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -19,7 +19,9 @@ #include #include +#include #include +#include #include #endif @@ -42,6 +44,9 @@ const QString Settings::ERROR_STR = "Error"; #ifndef CONSOLE_BUILD const QString Settings::LIGHT_STYLE_SHEET_NAME = ":/packetsender.css"; const QString Settings::DARK_STYLE_SHEET_NAME = ":/qdarkstyle/style.qss"; +const QString Settings::THEME_MODE_SYSTEM = "system"; +const QString Settings::THEME_MODE_LIGHT = "light"; +const QString Settings::THEME_MODE_DARK = "dark"; #endif QString Settings::logHeaderTranslate(QString txt) @@ -187,15 +192,13 @@ Settings::Settings(QWidget *parent, MainWindow* mw) : ui->autolaunchStarterPanelButton->setChecked(settings.value("autolaunchStarterPanelButton", false).toBool()); - #if QT_VERSION > QT_VERSION_CHECK(6, 5, 0) + QString currentThemeMode = Settings::themeMode(); + ui->themeModeCombo->setItemData(0, Settings::THEME_MODE_SYSTEM); + ui->themeModeCombo->setItemData(1, Settings::THEME_MODE_LIGHT); + ui->themeModeCombo->setItemData(2, Settings::THEME_MODE_DARK); + int themeIndex = ui->themeModeCombo->findData(currentThemeMode); + ui->themeModeCombo->setCurrentIndex(themeIndex < 0 ? 0 : themeIndex); - //This is now automatic in Qt6.5 - ui->darkModeCheck->hide(); - - #endif - - - ui->darkModeCheck->setChecked(settings.value("darkModeCheck", true).toBool()); ui->httpAdjustContentTypeCheck->setChecked(settings.value("httpAdjustContentTypeCheck", true).toBool()); ui->translateMacroSendCheck->setChecked(settings.value("translateMacroSendCheck", true).toBool()); @@ -398,12 +401,38 @@ QString Settings::language() +QString Settings::themeMode() { + QSettings settings(SETTINGSFILE, QSettings::IniFormat); + QString mode = settings.value("themeMode", "").toString().toLower(); + + if(mode == THEME_MODE_SYSTEM || mode == THEME_MODE_LIGHT || mode == THEME_MODE_DARK) { + return mode; + } + + if(settings.contains("darkModeCheck")) { + return settings.value("darkModeCheck", true).toBool() ? THEME_MODE_DARK : THEME_MODE_LIGHT; + } + + return THEME_MODE_SYSTEM; +} + + bool Settings::useDark() { #ifndef CONSOLE_BUILD - #if QT_VERSION > QT_VERSION_CHECK(6, 5, 0) + QString mode = Settings::themeMode(); + + if(mode == THEME_MODE_DARK) { + return true; + } + + if(mode == THEME_MODE_LIGHT) { + return false; + } + + #if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) QStyleHints * styleHints = QGuiApplication::styleHints(); auto colorScheme = styleHints->colorScheme(); @@ -411,8 +440,7 @@ bool Settings::useDark() { #endif - QSettings settings(SETTINGSFILE, QSettings::IniFormat); - return settings.value("darkModeCheck", true).toBool(); + return QGuiApplication::palette().color(QPalette::Window).lightness() < 128; #else return true; @@ -529,7 +557,8 @@ void Settings::on_buttonBox_accepted() settings.setValue("translateMacroSendCheck", ui->translateMacroSendCheck->isChecked()); settings.setValue("autolaunchStarterPanelButton", ui->autolaunchStarterPanelButton->isChecked()); - settings.setValue("darkModeCheck", ui->darkModeCheck->isChecked()); + QString themeMode = ui->themeModeCombo->currentData().toString(); + settings.setValue("themeMode", themeMode.isEmpty() ? Settings::THEME_MODE_SYSTEM : themeMode); settings.setValue("httpAdjustContentTypeCheck", ui->httpAdjustContentTypeCheck->isChecked()); settings.setValue("cancelResendNum", ui->cancelResendNumEdit->text().toUInt()); diff --git a/src/settings.h b/src/settings.h index 8f23518c..3a7b5a45 100644 --- a/src/settings.h +++ b/src/settings.h @@ -101,6 +101,9 @@ class Settings : public QDialog static const QString LIGHT_STYLE_SHEET_NAME; static const QString DARK_STYLE_SHEET_NAME; + static const QString THEME_MODE_SYSTEM; + static const QString THEME_MODE_LIGHT; + static const QString THEME_MODE_DARK; static QList portsToIntList(QString ports); static QString intListToPorts(QList portList); @@ -115,6 +118,7 @@ class Settings : public QDialog static bool needLanguage(); static QString logHeaderTranslate(QString txt); + static QString themeMode(); static bool useDark(); private slots: diff --git a/src/settings.ui b/src/settings.ui index 64e06255..84e6009a 100755 --- a/src/settings.ui +++ b/src/settings.ui @@ -655,11 +655,34 @@ - - - Use Dark Theme (requires restart) - - + + + + + Theme + + + + + + + + System + + + + + Light + + + + + Dark + + + + + @@ -1296,6 +1319,7 @@ displayOrderList displayOrderListTraffic defaultDisplayButton + themeModeCombo copyUnformattedCheck rolling500entryCheck restoreSessionCheck