File indexing completed on 2024-05-05 04:53:51

0001 /*
0002     SPDX-FileCopyrightText: 2017 Nicolas Carion
0003     SPDX-FileCopyrightText: 2022 Julius Künzel <jk.kdedev@smartlab.uber.space>
0004     SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "renderpresettreemodel.hpp"
0008 #include "../renderpresetmodel.hpp"
0009 #include "../renderpresetrepository.hpp"
0010 #include "abstractmodel/treeitem.hpp"
0011 
0012 #include <KColorScheme>
0013 #include <KLocalizedString>
0014 #include <QApplication>
0015 #include <QIcon>
0016 #include <array>
0017 #include <functional>
0018 #include <vector>
0019 
0020 RenderPresetTreeModel::RenderPresetTreeModel(QObject *parent)
0021     : AbstractTreeModel(parent)
0022 {
0023 }
0024 
0025 std::shared_ptr<RenderPresetTreeModel> RenderPresetTreeModel::construct(QObject *parent)
0026 {
0027     std::shared_ptr<RenderPresetTreeModel> self(new RenderPresetTreeModel(parent));
0028     QList<QVariant> rootData;
0029     rootData << "Name";
0030     self->rootItem = TreeItem::construct(rootData, self, true);
0031     RenderPresetRepository::get()->refresh();
0032     QVector<QString> presets = RenderPresetRepository::get()->getAllPresets();
0033 
0034     // helper lambda that creates a preset category with the given name
0035     auto createCat = [&](const QString &name) { return self->rootItem->appendChild(QList<QVariant>{name}); };
0036 
0037     std::vector<std::shared_ptr<TreeItem>> cats{};
0038 
0039     for (const auto &preset : qAsConst(presets)) {
0040         bool foundMatch = false;
0041         // we get a pointer to the presetemodel
0042         std::unique_ptr<RenderPresetModel> &ptr = RenderPresetRepository::get()->getPreset(preset);
0043         // we create the data list corresponding to this preset
0044         QList<QVariant> data;
0045         data << preset;
0046         for (const auto &cat : cats) {
0047             if (cat->dataColumn(0) == ptr->groupName()) {
0048                 cat->appendChild(data);
0049                 foundMatch = true;
0050                 break;
0051             }
0052         }
0053         if (!foundMatch) {
0054             // category not found, create it
0055             const auto &cat = createCat(ptr->groupName());
0056             cats.push_back(cat);
0057             cat->appendChild(data);
0058         }
0059     }
0060     return self;
0061 }
0062 
0063 QVariant RenderPresetTreeModel::data(const QModelIndex &index, int role) const
0064 {
0065     if (!index.isValid()) {
0066         qDebug() << "Index is not valid" << index;
0067         return QVariant();
0068     }
0069 
0070     if (RenderPresetRepository::get()->presetExists(getPreset(index))) {
0071         std::unique_ptr<RenderPresetModel> &preset = RenderPresetRepository::get()->getPreset(getPreset(index));
0072 
0073         KColorScheme scheme(qApp->palette().currentColorGroup(), KColorScheme::Window);
0074         if (role == Qt::ForegroundRole) {
0075             if (!preset->error().isEmpty()) {
0076                 return scheme.foreground(KColorScheme::InactiveText).color();
0077             }
0078         }
0079 
0080         if (role == Qt::BackgroundRole) {
0081             if (!preset->error().isEmpty()) {
0082                 return scheme.background(KColorScheme::NegativeBackground).color();
0083             }
0084         }
0085 
0086         if (role == Qt::ToolTipRole) {
0087             if (!preset->note().isEmpty()) {
0088                 return preset->note();
0089             }
0090         }
0091 
0092         if (role == Qt::DecorationRole) {
0093             if (!preset->error().isEmpty()) {
0094                 return QIcon::fromTheme(QStringLiteral("dialog-close"));
0095             }
0096 
0097             if (!preset->warning().isEmpty()) {
0098                 return QIcon::fromTheme(QStringLiteral("dialog-warning"));
0099             }
0100 
0101             switch (preset->installType()) {
0102             case RenderPresetModel::Custom:
0103                 return QIcon::fromTheme(QStringLiteral("favorite"));
0104             case RenderPresetModel::Download:
0105                 return QIcon::fromTheme(QStringLiteral("internet-services"));
0106             default:
0107                 return QVariant();
0108             }
0109         }
0110     }
0111 
0112     auto item = getItemById(int(index.internalId()));
0113     if (role == Qt::DecorationRole) {
0114         if (item->depth() == 1) {
0115             return QIcon::fromTheme(QStringLiteral("folder"));
0116         }
0117     }
0118 
0119     if (role != Qt::DisplayRole) {
0120         return QVariant();
0121     }
0122     return item->dataColumn(index.column());
0123 }
0124 
0125 QString RenderPresetTreeModel::getPreset(const QModelIndex &index) const
0126 {
0127     if (index.isValid()) {
0128         auto item = getItemById(int(index.internalId()));
0129         if (item->depth() == 2) {
0130             return item->dataColumn(0).toString();
0131         }
0132     }
0133     return QString();
0134 }
0135 
0136 QModelIndex RenderPresetTreeModel::findPreset(const QString &presetName)
0137 {
0138     if (presetName.isEmpty()) {
0139         return {};
0140     }
0141     // we iterate over categories
0142     for (int i = 0; i < rootItem->childCount(); ++i) {
0143         // we iterate over preset's of the category
0144         std::shared_ptr<TreeItem> category = rootItem->child(i);
0145         for (int j = 0; j < category->childCount(); ++j) {
0146             // we retrieve preset name
0147             std::shared_ptr<TreeItem> child = category->child(j);
0148             QString name = child->dataColumn(0).toString();
0149             if (name == presetName) {
0150                 return createIndex(j, 0, quintptr(child->getId()));
0151             }
0152         }
0153     }
0154     return {};
0155 }