#include <QDebug>
#include <QCoreApplication>
+class RemoveChildLaterEvent : public QEvent {
+public:
+ RemoveChildLaterEvent(AbstractTreeItem *child) : QEvent(QEvent::User), _child(child) {};
+ inline AbstractTreeItem *child() { return _child; }
+private:
+ AbstractTreeItem *_child;
+};
+
+
/*****************************************
* Abstract Items of a TreeModel
*****************************************/
AbstractTreeItem::AbstractTreeItem(AbstractTreeItem *parent)
: QObject(parent),
- _flags(Qt::ItemIsSelectable | Qt::ItemIsEnabled)
+ _flags(Qt::ItemIsSelectable | Qt::ItemIsEnabled),
+ _treeItemFlags(0)
{
}
-AbstractTreeItem::~AbstractTreeItem() {
-}
-
bool AbstractTreeItem::newChild(AbstractTreeItem *item) {
int newRow = childCount();
emit beginAppendChilds(newRow, newRow);
}
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();
+ checkForDeletion();
+
return true;
}
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++;
}
while(childIter != _childItems.end()) {
child = *childIter;
childIter = _childItems.erase(childIter);
- child->deleteLater();
+ delete child;
}
emit endRemoveChilds();
+
+ checkForDeletion();
+}
+
+void AbstractTreeItem::removeChildLater(AbstractTreeItem *child) {
+ Q_ASSERT(child);
+ QCoreApplication::postEvent(this, new RemoveChildLaterEvent(child));
+}
+
+void AbstractTreeItem::customEvent(QEvent *event) {
+ if(event->type() != QEvent::User)
+ return;
+
+ event->accept();
+
+ RemoveChildLaterEvent *removeEvent = static_cast<RemoveChildLaterEvent *>(event);
+ int childRow = _childItems.indexOf(removeEvent->child());
+ if(childRow == -1)
+ return;
+
+ removeChild(childRow);
}
bool AbstractTreeItem::reParent(AbstractTreeItem *newParent) {
parent()->_childItems.removeAt(oldRow);
emit parent()->endRemoveChilds();
+ AbstractTreeItem *oldParent = parent();
setParent(newParent);
bool success = newParent->newChild(this);
if(!success)
qWarning() << "AbstractTreeItem::reParent(): failed to attach to new parent after removing from old parent! this:" << this << "new parent:" << newParent;
+ if(oldParent)
+ oldParent->checkForDeletion();
+
return success;
}