diff options
Diffstat (limited to 'src/gui/ApplicationSettingsWidget.cpp')
-rw-r--r-- | src/gui/ApplicationSettingsWidget.cpp | 114 |
1 files changed, 110 insertions, 4 deletions
diff --git a/src/gui/ApplicationSettingsWidget.cpp b/src/gui/ApplicationSettingsWidget.cpp index 2461230c8..d3cc994f8 100644 --- a/src/gui/ApplicationSettingsWidget.cpp +++ b/src/gui/ApplicationSettingsWidget.cpp @@ -28,6 +28,7 @@ #include "core/Global.h" #include "core/Translator.h" +#include "MessageBox.h" #include "touchid/TouchID.h" class ApplicationSettingsWidget::ExtraPage @@ -54,6 +55,28 @@ private: QWidget* widget; }; +/** + * Helper class to ignore mouse wheel events on non-focused widgets + * NOTE: The widget must NOT have a focus policy of "WHEEL" + */ +class MouseWheelEventFilter : public QObject +{ +public: + explicit MouseWheelEventFilter(QObject* parent) + : QObject(parent){}; + +protected: + bool eventFilter(QObject* obj, QEvent* event) override + { + const auto* widget = qobject_cast<QWidget*>(obj); + if (event->type() == QEvent::Wheel && widget && !widget->hasFocus()) { + event->ignore(); + return true; + } + return QObject::eventFilter(obj, event); + } +}; + ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent) : EditWidget(parent) , m_secWidget(new QWidget()) @@ -80,28 +103,41 @@ ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent) // clang-format off connect(m_generalUi->autoSaveAfterEveryChangeCheckBox, SIGNAL(toggled(bool)), SLOT(autoSaveToggled(bool))); + connect(m_generalUi->hideWindowOnCopyCheckBox, SIGNAL(toggled(bool)), SLOT(hideWindowOnCopyCheckBoxToggled(bool))); connect(m_generalUi->systrayShowCheckBox, SIGNAL(toggled(bool)), SLOT(systrayToggled(bool))); connect(m_generalUi->toolbarHideCheckBox, SIGNAL(toggled(bool)), SLOT(toolbarSettingsToggled(bool))); connect(m_generalUi->rememberLastDatabasesCheckBox, SIGNAL(toggled(bool)), SLOT(rememberDatabasesToggled(bool))); + connect(m_generalUi->resetSettingsButton, SIGNAL(clicked()), SLOT(resetSettings())); connect(m_secUi->clearClipboardCheckBox, SIGNAL(toggled(bool)), m_secUi->clearClipboardSpinBox, SLOT(setEnabled(bool))); + connect(m_secUi->clearSearchCheckBox, SIGNAL(toggled(bool)), + m_secUi->clearSearchSpinBox, SLOT(setEnabled(bool))); connect(m_secUi->lockDatabaseIdleCheckBox, SIGNAL(toggled(bool)), m_secUi->lockDatabaseIdleSpinBox, SLOT(setEnabled(bool))); connect(m_secUi->touchIDResetCheckBox, SIGNAL(toggled(bool)), m_secUi->touchIDResetSpinBox, SLOT(setEnabled(bool))); // clang-format on + // Disable mouse wheel grab when scrolling + // This prevents combo box and spinner values from changing without explicit focus + auto mouseWheelFilter = new MouseWheelEventFilter(this); + m_generalUi->faviconTimeoutSpinBox->installEventFilter(mouseWheelFilter); + m_generalUi->toolButtonStyleComboBox->installEventFilter(mouseWheelFilter); + m_generalUi->languageComboBox->installEventFilter(mouseWheelFilter); + #ifdef WITH_XC_UPDATECHECK connect(m_generalUi->checkForUpdatesOnStartupCheckBox, SIGNAL(toggled(bool)), SLOT(checkUpdatesToggled(bool))); #else m_generalUi->checkForUpdatesOnStartupCheckBox->setVisible(false); m_generalUi->checkForUpdatesIncludeBetasCheckBox->setVisible(false); - m_generalUi->checkUpdatesSpacer->changeSize(0,0, QSizePolicy::Fixed, QSizePolicy::Fixed); + m_generalUi->checkUpdatesSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed); #endif #ifndef WITH_XC_NETWORKING m_secUi->privacy->setVisible(false); + m_generalUi->faviconTimeoutLabel->setVisible(false); + m_generalUi->faviconTimeoutSpinBox->setVisible(false); #endif #ifndef WITH_XC_TOUCHID @@ -147,11 +183,20 @@ void ApplicationSettingsWidget::loadSettings() m_generalUi->backupBeforeSaveCheckBox->setChecked(config()->get("BackupBeforeSave").toBool()); m_generalUi->useAtomicSavesCheckBox->setChecked(config()->get("UseAtomicSaves").toBool()); m_generalUi->autoReloadOnChangeCheckBox->setChecked(config()->get("AutoReloadOnChange").toBool()); - m_generalUi->minimizeOnCopyCheckBox->setChecked(config()->get("MinimizeOnCopy").toBool()); + m_generalUi->minimizeAfterUnlockCheckBox->setChecked(config()->get("MinimizeAfterUnlock").toBool()); + m_generalUi->minimizeOnOpenUrlCheckBox->setChecked(config()->get("MinimizeOnOpenUrl").toBool()); + m_generalUi->hideWindowOnCopyCheckBox->setChecked(config()->get("HideWindowOnCopy").toBool()); + m_generalUi->minimizeOnCopyRadioButton->setChecked(config()->get("MinimizeOnCopy").toBool()); + m_generalUi->dropToBackgroundOnCopyRadioButton->setChecked(config()->get("DropToBackgroundOnCopy").toBool()); m_generalUi->useGroupIconOnEntryCreationCheckBox->setChecked(config()->get("UseGroupIconOnEntryCreation").toBool()); m_generalUi->autoTypeEntryTitleMatchCheckBox->setChecked(config()->get("AutoTypeEntryTitleMatch").toBool()); m_generalUi->autoTypeEntryURLMatchCheckBox->setChecked(config()->get("AutoTypeEntryURLMatch").toBool()); m_generalUi->ignoreGroupExpansionCheckBox->setChecked(config()->get("IgnoreGroupExpansion").toBool()); + m_generalUi->faviconTimeoutSpinBox->setValue(config()->get("FaviconDownloadTimeout").toInt()); + + if (!m_generalUi->hideWindowOnCopyCheckBox->isChecked()) { + hideWindowOnCopyCheckBoxToggled(false); + } m_generalUi->languageComboBox->clear(); QList<QPair<QString, QString>> languages = Translator::availableLanguages(); @@ -166,6 +211,7 @@ void ApplicationSettingsWidget::loadSettings() m_generalUi->previewHideCheckBox->setChecked(config()->get("GUI/HidePreviewPanel").toBool()); m_generalUi->toolbarHideCheckBox->setChecked(config()->get("GUI/HideToolbar").toBool()); m_generalUi->toolbarMovableCheckBox->setChecked(config()->get("GUI/MovableToolbar").toBool()); + m_generalUi->monospaceNotesCheckBox->setChecked(config()->get("GUI/MonospaceNotes").toBool()); m_generalUi->toolButtonStyleComboBox->clear(); m_generalUi->toolButtonStyleComboBox->addItem(tr("Icon only"), Qt::ToolButtonIconOnly); @@ -203,6 +249,9 @@ void ApplicationSettingsWidget::loadSettings() m_secUi->clearClipboardCheckBox->setChecked(config()->get("security/clearclipboard").toBool()); m_secUi->clearClipboardSpinBox->setValue(config()->get("security/clearclipboardtimeout").toInt()); + m_secUi->clearSearchCheckBox->setChecked(config()->get("security/clearsearch").toBool()); + m_secUi->clearSearchSpinBox->setValue(config()->get("security/clearsearchtimeout").toInt()); + m_secUi->lockDatabaseIdleCheckBox->setChecked(config()->get("security/lockdatabaseidle").toBool()); m_secUi->lockDatabaseIdleSpinBox->setValue(config()->get("security/lockdatabaseidlesec").toInt()); m_secUi->lockDatabaseMinimizeCheckBox->setChecked(config()->get("security/lockdatabaseminimize").toBool()); @@ -229,7 +278,6 @@ void ApplicationSettingsWidget::loadSettings() void ApplicationSettingsWidget::saveSettings() { - if (config()->hasAccessError()) { showMessage(tr("Access error for config file %1").arg(config()->getFileName()), MessageWidget::Error); // We prevent closing the settings page if we could not write to @@ -246,18 +294,24 @@ void ApplicationSettingsWidget::saveSettings() config()->set("BackupBeforeSave", m_generalUi->backupBeforeSaveCheckBox->isChecked()); config()->set("UseAtomicSaves", m_generalUi->useAtomicSavesCheckBox->isChecked()); config()->set("AutoReloadOnChange", m_generalUi->autoReloadOnChangeCheckBox->isChecked()); - config()->set("MinimizeOnCopy", m_generalUi->minimizeOnCopyCheckBox->isChecked()); + config()->set("MinimizeAfterUnlock", m_generalUi->minimizeAfterUnlockCheckBox->isChecked()); + config()->set("MinimizeOnOpenUrl", m_generalUi->minimizeOnOpenUrlCheckBox->isChecked()); + config()->set("HideWindowOnCopy", m_generalUi->hideWindowOnCopyCheckBox->isChecked()); + config()->set("MinimizeOnCopy", m_generalUi->minimizeOnCopyRadioButton->isChecked()); + config()->set("DropToBackgroundOnCopy", m_generalUi->dropToBackgroundOnCopyRadioButton->isChecked()); config()->set("UseGroupIconOnEntryCreation", m_generalUi->useGroupIconOnEntryCreationCheckBox->isChecked()); config()->set("IgnoreGroupExpansion", m_generalUi->ignoreGroupExpansionCheckBox->isChecked()); config()->set("AutoTypeEntryTitleMatch", m_generalUi->autoTypeEntryTitleMatchCheckBox->isChecked()); config()->set("AutoTypeEntryURLMatch", m_generalUi->autoTypeEntryURLMatchCheckBox->isChecked()); int currentLangIndex = m_generalUi->languageComboBox->currentIndex(); + config()->set("FaviconDownloadTimeout", m_generalUi->faviconTimeoutSpinBox->value()); config()->set("GUI/Language", m_generalUi->languageComboBox->itemData(currentLangIndex).toString()); config()->set("GUI/HidePreviewPanel", m_generalUi->previewHideCheckBox->isChecked()); config()->set("GUI/HideToolbar", m_generalUi->toolbarHideCheckBox->isChecked()); config()->set("GUI/MovableToolbar", m_generalUi->toolbarMovableCheckBox->isChecked()); + config()->set("GUI/MonospaceNotes", m_generalUi->monospaceNotesCheckBox->isChecked()); int currentToolButtonStyleIndex = m_generalUi->toolButtonStyleComboBox->currentIndex(); config()->set("GUI/ToolButtonStyle", @@ -282,6 +336,9 @@ void ApplicationSettingsWidget::saveSettings() config()->set("security/clearclipboard", m_secUi->clearClipboardCheckBox->isChecked()); config()->set("security/clearclipboardtimeout", m_secUi->clearClipboardSpinBox->value()); + config()->set("security/clearsearch", m_secUi->clearSearchCheckBox->isChecked()); + config()->set("security/clearsearchtimeout", m_secUi->clearSearchSpinBox->value()); + config()->set("security/lockdatabaseidle", m_secUi->lockDatabaseIdleCheckBox->isChecked()); config()->set("security/lockdatabaseidlesec", m_secUi->lockDatabaseIdleSpinBox->value()); config()->set("security/lockdatabaseminimize", m_secUi->lockDatabaseMinimizeCheckBox->isChecked()); @@ -305,6 +362,7 @@ void ApplicationSettingsWidget::saveSettings() config()->set("LastDatabases", {}); config()->set("OpenPreviousDatabasesOnStartup", {}); config()->set("LastActiveDatabase", {}); + config()->set("LastAttachmentDir", {}); } if (!config()->get("RememberLastKeyFiles").toBool()) { @@ -317,6 +375,48 @@ void ApplicationSettingsWidget::saveSettings() } } +void ApplicationSettingsWidget::resetSettings() +{ + // Confirm reset + auto ans = MessageBox::question(this, + tr("Reset Settings?"), + tr("Are you sure you want to reset all general and security settings to default?"), + MessageBox::Reset | MessageBox::Cancel, + MessageBox::Cancel); + if (ans == MessageBox::Cancel) { + return; + } + + if (config()->hasAccessError()) { + showMessage(tr("Access error for config file %1").arg(config()->getFileName()), MessageWidget::Error); + // We prevent closing the settings page if we could not write to + // the config file. + return; + } + + // Reset general and security settings to default + config()->resetToDefaults(); + + // Clear recently used data + config()->set("LastDatabases", {}); + config()->set("OpenPreviousDatabasesOnStartup", {}); + config()->set("LastActiveDatabase", {}); + config()->set("LastAttachmentDir", {}); + config()->set("LastKeyFiles", {}); + config()->set("LastDir", ""); + + // Save the Extra Pages (these are NOT reset) + for (const ExtraPage& page : asConst(m_extraPages)) { + page.saveSettings(); + } + + config()->sync(); + + // Refresh the settings widget and notify listeners + loadSettings(); + emit settingsReset(); +} + void ApplicationSettingsWidget::reject() { // register the old key again as it might have changed @@ -334,6 +434,12 @@ void ApplicationSettingsWidget::autoSaveToggled(bool checked) m_generalUi->autoSaveOnExitCheckBox->setEnabled(!checked); } +void ApplicationSettingsWidget::hideWindowOnCopyCheckBoxToggled(bool checked) +{ + m_generalUi->minimizeOnCopyRadioButton->setEnabled(checked); + m_generalUi->dropToBackgroundOnCopyRadioButton->setEnabled(checked); +} + void ApplicationSettingsWidget::systrayToggled(bool checked) { m_generalUi->systrayDarkIconCheckBox->setEnabled(checked); |