/***************************************************************************
- * Copyright (C) 2005-07 by The Quassel Team *
+ * Copyright (C) 2005-07 by the Quassel IRC Team *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
+ * (at your option) version 3. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
-#include "global.h"
#include "treemodel.h"
/*****************************************
* Buffer Items stored in the Tree Model
*****************************************/
-TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent) : QObject(parent) {
- itemData = data;
- parentItem = parent;
+TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
+ : QObject(parent),
+ itemData(data),
+ _parentItem(parent),
+ _flags(Qt::ItemIsSelectable | Qt::ItemIsEnabled)
+{
}
-TreeItem::TreeItem(TreeItem *parent) {
- itemData = QList<QVariant>();
- parentItem = parent;
+TreeItem::TreeItem(TreeItem *parent)
+ : QObject(parent),
+ itemData(QList<QVariant>()),
+ _parentItem(parent),
+ _flags(Qt::ItemIsSelectable | Qt::ItemIsEnabled)
+{
}
TreeItem::~TreeItem() {
- qDeleteAll(childItems);
+ qDeleteAll(_childItems);
+}
+
+uint TreeItem::id() const {
+ return (uint)this;
}
void TreeItem::appendChild(TreeItem *item) {
- childItems.append(item);
+ _childItems.append(item);
+ _childHash[item->id()] = item;
+ connect(item, SIGNAL(destroyed()),
+ this, SLOT(childDestroyed()));
}
void TreeItem::removeChild(int row) {
- childItems.removeAt(row);
+ if(row >= _childItems.size())
+ return;
+ TreeItem *treeitem = _childItems.value(row);
+ _childItems.removeAt(row);
+ _childHash.remove(_childHash.key(treeitem));
}
-TreeItem *TreeItem::child(int row) {
- return childItems.value(row);
+TreeItem *TreeItem::child(int row) const {
+ if(row < _childItems.size())
+ return _childItems.value(row);
+ else
+ return 0;
+}
+
+TreeItem *TreeItem::childById(const uint &id) const {
+ if(_childHash.contains(id))
+ return _childHash.value(id);
+ else
+ return 0;
}
int TreeItem::childCount() const {
- return childItems.count();
+ return _childItems.count();
}
int TreeItem::row() const {
- if(parentItem)
- return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
+ if(_parentItem)
+ return _parentItem->_childItems.indexOf(const_cast<TreeItem*>(this));
else
return 0;
}
TreeItem *TreeItem::parent() {
- return parentItem;
+ return _parentItem;
}
int TreeItem::columnCount() const {
}
QVariant TreeItem::data(int column, int role) const {
- if(role == Qt::DisplayRole and column < itemData.count())
+ if(role == Qt::DisplayRole && column < itemData.count())
return itemData[column];
else
return QVariant();
}
+Qt::ItemFlags TreeItem::flags() const {
+ return _flags;
+}
+
+void TreeItem::setFlags(Qt::ItemFlags flags) {
+ _flags = flags;
+}
+
+void TreeItem::childDestroyed() {
+ TreeItem *item = static_cast<TreeItem*>(sender());
+ removeChild(item->row());
+}
+
+
/*****************************************
* TreeModel
*****************************************/
-TreeModel::TreeModel(const QList<QVariant> &data, QObject *parent) : QAbstractItemModel(parent) {
+TreeModel::TreeModel(const QList<QVariant> &data, QObject *parent)
+ : QAbstractItemModel(parent)
+{
rootItem = new TreeItem(data, 0);
}
return QModelIndex();
}
+QModelIndex TreeModel::indexById(uint id, const QModelIndex &parent) const {
+ TreeItem *parentItem;
+
+ if(!parent.isValid())
+ parentItem = rootItem;
+ else
+ parentItem = static_cast<TreeItem *>(parent.internalPointer());
+
+ TreeItem *childItem = parentItem->childById(id);
+ if(childItem)
+ return createIndex(childItem->row(), 0, childItem);
+ else
+ return QModelIndex();
+}
+
QModelIndex TreeModel::parent(const QModelIndex &index) const {
if(!index.isValid())
return QModelIndex();
TreeItem *childItem = static_cast<TreeItem*>(index.internalPointer());
- TreeItem *parentItem = childItem->parent();
+ TreeItem *parentItem = static_cast<TreeItem*>(childItem->parent());
if(parentItem == rootItem)
return QModelIndex();
int TreeModel::rowCount(const QModelIndex &parent) const {
TreeItem *parentItem;
- if(parent.column() > 0)
- return 0;
-
if(!parent.isValid())
parentItem = rootItem;
else
}
Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const {
+ TreeItem *item;
if(!index.isValid())
- return 0;
+ item = rootItem;
else
- return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
+ item = static_cast<TreeItem *>(index.internalPointer());
+ return item->flags();
}
QVariant TreeModel::headerData(int section, Qt::Orientation orientation, int role) const {
}
bool TreeModel::removeRow(int row, const QModelIndex &parent) {
+ if(row > rowCount(parent))
+ return false;
+
+ TreeItem *item;
+ if(!parent.isValid())
+ item = rootItem;
+ else
+ item = static_cast<TreeItem*>(parent.internalPointer());
+
beginRemoveRows(parent, row, row);
- TreeItem *item = static_cast<TreeItem*>(parent.internalPointer());
item->removeChild(row);
endRemoveRows();
return true;
}
+bool TreeModel::removeRows(int row, int count, const QModelIndex &parent) {
+ // check if there is work to be done
+ if(count == 0)
+ return true;
+
+ // out of range check
+ if(row + count - 1 > rowCount(parent) || row < 0 || count < 0)
+ return false;
+
+ TreeItem *item;
+ if(!parent.isValid())
+ item = rootItem;
+ else
+ item = static_cast<TreeItem*>(parent.internalPointer());
+
+
+ beginRemoveRows(parent, row, row + count - 1);
+
+ for(int i = row + count - 1; i >= 0; i--) {
+ item->removeChild(i);
+ }
+ endRemoveRows();
+ return true;
+}
+
+void TreeModel::clear() {
+ removeRows(0, rowCount());
+}