From 31e8612f4c52b5d1e7c710582cfe0f2607515e22 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Mon, 18 Mar 2024 13:58:07 +0100 Subject: [PATCH] universal dialog size remembering, fix for #1336 --- .../dialogs/formbackupdatabasesettings.cpp | 3 - src/librssguard/gui/guiutilities.cpp | 73 ++++++++++++++++--- src/librssguard/gui/guiutilities.h | 3 + src/librssguard/miscellaneous/settings.cpp | 2 + src/librssguard/miscellaneous/settings.h | 4 + 5 files changed, 72 insertions(+), 13 deletions(-) diff --git a/src/librssguard/gui/dialogs/formbackupdatabasesettings.cpp b/src/librssguard/gui/dialogs/formbackupdatabasesettings.cpp index 28357f51b..b0d3176fc 100644 --- a/src/librssguard/gui/dialogs/formbackupdatabasesettings.cpp +++ b/src/librssguard/gui/dialogs/formbackupdatabasesettings.cpp @@ -17,9 +17,6 @@ FormBackupDatabaseSettings::FormBackupDatabaseSettings(QWidget* parent) : QDialog(parent), m_ui(new Ui::FormBackupDatabaseSettings) { m_ui->setupUi(this); - - setObjectName(QSL("form_backup_db_set")); - m_ui->m_txtBackupName->lineEdit()->setPlaceholderText(tr("Common name for backup files")); GuiUtilities::applyDialogProperties(*this, qApp->icons()->fromTheme(QSL("document-export"))); diff --git a/src/librssguard/gui/guiutilities.cpp b/src/librssguard/gui/guiutilities.cpp index 8870bace1..a666bd1ae 100644 --- a/src/librssguard/gui/guiutilities.cpp +++ b/src/librssguard/gui/guiutilities.cpp @@ -4,6 +4,11 @@ #include "definitions/definitions.h" +#include "miscellaneous/application.h" +#include "miscellaneous/settings.h" + +#include +#include #include #include @@ -36,40 +41,53 @@ void GuiUtilities::applyDialogProperties(QWidget& widget, const QIcon& icon, con widget.setWindowTitle(title); } + loadDialogSize(widget); fixTooBigDialog(widget); + saveSizeOnWidgetClosed(widget); } void GuiUtilities::fixTooBigDialog(QWidget& widget, bool move_to_center) { // We fix too big dialog size or out-of-bounds position. auto size_widget = widget.frameGeometry().size(); + auto size_widget_original = size_widget; auto size_screen = widget.screen()->availableSize(); if (size_widget.width() > size_screen.width()) { - size_widget.setWidth(size_screen.width() * 0.9); + size_widget.setWidth(size_screen.width() * 0.95); } if (size_widget.height() > size_screen.height()) { - size_widget.setHeight(size_screen.height() * 0.9); + size_widget.setHeight(size_screen.height() * 0.95); } - if (size_widget != widget.size()) { + bool resized = false; + + if (size_widget != size_widget_original) { qWarningNN << LOGSEC_GUI << "Dialog" << QUOTE_W_SPACE(widget.metaObject()->className()) << "was down-sized from" << QUOTE_W_SPACE(widget.size()) << "to" << QUOTE_W_SPACE_DOT(size_widget); - + resized = true; widget.resize(size_widget); } auto pos_widget = widget.pos(); - if (move_to_center || pos_widget.x() < 0 || pos_widget.y() < 0) { + if ((resized && move_to_center) || pos_widget.x() < 0 || pos_widget.y() < 0) { // Calculate ideal position for centering the widget. - auto size_parent = widget.parentWidget() != nullptr ? widget.parentWidget()->size() : QSize(0, 0); + auto size_parent = widget.parentWidget() != nullptr ? widget.frameGeometry().size() : QSize(0, 0); // If dialog is bigger than its parent, center it to screen. // If dialog is smaller than its parent, center to parent. - auto size_to_center = (size_widget.width() > size_parent.width() || size_widget.height() > size_parent.height()) - ? size_screen - : size_parent; + bool screen_as_parent; + QSize size_to_center; + + if (size_widget.width() > size_parent.width() || size_widget.height() > size_parent.height()) { + screen_as_parent = true; + size_to_center = size_screen; + } + else { + screen_as_parent = false; + size_to_center = size_parent; + } auto origin_x = (size_to_center.width() - size_widget.width()) / 2.0; auto origin_y = (size_to_center.height() - size_widget.height()) / 2.0; @@ -78,11 +96,46 @@ void GuiUtilities::fixTooBigDialog(QWidget& widget, bool move_to_center) { if (origin_pos != pos_widget) { qWarningNN << LOGSEC_GUI << "Dialog" << QUOTE_W_SPACE(widget.metaObject()->className()) << "was moved from" << QUOTE_W_SPACE(pos_widget) << "to" << QUOTE_W_SPACE_DOT(origin_pos); - widget.move(origin_pos); + widget.move(screen_as_parent ? origin_pos : origin_pos + widget.parentWidget()->pos()); } } } +void GuiUtilities::loadDialogSize(QWidget& wdg) { + const QString on = wdg.objectName(); + + if (on.isEmpty()) { + qWarningNN << LOGSEC_GUI << "Object of class" << QUOTE_W_SPACE(wdg.metaObject()->className()) + << "has no name, cannot load its size."; + return; + } + + const QString key = QSL("%1_size").arg(on); + + wdg.resize(qApp->settings()->value(GROUP(DialogGeometries), key, wdg.size()).toSize()); +} + +void GuiUtilities::saveSizeOnWidgetClosed(QWidget& wdg) { + const QString on = wdg.objectName(); + + if (on.isEmpty()) { + qWarningNN << LOGSEC_GUI << "Object of class" << QUOTE_W_SPACE(wdg.metaObject()->className()) + << "has no name, cannot save its size when it closes."; + return; + } + + QDialog* wdg_dialog = qobject_cast(&wdg); + + if (wdg_dialog != nullptr) { + QObject::connect(wdg_dialog, &QDialog::finished, [=]() { + const QString key = QSL("%1_size").arg(on); + + qDebugNN << LOGSEC_GUI << "Saving size for dialog" << QUOTE_W_SPACE_DOT(on); + qApp->settings()->setValue(GROUP(DialogGeometries), key, wdg_dialog->size()); + }); + } +} + void GuiUtilities::restoreState(QWidget* wdg, QByteArray state) { QHash> props; QDataStream str(&state, QIODevice::OpenModeFlag::ReadOnly); diff --git a/src/librssguard/gui/guiutilities.h b/src/librssguard/gui/guiutilities.h index b3b4d34e1..9fb181268 100644 --- a/src/librssguard/gui/guiutilities.h +++ b/src/librssguard/gui/guiutilities.h @@ -15,6 +15,9 @@ class GuiUtilities { static void restoreState(QWidget* wdg, QByteArray state); static QByteArray saveState(QWidget* wdg); + static void loadDialogSize(QWidget& wdg); + static void saveSizeOnWidgetClosed(QWidget& wdg); + private: explicit GuiUtilities(); }; diff --git a/src/librssguard/miscellaneous/settings.cpp b/src/librssguard/miscellaneous/settings.cpp index afa5a4436..2bfc3c20b 100644 --- a/src/librssguard/miscellaneous/settings.cpp +++ b/src/librssguard/miscellaneous/settings.cpp @@ -15,6 +15,8 @@ DKEY WebEngineAttributes::ID = "web_engine_attributes"; #endif +DKEY DialogGeometries::ID = "dialog_geometries"; + // Media player. KEY VideoPlayer::ID = "media_player"; diff --git a/src/librssguard/miscellaneous/settings.h b/src/librssguard/miscellaneous/settings.h index 506f9646c..36fc2c12a 100644 --- a/src/librssguard/miscellaneous/settings.h +++ b/src/librssguard/miscellaneous/settings.h @@ -39,6 +39,10 @@ namespace Cookies { KEY ID; } +namespace DialogGeometries { + KEY ID; +} + namespace Node { KEY ID;