/* This file is part of SciQLop. SciQLop 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. SciQLop 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 SciQLop. If not, see . */ #include #include #include RepositoriesModel::RepositoriesModel(QObject* parent) : QAbstractItemModel(parent) { refresh(); connect(&(sqpApp->catalogueController()), &CatalogueController::repositoryAdded, this, [this](const QString&) { this->refresh(); }); connect(&(sqpApp->catalogueController()), &CatalogueController::catalogueAdded, this, [this](const CatalogueController::Catalogue_ptr&, const QString&) { this->refresh(); }); } RepositoriesModel::ItemType RepositoriesModel::type(const QModelIndex& index) const { if (RepoModelItem* item = to_item(index)) { return item->type; } return ItemType::None; } void RepositoriesModel::refresh() { beginResetModel(); _items.clear(); _items.push_back(std::make_unique("All")); _items.push_back(std::make_unique("Trash")); auto repo_list = sqpApp->catalogueController().repositories(); std::transform(std::begin(repo_list), std::end(repo_list), std::back_inserter(_items), [](const auto& repo_name) { return std::make_unique(repo_name); }); endResetModel(); } QVariant RepositoriesModel::data(const QModelIndex& index, int role) const { if (index.isValid() && index.column() == 0) { return to_item(index)->data(role); } return QVariant {}; } QModelIndex RepositoriesModel::index(int row, int column, const QModelIndex& parent) const { if (!hasIndex(row, column, parent)) { return QModelIndex(); } switch (type(parent)) { case RepositoriesModel::ItemType::None: // is a repo return createIndex(row, column, _items[row].get()); case RepositoriesModel::ItemType::Repository: // is a catalogue return createIndex(row, column, to_item(parent)->children[row].get()); case RepositoriesModel::ItemType::Catalogue: return createIndex(row, column, new RepoModelItem()); } return QModelIndex(); } QModelIndex RepositoriesModel::parent(const QModelIndex& index) const { auto item = to_item(index); if (item->type == ItemType::Catalogue) { auto repoIndex = SciQLop::containers::index_of(_items, item->parent); return createIndex(repoIndex, 0, item->parent); } return QModelIndex(); } int RepositoriesModel::rowCount(const QModelIndex& parent) const { switch (type(parent)) { case RepositoriesModel::ItemType::None: return _items.size(); case RepositoriesModel::ItemType::Repository: return to_item(parent)->children.size(); case RepositoriesModel::ItemType::Catalogue: break; } return 0; } RepositoriesModel::RepoModelItem::RepoModelItem(const QString& repo) : type { ItemType::Repository }, item { repo }, icon { ":/icones/database.png" } { auto catalogues = sqpApp->catalogueController().catalogues(repo); std::transform(std::begin(catalogues), std::end(catalogues), std::back_inserter(children), [this](auto& catalogue) { return std::make_unique(catalogue, this); }); } QVariant RepositoriesModel::RepoModelItem::data(int role) const { switch (role) { case Qt::EditRole: case Qt::DisplayRole: return text(); case Qt::DecorationRole: return QVariant { icon }; default: break; } return QVariant {}; }