diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/Application.cpp | 12 | ||||
-rw-r--r-- | src/gui/Application.h | 4 | ||||
-rw-r--r-- | src/gui/ApplicationSettingsWidget.cpp | 25 | ||||
-rw-r--r-- | src/gui/ApplicationSettingsWidget.h | 1 | ||||
-rw-r--r-- | src/gui/ApplicationSettingsWidgetGeneral.ui | 148 | ||||
-rw-r--r-- | src/gui/EntryPreviewWidget.cpp | 6 | ||||
-rw-r--r-- | src/gui/MainWindow.cpp | 60 | ||||
-rw-r--r-- | src/gui/MainWindow.h | 4 | ||||
-rw-r--r-- | src/gui/MainWindow.ui | 75 | ||||
-rw-r--r-- | src/main.cpp | 6 |
10 files changed, 205 insertions, 136 deletions
diff --git a/src/gui/Application.cpp b/src/gui/Application.cpp index 273ab8763..31222401b 100644 --- a/src/gui/Application.cpp +++ b/src/gui/Application.cpp @@ -315,3 +315,15 @@ bool Application::isDarkTheme() const { return m_darkTheme; } + +void Application::restart() +{ + // Disable single instance + m_lockServer.close(); + if (m_lockFile) { + m_lockFile->unlock(); + delete m_lockFile; + } + + exit(RESTART_EXITCODE); +} diff --git a/src/gui/Application.h b/src/gui/Application.h index 21dff6aff..9f694f8c3 100644 --- a/src/gui/Application.h +++ b/src/gui/Application.h @@ -31,6 +31,8 @@ class OSEventFilter; class QLockFile; class QSocketNotifier; +constexpr int RESTART_EXITCODE = -1; + class Application : public QApplication { Q_OBJECT @@ -47,6 +49,8 @@ public: bool sendFileNamesToRunningInstance(const QStringList& fileNames); + void restart(); + signals: void openFile(const QString& filename); void anotherInstanceStarted(); diff --git a/src/gui/ApplicationSettingsWidget.cpp b/src/gui/ApplicationSettingsWidget.cpp index d3fa1ea4f..691115368 100644 --- a/src/gui/ApplicationSettingsWidget.cpp +++ b/src/gui/ApplicationSettingsWidget.cpp @@ -106,7 +106,6 @@ ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent) 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())); @@ -126,7 +125,6 @@ ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent) m_generalUi->faviconTimeoutSpinBox->installEventFilter(mouseWheelFilter); m_generalUi->toolButtonStyleComboBox->installEventFilter(mouseWheelFilter); m_generalUi->languageComboBox->installEventFilter(mouseWheelFilter); - m_generalUi->appThemeSelection->installEventFilter(mouseWheelFilter); #ifdef WITH_XC_UPDATECHECK connect(m_generalUi->checkForUpdatesOnStartupCheckBox, SIGNAL(toggled(bool)), SLOT(checkUpdatesToggled(bool))); @@ -210,20 +208,9 @@ void ApplicationSettingsWidget::loadSettings() m_generalUi->languageComboBox->setCurrentIndex(defaultIndex); } - m_generalUi->previewHideCheckBox->setChecked(config()->get(Config::GUI_HidePreviewPanel).toBool()); - m_generalUi->toolbarHideCheckBox->setChecked(config()->get(Config::GUI_HideToolbar).toBool()); - toolbarSettingsToggled(m_generalUi->toolbarHideCheckBox->isChecked()); m_generalUi->toolbarMovableCheckBox->setChecked(config()->get(Config::GUI_MovableToolbar).toBool()); m_generalUi->monospaceNotesCheckBox->setChecked(config()->get(Config::GUI_MonospaceNotes).toBool()); - m_generalUi->appThemeSelection->clear(); - m_generalUi->appThemeSelection->addItem(tr("Automatic"), "auto"); - m_generalUi->appThemeSelection->addItem(tr("Light"), "light"); - m_generalUi->appThemeSelection->addItem(tr("Dark"), "dark"); - m_generalUi->appThemeSelection->addItem(tr("Classic (Platform-native)"), "classic"); - m_generalUi->appThemeSelection->setCurrentIndex( - m_generalUi->appThemeSelection->findData(config()->get(Config::GUI_ApplicationTheme).toString())); - m_generalUi->toolButtonStyleComboBox->clear(); m_generalUi->toolButtonStyleComboBox->addItem(tr("Icon only"), Qt::ToolButtonIconOnly); m_generalUi->toolButtonStyleComboBox->addItem(tr("Text only"), Qt::ToolButtonTextOnly); @@ -338,14 +325,9 @@ void ApplicationSettingsWidget::saveSettings() config()->set(Config::FaviconDownloadTimeout, m_generalUi->faviconTimeoutSpinBox->value()); config()->set(Config::GUI_Language, m_generalUi->languageComboBox->currentData().toString()); - config()->set(Config::GUI_HidePreviewPanel, m_generalUi->previewHideCheckBox->isChecked()); - config()->set(Config::GUI_HideToolbar, m_generalUi->toolbarHideCheckBox->isChecked()); config()->set(Config::GUI_MovableToolbar, m_generalUi->toolbarMovableCheckBox->isChecked()); config()->set(Config::GUI_MonospaceNotes, m_generalUi->monospaceNotesCheckBox->isChecked()); - QString theme = m_generalUi->appThemeSelection->currentData().toString(); - config()->set(Config::GUI_ApplicationTheme, theme); - config()->set(Config::GUI_ToolButtonStyle, m_generalUi->toolButtonStyleComboBox->currentData().toString()); config()->set(Config::GUI_ShowTrayIcon, m_generalUi->systrayShowCheckBox->isChecked()); @@ -481,13 +463,6 @@ void ApplicationSettingsWidget::systrayToggled(bool checked) m_generalUi->systrayMinimizeToTrayCheckBox->setEnabled(checked); } -void ApplicationSettingsWidget::toolbarSettingsToggled(bool checked) -{ - m_generalUi->toolbarMovableCheckBox->setEnabled(!checked); - m_generalUi->toolButtonStyleComboBox->setEnabled(!checked); - m_generalUi->toolButtonStyleLabel->setEnabled(!checked); -} - void ApplicationSettingsWidget::rememberDatabasesToggled(bool checked) { if (!checked) { diff --git a/src/gui/ApplicationSettingsWidget.h b/src/gui/ApplicationSettingsWidget.h index 63487e1b5..f36e5ef12 100644 --- a/src/gui/ApplicationSettingsWidget.h +++ b/src/gui/ApplicationSettingsWidget.h @@ -60,7 +60,6 @@ private slots: void autoSaveToggled(bool checked); void hideWindowOnCopyCheckBoxToggled(bool checked); void systrayToggled(bool checked); - void toolbarSettingsToggled(bool checked); void rememberDatabasesToggled(bool checked); void checkUpdatesToggled(bool checked); diff --git a/src/gui/ApplicationSettingsWidgetGeneral.ui b/src/gui/ApplicationSettingsWidgetGeneral.ui index fea7481aa..7324c5ab7 100644 --- a/src/gui/ApplicationSettingsWidgetGeneral.ui +++ b/src/gui/ApplicationSettingsWidgetGeneral.ui @@ -308,13 +308,6 @@ </widget> </item> <item> - <widget class="QCheckBox" name="previewHideCheckBox"> - <property name="text"> - <string>Hide the entry preview panel</string> - </property> - </widget> - </item> - <item> <widget class="QCheckBox" name="minimizeOnOpenUrlCheckBox"> <property name="text"> <string>Minimize when opening a URL</string> @@ -460,8 +453,8 @@ <property name="horizontalSpacing"> <number>10</number> </property> - <item row="0" column="1"> - <widget class="QComboBox" name="appThemeSelection"> + <item row="1" column="1"> + <widget class="QComboBox" name="toolButtonStyleComboBox"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> @@ -472,51 +465,30 @@ <enum>Qt::StrongFocus</enum> </property> <property name="accessibleName"> - <string>Application Theme Selection</string> - </property> - </widget> - </item> - <item row="0" column="3"> - <spacer name="horizontalSpacer_5"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> + <string>Toolbar button style</string> </property> - </spacer> - </item> - <item row="0" column="2"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>(restart program to activate)</string> + <property name="sizeAdjustPolicy"> + <enum>QComboBox::AdjustToContents</enum> </property> </widget> </item> <item row="1" column="2"> - <widget class="QLabel" name="languageLabel_3"> - <property name="text"> - <string>(restart program to activate)</string> - </property> - </widget> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="appThemeLabel"> - <property name="text"> - <string>Application theme:</string> + <widget class="QCheckBox" name="toolbarMovableCheckBox"> + <property name="enabled"> + <bool>true</bool> </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> - <property name="buddy"> - <cstring>appThemeSelection</cstring> + <property name="text"> + <string>Movable toolbar</string> </property> </widget> </item> - <item row="1" column="1"> + <item row="0" column="1"> <widget class="QComboBox" name="languageComboBox"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> @@ -532,7 +504,7 @@ </property> </widget> </item> - <item row="1" column="0"> + <item row="0" column="0"> <widget class="QLabel" name="languageLabel_2"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> @@ -551,7 +523,27 @@ </property> </widget> </item> - <item row="2" column="0"> + <item row="0" column="2"> + <widget class="QLabel" name="languageLabel_3"> + <property name="text"> + <string>(restart program to activate)</string> + </property> + </widget> + </item> + <item row="0" column="3"> + <spacer name="horizontalSpacer_5"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="1" column="0"> <widget class="QLabel" name="toolButtonStyleLabel"> <property name="enabled"> <bool>true</bool> @@ -576,67 +568,9 @@ </property> </widget> </item> - <item row="2" column="1"> - <widget class="QComboBox" name="toolButtonStyleComboBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::StrongFocus</enum> - </property> - <property name="accessibleName"> - <string>Toolbar button style</string> - </property> - <property name="sizeAdjustPolicy"> - <enum>QComboBox::AdjustToContents</enum> - </property> - </widget> - </item> </layout> </item> <item> - <spacer name="verticalSpacer_5"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>10</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QCheckBox" name="toolbarHideCheckBox"> - <property name="text"> - <string>Hide toolbar</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="toolbarMovableCheckBox"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Movable toolbar</string> - </property> - </widget> - </item> - <item> <widget class="QCheckBox" name="monospaceNotesCheckBox"> <property name="text"> <string>Use monospaced font for notes</string> @@ -1102,20 +1036,18 @@ <tabstop>autoReloadOnChangeCheckBox</tabstop> <tabstop>useAtomicSavesCheckBox</tabstop> <tabstop>useGroupIconOnEntryCreationCheckBox</tabstop> - <tabstop>previewHideCheckBox</tabstop> <tabstop>minimizeOnOpenUrlCheckBox</tabstop> <tabstop>hideWindowOnCopyCheckBox</tabstop> <tabstop>minimizeOnCopyRadioButton</tabstop> <tabstop>dropToBackgroundOnCopyRadioButton</tabstop> <tabstop>faviconTimeoutSpinBox</tabstop> - <tabstop>appThemeSelection</tabstop> <tabstop>languageComboBox</tabstop> <tabstop>toolButtonStyleComboBox</tabstop> - <tabstop>toolbarHideCheckBox</tabstop> - <tabstop>toolbarMovableCheckBox</tabstop> <tabstop>monospaceNotesCheckBox</tabstop> + <tabstop>toolbarMovableCheckBox</tabstop> <tabstop>minimizeOnCloseCheckBox</tabstop> <tabstop>systrayShowCheckBox</tabstop> + <tabstop>trayIconAppearance</tabstop> <tabstop>systrayMinimizeToTrayCheckBox</tabstop> <tabstop>resetSettingsButton</tabstop> <tabstop>autoTypeEntryTitleMatchCheckBox</tabstop> diff --git a/src/gui/EntryPreviewWidget.cpp b/src/gui/EntryPreviewWidget.cpp index eee1dd00d..b873800a8 100644 --- a/src/gui/EntryPreviewWidget.cpp +++ b/src/gui/EntryPreviewWidget.cpp @@ -77,6 +77,12 @@ EntryPreviewWidget::EntryPreviewWidget(QWidget* parent) connect(m_ui->entryTabWidget, SIGNAL(tabBarClicked(int)), SLOT(updateTabIndexes()), Qt::QueuedConnection); connect(&m_totpTimer, SIGNAL(timeout()), SLOT(updateTotpLabel())); + connect(config(), &Config::changed, this, [this](Config::ConfigKey key) { + if (key == Config::GUI_HidePreviewPanel) { + setVisible(!config()->get(Config::GUI_HidePreviewPanel).toBool()); + } + }); + // Group m_ui->groupCloseButton->setIcon(resources()->icon("dialog-close")); connect(m_ui->groupCloseButton, SIGNAL(clicked()), SLOT(hide())); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 3f85390f8..c0d6397c3 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -37,6 +37,7 @@ #include "core/Tools.h" #include "gui/AboutDialog.h" #include "gui/DatabaseWidget.h" +#include "gui/MessageBox.h" #include "gui/SearchWidget.h" #include "keys/CompositeKey.h" #include "keys/FileKey.h" @@ -50,7 +51,6 @@ #endif #ifdef WITH_XC_UPDATECHECK -#include "gui/MessageBox.h" #include "gui/UpdateCheckDialog.h" #include "updatecheck/UpdateChecker.h" #endif @@ -167,6 +167,8 @@ MainWindow::MainWindow() m_ui->actionEntryAddToAgent->setVisible(false); m_ui->actionEntryRemoveFromAgent->setVisible(false); + initViewMenu(); + #if defined(WITH_XC_KEESHARE) KeeShare::init(this); m_ui->settingsWidget->addSettingsPage(new SettingsPageKeeShare(m_ui->tabWidget)); @@ -1132,11 +1134,12 @@ void MainWindow::closeEvent(QCloseEvent* event) if (m_appExiting) { saveWindowInformation(); event->accept(); - QApplication::quit(); + m_restartRequested ? kpxcApp->restart() : QApplication::quit(); return; } m_appExitCalled = false; + m_restartRequested = false; event->ignore(); } @@ -1639,3 +1642,56 @@ void MainWindow::displayDesktopNotification(const QString& msg, QString title, i m_trayIcon->showMessage(title, msg, QSystemTrayIcon::Information, msTimeoutHint); #endif } + +void MainWindow::restartApp(const QString& message) +{ + auto ans = MessageBox::question( + this, tr("Restart Application?"), message, MessageBox::Yes | MessageBox::No, MessageBox::Yes); + if (ans == MessageBox::Yes) { + m_appExitCalled = true; + m_restartRequested = true; + close(); + } else { + m_restartRequested = false; + } +} + +void MainWindow::initViewMenu() +{ + m_ui->actionThemeAuto->setData("auto"); + m_ui->actionThemeLight->setData("light"); + m_ui->actionThemeDark->setData("dark"); + m_ui->actionThemeClassic->setData("classic"); + + auto themeActions = new QActionGroup(this); + themeActions->addAction(m_ui->actionThemeAuto); + themeActions->addAction(m_ui->actionThemeLight); + themeActions->addAction(m_ui->actionThemeDark); + themeActions->addAction(m_ui->actionThemeClassic); + + auto theme = config()->get(Config::GUI_ApplicationTheme).toString(); + for (auto action : themeActions->actions()) { + if (action->data() == theme) { + action->setChecked(true); + break; + } + } + + connect(themeActions, &QActionGroup::triggered, this, [this](QAction* action) { + if (action->data() != config()->get(Config::GUI_ApplicationTheme)) { + config()->set(Config::GUI_ApplicationTheme, action->data()); + restartApp(tr("You must restart the application to apply this setting. Would you like to restart now?")); + } + }); + + m_ui->actionShowToolbar->setChecked(!config()->get(Config::GUI_HideToolbar).toBool()); + connect(m_ui->actionShowToolbar, &QAction::toggled, this, [this](bool checked) { + config()->set(Config::GUI_HideToolbar, !checked); + applySettingsChanges(); + }); + + m_ui->actionShowPreviewPanel->setChecked(!config()->get(Config::GUI_HidePreviewPanel).toBool()); + connect(m_ui->actionShowPreviewPanel, &QAction::toggled, this, [](bool checked) { + config()->set(Config::GUI_HidePreviewPanel, !checked); + }); +} diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index 230e6256e..95e8e5a8b 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -81,6 +81,7 @@ public slots: void closeAllDatabases(); void lockAllDatabases(); void displayDesktopNotification(const QString& msg, QString title = "", int msTimeoutHint = 10000); + void restartApp(const QString& message); protected: void closeEvent(QCloseEvent* event) override; @@ -152,6 +153,8 @@ private: void dragEnterEvent(QDragEnterEvent* event) override; void dropEvent(QDropEvent* event) override; + void initViewMenu(); + const QScopedPointer<Ui::MainWindow> m_ui; SignalMultiplexer m_actionMultiplexer; QPointer<QAction> m_clearHistoryAction; @@ -171,6 +174,7 @@ private: bool m_appExitCalled = false; bool m_appExiting = false; + bool m_restartRequested = false; bool m_contextMenuFocusLock = false; bool m_showToolbarSeparator = false; qint64 m_lastFocusOutTime = 0; diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index c31275f5a..71efe1e6e 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -353,10 +353,28 @@ <addaction name="actionPasswordGenerator"/> <addaction name="actionSettings"/> </widget> + <widget class="QMenu" name="menuView"> + <property name="title"> + <string>View</string> + </property> + <widget class="QMenu" name="menuTheme"> + <property name="title"> + <string>Theme</string> + </property> + <addaction name="actionThemeAuto"/> + <addaction name="actionThemeLight"/> + <addaction name="actionThemeDark"/> + <addaction name="actionThemeClassic"/> + </widget> + <addaction name="menuTheme"/> + <addaction name="actionShowPreviewPanel"/> + <addaction name="actionShowToolbar"/> + </widget> <addaction name="menuFile"/> <addaction name="menuEntries"/> <addaction name="menuGroups"/> <addaction name="menuTools"/> + <addaction name="menuView"/> <addaction name="menuHelp"/> </widget> <widget class="QToolBar" name="toolBar"> @@ -843,6 +861,63 @@ <string>Remove key from SSH Agent</string> </property> </action> + <action name="actionThemeAuto"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>Automatic</string> + </property> + </action> + <action name="actionThemeLight"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Light</string> + </property> + </action> + <action name="actionThemeDark"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Dark</string> + </property> + </action> + <action name="actionThemeClassic"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Classic (Platform-native)</string> + </property> + </action> + <action name="actionShowToolbar"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>Show Toolbar</string> + </property> + </action> + <action name="actionShowPreviewPanel"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>Show Preview Panel</string> + </property> + </action> </widget> <customwidgets> <customwidget> diff --git a/src/main.cpp b/src/main.cpp index 9a0ba4172..ee8582b1b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -155,6 +155,12 @@ int main(int argc, char** argv) int exitCode = Application::exec(); + // Check if restart was requested + if (exitCode == RESTART_EXITCODE) { + QProcess* proc = new QProcess(); + proc->start(QCoreApplication::applicationFilePath()); + } + #if defined(WITH_ASAN) && defined(WITH_LSAN) // do leak check here to prevent massive tail of end-of-process leak errors from third-party libraries __lsan_do_leak_check(); |