***************************************************************************/
#include "treemodel.h"
-#include "global.h"
-#include <QDebug>
#include <QCoreApplication>
+#include <QDebug>
+
+#include "quassel.h"
+
+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
bool AbstractTreeItem::newChilds(const QList<AbstractTreeItem *> &items) {
if(items.isEmpty())
return false;
-
+
int nextRow = childCount();
int lastRow = nextRow + items.count() - 1;
}
bool AbstractTreeItem::removeChild(int row) {
- if(childCount() <= row)
+ if(row < 0 || childCount() <= row)
return false;
child(row)->removeAllChilds();
emit beginRemoveChilds(row, row);
AbstractTreeItem *treeitem = _childItems.takeAt(row);
- treeitem->deleteLater();
+ delete treeitem;
emit endRemoveChilds();
checkForDeletion();
-
+
return true;
}
void AbstractTreeItem::removeAllChilds() {
const int numChilds = childCount();
-
+
if(numChilds == 0)
return;
-
+
AbstractTreeItem *child;
QList<AbstractTreeItem *>::iterator childIter;
while(childIter != _childItems.end()) {
child = *childIter;
childIter = _childItems.erase(childIter);
- child->deleteLater();
+ delete child;
}
emit endRemoveChilds();
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.
int oldRow = row();
if(oldRow == -1)
return false;
-
+
emit parent()->beginRemoveChilds(oldRow, oldRow);
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;
}
qWarning() << "AbstractTreeItem::row():" << this << "has no parent AbstractTreeItem as it's parent! parent is" << QObject::parent();
return -1;
}
-
+
int row_ = parent()->_childItems.indexOf(const_cast<AbstractTreeItem *>(this));
if(row_ == -1)
qWarning() << "AbstractTreeItem::row():" << this << "is not in the child list of" << QObject::parent();
childIter++;
}
}
- qDebug() << "==== End Of Childlist ====";
+ qDebug() << "==== End Of Childlist ====";
}
/*****************************************
PropertyMapItem::~PropertyMapItem() {
}
-
+
QVariant PropertyMapItem::data(int column, int role) const {
if(column >= columnCount())
return QVariant();
default:
return QVariant();
}
-
+
}
bool PropertyMapItem::setData(int column, const QVariant &value, int role) {
int PropertyMapItem::columnCount() const {
return _propertyOrder.count();
}
-
+
void PropertyMapItem::appendProperty(const QString &property) {
_propertyOrder << property;
}
rootItem = new SimpleTreeItem(data, 0);
connectItem(rootItem);
- if(Global::parser.isSet("debugmodel")) {
+ if(Quassel::isOptionSet("debugmodel")) {
connect(this, SIGNAL(rowsAboutToBeInserted(const QModelIndex &, int, int)),
this, SLOT(debug_rowsAboutToBeInserted(const QModelIndex &, int, int)));
connect(this, SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)),
QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const {
if(!hasIndex(row, column, parent))
return QModelIndex();
-
+
AbstractTreeItem *parentItem;
-
+
if(!parent.isValid())
parentItem = rootItem;
else
parentItem = static_cast<AbstractTreeItem *>(parent.internalPointer());
-
+
AbstractTreeItem *childItem = parentItem->child(row);
if(childItem)
qWarning() << "TreeModel::indexByItem(AbstractTreeItem *item) received NULL-Pointer";
return QModelIndex();
}
-
+
if(item == rootItem)
return QModelIndex();
else
qWarning() << "TreeModel::parent(): has been asked for the rootItems Parent!";
return QModelIndex();
}
-
+
AbstractTreeItem *childItem = static_cast<AbstractTreeItem *>(index.internalPointer());
AbstractTreeItem *parentItem = childItem->parent();
Q_ASSERT(parentItem);
if(parentItem == rootItem)
return QModelIndex();
-
+
return createIndex(parentItem->row(), 0, parentItem);
}
void TreeModel::connectItem(AbstractTreeItem *item) {
connect(item, SIGNAL(dataChanged(int)),
this, SLOT(itemDataChanged(int)));
-
+
connect(item, SIGNAL(beginAppendChilds(int, int)),
this, SLOT(beginAppendChilds(int, int)));
connect(item, SIGNAL(endAppendChilds()),
this, SLOT(endAppendChilds()));
-
+
connect(item, SIGNAL(beginRemoveChilds(int, int)),
this, SLOT(beginRemoveChilds(int, int)));
connect(item, SIGNAL(endRemoveChilds()),
QModelIndex parent = indexByItem(parentItem);
Q_ASSERT(!_aboutToRemoveOrInsert);
-
+
_aboutToRemoveOrInsert = true;
_childStatus = ChildStatus(parent, rowCount(parent), firstRow, lastRow);
beginInsertRows(parent, firstRow, lastRow);
for(int i = firstRow; i <= lastRow; i++) {
disconnect(parentItem->child(i), 0, this, 0);
}
-
+
// consitency checks
QModelIndex parent = indexByItem(parentItem);
Q_ASSERT(firstRow <= lastRow);