QModelIndex SourcesModel::parent( const QModelIndex& child ) const { if( !child.isValid() ) { return QModelIndex(); } SourceTreeItem* node = itemFromIndex( child ); SourceTreeItem* parent = node->parent(); if( parent == m_rootItem ) return QModelIndex(); return createIndex( rowForItem( parent ), 0, parent ); }
QModelIndex SourcesModel::indexFromItem( SourceTreeItem* item ) const { if( !item || !item->parent() ) // should never happen.. return QModelIndex(); // reconstructs a modelindex from a sourcetreeitem that is somewhere in the tree // traverses the item to the root node, then rebuilds the qmodeindices from there back down // each int is the row of that item in the parent. /** * In this diagram, if the \param item is G, childIndexList will contain [0, 2, 0] * * A * D * E * F * G * H * B * C * **/ QList< int > childIndexList; SourceTreeItem* curItem = item; while( curItem != m_rootItem ) { int row = rowForItem( curItem ); if( row < 0 ) // something went wrong, bail return QModelIndex(); childIndexList << row; curItem = curItem->parent(); } // qDebug() << "build child index list:" << childIndexList; // now rebuild the qmodelindex we need QModelIndex idx; for( int i = childIndexList.size() - 1; i >= 0 ; i-- ) { idx = index( childIndexList[ i ], 0, idx ); } // qDebug() << "Got index from item:" << idx << idx.data( Qt::DisplayRole ).toString(); // qDebug() << "parent:" << idx.parent(); return idx; }