Merge pull request #11540 from kadet1090/rework-preferences-navigation
Gui: Add ScrollArea to Preferences and auto expand groups
This commit is contained in:
@@ -6,10 +6,16 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>600</height>
|
||||
<width>1000</width>
|
||||
<height>900</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>1000</width>
|
||||
<height>600</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Preferences</string>
|
||||
</property>
|
||||
@@ -209,13 +215,65 @@ QFrame::item { padding: 6px 8px };</string>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QStackedWidget" name="groupWidgetStack">
|
||||
<widget class="QScrollArea" name="scrollArea">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>1</horstretch>
|
||||
<verstretch>1</verstretch>
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</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>
|
||||
</item>
|
||||
<item>
|
||||
|
||||
@@ -53,10 +53,12 @@
|
||||
#include "Tools.h"
|
||||
#include "WidgetFactory.h"
|
||||
|
||||
#include <QDesktopWidget>
|
||||
|
||||
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<QStackedWidget*>(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<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());
|
||||
|
||||
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<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)
|
||||
{
|
||||
if (e->type() == QEvent::LanguageChange) {
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include <QDialog>
|
||||
#include <QStandardItemModel>
|
||||
#include <QStackedWidget>
|
||||
#include <memory>
|
||||
#include <FCGlobal.h>
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user