From 784630104d0ef9f56902774a3db626dfe22aede6 Mon Sep 17 00:00:00 2001 From: Martchus Date: Fri, 6 Oct 2023 21:03:40 +0200 Subject: [PATCH] Save position and size of window after is has been moved/resized * Remember new size after user resized the window * Remember new position after user repositioned window and using explicit coordinates has been configured in the appearance settings --- syncthingwidgets/settings/settingsdialog.cpp | 31 +++++++++++++++----- syncthingwidgets/settings/settingsdialog.h | 11 +++++-- tray/gui/traymenu.cpp | 15 ++++++++++ tray/gui/traymenu.h | 5 ++++ tray/gui/traywidget.cpp | 3 ++ 5 files changed, 56 insertions(+), 9 deletions(-) diff --git a/syncthingwidgets/settings/settingsdialog.cpp b/syncthingwidgets/settings/settingsdialog.cpp index 65a0ba7..2b5687e 100644 --- a/syncthingwidgets/settings/settingsdialog.cpp +++ b/syncthingwidgets/settings/settingsdialog.cpp @@ -513,13 +513,22 @@ bool AppearanceOptionPage::apply() return true; } +void AppearanceOptionPage::resetPositioningSettings() +{ + const auto &v = values(); + const auto &settings = v.appearance; + ui()->widthSpinBox->setValue(settings.trayMenuSize.width()); + ui()->heightSpinBox->setValue(settings.trayMenuSize.height()); + ui()->xPosSpinBox->setValue(settings.positioning.assumedIconPosition.x()); + ui()->yPosSpinBox->setValue(settings.positioning.assumedIconPosition.y()); +} + void AppearanceOptionPage::reset() { const auto &v = values(); const auto &settings = v.appearance; + resetPositioningSettings(); ui()->windowTypeComboBox->setCurrentIndex(settings.windowType); - ui()->widthSpinBox->setValue(settings.trayMenuSize.width()); - ui()->heightSpinBox->setValue(settings.trayMenuSize.height()); ui()->showTrafficCheckBox->setChecked(settings.showTraffic); ui()->showTabTextsCheckBox->setChecked(settings.showTabTexts); ui()->preferIconsFromThemeCheckBox->setChecked(v.icons.preferIconsFromTheme); @@ -553,8 +562,6 @@ void AppearanceOptionPage::reset() ui()->useCursorPosCheckBox->setChecked(settings.positioning.useCursorPosition); ui()->assumeIconPosCheckBox->setChecked(settings.positioning.useAssumedIconPosition); - ui()->xPosSpinBox->setValue(settings.positioning.assumedIconPosition.x()); - ui()->yPosSpinBox->setValue(settings.positioning.assumedIconPosition.y()); } // IconsOptionPage @@ -1624,8 +1631,9 @@ SettingsDialog::SettingsDialog(Data::SyncthingConnection *connection, QWidget *p category = new OptionCategory(this); translateCategory(category, [] { return tr("Tray"); }); - category->assignPages({ m_connectionsOptionPage = new ConnectionOptionPage(connection), new NotificationsOptionPage, new AppearanceOptionPage, - new IconsOptionPage(IconsOptionPage::Context::UI), new IconsOptionPage(IconsOptionPage::Context::System) }); + category->assignPages({ m_connectionsOptionPage = new ConnectionOptionPage(connection), new NotificationsOptionPage, + m_appearanceOptionPage = new AppearanceOptionPage, new IconsOptionPage(IconsOptionPage::Context::UI), + new IconsOptionPage(IconsOptionPage::Context::System) }); category->setIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/app/syncthingtray.svg"))); categories << category; @@ -1682,7 +1690,16 @@ void SettingsDialog::init() void SettingsDialog::hideConnectionStatus() { - m_connectionsOptionPage->hideConnectionStatus(); + if (m_connectionsOptionPage) { + m_connectionsOptionPage->hideConnectionStatus(); + } +} + +void SettingsDialog::resetPositioningSettings() +{ + if (m_appearanceOptionPage && m_appearanceOptionPage->hasBeenShown()) { + m_appearanceOptionPage->resetPositioningSettings(); + } } void SettingsDialog::selectLauncherSettings() diff --git a/syncthingwidgets/settings/settingsdialog.h b/syncthingwidgets/settings/settingsdialog.h index 0db434e..850ac7c 100644 --- a/syncthingwidgets/settings/settingsdialog.h +++ b/syncthingwidgets/settings/settingsdialog.h @@ -84,7 +84,10 @@ DECLARE_SETUP_WIDGETS const GuiType m_guiType; END_DECLARE_OPTION_PAGE -DECLARE_UI_FILE_BASED_OPTION_PAGE(AppearanceOptionPage) +BEGIN_DECLARE_UI_FILE_BASED_OPTION_PAGE(AppearanceOptionPage) +public: +void resetPositioningSettings(); +END_DECLARE_OPTION_PAGE BEGIN_DECLARE_UI_FILE_BASED_OPTION_PAGE_CUSTOM_CTOR(IconsOptionPage) public: @@ -197,10 +200,14 @@ public: Q_SIGNALS: void wizardRequested(); +public Q_SLOTS: + void resetPositioningSettings(); + private: void init(); - ConnectionOptionPage *m_connectionsOptionPage; + ConnectionOptionPage *m_connectionsOptionPage = nullptr; + AppearanceOptionPage *m_appearanceOptionPage = nullptr; int m_launcherSettingsCategory = -1, m_launcherSettingsPageIndex = -1; }; } // namespace QtGui diff --git a/tray/gui/traymenu.cpp b/tray/gui/traymenu.cpp index 25210d4..b79f18d 100644 --- a/tray/gui/traymenu.cpp +++ b/tray/gui/traymenu.cpp @@ -156,6 +156,21 @@ void TrayMenu::mouseReleaseEvent(QMouseEvent *event) } } +void TrayMenu::moveEvent(QMoveEvent *event) +{ + auto &settings = Settings::values().appearance.positioning; + if (settings.useAssumedIconPosition) { + Settings::values().appearance.positioning.assumedIconPosition = event->pos(); + emit positioningSettingsChanged(); + } +} + +void TrayMenu::resizeEvent(QResizeEvent *event) +{ + Settings::values().appearance.trayMenuSize = event->size(); + emit positioningSettingsChanged(); +} + void TrayMenu::paintEvent(QPaintEvent *event) { if (m_windowType == WindowType::Popup) { diff --git a/tray/gui/traymenu.h b/tray/gui/traymenu.h index 70bfa01..8956d09 100644 --- a/tray/gui/traymenu.h +++ b/tray/gui/traymenu.h @@ -28,12 +28,17 @@ public: void setWindowType(int windowType); void setWindowType(WindowType windowType); +Q_SIGNALS: + void positioningSettingsChanged(); + public Q_SLOTS: void showUsingPositioningSettings(); protected: void mouseReleaseEvent(QMouseEvent *) override; void mousePressEvent(QMouseEvent *) override; + void moveEvent(QMoveEvent *) override; + void resizeEvent(QResizeEvent *) override; void paintEvent(QPaintEvent *) override; void focusOutEvent(QFocusEvent *) override; diff --git a/tray/gui/traywidget.cpp b/tray/gui/traywidget.cpp index b840909..66bf121 100644 --- a/tray/gui/traywidget.cpp +++ b/tray/gui/traywidget.cpp @@ -247,6 +247,9 @@ SettingsDialog *TrayWidget::settingsDialog() s_settingsDlg = new SettingsDialog(s_instances.size() < 2 ? &m_connection : nullptr); connect(s_settingsDlg, &SettingsDialog::wizardRequested, this, &TrayWidget::showWizard); connect(s_settingsDlg, &SettingsDialog::applied, &TrayWidget::applySettingsOnAllInstances); + if (m_menu) { + connect(m_menu, &TrayMenu::positioningSettingsChanged, s_settingsDlg, &SettingsDialog::resetPositioningSettings); + } // save settings to disk when applied // note: QCoreApplication::aboutToQuit() does not work reliably but terminating only at the