void ModelDescriptorListWidget::selectRow(int row) { QModelIndex rootIndex = this->rootIndex(); if(rootIndex.isValid()) { QItemSelectionModel *selectionModel = this->selectionModel(); QSortFilterProxyModel *proxyModel = this->proxyModel(); if(row < proxyModel->rowCount(rootIndex)) { selectionModel->clear(); QModelIndex index = proxyModel->index(row, 0, rootIndex); if(index.isValid()) { selectionModel->setCurrentIndex(index, QItemSelectionModel::SelectCurrent); } } } }
void DiveListView::selectDive(struct dive *dive, bool scrollto, bool toggle) { QSortFilterProxyModel *m = qobject_cast<QSortFilterProxyModel*>(model()); QModelIndexList match = m->match(m->index(0,0), TreeItemDT::NR, dive->number, 1, Qt::MatchRecursive); QItemSelectionModel::SelectionFlags flags; QModelIndex idx = match.first(); QModelIndex parent = idx.parent(); if (parent.isValid()) expand(parent); flags = toggle ? QItemSelectionModel::Toggle : QItemSelectionModel::Select; flags |= QItemSelectionModel::Rows; selectionModel()->select( idx, flags); if (scrollto) scrollTo(idx, PositionAtCenter); }
void KLinkItemSelectionModelTest::testAdditionalLink() { #if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) { auto idx = m_mainModel->index(6, 0); m_mainSelectionModel->select(idx, QItemSelectionModel::Select); } QVERIFY(!m_mainSelectionModel->selection().isEmpty()); QVERIFY(!m_subSelectionModel->selection().isEmpty()); QCOMPARE(m_mainSelectionModel->selection().indexes().first().row(), 6); QCOMPARE(m_subSelectionModel->selection().indexes().first().row(), 1); { QSortFilterProxyModel additionalProxy; additionalProxy.setFilterRegExp(QRegExp(QStringLiteral("^[3-9]"))); additionalProxy.setSourceModel(m_mainModel); KLinkItemSelectionModel additionalLink; additionalLink.setModel(&additionalProxy); additionalLink.setLinkedItemSelectionModel(m_mainSelectionModel); QVERIFY(!additionalLink.selection().isEmpty()); QCOMPARE(additionalLink.selection().indexes().first().row(), 3); auto idx = additionalProxy.index(4, 0); QVERIFY(idx.isValid()); additionalLink.select(idx, QItemSelectionModel::ClearAndSelect); QVERIFY(!additionalLink.selection().isEmpty()); QCOMPARE(additionalLink.selection().indexes().first().row(), 4); QVERIFY(!m_mainSelectionModel->selection().isEmpty()); QVERIFY(!m_subSelectionModel->selection().isEmpty()); QCOMPARE(m_mainSelectionModel->selection().indexes().first().row(), 7); QCOMPARE(m_subSelectionModel->selection().indexes().first().row(), 2); } QVERIFY(!m_mainSelectionModel->selection().isEmpty()); QVERIFY(!m_subSelectionModel->selection().isEmpty()); QCOMPARE(m_mainSelectionModel->selection().indexes().first().row(), 7); QCOMPARE(m_subSelectionModel->selection().indexes().first().row(), 2); #endif }
void ModelDescriptorListWidget::setExperimentType(const QString &experimentType) { //NOTE: QAbstractItemModel::match() seems to search children, we only want root level items searched! QSortFilterProxyModel *proxyModel = qobject_cast<QSortFilterProxyModel *>(QTreeView::model()); if(!experimentType.isEmpty()) { for(int row=0; row < proxyModel->rowCount(QModelIndex()); row++) { QModelIndex index = proxyModel->index(row, 0, QModelIndex()); if(!index.data(Qt::DisplayRole).toString().compare(experimentType, Qt::CaseInsensitive)) { setRootIndex(index); setRootIsDecorated(false); return; } } } setRootIndex(QModelIndex()); setRootIsDecorated(true); expandAll(); }
void FlatProxyModelTester::testInsertRemoveGrandChildren() { QSortFilterProxyModel sf; FlatProxyModel fm; QStandardItemModel sm; sf.setSourceModel( &fm ); fm.setSourceModel( &sm ); sm.setHeaderData( 0, Qt::Horizontal, "Column 0" ); QCOMPARE( sm.rowCount(), 0 ); QStandardItem *pitem = new QStandardItem( "Parent" ); sm.insertRow( 0, pitem ); QCOMPARE( sm.rowCount(), 1 ); QCOMPARE( fm.rowCount(), 1 ); QCOMPARE( sf.rowCount(), 1 ); QCOMPARE( sm.index( 0, 0 ).data(), sf.index( 0, 0 ).data() ); QCOMPARE( sf.index( 0, 0 ).data(), QVariant( "Parent" ) ); QModelIndex grandparent = sm.index( 0, 0 ); QVERIFY( grandparent.isValid() ); QStandardItem *gitem = new QStandardItem( "First child" ); pitem->insertRow( 0, gitem ); QCOMPARE( sm.rowCount( grandparent ), 1 ); QCOMPARE( fm.rowCount(), 2 ); QCOMPARE( sf.rowCount(), 2 ); QCOMPARE( sm.index( 0, 0, grandparent ).data(), sf.index( 1, 0 ).data() ); QCOMPARE( sf.index( 1, 0 ).data(), QVariant( "First child" ) ); QModelIndex parent = sm.index( 0, 0, grandparent ); QVERIFY( parent.isValid() ); QStandardItem *item = new QStandardItem( "First grandchild" ); gitem->insertRow( 0, item ); QCOMPARE( sm.rowCount( parent ), 1 ); QCOMPARE( fm.rowCount(), 3 ); QCOMPARE( sf.rowCount(), 3 ); QCOMPARE( sm.index( 0, 0, parent ).data(), sf.index( 2, 0 ).data() ); QCOMPARE( sf.index( 2, 0 ).data(), QVariant( "First grandchild" ) ); item = new QStandardItem( "Second grandchild" ); gitem->insertRow( 1, item ); QCOMPARE( sm.rowCount( parent ), 2 ); QCOMPARE( fm.rowCount(), 4 ); QCOMPARE( sf.rowCount(), 4 ); QCOMPARE( sm.index( 0, 0, parent ).data(), sf.index( 2, 0 ).data() ); QCOMPARE( sm.index( 1, 0, parent ).data(), sf.index( 3, 0 ).data() ); QCOMPARE( sf.index( 2, 0 ).data(), QVariant( "First grandchild" ) ); QCOMPARE( sf.index( 3, 0 ).data(), QVariant( "Second grandchild" ) ); item = new QStandardItem( "In between" ); gitem->insertRow( 1, item ); QCOMPARE( sm.rowCount( parent ), 3 ); QCOMPARE( fm.rowCount(), 5 ); QCOMPARE( sf.rowCount(), 5 ); QCOMPARE( sm.index( 0, 0, parent ).data(), sf.index( 2, 0 ).data() ); QCOMPARE( sm.index( 1, 0, parent ).data(), sf.index( 3, 0 ).data() ); QCOMPARE( sm.index( 2, 0, parent ).data(), sf.index( 4, 0 ).data() ); QCOMPARE( sf.index( 2, 0 ).data(), QVariant( "First grandchild" ) ); QCOMPARE( sf.index( 3, 0 ).data(), QVariant( "In between" ) ); QCOMPARE( sf.index( 4, 0 ).data(), QVariant( "Second grandchild" ) ); item = new QStandardItem( "Before first" ); gitem->insertRow( 0, item ); QCOMPARE( sm.rowCount( parent ), 4 ); QCOMPARE( fm.rowCount(), 6 ); QCOMPARE( sf.rowCount(), 6 ); QCOMPARE( sm.index( 0, 0, parent ).data(), sf.index( 2, 0 ).data() ); QCOMPARE( sm.index( 1, 0, parent ).data(), sf.index( 3, 0 ).data() ); QCOMPARE( sm.index( 2, 0, parent ).data(), sf.index( 4, 0 ).data() ); QCOMPARE( sm.index( 3, 0, parent ).data(), sf.index( 5, 0 ).data() ); QCOMPARE( sf.index( 2, 0 ).data(), QVariant( "Before first" ) ); QCOMPARE( sf.index( 3, 0 ).data(), QVariant( "First grandchild" ) ); QCOMPARE( sf.index( 4, 0 ).data(), QVariant( "In between" ) ); QCOMPARE( sf.index( 5, 0 ).data(), QVariant( "Second grandchild" ) ); sm.removeRow( 0, parent ); QCOMPARE( sm.rowCount( parent ), 3 ); QCOMPARE( fm.rowCount(), 5 ); QCOMPARE( sf.rowCount(), 5 ); QCOMPARE( sm.index( 0, 0, parent ).data(), sf.index( 2, 0 ).data() ); QCOMPARE( sm.index( 1, 0, parent ).data(), sf.index( 3, 0 ).data() ); QCOMPARE( sm.index( 2, 0, parent ).data(), sf.index( 4, 0 ).data() ); QCOMPARE( sf.index( 2, 0 ).data(), QVariant( "First grandchild" ) ); QCOMPARE( sf.index( 3, 0 ).data(), QVariant( "In between" ) ); QCOMPARE( sf.index( 4, 0 ).data(), QVariant( "Second grandchild" ) ); sm.removeRow( 1, parent ); QCOMPARE( sm.rowCount( parent ), 2 ); QCOMPARE( fm.rowCount(), 4 ); QCOMPARE( sf.rowCount(), 4 ); QCOMPARE( sm.index( 0, 0, parent ).data(), sf.index( 2, 0 ).data() ); QCOMPARE( sm.index( 1, 0, parent ).data(), sf.index( 3, 0 ).data() ); QCOMPARE( sf.index( 2, 0 ).data(), QVariant( "First grandchild" ) ); QCOMPARE( sf.index( 3, 0 ).data(), QVariant( "Second grandchild" ) ); sm.removeRow( 1, parent ); QCOMPARE( sm.rowCount( parent ), 1 ); QCOMPARE( fm.rowCount(), 3 ); QCOMPARE( sf.rowCount(), 3 ); QCOMPARE( sm.index( 0, 0, parent ).data(), sf.index( 2, 0 ).data() ); QCOMPARE( sf.index( 2, 0 ).data(), QVariant( "First grandchild" ) ); sm.removeRow( 0, parent ); QCOMPARE( sm.rowCount( parent ), 0 ); QCOMPARE( fm.rowCount(), 2 ); QCOMPARE( sf.rowCount(), 2 ); QCOMPARE( sm.index( 0, 0, grandparent ).data(), sf.index( 1, 0 ).data() ); QCOMPARE( sf.index( 1, 0 ).data(), QVariant( "First child" ) ); QCOMPARE( sm.rowCount( grandparent ), 1 ); sm.removeRow( 0, grandparent ); QCOMPARE( sm.rowCount( grandparent ), 0 ); QCOMPARE( fm.rowCount(), 1 ); QCOMPARE( sf.rowCount(), 1 ); QCOMPARE( sm.index( 0, 0 ).data(), sf.index( 0, 0 ).data() ); QCOMPARE( sf.index( 0, 0 ).data(), QVariant( "Parent" ) ); QCOMPARE( sm.rowCount(), 1 ); sm.removeRow( 0 ); QCOMPARE( sm.rowCount(), 0 ); QCOMPARE( fm.rowCount(), 0 ); QCOMPARE( sf.rowCount(), 0 ); }
void FlatProxyModelTester::testInsertRemoveTop() { QSortFilterProxyModel sf; FlatProxyModel fm; QStandardItemModel sm; sf.setSourceModel( &fm ); fm.setSourceModel( &sm ); sm.setHeaderData( 0, Qt::Horizontal, "Column 0" ); QCOMPARE( sm.rowCount(), 0 ); // insert sm.insertRow( 0, new QStandardItem( "First" ) ); QCOMPARE( sm.rowCount(), 1 ); QCOMPARE( fm.rowCount(), 1 ); QCOMPARE( sf.rowCount(), 1 ); QCOMPARE( sm.index( 0, 0 ).data(), sf.index( 0, 0 ).data() ); QCOMPARE( sf.index( 0, 0 ).data(), QVariant( "First" ) ); sm.insertRow( 1, new QStandardItem( "Second" ) ); QCOMPARE( sm.rowCount(), 2 ); QCOMPARE( fm.rowCount(), 2 ); QCOMPARE( sf.rowCount(), 2 ); QCOMPARE( sm.index( 0, 0 ).data(), sf.index( 0, 0 ).data() ); QCOMPARE( sm.index( 1, 0 ).data(), sf.index( 1, 0 ).data() ); QCOMPARE( sf.index( 0, 0 ).data(), QVariant( "First" ) ); QCOMPARE( sf.index( 1, 0 ).data(), QVariant( "Second" ) ); sm.insertRow( 1, new QStandardItem( "In between" ) ); QCOMPARE( sm.rowCount(), 3 ); QCOMPARE( fm.rowCount(), 3 ); QCOMPARE( sf.rowCount(), 3 ); QCOMPARE( sm.index( 0, 0 ).data(), sf.index( 0, 0 ).data() ); QCOMPARE( sm.index( 1, 0 ).data(), sf.index( 1, 0 ).data() ); QCOMPARE( sm.index( 2, 0 ).data(), sf.index( 2, 0 ).data() ); QCOMPARE( sf.index( 0, 0 ).data(), QVariant( "First" ) ); QCOMPARE( sf.index( 1, 0 ).data(), QVariant( "In between" ) ); QCOMPARE( sf.index( 2, 0 ).data(), QVariant( "Second" ) ); sm.insertRow( 0, new QStandardItem( "Before first" ) ); QCOMPARE( sm.rowCount(), 4 ); QCOMPARE( fm.rowCount(), 4 ); QCOMPARE( sf.rowCount(), 4 ); QCOMPARE( sm.index( 0, 0 ).data(), sf.index( 0, 0 ).data() ); QCOMPARE( sm.index( 1, 0 ).data(), sf.index( 1, 0 ).data() ); QCOMPARE( sm.index( 2, 0 ).data(), sf.index( 2, 0 ).data() ); QCOMPARE( sm.index( 3, 0 ).data(), sf.index( 3, 0 ).data() ); QCOMPARE( sf.index( 0, 0 ).data(), QVariant( "Before first" ) ); QCOMPARE( sf.index( 1, 0 ).data(), QVariant( "First" ) ); QCOMPARE( sf.index( 2, 0 ).data(), QVariant( "In between" ) ); QCOMPARE( sf.index( 3, 0 ).data(), QVariant( "Second" ) ); // remove sm.removeRow( 0 ); QCOMPARE( sm.rowCount(), 3 ); QCOMPARE( fm.rowCount(), 3 ); QCOMPARE( sf.rowCount(), 3 ); QCOMPARE( sm.index( 0, 0 ).data(), sf.index( 0, 0 ).data() ); QCOMPARE( sm.index( 1, 0 ).data(), sf.index( 1, 0 ).data() ); QCOMPARE( sm.index( 2, 0 ).data(), sf.index( 2, 0 ).data() ); QCOMPARE( sf.index( 0, 0 ).data(), QVariant( "First" ) ); QCOMPARE( sf.index( 1, 0 ).data(), QVariant( "In between" ) ); QCOMPARE( sf.index( 2, 0 ).data(), QVariant( "Second" ) ); sm.removeRow( 1 ); QCOMPARE( sm.rowCount(), 2 ); QCOMPARE( fm.rowCount(), 2 ); QCOMPARE( sf.rowCount(), 2 ); QCOMPARE( sm.index( 0, 0 ).data(), sf.index( 0, 0 ).data() ); QCOMPARE( sm.index( 1, 0 ).data(), sf.index( 1, 0 ).data() ); QCOMPARE( sf.index( 0, 0 ).data(), QVariant( "First" ) ); QCOMPARE( sf.index( 1, 0 ).data(), QVariant( "Second" ) ); sm.removeRow( 1 ); QCOMPARE( sm.rowCount(), 1 ); QCOMPARE( fm.rowCount(), 1 ); QCOMPARE( sf.rowCount(), 1 ); QCOMPARE( sm.index( 0, 0 ).data(), sf.index( 0, 0 ).data() ); QCOMPARE( sf.index( 0, 0 ).data(), QVariant( "First" ) ); sm.removeRow( 0 ); QCOMPARE( sm.rowCount(), 0 ); QCOMPARE( fm.rowCount(), 0 ); QCOMPARE( sf.rowCount(), 0 ); }