[netinstall] Allow post-creation loading of model data

- Instead of loading all in the constructor, provide a public
  setupModelData().
- This allows creating the model and setting it for UI, before
  the load completes.
main
Adriaan de Groot 6 years ago
parent 5e03df723c
commit 938536c0c3

@ -87,7 +87,8 @@ NetInstallPage::readGroups( const QByteArray& yamlData )
cWarning() << "netinstall groups data does not form a sequence."; cWarning() << "netinstall groups data does not form a sequence.";
} }
Q_ASSERT( groups.IsSequence() ); Q_ASSERT( groups.IsSequence() );
m_groups = new PackageModel( groups ); m_groups = new PackageModel();
m_groups->setupModelData( CalamaresUtils::yamlSequenceToVariant( groups ) );
return true; return true;
} }
catch ( YAML::Exception& e ) catch ( YAML::Exception& e )
@ -214,7 +215,8 @@ NetInstallPage::loadGroupList( const QVariantList& l )
{ {
// This short-cuts through loading and just uses the data, // This short-cuts through loading and just uses the data,
// containing cruft from dataIsHere() and readGroups(). // containing cruft from dataIsHere() and readGroups().
m_groups = new PackageModel( l ); m_groups = new PackageModel();
m_groups->setupModelData( l );
retranslate(); // For changed model retranslate(); // For changed model
ui->groupswidget->setModel( m_groups ); ui->groupswidget->setModel( m_groups );
ui->groupswidget->header()->setSectionResizeMode( 0, QHeaderView::ResizeToContents ); ui->groupswidget->header()->setSectionResizeMode( 0, QHeaderView::ResizeToContents );

@ -22,18 +22,9 @@
#include "utils/Variant.h" #include "utils/Variant.h"
#include "utils/Yaml.h" #include "utils/Yaml.h"
PackageModel::PackageModel( const YAML::Node& data, QObject* parent ) PackageModel::PackageModel( QObject* parent )
: QAbstractItemModel( 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() PackageModel::~PackageModel()
@ -44,7 +35,7 @@ PackageModel::~PackageModel()
QModelIndex QModelIndex
PackageModel::index( int row, int column, const QModelIndex& parent ) const PackageModel::index( int row, int column, const QModelIndex& parent ) const
{ {
if ( !hasIndex( row, column, parent ) ) if ( !m_rootItem || !hasIndex( row, column, parent ) )
{ {
return QModelIndex(); return QModelIndex();
} }
@ -74,7 +65,7 @@ PackageModel::index( int row, int column, const QModelIndex& parent ) const
QModelIndex QModelIndex
PackageModel::parent( const QModelIndex& index ) const PackageModel::parent( const QModelIndex& index ) const
{ {
if ( !index.isValid() ) if ( !m_rootItem || !index.isValid() )
{ {
return QModelIndex(); return QModelIndex();
} }
@ -92,7 +83,7 @@ PackageModel::parent( const QModelIndex& index ) const
int int
PackageModel::rowCount( const QModelIndex& parent ) const PackageModel::rowCount( const QModelIndex& parent ) const
{ {
if ( parent.column() > 0 ) if ( !m_rootItem || ( parent.column() > 0 ) )
{ {
return 0; return 0;
} }
@ -119,7 +110,7 @@ PackageModel::columnCount( const QModelIndex& ) const
QVariant QVariant
PackageModel::data( const QModelIndex& index, int role ) const PackageModel::data( const QModelIndex& index, int role ) const
{ {
if ( !index.isValid() ) if ( !m_rootItem || !index.isValid() )
{ {
return QVariant(); return QVariant();
} }
@ -141,6 +132,11 @@ PackageModel::data( const QModelIndex& index, int role ) const
bool bool
PackageModel::setData( const QModelIndex& index, const QVariant& value, int role ) PackageModel::setData( const QModelIndex& index, const QVariant& value, int role )
{ {
if ( !m_rootItem )
{
return false;
}
if ( role == Qt::CheckStateRole && index.isValid() ) if ( role == Qt::CheckStateRole && index.isValid() )
{ {
PackageTreeItem* item = static_cast< PackageTreeItem* >( index.internalPointer() ); PackageTreeItem* item = static_cast< PackageTreeItem* >( index.internalPointer() );
@ -156,7 +152,7 @@ PackageModel::setData( const QModelIndex& index, const QVariant& value, int role
Qt::ItemFlags Qt::ItemFlags
PackageModel::flags( const QModelIndex& index ) const PackageModel::flags( const QModelIndex& index ) const
{ {
if ( !index.isValid() ) if ( !m_rootItem || !index.isValid() )
{ {
return Qt::ItemFlags(); return Qt::ItemFlags();
} }
@ -180,6 +176,11 @@ PackageModel::headerData( int section, Qt::Orientation orientation, int role ) c
PackageTreeItem::List PackageTreeItem::List
PackageModel::getPackages() const PackageModel::getPackages() const
{ {
if ( !m_rootItem )
{
return PackageTreeItem::List();
}
auto items = getItemPackages( m_rootItem ); auto items = getItemPackages( m_rootItem );
for ( auto package : m_hiddenItems ) for ( auto package : m_hiddenItems )
{ {
@ -194,7 +195,7 @@ PackageModel::getPackages() const
PackageTreeItem::List PackageTreeItem::List
PackageModel::getItemPackages( PackageTreeItem* item ) const PackageModel::getItemPackages( PackageTreeItem* item ) const
{ {
QList< PackageTreeItem* > selectedPackages; PackageTreeItem::List selectedPackages;
for ( int i = 0; i < item->childCount(); i++ ) for ( int i = 0; i < item->childCount(); i++ )
{ {
if ( item->child( i )->isSelected() == Qt::Unchecked ) 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();
}

@ -47,10 +47,11 @@ public:
*/ */
static constexpr const int MetaExpandRole = Qt::UserRole + 1; static constexpr const int MetaExpandRole = Qt::UserRole + 1;
explicit PackageModel( const YAML::Node& data, QObject* parent = nullptr ); explicit PackageModel( QObject* parent = nullptr );
explicit PackageModel( const QVariantList& data, QObject* parent = nullptr );
~PackageModel() override; ~PackageModel() override;
void setupModelData( const QVariantList& l );
QVariant data( const QModelIndex& index, int role ) const override; QVariant data( const QModelIndex& index, int role ) const override;
bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole ) override; bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole ) override;
Qt::ItemFlags flags( const QModelIndex& index ) const override; Qt::ItemFlags flags( const QModelIndex& index ) const override;
@ -70,7 +71,7 @@ private:
void setupModelData( const QVariantList& l, PackageTreeItem* parent ); void setupModelData( const QVariantList& l, PackageTreeItem* parent );
PackageTreeItem* m_rootItem; PackageTreeItem* m_rootItem = nullptr;
PackageTreeItem::List m_hiddenItems; PackageTreeItem::List m_hiddenItems;
}; };

@ -234,20 +234,17 @@ ItemTests::testModel()
QVariantList yamlContents = CalamaresUtils::yamlSequenceToVariant( yamldoc ); QVariantList yamlContents = CalamaresUtils::yamlSequenceToVariant( yamldoc );
QCOMPARE( yamlContents.length(), 1 ); QCOMPARE( yamlContents.length(), 1 );
PackageModel m0( yamlContents, nullptr ); PackageModel m0( nullptr );
PackageModel m1( yamldoc, nullptr ); m0.setupModelData( yamlContents );
QCOMPARE( m0.rowCount(), m1.rowCount() );
QCOMPARE( m0.m_hiddenItems.count(), 0 ); // Nothing hidden 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(), 1 ); // Group, the packages are invisible
QCOMPARE( m0.rowCount( m0.index( 0, 0 ) ), 3 ); // The packages 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( 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.m_hiddenItems.count(), 0 );
QCOMPARE( m2.rowCount(), 1 ); // Group, now the packages expanded but not counted QCOMPARE( m2.rowCount(), 1 ); // Group, now the packages expanded but not counted
QCOMPARE( m2.rowCount( m2.index( 0, 0 ) ), 3 ); // The packages QCOMPARE( m2.rowCount( m2.index( 0, 0 ) ), 3 ); // The packages
@ -255,7 +252,6 @@ ItemTests::testModel()
PackageTreeItem r; PackageTreeItem r;
QVERIFY( r == *m0.m_rootItem ); QVERIFY( r == *m0.m_rootItem );
QVERIFY( r == *m1.m_rootItem );
QCOMPARE( m0.m_rootItem->childCount(), 1 ); QCOMPARE( m0.m_rootItem->childCount(), 1 );
@ -277,8 +273,6 @@ ItemTests::testModel()
} }
QVERIFY( found_one_bash ); QVERIFY( found_one_bash );
recursiveCompare( m0, m1 );
// But m2 has "expanded" set which the others do no // But m2 has "expanded" set which the others do no
QVERIFY( *( m2.m_rootItem->child( 0 ) ) != *group ); QVERIFY( *( m2.m_rootItem->child( 0 ) ) != *group );
} }
@ -301,9 +295,10 @@ ItemTests::testExampleFiles()
YAML::Node yamldoc = YAML::Load( contents.constData() ); YAML::Node yamldoc = YAML::Load( contents.constData() );
QVariantList yamlContents = CalamaresUtils::yamlSequenceToVariant( yamldoc ); QVariantList yamlContents = CalamaresUtils::yamlSequenceToVariant( yamldoc );
PackageModel m0( yamldoc, nullptr ); PackageModel m1( nullptr );
PackageModel m1( yamlContents, nullptr ); m1.setupModelData( yamlContents );
recursiveCompare( m0, m1 );
// TODO: should test *something* about this file :/
} }
} }

Loading…
Cancel
Save