#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
*****************************************/
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) {
// currently we support only re parenting if the child that's about to be
// adopted does not have any children itself.
void beginRemoveChilds(int firstRow, int lastRow);
void endRemoveChilds();
-
+
+protected:
+ void customEvent(QEvent *event);
+
private:
QList<AbstractTreeItem *> _childItems;
Qt::ItemFlags _flags;
TreeItemFlags _treeItemFlags;
- inline void checkForDeletion() { if(treeItemFlags() & DeleteOnLastChildRemoved && childCount() == 0) parent()->removeChild(this); }
+ void removeChildLater(AbstractTreeItem *child);
+ inline void checkForDeletion() { if(treeItemFlags() & DeleteOnLastChildRemoved && childCount() == 0) parent()->removeChildLater(this); }
};