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..47dfeb717b 100644
--- a/src/Gui/DlgPreferencesImp.cpp
+++ b/src/Gui/DlgPreferencesImp.cpp
@@ -53,10 +53,12 @@
#include "Tools.h"
#include "WidgetFactory.h"
+#include
using namespace Gui::Dialog;
-QWidget* PreferencesPageItem::getWidget() const {
+QWidget* PreferencesPageItem::getWidget() const
+{
return _widget;
}
@@ -70,6 +72,16 @@ void PreferencesPageItem::setWidget(QWidget* widget)
_widget->setProperty(PropertyName, QVariant::fromValue(this));
}
+bool PreferencesPageItem::isExpanded() const
+{
+ return _expanded;
+}
+
+void PreferencesPageItem::setExpanded(bool expanded)
+{
+ _expanded = expanded;
+}
+
Q_DECLARE_METATYPE(PreferencesPageItem*);
const int DlgPreferencesImp::GroupNameRole = Qt::UserRole + 1;
@@ -110,10 +122,22 @@ DlgPreferencesImp::DlgPreferencesImp(QWidget* parent, Qt::WindowFlags fl)
&QTreeView::clicked,
this,
&DlgPreferencesImp::onPageSelected);
+ connect(ui->groupsTreeView,
+ &QTreeView::expanded,
+ this,
+ &DlgPreferencesImp::onGroupExpanded);
+ connect(ui->groupsTreeView,
+ &QTreeView::collapsed,
+ this,
+ &DlgPreferencesImp::onGroupCollapsed);
connect(ui->buttonReset,
&QPushButton::clicked,
this,
&DlgPreferencesImp::showResetOptions);
+ connect(ui->groupWidgetStack,
+ &QStackedWidget::currentChanged,
+ this,
+ &DlgPreferencesImp::onStackWidgetChange);
ui->groupsTreeView->setModel(&_model);
@@ -193,6 +217,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;
@@ -204,6 +237,7 @@ PreferencesPageItem* DlgPreferencesImp::createGroup(const std::string &groupName
item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
item->setWidget(groupPages);
+ item->setSelectable(false);
_model.invisibleRootItem()->appendRow(item);
@@ -255,6 +289,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 +676,6 @@ void DlgPreferencesImp::restartIfRequired()
void DlgPreferencesImp::showEvent(QShowEvent* ev)
{
- this->adjustSize();
QDialog::showEvent(ev);
}
@@ -654,20 +692,88 @@ QModelIndex findRootIndex(const QModelIndex& index)
void DlgPreferencesImp::onPageSelected(const QModelIndex& index)
{
- auto root = findRootIndex(index);
+ auto* currentItem = static_cast(_model.itemFromIndex(index));
- auto* groupItem = static_cast(_model.itemFromIndex(root));
+ if (currentItem->hasChildren()) {
+ auto pageIndex = currentItem->child(0)->index();
+
+ ui->groupsTreeView->selectionModel()->select(pageIndex, QItemSelectionModel::ClearAndSelect);
+
+ onPageSelected(pageIndex);
+
+ return;
+ }
+
+ auto groupIndex = findRootIndex(index);
+
+ auto* groupItem = static_cast(_model.itemFromIndex(groupIndex));
auto* pagesStackWidget = static_cast(groupItem->getWidget());
ui->groupWidgetStack->setCurrentWidget(groupItem->getWidget());
- if (index != root) {
+ if (index != groupIndex) {
pagesStackWidget->setCurrentIndex(index.row());
}
updatePageDependentLabels();
}
+void DlgPreferencesImp::onGroupExpanded(const QModelIndex& index)
+{
+ auto root = findRootIndex(index);
+
+ auto* groupItem = static_cast(_model.itemFromIndex(root));
+
+ groupItem->setExpanded(true);
+}
+
+void DlgPreferencesImp::onGroupCollapsed(const QModelIndex& index)
+{
+ auto root = findRootIndex(index);
+
+ auto* groupItem = static_cast(_model.itemFromIndex(root));
+
+ groupItem->setExpanded(false);
+}
+
+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);
+ }
+
+ auto currentItem = getCurrentPage();
+
+ if (!currentItem) {
+ return;
+ }
+
+ ui->groupsTreeView->selectionModel()->select(currentItem->index(), QItemSelectionModel::ClearAndSelect);
+
+ auto root = _model.invisibleRootItem();
+ for (int i = 0; i < root->rowCount(); i++) {
+ auto currentGroup = static_cast(root->child(i));
+
+ if (!currentGroup->isExpanded()) {
+ ui->groupsTreeView->collapse(currentGroup->index());
+ }
+ }
+
+ auto parentItem = currentItem;
+ while ((parentItem = static_cast(parentItem->parent()))) {
+ bool wasExpanded = parentItem->isExpanded();
+ ui->groupsTreeView->expand(parentItem->index());
+ parentItem->setExpanded(wasExpanded);
+ }
+}
+
void DlgPreferencesImp::changeEvent(QEvent *e)
{
if (e->type() == QEvent::LanguageChange) {
diff --git a/src/Gui/DlgPreferencesImp.h b/src/Gui/DlgPreferencesImp.h
index 013aa1ced7..647cbdee6a 100644
--- a/src/Gui/DlgPreferencesImp.h
+++ b/src/Gui/DlgPreferencesImp.h
@@ -28,6 +28,7 @@
#include
#include
+#include
#include
#include
@@ -45,10 +46,14 @@ public:
QWidget* getWidget() const;
void setWidget(QWidget* widget);
+ bool isExpanded() const;
+ void setExpanded(bool expanded);
+
static constexpr char const* PropertyName = "SettingsPageItem";
private:
- QWidget *_widget = nullptr;
+ QWidget* _widget = nullptr;
+ bool _expanded = false;
};
/**
@@ -150,6 +155,10 @@ protected:
protected Q_SLOTS:
void onButtonBoxClicked(QAbstractButton*);
void onPageSelected(const QModelIndex &index);
+ void onStackWidgetChange(int index);
+
+ void onGroupExpanded(const QModelIndex &index);
+ void onGroupCollapsed(const QModelIndex &index);
private:
/** @name for internal use only */