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>
|
<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>
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
Reference in New Issue
Block a user