From b147fe00a70f6b2423322fe03252c7ad23f9e889 Mon Sep 17 00:00:00 2001 From: Kacper Donat Date: Sun, 26 Nov 2023 16:01:22 +0100 Subject: [PATCH] Gui: Add ScrollArea to Preferences This adds QScrollArea widget to DlgPreferences which in turn allows preference pages to be scrollable. Stacked widget sizes are forced to selected widget so scroll area should appear when it is needed. Fixes #11511 --- src/Gui/DlgPreferences.ui | 70 ++++++++++++++++++++++++++++++++--- src/Gui/DlgPreferencesImp.cpp | 33 ++++++++++++++++- src/Gui/DlgPreferencesImp.h | 2 + 3 files changed, 98 insertions(+), 7 deletions(-) diff --git a/src/Gui/DlgPreferences.ui b/src/Gui/DlgPreferences.ui index 092907905d..844f91547f 100644 --- a/src/Gui/DlgPreferences.ui +++ b/src/Gui/DlgPreferences.ui @@ -6,10 +6,16 @@ 0 0 - 800 - 600 + 1000 + 900 + + + 1000 + 600 + + Preferences @@ -209,13 +215,65 @@ QFrame::item { padding: 6px 8px }; - + - - 1 - 1 + + 0 + 0 + + QFrame::NoFrame + + + Qt::ScrollBarAlwaysOff + + + QAbstractScrollArea::AdjustIgnored + + + true + + + + + 0 + 0 + 726 + 669 + + + + + 0 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 1 + 1 + + + + + + diff --git a/src/Gui/DlgPreferencesImp.cpp b/src/Gui/DlgPreferencesImp.cpp index baa741cbb2..28fcbf1e97 100644 --- a/src/Gui/DlgPreferencesImp.cpp +++ b/src/Gui/DlgPreferencesImp.cpp @@ -114,6 +114,10 @@ DlgPreferencesImp::DlgPreferencesImp(QWidget* parent, Qt::WindowFlags fl) &QPushButton::clicked, this, &DlgPreferencesImp::showResetOptions); + connect(ui->groupWidgetStack, + &QStackedWidget::currentChanged, + this, + &DlgPreferencesImp::onStackWidgetChange); ui->groupsTreeView->setModel(&_model); @@ -193,6 +197,15 @@ PreferencesPageItem* DlgPreferencesImp::createGroup(const std::string &groupName auto groupPages = new QStackedWidget; groupPages->setProperty(GroupNameProperty, QVariant(groupNameQString)); + connect(groupPages, + &QStackedWidget::currentChanged, + this, + &DlgPreferencesImp::onStackWidgetChange); + + + if (ui->groupWidgetStack->count() > 0) { + groupPages->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); + } ui->groupWidgetStack->addWidget(groupPages); auto item = new PreferencesPageItem; @@ -255,6 +268,11 @@ void DlgPreferencesImp::createPageInGroup(PreferencesPageItem *groupItem, const page->loadSettings(); auto pages = qobject_cast(groupItem->getWidget()); + + if (pages->count() > 0) { + page->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); + } + pages->addWidget(page); } catch (const Base::Exception& e) { @@ -637,7 +655,6 @@ void DlgPreferencesImp::restartIfRequired() void DlgPreferencesImp::showEvent(QShowEvent* ev) { - this->adjustSize(); QDialog::showEvent(ev); } @@ -668,6 +685,20 @@ void DlgPreferencesImp::onPageSelected(const QModelIndex& index) updatePageDependentLabels(); } +void DlgPreferencesImp::onStackWidgetChange(int index) +{ + auto stack = qobject_cast(sender()); + + for (int i = 0; i < stack->count(); i++) { + auto current = stack->widget(i); + current->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); + } + + if (auto selected = stack->widget(index)) { + selected->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + } +} + void DlgPreferencesImp::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { diff --git a/src/Gui/DlgPreferencesImp.h b/src/Gui/DlgPreferencesImp.h index 013aa1ced7..d683c5e900 100644 --- a/src/Gui/DlgPreferencesImp.h +++ b/src/Gui/DlgPreferencesImp.h @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -150,6 +151,7 @@ protected: protected Q_SLOTS: void onButtonBoxClicked(QAbstractButton*); void onPageSelected(const QModelIndex &index); + void onStackWidgetChange(int index); private: /** @name for internal use only */