Merge pull request #11540 from kadet1090/rework-preferences-navigation

Gui: Add ScrollArea to Preferences and auto expand groups
This commit is contained in:
Chris Hennes
2023-11-27 11:20:48 -06:00
committed by GitHub
3 changed files with 185 additions and 12 deletions

View File

@@ -6,10 +6,16 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>800</width> <width>1000</width>
<height>600</height> <height>900</height>
</rect> </rect>
</property> </property>
<property name="minimumSize">
<size>
<width>1000</width>
<height>600</height>
</size>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>Preferences</string> <string>Preferences</string>
</property> </property>
@@ -209,13 +215,65 @@ QFrame::item { padding: 6px 8px };</string>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QStackedWidget" name="groupWidgetStack"> <widget class="QScrollArea" name="scrollArea">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>1</horstretch> <horstretch>0</horstretch>
<verstretch>1</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustIgnored</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>726</width>
<height>669</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QStackedWidget" name="groupWidgetStack">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>1</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</widget>
</widget> </widget>
</item> </item>
<item> <item>

View File

@@ -53,10 +53,12 @@
#include "Tools.h" #include "Tools.h"
#include "WidgetFactory.h" #include "WidgetFactory.h"
#include <QDesktopWidget>
using namespace Gui::Dialog; using namespace Gui::Dialog;
QWidget* PreferencesPageItem::getWidget() const { QWidget* PreferencesPageItem::getWidget() const
{
return _widget; return _widget;
} }
@@ -70,6 +72,16 @@ void PreferencesPageItem::setWidget(QWidget* widget)
_widget->setProperty(PropertyName, QVariant::fromValue(this)); _widget->setProperty(PropertyName, QVariant::fromValue(this));
} }
bool PreferencesPageItem::isExpanded() const
{
return _expanded;
}
void PreferencesPageItem::setExpanded(bool expanded)
{
_expanded = expanded;
}
Q_DECLARE_METATYPE(PreferencesPageItem*); Q_DECLARE_METATYPE(PreferencesPageItem*);
const int DlgPreferencesImp::GroupNameRole = Qt::UserRole + 1; const int DlgPreferencesImp::GroupNameRole = Qt::UserRole + 1;
@@ -110,10 +122,22 @@ DlgPreferencesImp::DlgPreferencesImp(QWidget* parent, Qt::WindowFlags fl)
&QTreeView::clicked, &QTreeView::clicked,
this, this,
&DlgPreferencesImp::onPageSelected); &DlgPreferencesImp::onPageSelected);
connect(ui->groupsTreeView,
&QTreeView::expanded,
this,
&DlgPreferencesImp::onGroupExpanded);
connect(ui->groupsTreeView,
&QTreeView::collapsed,
this,
&DlgPreferencesImp::onGroupCollapsed);
connect(ui->buttonReset, connect(ui->buttonReset,
&QPushButton::clicked, &QPushButton::clicked,
this, this,
&DlgPreferencesImp::showResetOptions); &DlgPreferencesImp::showResetOptions);
connect(ui->groupWidgetStack,
&QStackedWidget::currentChanged,
this,
&DlgPreferencesImp::onStackWidgetChange);
ui->groupsTreeView->setModel(&_model); ui->groupsTreeView->setModel(&_model);
@@ -193,6 +217,15 @@ PreferencesPageItem* DlgPreferencesImp::createGroup(const std::string &groupName
auto groupPages = new QStackedWidget; auto groupPages = new QStackedWidget;
groupPages->setProperty(GroupNameProperty, QVariant(groupNameQString)); 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); ui->groupWidgetStack->addWidget(groupPages);
auto item = new PreferencesPageItem; auto item = new PreferencesPageItem;
@@ -204,6 +237,7 @@ PreferencesPageItem* DlgPreferencesImp::createGroup(const std::string &groupName
item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
item->setWidget(groupPages); item->setWidget(groupPages);
item->setSelectable(false);
_model.invisibleRootItem()->appendRow(item); _model.invisibleRootItem()->appendRow(item);
@@ -255,6 +289,11 @@ void DlgPreferencesImp::createPageInGroup(PreferencesPageItem *groupItem, const
page->loadSettings(); page->loadSettings();
auto pages = qobject_cast<QStackedWidget*>(groupItem->getWidget()); auto pages = qobject_cast<QStackedWidget*>(groupItem->getWidget());
if (pages->count() > 0) {
page->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
}
pages->addWidget(page); pages->addWidget(page);
} }
catch (const Base::Exception& e) { catch (const Base::Exception& e) {
@@ -637,7 +676,6 @@ void DlgPreferencesImp::restartIfRequired()
void DlgPreferencesImp::showEvent(QShowEvent* ev) void DlgPreferencesImp::showEvent(QShowEvent* ev)
{ {
this->adjustSize();
QDialog::showEvent(ev); QDialog::showEvent(ev);
} }
@@ -654,20 +692,88 @@ QModelIndex findRootIndex(const QModelIndex& index)
void DlgPreferencesImp::onPageSelected(const QModelIndex& index) void DlgPreferencesImp::onPageSelected(const QModelIndex& index)
{ {
auto root = findRootIndex(index); auto* currentItem = static_cast<PreferencesPageItem*>(_model.itemFromIndex(index));
auto* groupItem = static_cast<PreferencesPageItem*>(_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<PreferencesPageItem*>(_model.itemFromIndex(groupIndex));
auto* pagesStackWidget = static_cast<QStackedWidget*>(groupItem->getWidget()); auto* pagesStackWidget = static_cast<QStackedWidget*>(groupItem->getWidget());
ui->groupWidgetStack->setCurrentWidget(groupItem->getWidget()); ui->groupWidgetStack->setCurrentWidget(groupItem->getWidget());
if (index != root) { if (index != groupIndex) {
pagesStackWidget->setCurrentIndex(index.row()); pagesStackWidget->setCurrentIndex(index.row());
} }
updatePageDependentLabels(); updatePageDependentLabels();
} }
void DlgPreferencesImp::onGroupExpanded(const QModelIndex& index)
{
auto root = findRootIndex(index);
auto* groupItem = static_cast<PreferencesPageItem*>(_model.itemFromIndex(root));
groupItem->setExpanded(true);
}
void DlgPreferencesImp::onGroupCollapsed(const QModelIndex& index)
{
auto root = findRootIndex(index);
auto* groupItem = static_cast<PreferencesPageItem*>(_model.itemFromIndex(root));
groupItem->setExpanded(false);
}
void DlgPreferencesImp::onStackWidgetChange(int index)
{
auto stack = qobject_cast<QStackedWidget*>(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<PreferencesPageItem*>(root->child(i));
if (!currentGroup->isExpanded()) {
ui->groupsTreeView->collapse(currentGroup->index());
}
}
auto parentItem = currentItem;
while ((parentItem = static_cast<PreferencesPageItem*>(parentItem->parent()))) {
bool wasExpanded = parentItem->isExpanded();
ui->groupsTreeView->expand(parentItem->index());
parentItem->setExpanded(wasExpanded);
}
}
void DlgPreferencesImp::changeEvent(QEvent *e) void DlgPreferencesImp::changeEvent(QEvent *e)
{ {
if (e->type() == QEvent::LanguageChange) { if (e->type() == QEvent::LanguageChange) {

View File

@@ -28,6 +28,7 @@
#include <QDialog> #include <QDialog>
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QStackedWidget>
#include <memory> #include <memory>
#include <FCGlobal.h> #include <FCGlobal.h>
@@ -45,10 +46,14 @@ public:
QWidget* getWidget() const; QWidget* getWidget() const;
void setWidget(QWidget* widget); void setWidget(QWidget* widget);
bool isExpanded() const;
void setExpanded(bool expanded);
static constexpr char const* PropertyName = "SettingsPageItem"; static constexpr char const* PropertyName = "SettingsPageItem";
private: private:
QWidget *_widget = nullptr; QWidget* _widget = nullptr;
bool _expanded = false;
}; };
/** /**
@@ -150,6 +155,10 @@ protected:
protected Q_SLOTS: protected Q_SLOTS:
void onButtonBoxClicked(QAbstractButton*); void onButtonBoxClicked(QAbstractButton*);
void onPageSelected(const QModelIndex &index); void onPageSelected(const QModelIndex &index);
void onStackWidgetChange(int index);
void onGroupExpanded(const QModelIndex &index);
void onGroupCollapsed(const QModelIndex &index);
private: private:
/** @name for internal use only */ /** @name for internal use only */