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
This commit is contained in:
Martchus 2023-10-06 21:03:40 +02:00
parent 089100c7ab
commit 784630104d
5 changed files with 56 additions and 9 deletions

View File

@ -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()

View File

@ -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

View File

@ -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) {

View File

@ -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;

View File

@ -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