add position guarding for all modal dialogs

This commit is contained in:
Martin Rotter 2024-01-24 12:04:22 +01:00
parent 17fa6e6d8d
commit 8e2de8c3c6
3 changed files with 30 additions and 4 deletions

View File

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

View File

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

View File

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