From aa0fa37492d96180b6229a380eb1bf9c6da90d85 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 21 Nov 2017 06:13:42 -0500 Subject: [PATCH] [netinstall] Hidden groups follow selectedness of parents. If a subgroup is hidden, then it should be considered selected if its parent is selected or partially-selected. If the parent group is totally unselected, then the hidden subgroup shouldn't be installed either. This allows putting required-packages into a group, without cluttering the interface. FIXES #864 --- src/modules/netinstall/PackageModel.cpp | 3 ++- src/modules/netinstall/PackageTreeItem.cpp | 27 ++++++++++++++++++++++ src/modules/netinstall/PackageTreeItem.h | 14 +++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/modules/netinstall/PackageModel.cpp b/src/modules/netinstall/PackageModel.cpp index 9fe8305a7..b97793f6d 100644 --- a/src/modules/netinstall/PackageModel.cpp +++ b/src/modules/netinstall/PackageModel.cpp @@ -163,7 +163,8 @@ PackageModel::getPackages() const { QList items = getItemPackages( m_rootItem ); for ( auto package : m_hiddenItems ) - items.append( getItemPackages( package ) ); + if ( package->hiddenSelected() ) + items.append( getItemPackages( package ) ); QList packages; for ( auto item : items ) { diff --git a/src/modules/netinstall/PackageTreeItem.cpp b/src/modules/netinstall/PackageTreeItem.cpp index 8e0d3f43b..db89d988e 100644 --- a/src/modules/netinstall/PackageTreeItem.cpp +++ b/src/modules/netinstall/PackageTreeItem.cpp @@ -101,6 +101,13 @@ PackageTreeItem::parentItem() return m_parentItem; } +const PackageTreeItem* +PackageTreeItem::parentItem() const +{ + return m_parentItem; +} + + QString PackageTreeItem::prettyName() const { @@ -143,6 +150,26 @@ PackageTreeItem::setHidden( bool isHidden ) m_data.isHidden = isHidden; } +bool +PackageTreeItem::hiddenSelected() const +{ + Q_ASSERT( m_data.isHidden ); + if (! m_data.selected ) + return false; + + const PackageTreeItem* currentItem = parentItem(); + while ( currentItem != nullptr ) + { + if ( !currentItem->isHidden() ) + return currentItem->isSelected() != Qt::Unchecked; + currentItem = currentItem->parentItem(); + } + + /* Has no non-hiddent parents */ + return m_data.selected; +} + + bool PackageTreeItem::isCritical() const { diff --git a/src/modules/netinstall/PackageTreeItem.h b/src/modules/netinstall/PackageTreeItem.h index e9bbcf59c..08bf1e811 100644 --- a/src/modules/netinstall/PackageTreeItem.h +++ b/src/modules/netinstall/PackageTreeItem.h @@ -49,16 +49,30 @@ public: int columnCount() const; QVariant data( int column ) const override; int row() const; + PackageTreeItem* parentItem(); + const PackageTreeItem* parentItem() const; + QString prettyName() const; QString description() const; QString preScript() const; QString packageName() const; QString postScript() const; + bool isHidden() const; void setHidden( bool isHidden ); + /** + * @brief Is this hidden item, considered "selected"? + * + * This asserts when called on a non-hidden item. + * A hidden item has its own selected state, but really + * falls under the selectedness of the parent item. + */ + bool hiddenSelected() const; + bool isCritical() const; void setCritical( bool isCritical ); + Qt::CheckState isSelected() const; void setSelected( Qt::CheckState isSelected ); void setChildrenSelected( Qt::CheckState isSelected );