/* * Strawberry Music Player * This file was part of Clementine. * Copyright 2010, David Sansome * Copyright 2018-2021, Jonas Kvinge * * Strawberry 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 3 of the License, or * (at your option) any later version. * * Strawberry is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Strawberry. If not, see . * */ #ifndef SIMPLETREEITEM_H #define SIMPLETREEITEM_H #include "config.h" #include #include #include #include "simpletreemodel.h" template class SimpleTreeItem { public: explicit SimpleTreeItem(int _type, SimpleTreeModel *_model); // For the root item explicit SimpleTreeItem(int _type, const QString &_key, T *_parent = nullptr); explicit SimpleTreeItem(int _type, T *_parent = nullptr); virtual ~SimpleTreeItem(); void InsertNotify(T *_parent); void DeleteNotify(int child_row); void ClearNotify(); void ChangedNotify(); void Delete(int child_row); T *ChildByKey(const QString &key) const; QString DisplayText() const { return display_text; } QString SortText() const { return sort_text; } int type; QString key; QString sort_text; QString display_text; int row; T *parent; QList children; QAbstractItemModel *child_model; SimpleTreeModel *model; }; template SimpleTreeItem::SimpleTreeItem(int _type, SimpleTreeModel *_model) : type(_type), row(0), parent(nullptr), child_model(nullptr), model(_model) {} template SimpleTreeItem::SimpleTreeItem(int _type, const QString &_key, T *_parent) : type(_type), key(_key), parent(_parent), child_model(nullptr), model(_parent ? _parent->model : nullptr) { if (parent) { row = parent->children.count(); parent->children << static_cast(this); } } template SimpleTreeItem::SimpleTreeItem(int _type, T *_parent) : type(_type), parent(_parent), child_model(nullptr), model(_parent ? _parent->model : nullptr) { if (parent) { row = parent->children.count(); parent->children << static_cast(this); } } template void SimpleTreeItem::InsertNotify(T *_parent) { parent = _parent; model = parent->model; row = parent->children.count(); model->BeginInsert(parent, row); parent->children << static_cast(this); model->EndInsert(); } template void SimpleTreeItem::DeleteNotify(int child_row) { model->BeginDelete(static_cast(this), child_row); delete children.takeAt(child_row); // Adjust row numbers of those below it :( for (int i = child_row; i < children.count(); ++i) children[i]->row--; model->EndDelete(); } template void SimpleTreeItem::ClearNotify() { if (children.count()) { model->BeginDelete(static_cast(this), 0, children.count() - 1); qDeleteAll(children); children.clear(); model->EndDelete(); } } template void SimpleTreeItem::ChangedNotify() { model->EmitDataChanged(static_cast(this)); } template SimpleTreeItem::~SimpleTreeItem() { qDeleteAll(children); } template void SimpleTreeItem::Delete(int child_row) { delete children.takeAt(child_row); // Adjust row numbers of those below it :( for (int i = child_row; i < children.count(); ++i) children[i]->row--; } template T *SimpleTreeItem::ChildByKey(const QString &_key) const { for (T *child : children) { if (child->key == _key) return child; } return nullptr; } #endif // SIMPLETREEITEM_H