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 @@
-
-
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 @@
-
-
+
\ 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 @@
-
-
+
\ 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 @@
-
-
+
\ 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