X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fclient%2Ftreemodel.cpp;h=b3f2613cabd44f27f1be59fdcbc168556210306f;hb=37112539ef48c17968eb2d55fb8fc76b20329040;hp=36cb8d6a1c4f320fb9095a2705ff4b2582edb2a3;hpb=5c6804f291a63f978e328aeddcc8448e3443b45e;p=quassel.git diff --git a/src/client/treemodel.cpp b/src/client/treemodel.cpp index 36cb8d6a..b3f2613c 100644 --- a/src/client/treemodel.cpp +++ b/src/client/treemodel.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel Project * + * Copyright (C) 2005-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -127,6 +127,10 @@ void AbstractTreeItem::customEvent(QEvent *event) { if(childRow == -1) return; + // since we are called asynchronously we have to recheck if the item in question still has no childs + if(removeEvent->child()->childCount()) + return; + removeChild(childRow); } @@ -301,15 +305,15 @@ TreeModel::TreeModel(const QList &data, QObject *parent) if(Quassel::isOptionSet("debugmodel")) { connect(this, SIGNAL(rowsAboutToBeInserted(const QModelIndex &, int, int)), - this, SLOT(debug_rowsAboutToBeInserted(const QModelIndex &, int, int))); + this, SLOT(debug_rowsAboutToBeInserted(const QModelIndex &, int, int))); connect(this, SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)), - this, SLOT(debug_rowsAboutToBeRemoved(const QModelIndex &, int, int))); + this, SLOT(debug_rowsAboutToBeRemoved(const QModelIndex &, int, int))); connect(this, SIGNAL(rowsInserted(const QModelIndex &, int, int)), - this, SLOT(debug_rowsInserted(const QModelIndex &, int, int))); + this, SLOT(debug_rowsInserted(const QModelIndex &, int, int))); connect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), - this, SLOT(debug_rowsRemoved(const QModelIndex &, int, int))); + this, SLOT(debug_rowsRemoved(const QModelIndex &, int, int))); connect(this, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), - this, SLOT(debug_dataChanged(const QModelIndex &, const QModelIndex &))); + this, SLOT(debug_dataChanged(const QModelIndex &, const QModelIndex &))); } } @@ -318,7 +322,7 @@ TreeModel::~TreeModel() { } QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const { - if(!hasIndex(row, column, parent)) + if(row < 0 || row >= rowCount(parent) || column < 0 || column >= columnCount(parent)) return QModelIndex(); AbstractTreeItem *parentItem; @@ -350,7 +354,8 @@ QModelIndex TreeModel::indexByItem(AbstractTreeItem *item) const { QModelIndex TreeModel::parent(const QModelIndex &index) const { if(!index.isValid()) { - qWarning() << "TreeModel::parent(): has been asked for the rootItems Parent!"; + // ModelTest does this + // qWarning() << "TreeModel::parent(): has been asked for the rootItems Parent!"; return QModelIndex(); } @@ -442,23 +447,23 @@ void TreeModel::itemDataChanged(int column) { void TreeModel::connectItem(AbstractTreeItem *item) { connect(item, SIGNAL(dataChanged(int)), - this, SLOT(itemDataChanged(int))); + this, SLOT(itemDataChanged(int))); connect(item, SIGNAL(beginAppendChilds(int, int)), - this, SLOT(beginAppendChilds(int, int))); + this, SLOT(beginAppendChilds(int, int))); connect(item, SIGNAL(endAppendChilds()), - this, SLOT(endAppendChilds())); + this, SLOT(endAppendChilds())); connect(item, SIGNAL(beginRemoveChilds(int, int)), - this, SLOT(beginRemoveChilds(int, int))); + this, SLOT(beginRemoveChilds(int, int))); connect(item, SIGNAL(endRemoveChilds()), - this, SLOT(endRemoveChilds())); + this, SLOT(endRemoveChilds())); } void TreeModel::beginAppendChilds(int firstRow, int lastRow) { AbstractTreeItem *parentItem = qobject_cast(sender()); if(!parentItem) { - qWarning() << "TreeModel::beginAppendChilds(): cannot append Childs to unknown parent"; + qWarning() << "TreeModel::beginAppendChilds(): cannot append Children to unknown parent"; return; } @@ -473,7 +478,7 @@ void TreeModel::beginAppendChilds(int firstRow, int lastRow) { void TreeModel::endAppendChilds() { AbstractTreeItem *parentItem = qobject_cast(sender()); if(!parentItem) { - qWarning() << "TreeModel::endAppendChilds(): cannot append Childs to unknown parent"; + qWarning() << "TreeModel::endAppendChilds(): cannot append Children to unknown parent"; return; } Q_ASSERT(_aboutToRemoveOrInsert); @@ -492,7 +497,7 @@ void TreeModel::endAppendChilds() { void TreeModel::beginRemoveChilds(int firstRow, int lastRow) { AbstractTreeItem *parentItem = qobject_cast(sender()); if(!parentItem) { - qWarning() << "TreeModel::beginRemoveChilds(): cannot append Childs to unknown parent"; + qWarning() << "TreeModel::beginRemoveChilds(): cannot append Children to unknown parent"; return; } @@ -514,7 +519,7 @@ void TreeModel::beginRemoveChilds(int firstRow, int lastRow) { void TreeModel::endRemoveChilds() { AbstractTreeItem *parentItem = qobject_cast(sender()); if(!parentItem) { - qWarning() << "TreeModel::endRemoveChilds(): cannot remove Childs from unknown parent"; + qWarning() << "TreeModel::endRemoveChilds(): cannot remove Children from unknown parent"; return; } @@ -545,11 +550,9 @@ void TreeModel::debug_rowsAboutToBeRemoved(const QModelIndex &parent, int start, qDebug() << "debug_rowsAboutToBeRemoved" << parent << parentItem << parent.data().toString() << rowCount(parent) << start << end; QModelIndex child; - AbstractTreeItem *childItem; for(int i = end; i >= start; i--) { child = parent.child(i, 0); - childItem = parentItem->child(i); - Q_ASSERT(childItem); + Q_ASSERT(parentItem->child(i)); qDebug() << ">>>" << i << child << child.data().toString(); } } @@ -562,11 +565,9 @@ void TreeModel::debug_rowsInserted(const QModelIndex &parent, int start, int end qDebug() << "debug_rowsInserted:" << parent << parentItem << parent.data().toString() << rowCount(parent) << start << end; QModelIndex child; - AbstractTreeItem *childItem; for(int i = start; i <= end; i++) { child = parent.child(i, 0); - childItem = parentItem->child(i); - Q_ASSERT(childItem); + Q_ASSERT(parentItem->child(i)); qDebug() << "<<<" << i << child << child.data().toString(); } }