diff --git a/src/modules/netinstall/NetInstallPage.cpp b/src/modules/netinstall/NetInstallPage.cpp index f897c0018..4468e9cc0 100644 --- a/src/modules/netinstall/NetInstallPage.cpp +++ b/src/modules/netinstall/NetInstallPage.cpp @@ -78,6 +78,6 @@ NetInstallPage::onActivate() { const QVariantList groups = gs->value( "NetinstallAdd" ).toList(); - static_cast< PackageModel* >( ui->groupswidget->model() )->appendModelData( groups ); + static_cast< PackageModel* >( ui->groupswidget->model() )->appendModelData( groups, "packageChooser" ); } } diff --git a/src/modules/netinstall/PackageModel.cpp b/src/modules/netinstall/PackageModel.cpp index 9eafd898e..d139a89f6 100644 --- a/src/modules/netinstall/PackageModel.cpp +++ b/src/modules/netinstall/PackageModel.cpp @@ -342,20 +342,26 @@ PackageModel::setupModelData( const QVariantList& l ) emit endResetModel(); } -/** @brief Appends groups to the tree - * - * Uses the data from @p groupList to add elements to the - * existing tree that m_rootItem points to. If m_rootItem - * is not valid, it does nothing - * - */ void -PackageModel::appendModelData( const QVariantList& groupList ) +PackageModel::appendModelData( const QVariantList& groupList, const QString source ) { if ( m_rootItem ) { emit beginResetModel(); + + // Prune any existing data from the same source + for ( int i = 0; i < m_rootItem->childCount(); i++ ) + { + PackageTreeItem* child = m_rootItem->child( i ); + if ( child->source() == source ) + { + m_rootItem->removeChild( i ); + } + } + + // Add the new data to the model setupModelData( groupList, m_rootItem ); + emit endResetModel(); } } diff --git a/src/modules/netinstall/PackageModel.h b/src/modules/netinstall/PackageModel.h index fcdfe5daa..49a17f0b6 100644 --- a/src/modules/netinstall/PackageModel.h +++ b/src/modules/netinstall/PackageModel.h @@ -55,12 +55,23 @@ public: int columnCount( const QModelIndex& parent = QModelIndex() ) const override; void setSelections( QStringList selectNames ); - void setSelections(QStringList selectNames, PackageTreeItem *item ); + void setSelections( QStringList selectNames, PackageTreeItem* item ); PackageTreeItem::List getPackages() const; PackageTreeItem::List getItemPackages( PackageTreeItem* item ) const; - void appendModelData( const QVariantList& groupList ); + /** @brief Appends groups to the tree + * + * Uses the data from @p groupList to add elements to the + * existing tree that m_rootItem points to. If m_rootItem + * is not valid, it does nothing + * + * Before adding anything to the model, it ensures that there + * is no existing data from the same source. If there is, that + * data is pruned first + * + */ + void appendModelData( const QVariantList& groupList, const QString source ); private: friend class ItemTests; diff --git a/src/modules/netinstall/PackageTreeItem.cpp b/src/modules/netinstall/PackageTreeItem.cpp index b30cdf915..245f1ddc6 100644 --- a/src/modules/netinstall/PackageTreeItem.cpp +++ b/src/modules/netinstall/PackageTreeItem.cpp @@ -70,6 +70,7 @@ PackageTreeItem::PackageTreeItem( const QVariantMap& groupData, GroupTag&& paren , m_description( CalamaresUtils::getString( groupData, "description" ) ) , m_preScript( CalamaresUtils::getString( groupData, "pre-install" ) ) , m_postScript( CalamaresUtils::getString( groupData, "post-install" ) ) + , m_source( CalamaresUtils::getString( groupData, "source" ) ) , m_isGroup( true ) , m_isCritical( parentCriticality( groupData, parent.parent ) ) , m_isHidden( CalamaresUtils::getBool( groupData, "hidden", false ) ) @@ -248,6 +249,19 @@ PackageTreeItem::setChildrenSelected( Qt::CheckState isSelected ) } } +void +PackageTreeItem::removeChild( int row ) +{ + if ( row < m_childItems.count() ) + { + m_childItems.removeAt( row ); + } + else + { + cWarning() << "Attempt to remove invalid child in removeChild() at row " + QString::number( row ); + } +} + int PackageTreeItem::type() const { diff --git a/src/modules/netinstall/PackageTreeItem.h b/src/modules/netinstall/PackageTreeItem.h index c04b9a21d..2a0fca83e 100644 --- a/src/modules/netinstall/PackageTreeItem.h +++ b/src/modules/netinstall/PackageTreeItem.h @@ -56,6 +56,7 @@ public: QString description() const { return m_description; } QString preScript() const { return m_preScript; } QString postScript() const { return m_postScript; } + QString source() const { return m_source; } /** @brief Is this item a group-item? * @@ -124,6 +125,8 @@ public: void setSelected( Qt::CheckState isSelected ); void setChildrenSelected( Qt::CheckState isSelected ); + void removeChild( int row ); + /** @brief Update selectedness based on the children's states * * This only makes sense for groups, which might have packages @@ -157,6 +160,7 @@ private: QString m_description; QString m_preScript; QString m_postScript; + QString m_source; bool m_isGroup = false; bool m_isCritical = false; bool m_isHidden = false; diff --git a/src/modules/packagechooser/Config.cpp b/src/modules/packagechooser/Config.cpp index 2f54442b7..c573889ab 100644 --- a/src/modules/packagechooser/Config.cpp +++ b/src/modules/packagechooser/Config.cpp @@ -140,7 +140,7 @@ Config::updateGlobalStorage( const QStringList& selected ) const auto netinstallAddOrig = gs->value( "NetinstallAdd" ); if ( netinstallAddOrig.canConvert( QVariant::List ) ) { - netinstallDataList += netinstallAddOrig.toList(); + //netinstallDataList += netinstallAddOrig.toList(); } else { diff --git a/src/modules/packagechooser/PackageModel.cpp b/src/modules/packagechooser/PackageModel.cpp index 7b7cfc08f..3d1c0c044 100644 --- a/src/modules/packagechooser/PackageModel.cpp +++ b/src/modules/packagechooser/PackageModel.cpp @@ -140,11 +140,16 @@ QVariantList PackageListModel::getNetinstallDataForNames( const QStringList& ids ) const { QVariantList l; - for ( const auto& p : qAsConst( m_packages ) ) + for ( auto &p : m_packages ) { if ( ids.contains( p.id ) ) { - l.append( p.netinstallData ); + if ( !p.netinstallData.isEmpty() ) + { + QVariantMap newData = p.netinstallData; + newData["source"] = "packageChooser"; + l.append( newData ); + } } } return l;