diff --git a/share/icons/application/scalable/apps/keepassxc-dark.svg b/share/icons/application/scalable/apps/keepassxc-dark.svg deleted file mode 100644 index d296e68ff..000000000 --- a/share/icons/application/scalable/apps/keepassxc-dark.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/share/icons/application/scalable/apps/keepassxc-locked.svg b/share/icons/application/scalable/apps/keepassxc-locked.svg index 82e766940..0f0cc55cb 100644 --- a/share/icons/application/scalable/apps/keepassxc-locked.svg +++ b/share/icons/application/scalable/apps/keepassxc-locked.svg @@ -1,97 +1 @@ - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - + \ No newline at end of file diff --git a/share/icons/application/scalable/apps/keepassxc-monochrome-dark-locked.svg b/share/icons/application/scalable/apps/keepassxc-monochrome-dark-locked.svg new file mode 100644 index 000000000..3cd212d6e --- /dev/null +++ b/share/icons/application/scalable/apps/keepassxc-monochrome-dark-locked.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/application/scalable/apps/keepassxc-monochrome-dark.svg b/share/icons/application/scalable/apps/keepassxc-monochrome-dark.svg new file mode 100644 index 000000000..28c4754a5 --- /dev/null +++ b/share/icons/application/scalable/apps/keepassxc-monochrome-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/application/scalable/apps/keepassxc-monochrome-light-locked.svg b/share/icons/application/scalable/apps/keepassxc-monochrome-light-locked.svg new file mode 100644 index 000000000..71b77ac92 --- /dev/null +++ b/share/icons/application/scalable/apps/keepassxc-monochrome-light-locked.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/application/scalable/apps/keepassxc-monochrome-light.svg b/share/icons/application/scalable/apps/keepassxc-monochrome-light.svg new file mode 100644 index 000000000..4516274d9 --- /dev/null +++ b/share/icons/application/scalable/apps/keepassxc-monochrome-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/application/scalable/apps/keepassxc-unlocked.svg b/share/icons/application/scalable/apps/keepassxc-unlocked.svg index c2d5758f0..a4df192d1 100644 --- a/share/icons/application/scalable/apps/keepassxc-unlocked.svg +++ b/share/icons/application/scalable/apps/keepassxc-unlocked.svg @@ -1,77 +1 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - + \ No newline at end of file diff --git a/share/icons/application/scalable/apps/keepassxc.svg b/share/icons/application/scalable/apps/keepassxc.svg index c2d5758f0..a4df192d1 100644 --- a/share/icons/application/scalable/apps/keepassxc.svg +++ b/share/icons/application/scalable/apps/keepassxc.svg @@ -1,77 +1 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - + \ No newline at end of file diff --git a/share/icons/icons.qrc b/share/icons/icons.qrc index a02106d21..cb11f9068 100644 --- a/share/icons/icons.qrc +++ b/share/icons/icons.qrc @@ -74,7 +74,10 @@ application/scalable/apps/freedesktop.svg application/scalable/apps/internet-web-browser.svg application/scalable/apps/keepassxc.svg - application/scalable/apps/keepassxc-dark.svg + application/scalable/apps/keepassxc-monochrome-dark.svg + application/scalable/apps/keepassxc-monochrome-dark-locked.svg + application/scalable/apps/keepassxc-monochrome-light.svg + application/scalable/apps/keepassxc-monochrome-light-locked.svg application/scalable/apps/keepassxc-locked.svg application/scalable/apps/keepassxc-unlocked.svg application/scalable/apps/preferences-desktop-icons.svg diff --git a/src/core/Config.cpp b/src/core/Config.cpp index b413d460e..bd4d0a7dd 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -93,7 +93,7 @@ static const QHash configStrings = { {Config::GUI_HidePreviewPanel, {QS("GUI/HidePreviewPanel"), Roaming, false}}, {Config::GUI_ToolButtonStyle, {QS("GUI/ToolButtonStyle"), Roaming, Qt::ToolButtonIconOnly}}, {Config::GUI_ShowTrayIcon, {QS("GUI/ShowTrayIcon"), Roaming, false}}, - {Config::GUI_DarkTrayIcon, {QS("GUI/DarkTrayIcon"), Roaming, false}}, + {Config::GUI_TrayIconAppearance, {QS("GUI/TrayIconAppearance"), Roaming, {}}}, {Config::GUI_MinimizeToTray, {QS("GUI/MinimizeToTray"), Roaming, false}}, {Config::GUI_MinimizeOnStartup, {QS("GUI/MinimizeOnStartup"), Roaming, false}}, {Config::GUI_MinimizeOnClose, {QS("GUI/MinimizeOnClose"), Roaming, false}}, @@ -345,7 +345,8 @@ static const QHash deprecationMap = { {QS("generator/WordCase"), Config::PasswordGenerator_WordCase}, {QS("generator/Type"), Config::PasswordGenerator_Type}, {QS("QtErrorMessageShown"), Config::Messages_Qt55CompatibilityWarning}, - {QS("GUI/HidePasswords"), Config::Deleted}}; + {QS("GUI/HidePasswords"), Config::Deleted}, + {QS("GUI/DarkTrayIcon"), Config::Deleted}}; /** * Migrate settings from previous versions. diff --git a/src/core/Config.h b/src/core/Config.h index 8d4609a21..b3dc0fb85 100644 --- a/src/core/Config.h +++ b/src/core/Config.h @@ -76,7 +76,7 @@ public: GUI_HidePreviewPanel, GUI_ToolButtonStyle, GUI_ShowTrayIcon, - GUI_DarkTrayIcon, + GUI_TrayIconAppearance, GUI_MinimizeToTray, GUI_MinimizeOnStartup, GUI_MinimizeOnClose, diff --git a/src/core/Resources.cpp b/src/core/Resources.cpp index c4f747232..608e02dcf 100644 --- a/src/core/Resources.cpp +++ b/src/core/Resources.cpp @@ -28,6 +28,7 @@ #include "core/Config.h" #include "core/Global.h" #include "gui/MainWindow.h" +#include "gui/osutils/OSUtils.h" Resources* Resources::m_instance(nullptr); @@ -100,19 +101,48 @@ QIcon Resources::applicationIcon() return icon("keepassxc", false); } +QString Resources::getTrayIconAppearance() const +{ + auto iconAppearance = config()->get(Config::GUI_TrayIconAppearance).toString(); + if (iconAppearance.isNull()) { +#ifdef Q_OS_MACOS + iconAppearance = osUtils->isDarkMode() ? "monochrome-light" : "monochrome-dark"; +#else + iconAppearance = "monochrome-light"; +#endif + } + return iconAppearance; +} + QIcon Resources::trayIcon() { - return useDarkIcon() ? icon("keepassxc-dark", false) : icon("keepassxc", false); + return trayIconUnlocked(); } QIcon Resources::trayIconLocked() { + auto iconApperance = getTrayIconAppearance(); + + if (iconApperance == "monochrome-light") { + return icon("keepassxc-monochrome-light-locked", false); + } + if (iconApperance == "monochrome-dark") { + return icon("keepassxc-monochrome-dark-locked", false); + } return icon("keepassxc-locked", false); } QIcon Resources::trayIconUnlocked() { - return useDarkIcon() ? icon("keepassxc-dark", false) : icon("keepassxc-unlocked", false); + auto iconApperance = getTrayIconAppearance(); + + if (iconApperance == "monochrome-light") { + return icon("keepassxc-monochrome-light", false); + } + if (iconApperance == "monochrome-dark") { + return icon("keepassxc-monochrome-dark", false); + } + return icon("keepassxc", false); } QIcon Resources::icon(const QString& name, bool recolor, const QColor& overrideColor) @@ -223,11 +253,6 @@ bool Resources::testResourceDir(const QString& dir) return false; } -bool Resources::useDarkIcon() -{ - return config()->get(Config::GUI_DarkTrayIcon).toBool(); -} - Resources* Resources::instance() { if (!m_instance) { diff --git a/src/core/Resources.h b/src/core/Resources.h index 97a994aa1..11302a5b6 100644 --- a/src/core/Resources.h +++ b/src/core/Resources.h @@ -40,9 +40,9 @@ public: static Resources* instance(); private: + QString getTrayIconAppearance() const; Resources(); bool testResourceDir(const QString& dir); - bool useDarkIcon(); static Resources* m_instance; diff --git a/src/gui/ApplicationSettingsWidget.cpp b/src/gui/ApplicationSettingsWidget.cpp index 896fd8898..e44ded9f3 100644 --- a/src/gui/ApplicationSettingsWidget.cpp +++ b/src/gui/ApplicationSettingsWidget.cpp @@ -238,7 +238,6 @@ void ApplicationSettingsWidget::loadSettings() m_generalUi->systrayShowCheckBox->setChecked(config()->get(Config::GUI_ShowTrayIcon).toBool()); systrayToggled(m_generalUi->systrayShowCheckBox->isChecked()); - m_generalUi->systrayDarkIconCheckBox->setChecked(config()->get(Config::GUI_DarkTrayIcon).toBool()); m_generalUi->systrayMinimizeToTrayCheckBox->setChecked(config()->get(Config::GUI_MinimizeToTray).toBool()); m_generalUi->minimizeOnCloseCheckBox->setChecked(config()->get(Config::GUI_MinimizeOnClose).toBool()); m_generalUi->systrayMinimizeOnStartup->setChecked(config()->get(Config::GUI_MinimizeOnStartup).toBool()); @@ -261,6 +260,15 @@ void ApplicationSettingsWidget::loadSettings() m_generalUi->autoTypeStartDelaySpinBox->setValue(config()->get(Config::AutoTypeStartDelay).toInt()); } + m_generalUi->trayIconAppearance->clear(); + m_generalUi->trayIconAppearance->addItem(tr("Monochrome (light)"), QStringLiteral("monochrome-light")); + m_generalUi->trayIconAppearance->addItem(tr("Monochrome (dark)"), QStringLiteral("monochrome-dark")); + m_generalUi->trayIconAppearance->addItem(tr("Colored"), QStringLiteral("colored")); + int trayIconIndex = m_generalUi->trayIconAppearance->findData(config()->get(Config::GUI_TrayIconAppearance)); + if (trayIconIndex > 0) { + m_generalUi->trayIconAppearance->setCurrentIndex(trayIconIndex); + } + m_secUi->clearClipboardCheckBox->setChecked(config()->get(Config::Security_ClearClipboard).toBool()); m_secUi->clearClipboardSpinBox->setValue(config()->get(Config::Security_ClearClipboardTimeout).toInt()); @@ -341,7 +349,7 @@ void ApplicationSettingsWidget::saveSettings() config()->set(Config::GUI_ToolButtonStyle, m_generalUi->toolButtonStyleComboBox->currentData().toString()); config()->set(Config::GUI_ShowTrayIcon, m_generalUi->systrayShowCheckBox->isChecked()); - config()->set(Config::GUI_DarkTrayIcon, m_generalUi->systrayDarkIconCheckBox->isChecked()); + config()->set(Config::GUI_TrayIconAppearance, m_generalUi->trayIconAppearance->currentData().toString()); config()->set(Config::GUI_MinimizeToTray, m_generalUi->systrayMinimizeToTrayCheckBox->isChecked()); config()->set(Config::GUI_MinimizeOnClose, m_generalUi->minimizeOnCloseCheckBox->isChecked()); config()->set(Config::GUI_MinimizeOnStartup, m_generalUi->systrayMinimizeOnStartup->isChecked()); @@ -468,7 +476,8 @@ void ApplicationSettingsWidget::hideWindowOnCopyCheckBoxToggled(bool checked) void ApplicationSettingsWidget::systrayToggled(bool checked) { - m_generalUi->systrayDarkIconCheckBox->setEnabled(checked); + m_generalUi->trayIconAppearance->setEnabled(checked); + m_generalUi->trayIconAppearanceLabel->setEnabled(checked); m_generalUi->systrayMinimizeToTrayCheckBox->setEnabled(checked); } diff --git a/src/gui/ApplicationSettingsWidgetGeneral.ui b/src/gui/ApplicationSettingsWidgetGeneral.ui index 12a5cc57d..fea7481aa 100644 --- a/src/gui/ApplicationSettingsWidgetGeneral.ui +++ b/src/gui/ApplicationSettingsWidgetGeneral.ui @@ -401,6 +401,9 @@ Favicon download timeout: + + faviconTimeoutSpinBox + @@ -508,6 +511,9 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + appThemeSelection + @@ -540,6 +546,9 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + languageComboBox + @@ -562,6 +571,9 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + toolButtonStyleComboBox + @@ -646,14 +658,14 @@ - - - 0 - + QLayout::SetMaximumSize - + + 0 + + Qt::Horizontal @@ -669,16 +681,61 @@ - - + + + + false + + + + 0 + 0 + + + + + + false - Dark system tray icon + Tray icon type: + + + trayIconAppearance + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 6 + 0 + + + + @@ -885,6 +942,9 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + autoTypeDelaySpinBox + @@ -964,6 +1024,9 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + autoTypeShortcutWidget + @@ -974,6 +1037,9 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + autoTypeStartDelaySpinBox + @@ -1050,7 +1116,6 @@ monospaceNotesCheckBox minimizeOnCloseCheckBox systrayShowCheckBox - systrayDarkIconCheckBox systrayMinimizeToTrayCheckBox resetSettingsButton autoTypeEntryTitleMatchCheckBox diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 1cf4d46f0..18e8ac0dc 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -392,6 +392,7 @@ MainWindow::MainWindow() connect(m_ui->tabWidget, SIGNAL(currentChanged(int)), SLOT(updateWindowTitle())); connect(m_ui->tabWidget, SIGNAL(currentChanged(int)), SLOT(databaseTabChanged(int))); connect(m_ui->tabWidget, SIGNAL(currentChanged(int)), SLOT(setMenuActionState())); + connect(m_ui->tabWidget, SIGNAL(currentChanged(int)), SLOT(updateTrayIcon())); connect(m_ui->tabWidget, SIGNAL(databaseLocked(DatabaseWidget*)), SLOT(databaseStatusChanged(DatabaseWidget*))); connect(m_ui->tabWidget, SIGNAL(databaseUnlocked(DatabaseWidget*)), SLOT(databaseStatusChanged(DatabaseWidget*))); connect(m_ui->tabWidget, SIGNAL(tabVisibilityChanged(bool)), SLOT(updateToolbarSeparatorVisibility())); @@ -1227,7 +1228,7 @@ void MainWindow::updateTrayIcon() auto* actionToggle = new QAction(tr("Toggle window"), menu); menu->addAction(actionToggle); - actionToggle->setIcon(resources()->icon("keepassxc-dark", false)); + actionToggle->setIcon(resources()->icon("keepassxc-monochrome-dark")); menu->addAction(m_ui->actionLockDatabases); @@ -1250,7 +1251,10 @@ void MainWindow::updateTrayIcon() m_trayIcon->setIcon(resources()->trayIcon()); m_trayIcon->show(); } - if (m_ui->tabWidget->hasLockableDatabases()) { + + if (m_ui->tabWidget->count() == 0) { + m_trayIcon->setIcon(resources()->trayIcon()); + } else if (m_ui->tabWidget->hasLockableDatabases()) { m_trayIcon->setIcon(resources()->trayIconUnlocked()); } else { m_trayIcon->setIcon(resources()->trayIconLocked()); @@ -1259,7 +1263,6 @@ void MainWindow::updateTrayIcon() if (m_trayIcon) { m_trayIcon->hide(); delete m_trayIcon; - m_trayIcon = nullptr; } } } diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index b901ef54c..f5d58d75e 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -136,6 +136,9 @@ private slots: void releaseContextFocusLock(); void agentEnabled(bool enabled); +private slots: + void updateTrayIcon(); + private: static void setShortcut(QAction* action, QKeySequence::StandardKey standard, int fallback = 0); @@ -143,7 +146,6 @@ private: void saveWindowInformation(); bool saveLastDatabases(); - void updateTrayIcon(); bool isTrayIconEnabled() const; void customOpenUrl(QString url); diff --git a/src/gui/styles/base/BaseStyle.cpp b/src/gui/styles/base/BaseStyle.cpp index 3997cadff..3b3c60411 100644 --- a/src/gui/styles/base/BaseStyle.cpp +++ b/src/gui/styles/base/BaseStyle.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include