From 3bbf11e26fa9c0aa1b44ce4d543ea5e1b9fbbb18 Mon Sep 17 00:00:00 2001 From: thez3ro Date: Sat, 8 Oct 2016 18:55:05 +0200 Subject: [PATCH] Unlocked tray icon #37 --- share/CMakeLists.txt | 2 +- .../scalable/apps/keepassx-locked.svgz | Bin 0 -> 4263 bytes src/core/FilePath.cpp | 10 ++++++++++ src/core/FilePath.h | 2 ++ src/gui/DatabaseTabWidget.cpp | 8 ++++++++ src/gui/DatabaseTabWidget.h | 3 +++ src/gui/DatabaseWidget.cpp | 1 + src/gui/MainWindow.cpp | 18 +++++++++++++++++- src/gui/MainWindow.h | 1 + 9 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 share/icons/application/scalable/apps/keepassx-locked.svgz diff --git a/share/CMakeLists.txt b/share/CMakeLists.txt index 6a276d97c..ede76cb68 100644 --- a/share/CMakeLists.txt +++ b/share/CMakeLists.txt @@ -21,7 +21,7 @@ install(FILES ${DATABASE_ICONS} DESTINATION ${DATA_INSTALL_DIR}/icons/database) if(UNIX AND NOT APPLE) install(DIRECTORY icons/application/ DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor - FILES_MATCHING PATTERN "keepassx.png" PATTERN "keepassx.svgz") + FILES_MATCHING PATTERN "keepassx*.png" PATTERN "keepassx*.svgz") install(DIRECTORY icons/application/ DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor FILES_MATCHING PATTERN "application-x-keepassx.png" PATTERN "application-x-keepassx.svgz") install(FILES linux/keepassx.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) diff --git a/share/icons/application/scalable/apps/keepassx-locked.svgz b/share/icons/application/scalable/apps/keepassx-locked.svgz new file mode 100644 index 0000000000000000000000000000000000000000..2c3405c9a951e7dfc8d7f63b906f81a371879ba6 GIT binary patch literal 4263 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 J)6!Zm0083JHD~|; literal 0 HcmV?d00001 diff --git a/src/core/FilePath.cpp b/src/core/FilePath.cpp index 06208b7c9..a572bace5 100644 --- a/src/core/FilePath.cpp +++ b/src/core/FilePath.cpp @@ -90,6 +90,16 @@ QIcon FilePath::applicationIcon() return icon("apps", "keepassx"); } +QIcon FilePath::trayIconLocked() +{ + return icon("apps", "keepassx-locked"); +} + +QIcon FilePath::trayIconUnlocked() +{ + return applicationIcon(); +} + QIcon FilePath::icon(const QString& category, const QString& name, bool fromTheme) { QString combinedName = category + "/" + name; diff --git a/src/core/FilePath.h b/src/core/FilePath.h index c37a90887..34edcbc93 100644 --- a/src/core/FilePath.h +++ b/src/core/FilePath.h @@ -28,6 +28,8 @@ public: QString dataPath(const QString& name); QString pluginPath(const QString& name); QIcon applicationIcon(); + QIcon trayIconLocked(); + QIcon trayIconUnlocked(); QIcon icon(const QString& category, const QString& name, bool fromTheme = true); QIcon onOffIcon(const QString& category, const QString& name); diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 1abb6b452..45bbbae83 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -610,6 +610,7 @@ void DatabaseTabWidget::insertDatabase(Database* db, const DatabaseManagerStruct connect(dbStruct.dbWidget, SIGNAL(closeRequest()), SLOT(closeDatabaseFromSender())); connect(dbStruct.dbWidget, SIGNAL(databaseChanged(Database*)), SLOT(changeDatabase(Database*))); connect(dbStruct.dbWidget, SIGNAL(unlockedDatabase()), SLOT(updateTabNameFromDbWidgetSender())); + connect(dbStruct.dbWidget, SIGNAL(unlockedDatabase()), SLOT(emitDatabaseUnlockedFromDbWidgetSender())); } DatabaseWidget* DatabaseTabWidget::currentDatabaseWidget() @@ -706,6 +707,8 @@ void DatabaseTabWidget::lockDatabases() dbWidget->lock(); // database has changed so we can't use the db variable anymore updateTabName(dbWidget->database()); + + Q_EMIT databaseLocked(dbWidget); } } @@ -764,6 +767,11 @@ void DatabaseTabWidget::emitActivateDatabaseChanged() Q_EMIT activateDatabaseChanged(currentDatabaseWidget()); } +void DatabaseTabWidget::emitDatabaseUnlockedFromDbWidgetSender() +{ + Q_EMIT databaseUnlocked(static_cast(sender())); +} + void DatabaseTabWidget::connectDatabase(Database* newDb, Database* oldDb) { if (oldDb) { diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index de4a9ca12..618b48b1c 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -80,6 +80,8 @@ Q_SIGNALS: void tabNameChanged(); void databaseWithFileClosed(QString filePath); void activateDatabaseChanged(DatabaseWidget* dbWidget); + void databaseLocked(DatabaseWidget* dbWidget); + void databaseUnlocked(DatabaseWidget* dbWidget); private Q_SLOTS: void updateTabName(Database* db); @@ -89,6 +91,7 @@ private Q_SLOTS: void toggleTabbar(); void changeDatabase(Database* newDb); void emitActivateDatabaseChanged(); + void emitDatabaseUnlockedFromDbWidgetSender(); private: bool saveDatabase(Database* db); diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 120379171..0ede41926 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -658,6 +658,7 @@ void DatabaseWidget::openDatabase(bool accepted) if (accepted) { replaceDatabase(static_cast(sender())->database()); setCurrentWidget(m_mainWidget); + Q_EMIT unlockedDatabase(); // We won't need those anymore and KeePass1OpenWidget closes // the file in its dtor. diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 6dccf1dc3..f3d41521c 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -185,6 +185,10 @@ MainWindow::MainWindow() SLOT(databaseTabChanged(int))); connect(m_ui->tabWidget, SIGNAL(currentChanged(int)), SLOT(setMenuActionState())); + connect(m_ui->tabWidget, SIGNAL(databaseLocked(DatabaseWidget*)), + SLOT(databaseStatusChanged(DatabaseWidget*))); + connect(m_ui->tabWidget, SIGNAL(databaseUnlocked(DatabaseWidget*)), + SLOT(databaseStatusChanged(DatabaseWidget*))); connect(m_ui->stackedWidget, SIGNAL(currentChanged(int)), SLOT(setMenuActionState())); connect(m_ui->stackedWidget, SIGNAL(currentChanged(int)), SLOT(updateWindowTitle())); connect(m_ui->settingsWidget, SIGNAL(editFinished(bool)), SLOT(switchToDatabases())); @@ -486,6 +490,11 @@ void MainWindow::switchToSettings() m_ui->stackedWidget->setCurrentIndex(1); } +void MainWindow::databaseStatusChanged(DatabaseWidget *) +{ + updateTrayIcon(); +} + void MainWindow::databaseTabChanged(int tabIndex) { if (tabIndex != -1 && m_ui->stackedWidget->currentIndex() == 2) { @@ -573,7 +582,7 @@ void MainWindow::updateTrayIcon() { if (isTrayIconEnabled()) { if (!m_trayIcon) { - m_trayIcon = new QSystemTrayIcon(filePath()->applicationIcon(), this); + m_trayIcon = new QSystemTrayIcon(this); QMenu* menu = new QMenu(this); @@ -587,8 +596,15 @@ void MainWindow::updateTrayIcon() connect(actionToggle, SIGNAL(triggered()), SLOT(toggleWindow())); m_trayIcon->setContextMenu(menu); + m_trayIcon->setIcon(filePath()->applicationIcon()); m_trayIcon->show(); } + if (m_ui->tabWidget->hasLockableDatabases()) { + m_trayIcon->setIcon(filePath()->trayIconUnlocked()); + } + else { + m_trayIcon->setIcon(filePath()->trayIconLocked()); + } } else { if (m_trayIcon) { diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index 02019312d..7e1a18293 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -54,6 +54,7 @@ private Q_SLOTS: void showAboutDialog(); void switchToDatabases(); void switchToSettings(); + void databaseStatusChanged(DatabaseWidget *dbWidget); void databaseTabChanged(int tabIndex); void openRecentDatabase(QAction* action); void clearLastDatabases();