void QgsComposerLegendWidget::on_mMoveUpToolButton_clicked() { if ( !mLegend ) { return; } QStandardItemModel* itemModel = qobject_cast<QStandardItemModel *>( mItemTreeView->model() ); if ( !itemModel ) { return; } QModelIndex currentIndex = mItemTreeView->currentIndex(); if ( !currentIndex.isValid() ) { return; } mLegend->beginCommand( "Moved legend item up" ); //is there an older sibling? int row = currentIndex.row(); QModelIndex olderSibling = currentIndex.sibling( row - 1, 0 ); if ( !olderSibling.isValid() ) { return; } QModelIndex parentIndex = currentIndex.parent(); QList<QStandardItem*> itemToMove; QList<QStandardItem*> olderSiblingItem; if ( !parentIndex.isValid() ) //move toplevel item { itemToMove = itemModel->takeRow( row ); olderSiblingItem = itemModel->takeRow( row - 1 ); itemModel->insertRow( row - 1, itemToMove ); itemModel->insertRow( row, olderSiblingItem ); } else //move classification items { QStandardItem* parentItem = itemModel->itemFromIndex( parentIndex ); itemToMove = parentItem->takeRow( row ); olderSiblingItem = parentItem->takeRow( row - 1 ); parentItem->insertRow( row - 1, itemToMove ); parentItem->insertRow( row, olderSiblingItem ); } mItemTreeView->setCurrentIndex( itemModel->indexFromItem( itemToMove.at( 0 ) ) ); mLegend->update(); mLegend->endCommand(); }
void QgsComposerLegendWidget::on_mMoveDownPushButton_clicked() { QStandardItemModel* itemModel = dynamic_cast<QStandardItemModel*>( mItemTreeView->model() ); if ( !itemModel ) { return; } QModelIndex currentIndex = mItemTreeView->currentIndex(); if ( !currentIndex.isValid() ) { return; } //is there an older sibling? int row = currentIndex.row(); QModelIndex youngerSibling = currentIndex.sibling( row + 1, 0 ); if ( !youngerSibling.isValid() ) { return; } QModelIndex parentIndex = currentIndex.parent(); QList<QStandardItem*> itemToMove; QList<QStandardItem*> youngerSiblingItem; if ( !parentIndex.isValid() ) //move toplevel (layer) item { youngerSiblingItem = itemModel->takeRow( row + 1 ); itemToMove = itemModel->takeRow( row ); itemModel->insertRow( row, youngerSiblingItem ); itemModel->insertRow( row + 1, itemToMove ); } else //move child (classification) item { QStandardItem* parentItem = itemModel->itemFromIndex( parentIndex ); youngerSiblingItem = parentItem->takeRow( row + 1 ); itemToMove = parentItem->takeRow( row ); parentItem->insertRow( row, youngerSiblingItem ); parentItem->insertRow( row + 1, itemToMove ); } mItemTreeView->setCurrentIndex( itemModel->indexFromItem( itemToMove.at( 0 ) ) ); if ( mLegend ) { mLegend->update(); } }
KoRecentDocumentsPane::KoRecentDocumentsPane(QWidget* parent, const KComponentData &_componentData, const QString& header) : KoDetailsPane(parent, _componentData, header) , d(new KoRecentDocumentsPanePrivate) { setFocusProxy(m_documentList); KGuiItem openGItem(i18n("Open This Document"), "document-open"); m_openButton->setGuiItem(openGItem); m_alwaysUseCheckBox->hide(); model()->setSortRole(0); // Disable sorting KConfigGroup config(componentData().config(), "RecentFiles"); int i = 1; QString path; KFileItemList fileList; QStandardItem* rootItem = model()->invisibleRootItem(); do { path = config.readPathEntry(QString("File%1").arg(i), QString()); if (!path.isEmpty()) { QString name = config.readPathEntry(QString("Name%1").arg(i), QString()); KUrl url(path); if (name.isEmpty()) name = url.fileName(); if (!url.isLocalFile() || QFile::exists(url.toLocalFile())) { KFileItem fileItem(KFileItem::Unknown, KFileItem::Unknown, url); fileList.prepend(fileItem); //center all icons in 64x64 area QImage icon = fileItem.pixmap(64).toImage(); icon = icon.convertToFormat(QImage::Format_ARGB32); icon = icon.copy((icon.width() - 64) / 2, (icon.height() - 64) / 2, 64, 64); KoFileListItem* item = new KoFileListItem(QPixmap::fromImage(icon), name); item->setEditable(false); item->setData(fileItem.pixmap(128), Qt::UserRole); item->setFileItem(fileItem); rootItem->insertRow(0, item); } } i++; } while (!path.isEmpty() || i <= 10); //Select the first file QModelIndex firstIndex = model()->indexFromItem(model()->item(0)); m_documentList->selectionModel()->select(firstIndex, QItemSelectionModel::Select); m_documentList->selectionModel()->setCurrentIndex(firstIndex, QItemSelectionModel::Select); d->m_previewJob = KIO::filePreview(fileList, QSize(200, 200), 0); connect(d->m_previewJob, SIGNAL(result(KJob*)), this, SLOT(previewResult(KJob*))); connect(d->m_previewJob, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)), this, SLOT(updatePreview(const KFileItem&, const QPixmap&))); }
// Returns a heading item with the given text. Will create and add a new heading under \c parentIndex at \c position if no heading with that text exists yet. (Use -1 for \c position to append at the bottom.) If \c text is empty, will return the top-level (invisible root) item. QStandardItem* AMWindowPaneModel::headingItem(const QString& text, QModelIndex parentIndex, int position) { if(text.isEmpty()) return invisibleRootItem(); QList<QStandardItem*> searchItems = this->findItems(text); foreach(QStandardItem* i, searchItems) { if(isHeading(i->index())) return i; } // Didn't find it... time to make it: QStandardItem* newHeading = new QStandardItem(text); newHeading->setFlags(Qt::ItemIsEnabled); // enabled, but should not be selectable // graphics defaults: QFont font = QFont("Lucida Grande", 10, QFont::Bold); font.setCapitalization(QFont::AllUppercase); newHeading->setFont(font); newHeading->setData(QBrush(QColor::fromRgb(100, 109, 125)), Qt::ForegroundRole); QStandardItem* parent = itemFromIndex(parentIndex); if(parent) { if(position < 0 || position > parent->rowCount()) position = parent->rowCount(); parent->insertRow(position, newHeading); } else { if(position < 0 || position > rowCount()) position = rowCount(); insertRow(position, newHeading); } return newHeading; }
bool ProgramsModel::AddProgram(int groupNum, QModelIndex &index, int row) { QStandardItem *groupItem = item(groupNum); //if the group was disabled re-enable it if(groupItem->rowCount()==0) { groupItem->setBackground(Qt::transparent); groupItem->setToolTip(""); } int progId = myHost->programsModel->GetNextProgId(); QString name("New prog"); //create the program item QStandardItem *prgItem = new QStandardItem( name ); prgItem->setData(ProgramNode,NodeType); prgItem->setData(progId,ProgramId); #ifndef QT_NO_DEBUG prgItem->setData(progId,Qt::ToolTipRole); #endif prgItem->setDragEnabled(true); prgItem->setDropEnabled(false); prgItem->setEditable(true); if(row==-1) row=groupItem->rowCount(); groupItem->insertRow(row, prgItem); index = prgItem->index(); // ValidateProgChange(index); return true; }
KoRecentDocumentsPane::KoRecentDocumentsPane(QWidget* parent, const KComponentData &_componentData, const QString& header) : KoDetailsPane(parent, _componentData, header) , d(new KoRecentDocumentsPanePrivate) { setFocusProxy(m_documentList); KGuiItem openGItem(i18n("Open This Document"), koIconName("document-open")); m_openButton->setGuiItem(openGItem); m_alwaysUseCheckBox->hide(); model()->setSortRole(0); // Disable sorting KConfigGroup config(componentData().config(), "RecentFiles"); int i = 1; QString path; KFileItemList fileList; QStandardItem* rootItem = model()->invisibleRootItem(); do { path = config.readPathEntry(QString("File%1").arg(i), QString()); if (!path.isEmpty()) { QString name = config.readPathEntry(QString("Name%1").arg(i), QString()); QUrl url(path); if (name.isEmpty()) name = url.fileName(); if (!url.isLocalFile() || QFile::exists(url.toLocalFile())) { KFileItem fileItem(KFileItem::Unknown, KFileItem::Unknown, url); fileList.prepend(fileItem); const QIcon icon = QIcon::fromTheme(fileItem.iconName()); KoFileListItem* item = new KoFileListItem(icon, name, fileItem); item->setEditable(false); rootItem->insertRow(0, item); } } i++; } while (!path.isEmpty() || i <= 10); //Select the first file QModelIndex firstIndex = model()->indexFromItem(model()->item(0)); m_documentList->selectionModel()->select(firstIndex, QItemSelectionModel::Select); m_documentList->selectionModel()->setCurrentIndex(firstIndex, QItemSelectionModel::Select); QStringList availablePlugins = KIO::PreviewJob::availablePlugins(); KIO::PreviewJob *previewJob = KIO::filePreview(fileList, QSize(IconExtent, IconExtent), &availablePlugins); d->m_previewJobs.append(previewJob); connect(previewJob, SIGNAL(result(KJob*)), SLOT(previewResult(KJob*))); connect(previewJob, SIGNAL(gotPreview(KFileItem,QPixmap)), SLOT(updateIcon(KFileItem,QPixmap))); }
/** Updates the sibling position of the item, depending on the position in the model. */ void NavigatorTreeModel::updateItemRowOrder(const ModelNode &node) { if (!containsNode(node)) return; ItemRow itemRow = itemRowForNode(node); int currentRow = itemRow.idItem->row(); int newRow = currentRow; if (node.parentProperty().parentModelNode().isValid()) newRow = modelNodeChildren(node.parentProperty().parentModelNode()).indexOf(node); Q_ASSERT(newRow >= 0); if (currentRow != newRow) { QStandardItem *parentIdItem = itemRow.idItem->parent(); QList<QStandardItem*> items = parentIdItem->takeRow(currentRow); parentIdItem->insertRow(newRow, items); } }
bool QgsLegendModel::dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent ) { Q_UNUSED( action ); Q_UNUSED( column ); if ( !data->hasFormat( "text/xml" ) ) { return false; } QStandardItem* dropIntoItem = 0; if ( parent.isValid() ) { dropIntoItem = itemFromIndex( parent ); } else { dropIntoItem = invisibleRootItem(); } //get XML doc QByteArray encodedData = data->data( "text/xml" ); QDomDocument xmlDoc; xmlDoc.setContent( encodedData ); QDomElement dragDataElem = xmlDoc.documentElement(); if ( dragDataElem.tagName() != "LegendModelDragData" ) { return false; } QDomNodeList nodeList = dragDataElem.childNodes(); int nChildNodes = nodeList.size(); QDomElement currentElem; QString currentTagName; QgsComposerLegendItem* currentItem = 0; for ( int i = 0; i < nChildNodes; ++i ) { currentElem = nodeList.at( i ).toElement(); if ( currentElem.isNull() ) { continue; } currentTagName = currentElem.tagName(); if ( currentTagName == "LayerItem" ) { currentItem = new QgsComposerLayerItem(); } else if ( currentTagName == "GroupItem" ) { currentItem = new QgsComposerGroupItem(); } else { continue; } currentItem->readXML( currentElem ); if ( row < 0 ) { dropIntoItem->insertRow( dropIntoItem->rowCount(), currentItem ); } else { dropIntoItem->insertRow( row + i, currentItem ); } } emit layersChanged(); return true; }
KoRecentDocumentsPane::KoRecentDocumentsPane(QWidget* parent, const QString& header) : KoDetailsPane(parent, header) , d(new KoRecentDocumentsPanePrivate) { setFocusProxy(m_documentList); m_openButton->setText(i18n("Open This Document")); m_openButton->setIcon(koIcon("document-open")); m_alwaysUseCheckBox->hide(); model()->setSortRole(0); // Disable sorting // load list of recent files from config KConfigGroup config(KSharedConfig::openConfig(), "RecentFiles"); QString fileKey; QString fileValue; QUrl url; QString nameValue; KFileItemList fileList; QStandardItem* rootItem = model()->invisibleRootItem(); for (int i = 1; i <= MAX_RECENTFILES_ENTRIES; ++i) { fileValue = config.readPathEntry(QString("File%1").arg(i), QString()); // ignore empty entries if (fileValue.isEmpty()) { continue; } url = QUrl::fromUserInput(fileValue); // ignore entries for files known to no longer exist if (url.isLocalFile() && !QFile::exists(url.toLocalFile())) { continue; } // ignore duplicated entries if (!fileList.findByUrl(url).isNull()) { continue; } nameValue = config.readPathEntry(QString("Name%1").arg(i), QString()); // handle name entries with empty strings if (nameValue.isEmpty()) { nameValue = url.fileName(); } KFileItem fileItem(url); fileList.prepend(fileItem); const QIcon icon = QIcon::fromTheme(fileItem.iconName()); KoFileListItem* item = new KoFileListItem(icon, nameValue, fileItem); item->setEditable(false); rootItem->insertRow(0, item); } //Select the first file QModelIndex firstIndex = model()->indexFromItem(model()->item(0)); m_documentList->selectionModel()->select(firstIndex, QItemSelectionModel::Select); m_documentList->selectionModel()->setCurrentIndex(firstIndex, QItemSelectionModel::Select); QStringList availablePlugins = KIO::PreviewJob::availablePlugins(); KIO::PreviewJob *previewJob = KIO::filePreview(fileList, QSize(IconExtent, IconExtent), &availablePlugins); d->m_previewJobs.append(previewJob); connect(previewJob, SIGNAL(result(KJob*)), SLOT(previewResult(KJob*))); connect(previewJob, SIGNAL(gotPreview(KFileItem,QPixmap)), SLOT(updateIcon(KFileItem,QPixmap))); }
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::test() { qDebug()<<"set 1 row, 1 column"; m_standardmodel.setColumnCount( 1 ); m_standardmodel.setRowCount( 1 ); m_standardmodel.setHorizontalHeaderLabels( QStringList() << "Column 1" ); m_flatmodel.setSourceModel( &m_standardmodel ); QCOMPARE( m_flatmodel.columnCount(), 2 ); // it adds an extra column QCOMPARE( m_flatmodel.rowCount(), 1 ); QCOMPARE( m_flatmodel.headerData( 0, Qt::Horizontal ), QVariant( "Column 1" ) ); m_standardmodel.setData( m_standardmodel.index( 0, 0 ), "Index 0,0" ); QModelIndex idx = m_flatmodel.index( 0, 0 ); QVERIFY( idx.isValid() ); qDebug()<<"Index 0,0:"<<idx.data(); QCOMPARE( idx.data(), QVariant( "Index 0,0" ) ); qDebug()<<"1 row, set 2 columns"; m_standardmodel.setColumnCount( 2 ); QCOMPARE( m_flatmodel.columnCount(), 3 ); // it adds an extra column m_flatmodel.setHeaderData( 1, Qt::Horizontal, "Column 2" ); QCOMPARE( m_flatmodel.headerData( 1, Qt::Horizontal ), QVariant( "Column 2" ) ); m_standardmodel.setData( m_standardmodel.index( 0, 1 ), "Index 0,1" ); idx = m_flatmodel.index( 0, 1 ); QVERIFY( idx.isValid() ); qDebug()<<"Index 0,1:"<<idx.data(); QCOMPARE( idx.data(), QVariant( "Index 0,1" ) ); qDebug()<<"Set 2 rows, 2 columns"; m_standardmodel.setRowCount( 2 ); QCOMPARE( m_flatmodel.rowCount(), 2 ); m_standardmodel.setData( m_standardmodel.index( 1, 0 ), "Index 1,0" ); idx = m_flatmodel.index( 1, 0 ); QVERIFY( idx.isValid() ); qDebug()<<"Index 1,0:"<<idx.data(); QCOMPARE( idx.data(), QVariant( "Index 1,0" ) ); m_standardmodel.setData( m_standardmodel.index( 1, 1 ), "Index 1,1" ); idx = m_flatmodel.index( 1, 1 ); QVERIFY( idx.isValid() ); qDebug()<<"Index 1,1:"<<idx.data(); QCOMPARE( idx.data(), QVariant( "Index 1,1" ) ); qDebug()<<"Add child on last index, adds a new row 1 in the flat model"; // NOTE: m_standardmodel.insertRow( 0, m_standardmodel.index( 1, 0 ) ); // does not work as there will be no columns and thus no valid indexes for this row QStandardItem *item = m_standardmodel.itemFromIndex( m_standardmodel.index( 1, 0 ) ); QList<QStandardItem*> items; items << new QStandardItem( "Child last column 1" ) << new QStandardItem( "Child last column 2" ); item->appendRow( items ); QCOMPARE( m_flatmodel.rowCount(), 3 ); idx = m_flatmodel.index( 2, 0 ); QCOMPARE( idx.data(), QVariant( "Child last column 1" ) ); idx = m_flatmodel.index( 2, 1 ); QCOMPARE( idx.data(), QVariant( "Child last column 2" ) ); qDebug()<<"add child on first index"; item = m_standardmodel.itemFromIndex( m_standardmodel.index( 0, 0 ) ); items.clear(); items << new QStandardItem( "Child first column 1" ) << new QStandardItem( "Child first column 2" ); item->appendRow( items ); QCOMPARE( m_flatmodel.rowCount(), 4 ); idx = m_flatmodel.index( 1, 0 ); QCOMPARE( idx.data(), QVariant( "Child first column 1" ) ); idx = m_flatmodel.index( 1, 1 ); QCOMPARE( idx.data(), QVariant( "Child first column 2" ) ); qDebug()<<"add row (2) on top level between first and last"; item = m_standardmodel.invisibleRootItem(); items.clear(); items << new QStandardItem( "New index 1,0" ) << new QStandardItem( "New index 1,1" ); item->insertRow( 1, items ); QCOMPARE( m_flatmodel.rowCount(), 5 ); idx = m_flatmodel.index( 2, 0 ); QCOMPARE( idx.data(), QVariant( "New index 1,0" ) ); idx = m_flatmodel.index( 2, 1 ); QCOMPARE( idx.data(), QVariant( "New index 1,1" ) ); qDebug()<<"Add child on middle index, adds row 3 to flat model"; item = m_standardmodel.itemFromIndex( m_standardmodel.index( 1, 0 ) ); items.clear(); items << new QStandardItem( "Child middle column 1" ) << new QStandardItem( "Child middle column 2" ); item->appendRow( items ); QCOMPARE( m_flatmodel.rowCount(), 6 ); idx = m_flatmodel.index( 3, 0 ); QCOMPARE( idx.data().toString(), QVariant( "Child middle column 1" ).toString() ); idx = m_flatmodel.index( 3, 1 ); QCOMPARE( idx.data(), QVariant( "Child middle column 2" ) ); qDebug()<<"Add child on middle index's child, adds row 4 to flat model"; QModelIndex parent = m_standardmodel.index( 1, 0 ); QCOMPARE( parent.data().toString(), QString( "New index 1,0" ) ); idx = m_standardmodel.index( 0, 0, parent ); QCOMPARE( idx.data().toString(), QString( "Child middle column 1" ) ); item = m_standardmodel.itemFromIndex( idx ); items.clear(); items << new QStandardItem( "Child of middle child column 1" ) << new QStandardItem( "Child of middle child column 2" ); item->appendRow( items ); QCOMPARE( m_flatmodel.rowCount(), 7 ); idx = m_flatmodel.index( 4, 0 ); QCOMPARE( idx.data().toString(), QVariant( "Child of middle child column 1" ).toString() ); idx = m_flatmodel.index( 4, 1 ); QCOMPARE( idx.data(), QVariant( "Child of middle child column 2" ) ); qDebug()<<"Add child on middle index at row 0, adds row 3 to flat model"; idx = m_standardmodel.index( 1, 0 ); QCOMPARE( idx.data().toString(), QString( "New index 1,0" ) ); item = m_standardmodel.itemFromIndex( idx ); items.clear(); items << new QStandardItem( "Index 1,0 -> Index 0,0" ) << new QStandardItem( "Index 1,0 -> Index 0,1" ); item->insertRow( 0, items ); QCOMPARE( m_flatmodel.rowCount(), 8 ); idx = m_flatmodel.index( 3, 0 ); QCOMPARE( idx.data().toString(), QVariant( "Index 1,0 -> Index 0,0" ).toString() ); idx = m_flatmodel.index( 3, 1 ); QCOMPARE( idx.data(), QVariant( "Index 1,0 -> Index 0,1" ) ); qDebug()<<"Add child on middle index at row 1, adds row 4 to flat model"; idx = m_standardmodel.index( 1, 0 ); QCOMPARE( idx.data().toString(), QString( "New index 1,0" ) ); item = m_standardmodel.itemFromIndex( idx ); items.clear(); items << new QStandardItem( "Index 1,0 -> Index 1,0" ) << new QStandardItem( "Index 1,0 -> Index 1,1" ); item->insertRow( 1, items ); QCOMPARE( m_flatmodel.rowCount(), 9 ); idx = m_flatmodel.index( 4, 0 ); QCOMPARE( idx.data().toString(), QVariant( "Index 1,0 -> Index 1,0" ).toString() ); idx = m_flatmodel.index( 4, 1 ); QCOMPARE( idx.data(), QVariant( "Index 1,0 -> Index 1,1" ) ); qDebug()<<"Add child on middle index at last row (4), adds row 8 to flat model"; idx = m_standardmodel.index( 1, 0 ); QCOMPARE( idx.data().toString(), QString( "New index 1,0" ) ); item = m_standardmodel.itemFromIndex( idx ); items.clear(); items << new QStandardItem( "Index 1,0 -> Index 4,0" ) << new QStandardItem( "Index 1,0 -> Index 4,1" ); item->insertRow( 3, items ); QCOMPARE( m_standardmodel.rowCount( m_standardmodel.index( 1, 0 ) ), 4 ); QCOMPARE( m_flatmodel.rowCount(), 10 ); idx = m_flatmodel.index( 7, 0 ); QCOMPARE( idx.data().toString(), QVariant( "Index 1,0 -> Index 4,0" ).toString() ); idx = m_flatmodel.index( 7, 1 ); QCOMPARE( idx.data(), QVariant( "Index 1,0 -> Index 4,1" ) ); }