From 4d6a5ee4565ff28c9ca02b79cf1108675648fda6 Mon Sep 17 00:00:00 2001 From: wmayer Date: Fri, 9 Feb 2024 17:00:28 +0100 Subject: [PATCH] Gui: set minimum width of preferences dialog to avoid to truncate or hide controls --- src/Gui/DlgPreferencesImp.cpp | 30 ++++++++++++++++++++++++++++++ src/Gui/DlgPreferencesImp.h | 5 +++++ 2 files changed, 35 insertions(+) diff --git a/src/Gui/DlgPreferencesImp.cpp b/src/Gui/DlgPreferencesImp.cpp index cd37e6fc88..ea17cee804 100644 --- a/src/Gui/DlgPreferencesImp.cpp +++ b/src/Gui/DlgPreferencesImp.cpp @@ -329,6 +329,7 @@ void DlgPreferencesImp::createPageInGroup(PreferencesPageItem *groupItem, const } pages->addWidget(page); + addSizeHint(page); } catch (const Base::Exception& e) { Base::Console().Error("Base exception thrown for '%s'\n", pageName.c_str()); @@ -339,6 +340,29 @@ void DlgPreferencesImp::createPageInGroup(PreferencesPageItem *groupItem, const } } +void DlgPreferencesImp::addSizeHint(QWidget* page) +{ + _sizeHintOfPages = _sizeHintOfPages.expandedTo(page->minimumSizeHint()); +} + +int DlgPreferencesImp::minimumPageWidth() const +{ + return _sizeHintOfPages.width(); +} + +int DlgPreferencesImp::minimumDialogWidth(int pageWidth) const +{ + QSize size = ui->groupWidgetStack->sizeHint(); + int diff = pageWidth - size.width(); + int dw = width(); + if (diff > 0) { + const int offset = 2; + dw += diff + offset; + } + + return dw; +} + void DlgPreferencesImp::updatePageDependentWidgets() { auto currentPageItem = getCurrentPage(); @@ -734,6 +758,12 @@ void DlgPreferencesImp::showEvent(QShowEvent* ev) resize(width(), maxStartHeight); move(x(), heightDifference / 2); } + + // if the expanded dialog occupies less than 50% of the screen + int mw = minimumDialogWidth(minimumPageWidth()); + if (availableSize.width() > 2 * mw) { + resize(mw, height()); + } } void DlgPreferencesImp::onPageSelected(const QModelIndex& index) diff --git a/src/Gui/DlgPreferencesImp.h b/src/Gui/DlgPreferencesImp.h index 7aec8b4c09..3b4fbaa554 100644 --- a/src/Gui/DlgPreferencesImp.h +++ b/src/Gui/DlgPreferencesImp.h @@ -181,6 +181,10 @@ private: void updatePageDependentWidgets(); QPixmap loadIconForGroup(const std::string& name) const; + + void addSizeHint(QWidget*); + int minimumPageWidth() const; + int minimumDialogWidth(int) const; //@} private: @@ -189,6 +193,7 @@ private: static std::list _pages; /**< Name of all registered preference pages */ QStandardItemModel _model; + QSize _sizeHintOfPages; struct Group { std::string iconName;