add position guarding for all modal dialogs
This commit is contained in:
parent
17fa6e6d8d
commit
8e2de8c3c6
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user