fixing segfaults on part if the part results in an empty category (BR #232)
[quassel.git] / src / client / treemodel.cpp
index 48394c5..4933f0d 100644 (file)
 #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
  *****************************************/
@@ -101,6 +110,25 @@ void AbstractTreeItem::removeAllChilds() {
   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.
@@ -117,14 +145,16 @@ bool AbstractTreeItem::reParent(AbstractTreeItem *newParent) {
   parent()->_childItems.removeAt(oldRow);
   emit parent()->endRemoveChilds();
 
-  parent()->checkForDeletion();
-
+  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;
 }