X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Ftreemodel.cpp;h=48394c5ee29c1e231f219304ba3be3b654e5198c;hp=2a71576de2309419dce7b97d5b2f01db8668cf5c;hb=e561e02a8d2f1f009559d17c7b1c66cb6f4e2a5a;hpb=4be2513b86decea7720f930164b4e893b63e53e0 diff --git a/src/client/treemodel.cpp b/src/client/treemodel.cpp index 2a71576d..48394c5e 100644 --- a/src/client/treemodel.cpp +++ b/src/client/treemodel.cpp @@ -29,26 +29,16 @@ *****************************************/ AbstractTreeItem::AbstractTreeItem(AbstractTreeItem *parent) : QObject(parent), - _flags(Qt::ItemIsSelectable | Qt::ItemIsEnabled) + _flags(Qt::ItemIsSelectable | Qt::ItemIsEnabled), + _treeItemFlags(0) { } -AbstractTreeItem::~AbstractTreeItem() { -} - -quint64 AbstractTreeItem::id() const { - return qHash(this); -} - bool AbstractTreeItem::newChild(AbstractTreeItem *item) { - // check if a child with that ID is already known - Q_ASSERT(childById(item->id()) == 0); - int newRow = childCount(); emit beginAppendChilds(newRow, newRow); _childItems.append(item); emit endAppendChilds(); - return true; } @@ -56,53 +46,29 @@ bool AbstractTreeItem::newChilds(const QList &items) { if(items.isEmpty()) return false; - QList::const_iterator itemIter = items.constBegin(); - AbstractTreeItem *item; - while(itemIter != items.constEnd()) { - item = *itemIter; - if(childById(item->id()) != 0) { - qWarning() << "AbstractTreeItem::newChilds(): received child that is already attached" << item << item->id(); - return false; - } - itemIter++; - } - int nextRow = childCount(); int lastRow = nextRow + items.count() - 1; emit beginAppendChilds(nextRow, lastRow); - itemIter = items.constBegin(); - while(itemIter != items.constEnd()) { - _childItems.append(*itemIter); - itemIter++; - } + _childItems << items; emit endAppendChilds(); return true; } bool AbstractTreeItem::removeChild(int row) { - if(childCount() <= row) + if(row < 0 || childCount() <= row) return false; child(row)->removeAllChilds(); emit beginRemoveChilds(row, row); AbstractTreeItem *treeitem = _childItems.takeAt(row); - treeitem->deleteLater(); + delete treeitem; emit endRemoveChilds(); - return true; -} - -bool AbstractTreeItem::removeChildById(const quint64 &id) { - const int numChilds = childCount(); - - for(int i = 0; i < numChilds; i++) { - if(_childItems[i]->id() == id) - return removeChild(i); - } + checkForDeletion(); - return false; + return true; } void AbstractTreeItem::removeAllChilds() { @@ -118,6 +84,7 @@ void AbstractTreeItem::removeAllChilds() { childIter = _childItems.begin(); while(childIter != _childItems.end()) { child = *childIter; + child->setTreeItemFlags(0); // disable self deletion, as this would only fuck up consitency and the child gets deleted anyways child->removeAllChilds(); childIter++; } @@ -127,9 +94,11 @@ void AbstractTreeItem::removeAllChilds() { while(childIter != _childItems.end()) { child = *childIter; childIter = _childItems.erase(childIter); - child->deleteLater(); + delete child; } emit endRemoveChilds(); + + checkForDeletion(); } bool AbstractTreeItem::reParent(AbstractTreeItem *newParent) { @@ -148,6 +117,8 @@ bool AbstractTreeItem::reParent(AbstractTreeItem *newParent) { parent()->_childItems.removeAt(oldRow); emit parent()->endRemoveChilds(); + parent()->checkForDeletion(); + setParent(newParent); bool success = newParent->newChild(this); @@ -164,15 +135,6 @@ AbstractTreeItem *AbstractTreeItem::child(int row) const { return _childItems[row]; } -AbstractTreeItem *AbstractTreeItem::childById(const quint64 &id) const { - const int numChilds = childCount(); - for(int i = 0; i < numChilds; i++) { - if(_childItems[i]->id() == id) - return _childItems[i]; - } - return 0; -} - int AbstractTreeItem::childCount(int column) const { if(column > 0) return 0; @@ -192,26 +154,14 @@ int AbstractTreeItem::row() const { return row_; } -AbstractTreeItem *AbstractTreeItem::parent() const { - return qobject_cast(QObject::parent()); -} - -Qt::ItemFlags AbstractTreeItem::flags() const { - return _flags; -} - -void AbstractTreeItem::setFlags(Qt::ItemFlags flags) { - _flags = flags; -} - void AbstractTreeItem::dumpChildList() { - qDebug() << "==== Childlist for Item:" << this << id() << "===="; + qDebug() << "==== Childlist for Item:" << this << "===="; if(childCount() > 0) { AbstractTreeItem *child; QList::const_iterator childIter = _childItems.constBegin(); while(childIter != _childItems.constEnd()) { child = *childIter; - qDebug() << "Row:" << child->row() << child << child->id() << child->data(0, Qt::DisplayRole); + qDebug() << "Row:" << child->row() << child << child->data(0, Qt::DisplayRole); childIter++; } } @@ -355,22 +305,6 @@ QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) con return QModelIndex(); } -QModelIndex TreeModel::indexById(quint64 id, const QModelIndex &parent) const { - AbstractTreeItem *parentItem; - - if(!parent.isValid()) - parentItem = rootItem; - else - parentItem = static_cast(parent.internalPointer()); - - AbstractTreeItem *childItem = parentItem->childById(id); - - if(childItem) - return createIndex(childItem->row(), 0, childItem); - else - return QModelIndex(); -} - QModelIndex TreeModel::indexByItem(AbstractTreeItem *item) const { if(item == 0) { qWarning() << "TreeModel::indexByItem(AbstractTreeItem *item) received NULL-Pointer"; @@ -585,7 +519,7 @@ void TreeModel::debug_rowsAboutToBeRemoved(const QModelIndex &parent, int start, child = parent.child(i, 0); childItem = parentItem->child(i); Q_ASSERT(childItem); - qDebug() << ">>>" << i << child << childItem->id() << child.data().toString(); + qDebug() << ">>>" << i << child << child.data().toString(); } } @@ -602,7 +536,7 @@ void TreeModel::debug_rowsInserted(const QModelIndex &parent, int start, int end child = parent.child(i, 0); childItem = parentItem->child(i); Q_ASSERT(childItem); - qDebug() << "<<<" << i << child << childItem->id() << child.data().toString(); + qDebug() << "<<<" << i << child << child.data().toString(); } }