diff --git a/src/forms/settings/settings.cpp b/src/forms/settings/settings.cpp index cf79650..e01a269 100644 --- a/src/forms/settings/settings.cpp +++ b/src/forms/settings/settings.cpp @@ -22,9 +22,8 @@ #include "components/custom_keyseq_edit/singlestrokekeysequenceedit.h" #include "components/loading_button/loadingbutton.h" -Settings::Settings(HotkeyManager *hotkeyManager, QWidget *parent) +Settings::Settings(QWidget *parent) : AShirtDialog(parent, AShirtDialog::commonWindowFlags) - , hotkeyManager(hotkeyManager) , connStatusLabel(new QLabel(this)) , eviRepoTextBox(new QLineEdit(this)) , accessKeyTextBox(new QLineEdit(this)) @@ -163,7 +162,7 @@ void Settings::checkForDuplicateShortcuts(const QKeySequence& keySequence, QKeyS void Settings::showEvent(QShowEvent *evt) { QDialog::showEvent(evt); - hotkeyManager->disableHotkeys(); + HotkeyManager::disableHotkeys(); eviRepoTextBox->setFocus(); //setting focus to prevent retaining focus for macs // reset the form in case a user left junk in the text boxes and pressed "cancel" @@ -184,12 +183,12 @@ void Settings::showEvent(QShowEvent *evt) { void Settings::closeEvent(QCloseEvent *event) { onSaveClicked(); - hotkeyManager->enableHotkeys(); + HotkeyManager::enableHotkeys(); QDialog::closeEvent(event); } void Settings::onCancelClicked() { - hotkeyManager->enableHotkeys(); + HotkeyManager::enableHotkeys(); reject(); } @@ -211,7 +210,7 @@ void Settings::onSaveClicked() { AppConfig::setValue(CONFIG::SHORTCUT_CAPTUREWINDOW, captureWindowShortcutTextBox->keySequence().toString()); AppConfig::setValue(CONFIG::SHORTCUT_CAPTURECLIPBOARD, captureClipboardShortcutTextBox->keySequence().toString()); - hotkeyManager->updateHotkeys(); + HotkeyManager::updateHotkeys(); close(); } diff --git a/src/forms/settings/settings.h b/src/forms/settings/settings.h index df923c6..086c8ce 100644 --- a/src/forms/settings/settings.h +++ b/src/forms/settings/settings.h @@ -26,10 +26,9 @@ class Settings : public AShirtDialog { public: /** * @brief Settings constructs the settings menu. UI will be built and wired. - * @param hotkeyManager a handle to the HotkeyManager, so hotkeys may be updated upon saving. * @param parent */ - explicit Settings(HotkeyManager* hotkeyManager, QWidget* parent = nullptr); + explicit Settings(QWidget* parent = nullptr); ~Settings() = default; private: @@ -61,9 +60,6 @@ class Settings : public AShirtDialog { void onBrowseClicked(); private: - /// hotkeyManager is a (shared) reference to the HotkeyManager. Not to be deleted. - HotkeyManager* hotkeyManager; - // UI components QLabel* connStatusLabel = nullptr; diff --git a/src/helpers/hotkeys/uglobalhotkeys.cpp b/src/helpers/hotkeys/uglobalhotkeys.cpp index 133fbe9..8d46dd9 100644 --- a/src/helpers/hotkeys/uglobalhotkeys.cpp +++ b/src/helpers/hotkeys/uglobalhotkeys.cpp @@ -107,7 +107,9 @@ bool UGlobalHotkeys::registerHotkey(const UKeySequence &keySeq, size_t id) void UGlobalHotkeys::unregisterHotkey(size_t id) { #if defined(Q_OS_WIN) || defined(Q_OS_LINUX) - Q_ASSERT(Registered.find(id) != Registered.end() && "Unregistered hotkey"); + if(Registered.find(id) == Registered.end()) { + return; + } #endif #if defined(Q_OS_WIN) UnregisterHotKey(nullptr, id); diff --git a/src/hotkeymanager.cpp b/src/hotkeymanager.cpp index 28d6e2d..7f08f82 100644 --- a/src/hotkeymanager.cpp +++ b/src/hotkeymanager.cpp @@ -4,51 +4,52 @@ #include "hotkeymanager.h" #include "appconfig.h" -HotkeyManager::HotkeyManager(QObject *parent) - : QObject (parent) - , hotkeyManager(new UGlobalHotkeys(this)) +HotkeyManager::HotkeyManager() + : m_hotkeyManager(new UGlobalHotkeys(this)) { - connect(hotkeyManager, &UGlobalHotkeys::activated, this, &HotkeyManager::hotkeyTriggered); + connect(m_hotkeyManager, &UGlobalHotkeys::activated, this, &HotkeyManager::hotkeyTriggered); } -HotkeyManager::~HotkeyManager() { delete hotkeyManager; } +HotkeyManager::~HotkeyManager() { delete m_hotkeyManager; } + +void HotkeyManager::regKey(QString combo, GlobalHotkeyEvent evt) +{ + if (combo.isEmpty()) + return; + registerKey(combo, evt); +} void HotkeyManager::registerKey(const QString& binding, GlobalHotkeyEvent evt) { - hotkeyManager->registerHotkey(binding, size_t(evt)); + get()->m_hotkeyManager->registerHotkey(binding, size_t(evt)); } void HotkeyManager::unregisterKey(GlobalHotkeyEvent evt) { - hotkeyManager->unregisterHotkey(size_t(evt)); + get()->m_hotkeyManager->unregisterHotkey(size_t(evt)); } void HotkeyManager::hotkeyTriggered(size_t hotkeyIndex) { if (hotkeyIndex == ACTION_CAPTURE_AREA) { - Q_EMIT captureAreaHotkeyPressed(); + Q_EMIT get()->captureAreaHotkeyPressed(); } else if (hotkeyIndex == ACTION_CAPTURE_WINDOW) { - Q_EMIT captureWindowHotkeyPressed(); + Q_EMIT get()->captureWindowHotkeyPressed(); } else if (hotkeyIndex == ACTION_CAPTURE_CLIPBOARD) { - Q_EMIT clipboardHotkeyPressed(); + Q_EMIT get()->clipboardHotkeyPressed(); } } void HotkeyManager::disableHotkeys() { - hotkeyManager->unregisterAllHotkeys(); + get()->m_hotkeyManager->unregisterAllHotkeys(); } void HotkeyManager::enableHotkeys() { - updateHotkeys(); + get()->updateHotkeys(); } void HotkeyManager::updateHotkeys() { - hotkeyManager->unregisterAllHotkeys(); - auto regKey = [this](QString combo, GlobalHotkeyEvent evt) { - if (!combo.isEmpty()) { - registerKey(combo, evt); - } - }; - regKey(AppConfig::value(CONFIG::SHORTCUT_SCREENSHOT), ACTION_CAPTURE_AREA); - regKey(AppConfig::value(CONFIG::SHORTCUT_CAPTUREWINDOW), ACTION_CAPTURE_WINDOW); - regKey(AppConfig::value(CONFIG::SHORTCUT_CAPTURECLIPBOARD), ACTION_CAPTURE_CLIPBOARD); + get()->m_hotkeyManager->unregisterAllHotkeys(); + get()->regKey(AppConfig::value(CONFIG::SHORTCUT_SCREENSHOT), ACTION_CAPTURE_AREA); + get()->regKey(AppConfig::value(CONFIG::SHORTCUT_CAPTUREWINDOW), ACTION_CAPTURE_WINDOW); + get()->regKey(AppConfig::value(CONFIG::SHORTCUT_CAPTURECLIPBOARD), ACTION_CAPTURE_CLIPBOARD); } diff --git a/src/hotkeymanager.h b/src/hotkeymanager.h index 281d8f4..04b206d 100644 --- a/src/hotkeymanager.h +++ b/src/hotkeymanager.h @@ -13,12 +13,9 @@ */ class HotkeyManager : public QObject { Q_OBJECT + /// GlobalHotkeyEvent provides names for all possible application-global hotkeys public: - HotkeyManager(QObject *parent = nullptr); - ~HotkeyManager(); - - /// GlobalHotkeyEvent provides names for all possible application-global hotkeys enum GlobalHotkeyEvent { // Reserving 1 (UGlobalHotkey default) ACTION_CAPTURE_AREA = 2, @@ -26,23 +23,26 @@ class HotkeyManager : public QObject { ACTION_CAPTURE_CLIPBOARD = 4, }; - public: + static HotkeyManager* get() { + static HotkeyManager m; + return &m; + } /** * @brief registerKey pairs a given key combination with a given event type. * @param binding A string representing the actual command (e.g. Alt+f1) * @param evt A GlobalHotkeyEvent specifying what should happen when a key is pressed. */ - void registerKey(const QString& binding, GlobalHotkeyEvent evt); + static void registerKey(const QString& binding, GlobalHotkeyEvent evt); /// unregisterKey removes the handling specified for the given event. Safe to call even if /// no key has been registered. - void unregisterKey(GlobalHotkeyEvent evt); + static void unregisterKey(GlobalHotkeyEvent evt); /// disableHotkeys removes all of the keybindings. - void disableHotkeys(); + static void disableHotkeys(); /// enableHotkeys "restores" all of the currently set hotkeys. This acts as the counterpoint to /// disableHotkeys, but functionally is identical to updateHotKeys. - void enableHotkeys(); + static void enableHotkeys(); signals: /// clipboardHotkeyPressed signals when the ACTION_CAPTURE_CLIPBOARD event has been triggered. @@ -55,13 +55,17 @@ class HotkeyManager : public QObject { public slots: /// updateHotkeys retrives AppConfig data to set known global hotkeys. Removes _all_ (Application) /// hotkeys when called. - void updateHotkeys(); + static void updateHotkeys(); private slots: /// hotkeyTriggered provides a slot for interacting with the underlying UGlobalHotkey manager. - void hotkeyTriggered(size_t hotkeyIndex); + static void hotkeyTriggered(size_t hotkeyIndex); - private: + private: + HotkeyManager(); + ~HotkeyManager(); + /// Interal Reg method used to filter Empty keys + void regKey(QString combo, GlobalHotkeyEvent evt); /// hotkeyManager is a reference to the raw hotkey manager, which a 3rd party manages. - UGlobalHotkeys* hotkeyManager; + UGlobalHotkeys* m_hotkeyManager = nullptr; }; diff --git a/src/traymanager.cpp b/src/traymanager.cpp index 2b95002..cfa00cd 100644 --- a/src/traymanager.cpp +++ b/src/traymanager.cpp @@ -30,9 +30,8 @@ TrayManager::TrayManager(QWidget * parent, DatabaseConnection* db) : QDialog(parent) , db(db) , screenshotTool(new Screenshot(this)) - , hotkeyManager(new HotkeyManager(this)) , updateCheckTimer(new QTimer(this)) - , settingsWindow(new Settings(hotkeyManager, this)) + , settingsWindow(new Settings(this)) , evidenceManagerWindow(new EvidenceManager(this->db, this)) , creditsWindow(new Credits(this)) , importWindow(new PortingDialog(PortingDialog::Import, this->db, this)) @@ -43,7 +42,7 @@ TrayManager::TrayManager(QWidget * parent, DatabaseConnection* db) , allOperationActions(this) { - hotkeyManager->updateHotkeys(); + HotkeyManager::updateHotkeys(); updateCheckTimer->start(MS_IN_DAY); // every day buildUi(); @@ -106,11 +105,11 @@ void TrayManager::wireUi() { &TrayManager::onScreenshotCaptured); // connect to hotkey signals - connect(hotkeyManager, &HotkeyManager::clipboardHotkeyPressed, this, + connect(HotkeyManager::get(), &HotkeyManager::clipboardHotkeyPressed, this, &TrayManager::captureClipboardActionTriggered); - connect(hotkeyManager, &HotkeyManager::captureAreaHotkeyPressed, this, + connect(HotkeyManager::get(), &HotkeyManager::captureAreaHotkeyPressed, this, &TrayManager::captureAreaActionTriggered); - connect(hotkeyManager, &HotkeyManager::captureWindowHotkeyPressed, this, + connect(HotkeyManager::get(), &HotkeyManager::captureWindowHotkeyPressed, this, &TrayManager::captureWindowActionTriggered); // connect to network signals diff --git a/src/traymanager.h b/src/traymanager.h index 22860ba..82506a4 100644 --- a/src/traymanager.h +++ b/src/traymanager.h @@ -14,7 +14,6 @@ #include "forms/porting/porting_dialog.h" #include "forms/settings/settings.h" #include "helpers/screenshot.h" -#include "hotkeymanager.h" #include "forms/add_operation/createoperation.h" #ifndef QT_NO_SYSTEMTRAYICON @@ -91,7 +90,6 @@ class TrayManager : public QDialog { inline static const int MS_IN_DAY = 86400000; QString _recordErrorTitle = tr("Unable to Record Evidence"); DatabaseConnection *db = nullptr; - HotkeyManager *hotkeyManager = nullptr; Screenshot *screenshotTool = nullptr; QTimer *updateCheckTimer = nullptr; MessageType currentTrayMessage = NO_ACTION;