From: Marcus Eggenberger Date: Sun, 27 Jul 2008 16:27:45 +0000 (+0200) Subject: internal stuff only: AbstractTreeItems can now commit suicide if they are childless X-Git-Tag: 0.3.0~208 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=197cf9c0d5e227dd475124515f6e6005cf87ac8e internal stuff only: AbstractTreeItems can now commit suicide if they are childless --- diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index 27bb3e2f..d51e0ffc 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -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(child(i)); - IrcUserItem *userItem = catItem->findIrcUser(ircUser); + UserCategoryItem *oldCategoryItem = qobject_cast(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("

%1

").arg(toolTip.join("
")); } +// void IrcUserItem::ircUserDestroyed() { +// parent()->removeChild(this); +// if(parent()->childCount() == 0) +// parent()->parent()->removeChild(parent()); +// } + /***************************************** * NetworkModel *****************************************/ diff --git a/src/client/networkmodel.h b/src/client/networkmodel.h index 08ae4af0..31e4dcaa 100644 --- a/src/client/networkmodel.h +++ b/src/client/networkmodel.h @@ -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; diff --git a/src/client/treemodel.cpp b/src/client/treemodel.cpp index 5c23063d..4fd26873 100644 --- a/src/client/treemodel.cpp +++ b/src/client/treemodel.cpp @@ -29,13 +29,11 @@ *****************************************/ 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); diff --git a/src/client/treemodel.h b/src/client/treemodel.h index 8a5e3ac9..cc602de7 100644 --- a/src/client/treemodel.h +++ b/src/client/treemodel.h @@ -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 &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(QObject::parent()); } @@ -76,6 +83,9 @@ signals: private: QList _childItems; Qt::ItemFlags _flags; + TreeItemFlags _treeItemFlags; + + inline void checkForDeletion() { if(treeItemFlags() & DeleteOnLastChildRemoved && childCount() == 0) parent()->removeChild(this); } };