QModelIndex BtTreeModel::createFolderTree( QStringList dirs, BtTreeItem* parent, QString pPath) { BtTreeItem* pItem = parent; // Start the loop. We are going to return ndx at the end, // so we need to declare and initialize outside of the loop QModelIndex ndx = createIndex(pItem->childCount(),0,pItem); // Need to call this because we are adding different things with different // column counts. Just using the rowsAboutToBeAdded throws ugly errors and // then a sigsegv emit layoutAboutToBeChanged(); foreach ( QString cur, dirs ) { QString fPath; BtFolder* temp = new BtFolder(); int i; // If the parent item is a folder, use its full path if ( pItem->type() == BtTreeItem::FOLDER ) fPath = pItem->folder()->fullPath() % "/" % cur; else fPath = pPath % "/" % cur; // If it isn't we need the parent path fPath.replace(QRegExp("//"), "/"); // Set the full path, which will set the name and the path temp->setfullPath(fPath); i = pItem->childCount(); pItem->insertChildren(i, 1, BtTreeItem::FOLDER); pItem->child(i)->setData(BtTreeItem::FOLDER, temp); // Insert the item into the tree. If it fails, bug out //if ( ! insertRow(i, ndx, temp, BtTreeItem::FOLDER) ) //{ // emit layoutChanged(); // return QModelIndex(); //} // Set the parent item to point to the newly created tree pItem = pItem->child(i); // And this for the return ndx = createIndex(pItem->childCount(), 0, pItem); }
bool BtTreeModel::insertRow(int row, const QModelIndex &parent, QObject* victim, int victimType ) { if ( ! parent.isValid() ) return false; BtTreeItem *pItem = item(parent); int type = pItem->type(); bool success = true; beginInsertRows(parent,row,row); success = pItem->insertChildren(row,1,type); if ( victim && success ) { type = victimType == -1 ? type : victimType; BtTreeItem* added = pItem->child(row); added->setData(type, victim); } endInsertRows(); return success; }