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 }