From 049204db52be28a8ed2ca757f9762521b45e8895 Mon Sep 17 00:00:00 2001 From: David Carter Date: Mon, 17 Jun 2024 11:30:01 -0400 Subject: [PATCH 1/2] Materials: Material selector doesn't have minimum size set Add properties for setting a minimum size with reasonable defaults. Notify the user when the tree is expanded or contracted to allow for container resizing. --- src/Mod/Material/Gui/MaterialTreeWidget.cpp | 36 +++++++++++++++++++++ src/Mod/Material/Gui/MaterialTreeWidget.h | 8 +++++ 2 files changed, 44 insertions(+) diff --git a/src/Mod/Material/Gui/MaterialTreeWidget.cpp b/src/Mod/Material/Gui/MaterialTreeWidget.cpp index f4f056ba69..849d9d663f 100644 --- a/src/Mod/Material/Gui/MaterialTreeWidget.cpp +++ b/src/Mod/Material/Gui/MaterialTreeWidget.cpp @@ -59,6 +59,7 @@ MaterialTreeWidget::MaterialTreeWidget(const std::shared_ptr()) , _filterList(filterList) { @@ -78,6 +80,7 @@ MaterialTreeWidget::MaterialTreeWidget( MaterialTreeWidget::MaterialTreeWidget(QWidget* parent) : QWidget(parent) , m_expanded(false) + , m_treeSizeHint(250, 500) , _filter(std::make_shared()) { setup(); @@ -102,6 +105,30 @@ MaterialTreeWidget::~MaterialTreeWidget() saveMaterialTree(); } +QSize MaterialTreeWidget::sizeHint() const +{ + if (!m_expanded) { + // When not expanded, the size height is the same as m_material + QSize size = m_material->sizeHint(); + size.setWidth(250); + return size; + } + return QWidget::sizeHint(); +} + +QSize MaterialTreeWidget::treeSizeHint() const +{ + return m_treeSizeHint; +} + +void MaterialTreeWidget::setTreeSizeHint(const QSize& hint) +{ + m_treeSizeHint = hint; + m_materialTree->setMinimumSize(m_treeSizeHint); + m_materialTree->adjustSize(); + adjustSize(); +} + void MaterialTreeWidget::createLayout() { m_material = new QLineEdit(this); @@ -111,12 +138,15 @@ void MaterialTreeWidget::createLayout() m_filterCombo = new QComboBox(this); m_editor = new QPushButton(tr("Launch editor"), this); + m_materialTree->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + m_materialTree->setMinimumSize(m_treeSizeHint); m_materialTree->setSelectionMode(QAbstractItemView::SingleSelection); m_materialTree->setSelectionBehavior(QAbstractItemView::SelectItems); auto materialLayout = new QHBoxLayout(); materialLayout->addWidget(m_material); materialLayout->addWidget(m_expand); + // materialLayout->setSizeConstraint(QLayout::SetMinimumSize); auto treeLayout = new QHBoxLayout(); treeLayout->addWidget(m_materialTree); @@ -133,6 +163,8 @@ void MaterialTreeWidget::createLayout() layout->addItem(buttonLayout); setLayout(layout); + setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum); + // Set the filter if using a filter list if (hasMultipleFilters()) { _filter = _filterList->front(); @@ -169,6 +201,10 @@ void MaterialTreeWidget::setExpanded(bool open) else { m_expand->setIcon(style()->standardIcon(QStyle::SP_TitleBarUnshadeButton)); } + + // m_materialTree->adjustSize(); + adjustSize(); + Q_EMIT onExpanded(m_expanded); } void MaterialTreeWidget::setFilterVisible(bool open) diff --git a/src/Mod/Material/Gui/MaterialTreeWidget.h b/src/Mod/Material/Gui/MaterialTreeWidget.h index 707e278960..8ffeda1828 100644 --- a/src/Mod/Material/Gui/MaterialTreeWidget.h +++ b/src/Mod/Material/Gui/MaterialTreeWidget.h @@ -71,6 +71,8 @@ class MaterialTreeWidgetPy; class MatGuiExport MaterialTreeWidget: public QWidget, public Base::BaseClass { Q_OBJECT + Q_PROPERTY(QSize treeSizeHint READ treeSizeHint WRITE + setTreeSizeHint) // clazy:exclude=qproperty-without-notify TYPESYSTEM_HEADER_WITH_OVERRIDE(); @@ -158,10 +160,15 @@ public: _filterOptions.setIncludeLegacy(legacy); } + QSize sizeHint() const override; + QSize treeSizeHint() const; + void setTreeSizeHint(const QSize& hint); + Q_SIGNALS: /** Emits this signal when a material has been selected */ void materialSelected(const std::shared_ptr& material); void onMaterial(const QString& uuid); + void onExpanded(bool expanded); private Q_SLOTS: void expandClicked(bool checked); @@ -179,6 +186,7 @@ private: QPushButton* m_editor; QComboBox* m_filterCombo; bool m_expanded; + QSize m_treeSizeHint; QString m_materialDisplay; QString m_uuid; From a1ab9e73ab4eb4a93d3889134dfea9ab4a6542bc Mon Sep 17 00:00:00 2001 From: David Carter Date: Thu, 4 Jul 2024 11:49:45 -0400 Subject: [PATCH 2/2] Reduce Linter warnings --- src/Mod/Material/Gui/MaterialTreeWidget.cpp | 15 +++++++++------ src/Mod/Material/Gui/MaterialTreeWidget.h | 13 +++++++++++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/Mod/Material/Gui/MaterialTreeWidget.cpp b/src/Mod/Material/Gui/MaterialTreeWidget.cpp index 849d9d663f..edfb45198b 100644 --- a/src/Mod/Material/Gui/MaterialTreeWidget.cpp +++ b/src/Mod/Material/Gui/MaterialTreeWidget.cpp @@ -59,8 +59,9 @@ MaterialTreeWidget::MaterialTreeWidget(const std::shared_ptr()) , _filterList(filterList) + , _recentMax(defaultRecents) { setup(); } @@ -80,8 +82,9 @@ MaterialTreeWidget::MaterialTreeWidget( MaterialTreeWidget::MaterialTreeWidget(QWidget* parent) : QWidget(parent) , m_expanded(false) - , m_treeSizeHint(250, 500) + , m_treeSizeHint(minimumTreeWidth, minimumTreeHeight) , _filter(std::make_shared()) + , _recentMax(defaultRecents) { setup(); } @@ -110,7 +113,7 @@ QSize MaterialTreeWidget::sizeHint() const if (!m_expanded) { // When not expanded, the size height is the same as m_material QSize size = m_material->sizeHint(); - size.setWidth(250); + size.setWidth(minimumWidth); return size; } return QWidget::sizeHint(); @@ -397,7 +400,7 @@ void MaterialTreeWidget::setActiveFilter(const QString& name) // Save the library/folder expansion state saveMaterialTree(); - + updateMaterialTree(); return; } @@ -440,7 +443,7 @@ void MaterialTreeWidget::getRecents() auto param = App::GetApplication().GetParameterGroupByPath( "User parameter:BaseApp/Preferences/Mod/Material/Recent"); - _recentMax = static_cast(param->GetInt("RecentMax", 5)); + _recentMax = static_cast(param->GetInt("RecentMax", defaultRecents)); auto count = param->GetInt("Recent", 0); for (int i = 0; static_cast(i) < count; i++) { QString key = QString::fromLatin1("MRU%1").arg(i); diff --git a/src/Mod/Material/Gui/MaterialTreeWidget.h b/src/Mod/Material/Gui/MaterialTreeWidget.h index 8ffeda1828..efdbf0e41e 100644 --- a/src/Mod/Material/Gui/MaterialTreeWidget.h +++ b/src/Mod/Material/Gui/MaterialTreeWidget.h @@ -96,7 +96,7 @@ public: void setFilter(const std::shared_ptr& filter); void setFilter( const std::shared_ptr>>& filterList); - void setActiveFilter(const QString &name); + void setActiveFilter(const QString& name); void setExpanded(bool open); bool getExpanded() @@ -178,6 +178,14 @@ private Q_SLOTS: void onFilter(const QString& text); private: + // UI minimum sizes + static const int minimumWidth = 250; + static const int minimumTreeWidth = 250; + static const int minimumTreeHeight = 500; + + static const int defaultFavorites = 0; + static const int defaultRecents = 5; + void setup(); QLineEdit* m_material; @@ -254,7 +262,8 @@ protected: const Base::Reference& param); void setFilterVisible(bool open); void fillFilterCombo(); - bool hasMultipleFilters() const { + bool hasMultipleFilters() const + { return (_filterList && _filterList->size() > 1); } };