X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Ftreemodel.cpp;h=fda1df4de1ca8f924f116559c966291a789ca197;hp=fef6a2168479365b7c0b2a9056ea014a68e26044;hb=36b2b9680ff608f41c681b8c23865abb06a2464c;hpb=82c333488067c4aa77dee07f27818c47ecaf10fe diff --git a/src/client/treemodel.cpp b/src/client/treemodel.cpp index fef6a216..fda1df4d 100644 --- a/src/client/treemodel.cpp +++ b/src/client/treemodel.cpp @@ -1,11 +1,11 @@ /*************************************************************************** - * 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 * @@ -18,51 +18,77 @@ * 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 &data, TreeItem *parent) : QObject(parent) { - itemData = data; - parentItem = parent; +TreeItem::TreeItem(const QList &data, TreeItem *parent) + : QObject(parent), + itemData(data), + _parentItem(parent), + _flags(Qt::ItemIsSelectable | Qt::ItemIsEnabled) +{ } -TreeItem::TreeItem(TreeItem *parent) { - itemData = QList(); - parentItem = parent; +TreeItem::TreeItem(TreeItem *parent) + : QObject(parent), + itemData(QList()), + _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) const { + if(row < _childItems.size()) + return _childItems.value(row); + else + return 0; } -TreeItem *TreeItem::child(int row) { - return childItems.value(row); +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(this)); + if(_parentItem) + return _parentItem->_childItems.indexOf(const_cast(this)); else return 0; } TreeItem *TreeItem::parent() { - return parentItem; + return _parentItem; } int TreeItem::columnCount() const { @@ -70,17 +96,33 @@ 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(sender()); + removeChild(item->row()); +} + + /***************************************** * TreeModel *****************************************/ -TreeModel::TreeModel(const QList &data, QObject *parent) : QAbstractItemModel(parent) { +TreeModel::TreeModel(const QList &data, QObject *parent) + : QAbstractItemModel(parent) +{ rootItem = new TreeItem(data, 0); } @@ -106,12 +148,27 @@ QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) con return QModelIndex(); } +QModelIndex TreeModel::indexById(uint id, const QModelIndex &parent) const { + TreeItem *parentItem; + + if(!parent.isValid()) + parentItem = rootItem; + else + parentItem = static_cast(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(index.internalPointer()); - TreeItem *parentItem = childItem->parent(); + TreeItem *parentItem = static_cast(childItem->parent()); if(parentItem == rootItem) return QModelIndex(); @@ -121,9 +178,6 @@ QModelIndex TreeModel::parent(const QModelIndex &index) const { int TreeModel::rowCount(const QModelIndex &parent) const { TreeItem *parentItem; - if(parent.column() > 0) - return 0; - if(!parent.isValid()) parentItem = rootItem; else @@ -148,10 +202,12 @@ QVariant TreeModel::data(const QModelIndex &index, int role) const { } 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(index.internalPointer()); + return item->flags(); } QVariant TreeModel::headerData(int section, Qt::Orientation orientation, int role) const { @@ -194,6 +250,7 @@ bool TreeModel::removeRows(int row, int count, const QModelIndex &parent) { beginRemoveRows(parent, row, row + count - 1); + for(int i = row + count - 1; i >= 0; i--) { item->removeChild(i); } @@ -203,4 +260,5 @@ bool TreeModel::removeRows(int row, int count, const QModelIndex &parent) { void TreeModel::clear() { removeRows(0, rowCount()); + reset(); }