fixing segfaults on part if the part results in an empty category (BR #232)
authorMarcus Eggenberger <egs@quassel-irc.org>
Sat, 9 Aug 2008 14:38:00 +0000 (16:38 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Sat, 9 Aug 2008 14:38:00 +0000 (16:38 +0200)
src/client/treemodel.cpp
src/client/treemodel.h

index 3b18d03..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.
index cc602de..e4b5ca3 100644 (file)
@@ -79,13 +79,17 @@ signals:
   
   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); }
 };