X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Ftreemodel.cpp;h=52439afec80409d604007c56ee7231bb915fb731;hp=0d6111fb5c3916f85ac6efd4717f1e54f08f8739;hb=ef0e65458bf4e1cbc01399fe0e025a5b4fd327dc;hpb=44b22c4419f478a20f6324f9f3a700a2dec56302 diff --git a/src/client/treemodel.cpp b/src/client/treemodel.cpp index 0d6111fb..52439afe 100644 --- a/src/client/treemodel.cpp +++ b/src/client/treemodel.cpp @@ -24,9 +24,12 @@ /***************************************** * 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), + parentItem(parent), + itemData(data), + _flags(Qt::ItemIsSelectable | Qt::ItemIsEnabled) +{ } TreeItem::TreeItem(TreeItem *parent) { @@ -38,16 +41,35 @@ TreeItem::~TreeItem() { qDeleteAll(childItems); } +uint TreeItem::id() const { + return (uint)this; +} + void TreeItem::appendChild(TreeItem *item) { childItems.append(item); + childHash[item->id()] = item; } void TreeItem::removeChild(int 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 { @@ -70,17 +92,28 @@ 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 { + // some sane defaults + return _flags; +} + +void TreeItem::setFlags(Qt::ItemFlags flags) { + _flags = flags; +} + /***************************************** * 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,6 +139,21 @@ 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(); @@ -148,10 +196,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 {