internal stuff only: AbstractTreeItems can now commit suicide if they are childless
authorMarcus Eggenberger <egs@quassel-irc.org>
Sun, 27 Jul 2008 16:27:45 +0000 (18:27 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Sun, 27 Jul 2008 16:27:53 +0000 (18:27 +0200)
src/client/networkmodel.cpp
src/client/networkmodel.h
src/client/treemodel.cpp
src/client/treemodel.h

index 27bb3e2..d51e0ff 100644 (file)
@@ -526,13 +526,12 @@ void ChannelBufferItem::userModeChanged(IrcUser *ircUser) {
   }
 
   // find the item that needs reparenting
-  UserCategoryItem *oldCategoryItem = 0;
   IrcUserItem *ircUserItem = 0;
   for(int i = 0; i < childCount(); i++) {
-    UserCategoryItem *catItem = qobject_cast<UserCategoryItem *>(child(i));
-    IrcUserItem *userItem = catItem->findIrcUser(ircUser);
+    UserCategoryItem *oldCategoryItem = qobject_cast<UserCategoryItem *>(child(i));
+    Q_ASSERT(oldCategoryItem);
+    IrcUserItem *userItem = oldCategoryItem->findIrcUser(ircUser);
     if(userItem) {
-      oldCategoryItem = catItem;
       ircUserItem = userItem;
       break;
     }
@@ -542,11 +541,7 @@ void ChannelBufferItem::userModeChanged(IrcUser *ircUser) {
     qWarning() << "ChannelBufferItem::userModeChanged(IrcUser *): unable to determine old category of" << ircUser;
     return;
   }
-
-  Q_ASSERT(oldCategoryItem);
-  if(ircUserItem->reParent(categoryItem) && oldCategoryItem->childCount() == 0) {
-    removeChild(oldCategoryItem);
-  }
+  ircUserItem->reParent(categoryItem);
 }
 
 /*****************************************
@@ -560,6 +555,7 @@ UserCategoryItem::UserCategoryItem(int category, AbstractTreeItem *parent)
   : PropertyMapItem(QStringList() << "categoryName", parent),
     _category(category)
 {
+  setTreeItemFlags(AbstractTreeItem::DeleteOnLastChildRemoved);
   setObjectName(parent->data(0, Qt::DisplayRole).toString() + "/" + QString::number(category));
 }
 
@@ -696,6 +692,12 @@ QString IrcUserItem::toolTip(int column) const {
   return QString("<p> %1 </p>").arg(toolTip.join("<br />"));
 }
 
+// void IrcUserItem::ircUserDestroyed() {
+//   parent()->removeChild(this);
+//   if(parent()->childCount() == 0)
+//     parent()->parent()->removeChild(parent());
+// }
+
 /*****************************************
  * NetworkModel
  *****************************************/
index 08ae4af..31e4dca 100644 (file)
@@ -240,7 +240,7 @@ public:
   virtual QString toolTip(int column) const;
 
 private slots:
-  void ircUserDestroyed() { parent()->removeChild(this); }
+  inline void ircUserDestroyed() { parent()->removeChild(this); }
 
 private:
   QPointer<IrcUser> _ircUser;
index 5c23063..4fd2687 100644 (file)
  *****************************************/
 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);
@@ -68,6 +66,8 @@ bool AbstractTreeItem::removeChild(int row) {
   treeitem->deleteLater();
   emit endRemoveChilds();
 
+  checkForDeletion();
+  
   return true;
 }
 
@@ -96,6 +96,8 @@ void AbstractTreeItem::removeAllChilds() {
     child->deleteLater();
   }
   emit endRemoveChilds();
+
+  checkForDeletion();
 }
 
 bool AbstractTreeItem::reParent(AbstractTreeItem *newParent) {
@@ -114,6 +116,8 @@ bool AbstractTreeItem::reParent(AbstractTreeItem *newParent) {
   parent()->_childItems.removeAt(oldRow);
   emit parent()->endRemoveChilds();
 
+  parent()->checkForDeletion();
+
   setParent(newParent);
 
   bool success = newParent->newChild(this);
index 8a5e3ac..cc602de 100644 (file)
@@ -35,8 +35,13 @@ class AbstractTreeItem : public QObject {
   Q_OBJECT
 
 public:
+  enum TreeItemFlag {
+    NoTreeItemFlag = 0x00,
+    DeleteOnLastChildRemoved = 0x01
+  };
+  Q_DECLARE_FLAGS(TreeItemFlags, TreeItemFlag);
+
   AbstractTreeItem(AbstractTreeItem *parent = 0);
-  virtual ~AbstractTreeItem();
 
   bool newChild(AbstractTreeItem *child);
   bool newChilds(const QList<AbstractTreeItem *> &items);
@@ -59,6 +64,8 @@ public:
   virtual inline Qt::ItemFlags flags() const { return _flags; }
   virtual inline void setFlags(Qt::ItemFlags flags) { _flags = flags; }
 
+  inline AbstractTreeItem::TreeItemFlags treeItemFlags() const { return _treeItemFlags; }
+  inline void setTreeItemFlags(AbstractTreeItem::TreeItemFlags flags) { _treeItemFlags = flags; }
   int row() const;
   inline AbstractTreeItem *parent() const { return qobject_cast<AbstractTreeItem *>(QObject::parent()); }
 
@@ -76,6 +83,9 @@ signals:
 private:
   QList<AbstractTreeItem *> _childItems;
   Qt::ItemFlags _flags;
+  TreeItemFlags _treeItemFlags;
+
+  inline void checkForDeletion() { if(treeItemFlags() & DeleteOnLastChildRemoved && childCount() == 0) parent()->removeChild(this); }
 };