From 8e2de8c3c6ab064bd1db115846c24b6ca24ebf91 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 24 Jan 2024 12:04:22 +0100 Subject: [PATCH] add position guarding for all modal dialogs --- src/librssguard/gui/dialogs/formmain.cpp | 2 +- src/librssguard/gui/guiutilities.cpp | 30 ++++++++++++++++++++++-- src/librssguard/gui/guiutilities.h | 2 +- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/librssguard/gui/dialogs/formmain.cpp b/src/librssguard/gui/dialogs/formmain.cpp index 368c1aa0a..93edb13ab 100644 --- a/src/librssguard/gui/dialogs/formmain.cpp +++ b/src/librssguard/gui/dialogs/formmain.cpp @@ -682,7 +682,7 @@ void FormMain::loadSize() { resize(settings->value(GROUP(GUI), GUI::MainWindowInitialSize, size()).toSize()); move(settings->value(GROUP(GUI), GUI::MainWindowInitialPosition, screen.center() - rect().center()).toPoint()); - GuiUtilities::fixTooBigDialog(*this); + GuiUtilities::fixTooBigDialog(*this, false); if (settings->value(GROUP(GUI), SETTING(GUI::MainWindowStartsMaximized)).toBool()) { setWindowState(windowState() | Qt::WindowState::WindowMaximized); diff --git a/src/librssguard/gui/guiutilities.cpp b/src/librssguard/gui/guiutilities.cpp index 7860ec7d5..f4d74907e 100644 --- a/src/librssguard/gui/guiutilities.cpp +++ b/src/librssguard/gui/guiutilities.cpp @@ -39,9 +39,9 @@ void GuiUtilities::applyDialogProperties(QWidget& widget, const QIcon& icon, con fixTooBigDialog(widget); } -void GuiUtilities::fixTooBigDialog(QWidget& 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.size(); + auto size_widget = widget.frameGeometry().size(); auto size_screen = widget.screen()->availableSize(); if (size_widget.width() > size_screen.width()) { @@ -53,8 +53,34 @@ void GuiUtilities::fixTooBigDialog(QWidget& widget) { } if (size_widget != widget.size()) { + 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); + widget.resize(size_widget); } + + auto pos_widget = widget.pos(); + + if (move_to_center || pos_widget.x() < 0 || pos_widget.y()) { + // Calculate ideal position for centering the widget. + auto size_parent = widget.parentWidget() != nullptr ? widget.parentWidget()->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; + + auto origin_x = (size_to_center.width() - size_widget.width()) / 2.0; + auto origin_y = (size_to_center.height() - size_widget.height()) / 2.0; + auto origin_pos = QPoint(origin_x, origin_y); + + 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); + } + } } void GuiUtilities::restoreState(QWidget* wdg, QByteArray state) { diff --git a/src/librssguard/gui/guiutilities.h b/src/librssguard/gui/guiutilities.h index 219e62aab..b3b4d34e1 100644 --- a/src/librssguard/gui/guiutilities.h +++ b/src/librssguard/gui/guiutilities.h @@ -11,7 +11,7 @@ class GuiUtilities { public: static void setLabelAsNotice(QLabel& label, bool is_warning, bool set_margins = true); static void applyDialogProperties(QWidget& widget, const QIcon& icon = QIcon(), const QString& title = QString()); - static void fixTooBigDialog(QWidget& widget); + static void fixTooBigDialog(QWidget& widget, bool move_to_center = true); static void restoreState(QWidget* wdg, QByteArray state); static QByteArray saveState(QWidget* wdg);