diff --git a/src/modules/netinstall/NetInstallPage.cpp b/src/modules/netinstall/NetInstallPage.cpp index 13e9418a4..b1e04c56a 100644 --- a/src/modules/netinstall/NetInstallPage.cpp +++ b/src/modules/netinstall/NetInstallPage.cpp @@ -87,7 +87,8 @@ NetInstallPage::readGroups( const QByteArray& yamlData ) cWarning() << "netinstall groups data does not form a sequence."; } Q_ASSERT( groups.IsSequence() ); - m_groups = new PackageModel( groups ); + m_groups = new PackageModel(); + m_groups->setupModelData( CalamaresUtils::yamlSequenceToVariant( groups ) ); return true; } catch ( YAML::Exception& e ) @@ -214,7 +215,8 @@ NetInstallPage::loadGroupList( const QVariantList& l ) { // This short-cuts through loading and just uses the data, // containing cruft from dataIsHere() and readGroups(). - m_groups = new PackageModel( l ); + m_groups = new PackageModel(); + m_groups->setupModelData( l ); retranslate(); // For changed model ui->groupswidget->setModel( m_groups ); ui->groupswidget->header()->setSectionResizeMode( 0, QHeaderView::ResizeToContents ); diff --git a/src/modules/netinstall/PackageModel.cpp b/src/modules/netinstall/PackageModel.cpp index 26b5eb552..88a06a1bb 100644 --- a/src/modules/netinstall/PackageModel.cpp +++ b/src/modules/netinstall/PackageModel.cpp @@ -22,18 +22,9 @@ #include "utils/Variant.h" #include "utils/Yaml.h" -PackageModel::PackageModel( const YAML::Node& data, QObject* parent ) +PackageModel::PackageModel( QObject* parent ) : QAbstractItemModel( parent ) { - m_rootItem = new PackageTreeItem(); - setupModelData( CalamaresUtils::yamlSequenceToVariant( data ), m_rootItem ); -} - -PackageModel::PackageModel( const QVariantList& data, QObject* parent ) - : QAbstractItemModel( parent ) -{ - m_rootItem = new PackageTreeItem(); - setupModelData( data, m_rootItem ); } PackageModel::~PackageModel() @@ -44,7 +35,7 @@ PackageModel::~PackageModel() QModelIndex PackageModel::index( int row, int column, const QModelIndex& parent ) const { - if ( !hasIndex( row, column, parent ) ) + if ( !m_rootItem || !hasIndex( row, column, parent ) ) { return QModelIndex(); } @@ -74,7 +65,7 @@ PackageModel::index( int row, int column, const QModelIndex& parent ) const QModelIndex PackageModel::parent( const QModelIndex& index ) const { - if ( !index.isValid() ) + if ( !m_rootItem || !index.isValid() ) { return QModelIndex(); } @@ -92,7 +83,7 @@ PackageModel::parent( const QModelIndex& index ) const int PackageModel::rowCount( const QModelIndex& parent ) const { - if ( parent.column() > 0 ) + if ( !m_rootItem || ( parent.column() > 0 ) ) { return 0; } @@ -119,7 +110,7 @@ PackageModel::columnCount( const QModelIndex& ) const QVariant PackageModel::data( const QModelIndex& index, int role ) const { - if ( !index.isValid() ) + if ( !m_rootItem || !index.isValid() ) { return QVariant(); } @@ -141,6 +132,11 @@ PackageModel::data( const QModelIndex& index, int role ) const bool PackageModel::setData( const QModelIndex& index, const QVariant& value, int role ) { + if ( !m_rootItem ) + { + return false; + } + if ( role == Qt::CheckStateRole && index.isValid() ) { PackageTreeItem* item = static_cast< PackageTreeItem* >( index.internalPointer() ); @@ -156,7 +152,7 @@ PackageModel::setData( const QModelIndex& index, const QVariant& value, int role Qt::ItemFlags PackageModel::flags( const QModelIndex& index ) const { - if ( !index.isValid() ) + if ( !m_rootItem || !index.isValid() ) { return Qt::ItemFlags(); } @@ -180,6 +176,11 @@ PackageModel::headerData( int section, Qt::Orientation orientation, int role ) c PackageTreeItem::List PackageModel::getPackages() const { + if ( !m_rootItem ) + { + return PackageTreeItem::List(); + } + auto items = getItemPackages( m_rootItem ); for ( auto package : m_hiddenItems ) { @@ -194,7 +195,7 @@ PackageModel::getPackages() const PackageTreeItem::List PackageModel::getItemPackages( PackageTreeItem* item ) const { - QList< PackageTreeItem* > selectedPackages; + PackageTreeItem::List selectedPackages; for ( int i = 0; i < item->childCount(); i++ ) { if ( item->child( i )->isSelected() == Qt::Unchecked ) @@ -256,3 +257,13 @@ PackageModel::setupModelData( const QVariantList& groupList, PackageTreeItem* pa } } } + +void +PackageModel::setupModelData( const QVariantList& l ) +{ + emit beginResetModel(); + delete m_rootItem; + m_rootItem = new PackageTreeItem(); + setupModelData( l, m_rootItem ); + emit endResetModel(); +} diff --git a/src/modules/netinstall/PackageModel.h b/src/modules/netinstall/PackageModel.h index 04004b661..b4e8fc102 100644 --- a/src/modules/netinstall/PackageModel.h +++ b/src/modules/netinstall/PackageModel.h @@ -47,10 +47,11 @@ public: */ static constexpr const int MetaExpandRole = Qt::UserRole + 1; - explicit PackageModel( const YAML::Node& data, QObject* parent = nullptr ); - explicit PackageModel( const QVariantList& data, QObject* parent = nullptr ); + explicit PackageModel( QObject* parent = nullptr ); ~PackageModel() override; + void setupModelData( const QVariantList& l ); + QVariant data( const QModelIndex& index, int role ) const override; bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole ) override; Qt::ItemFlags flags( const QModelIndex& index ) const override; @@ -70,7 +71,7 @@ private: void setupModelData( const QVariantList& l, PackageTreeItem* parent ); - PackageTreeItem* m_rootItem; + PackageTreeItem* m_rootItem = nullptr; PackageTreeItem::List m_hiddenItems; }; diff --git a/src/modules/netinstall/Tests.cpp b/src/modules/netinstall/Tests.cpp index e85944f6c..cfaf20efa 100644 --- a/src/modules/netinstall/Tests.cpp +++ b/src/modules/netinstall/Tests.cpp @@ -234,20 +234,17 @@ ItemTests::testModel() QVariantList yamlContents = CalamaresUtils::yamlSequenceToVariant( yamldoc ); QCOMPARE( yamlContents.length(), 1 ); - PackageModel m0( yamlContents, nullptr ); - PackageModel m1( yamldoc, nullptr ); + PackageModel m0( nullptr ); + m0.setupModelData( yamlContents ); - QCOMPARE( m0.rowCount(), m1.rowCount() ); QCOMPARE( m0.m_hiddenItems.count(), 0 ); // Nothing hidden - QCOMPARE( m1.m_hiddenItems.count(), 0 ); QCOMPARE( m0.rowCount(), 1 ); // Group, the packages are invisible QCOMPARE( m0.rowCount( m0.index( 0, 0 ) ), 3 ); // The packages - QCOMPARE( m1.rowCount( m1.index( 0, 0 ) ), 3 ); // The packages checkAllSelected( m0.m_rootItem ); - checkAllSelected( m1.m_rootItem ); - PackageModel m2( YAML::Load( doc_with_expanded ), nullptr ); + PackageModel m2( nullptr ); + m2.setupModelData( CalamaresUtils::yamlSequenceToVariant( YAML::Load( doc_with_expanded ) ) ); QCOMPARE( m2.m_hiddenItems.count(), 0 ); QCOMPARE( m2.rowCount(), 1 ); // Group, now the packages expanded but not counted QCOMPARE( m2.rowCount( m2.index( 0, 0 ) ), 3 ); // The packages @@ -255,7 +252,6 @@ ItemTests::testModel() PackageTreeItem r; QVERIFY( r == *m0.m_rootItem ); - QVERIFY( r == *m1.m_rootItem ); QCOMPARE( m0.m_rootItem->childCount(), 1 ); @@ -277,8 +273,6 @@ ItemTests::testModel() } QVERIFY( found_one_bash ); - recursiveCompare( m0, m1 ); - // But m2 has "expanded" set which the others do no QVERIFY( *( m2.m_rootItem->child( 0 ) ) != *group ); } @@ -301,9 +295,10 @@ ItemTests::testExampleFiles() YAML::Node yamldoc = YAML::Load( contents.constData() ); QVariantList yamlContents = CalamaresUtils::yamlSequenceToVariant( yamldoc ); - PackageModel m0( yamldoc, nullptr ); - PackageModel m1( yamlContents, nullptr ); - recursiveCompare( m0, m1 ); + PackageModel m1( nullptr ); + m1.setupModelData( yamlContents ); + + // TODO: should test *something* about this file :/ } }