}
// 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;
}
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);
}
/*****************************************
: PropertyMapItem(QStringList() << "categoryName", parent),
_category(category)
{
+ setTreeItemFlags(AbstractTreeItem::DeleteOnLastChildRemoved);
setObjectName(parent->data(0, Qt::DisplayRole).toString() + "/" + QString::number(category));
}
return QString("<p> %1 </p>").arg(toolTip.join("<br />"));
}
+// void IrcUserItem::ircUserDestroyed() {
+// parent()->removeChild(this);
+// if(parent()->childCount() == 0)
+// parent()->parent()->removeChild(parent());
+// }
+
/*****************************************
* NetworkModel
*****************************************/
virtual QString toolTip(int column) const;
private slots:
- void ircUserDestroyed() { parent()->removeChild(this); }
+ inline void ircUserDestroyed() { parent()->removeChild(this); }
private:
QPointer<IrcUser> _ircUser;
*****************************************/
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);
treeitem->deleteLater();
emit endRemoveChilds();
+ checkForDeletion();
+
return true;
}
child->deleteLater();
}
emit endRemoveChilds();
+
+ checkForDeletion();
}
bool AbstractTreeItem::reParent(AbstractTreeItem *newParent) {
parent()->_childItems.removeAt(oldRow);
emit parent()->endRemoveChilds();
+ parent()->checkForDeletion();
+
setParent(newParent);
bool success = newParent->newChild(this);
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);
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()); }
private:
QList<AbstractTreeItem *> _childItems;
Qt::ItemFlags _flags;
+ TreeItemFlags _treeItemFlags;
+
+ inline void checkForDeletion() { if(treeItemFlags() & DeleteOnLastChildRemoved && childCount() == 0) parent()->removeChild(this); }
};