File indexing completed on 2025-04-27 04:08:16

0001 /*
0002  * This file is part of the KDE project
0003  * SPDX-FileCopyrightText: 2014 Dan Leinir Turthra Jensen <admin@leinir.dk>
0004  *
0005  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006  *
0007  */
0008 
0009 #include "TemplatesModel.h"
0010 #include <KisTemplateTree.h>
0011 #include <KisTemplateGroup.h>
0012 #include <KisTemplate.h>
0013 #include <KisPart.h>
0014 #include <kis_icon.h>
0015 
0016 
0017 struct TemplatesModel::ItemData {
0018 public:
0019     ItemData()
0020         : favourite(false)
0021         , groupFolded(false)
0022     {};
0023     QString name;
0024     QString description;
0025     QString file;
0026     QString icon;
0027     QString groupName;
0028     bool favourite;
0029     bool groupFolded;
0030 };
0031 
0032 class TemplatesModel::Private {
0033 public:
0034     Private() {}
0035     ~Private() { qDeleteAll(items);}
0036     QList<ItemData*> items;
0037 };
0038 
0039 TemplatesModel::TemplatesModel(QObject* parent)
0040     : QAbstractListModel(parent)
0041     , d(new Private)
0042 {
0043     // Prefill a couple of
0044     ItemData* customItem = new ItemData();
0045     customItem->name = "Custom Image";
0046     customItem->file = "custom";
0047     customItem->icon = "filenew-black";
0048     d->items << customItem;
0049     ItemData* clipItem = new ItemData();
0050     clipItem->name = "From Clipboard";
0051     clipItem->file = "clip";
0052     clipItem->icon = "fileclip-black";
0053     d->items << clipItem;
0054     ItemData* screenItem = new ItemData();
0055     screenItem->name = "Blank Image (Screen Size)";
0056     screenItem->file = "screen";
0057     screenItem->icon = "filenew-black";
0058     d->items << screenItem;
0059     ItemData* a4pItem = new ItemData();
0060     a4pItem->name = "Blank Image (A4 Portrait)";
0061     a4pItem->file = "a4p";
0062     a4pItem->icon = "A4portrait-black";
0063     d->items << a4pItem;
0064     ItemData* a4lItem = new ItemData();
0065     a4lItem->name = "Blank Image (A4 Landscape)";
0066     a4lItem->file = "a4l";
0067     a4lItem->icon = "A4landscape-black";
0068     d->items << a4lItem;
0069 
0070     populate();
0071 }
0072 
0073 TemplatesModel::~TemplatesModel()
0074 {
0075     delete d;
0076 }
0077 
0078 QHash<int, QByteArray> TemplatesModel::roleNames() const
0079 {
0080     QHash<int, QByteArray> roleNames;
0081     roleNames[NameRole] = "name";
0082     roleNames[DescriptionRole] = "description";
0083     roleNames[FileRole] = "file";
0084     roleNames[IconRole] = "icon";
0085     roleNames[GroupName] = "groupName";
0086     roleNames[GroupFolded] = "groupFolded";
0087     return roleNames;
0088 }
0089 
0090 QVariant TemplatesModel::data(const QModelIndex& index, int role) const
0091 {
0092     QVariant data;
0093     if(index.isValid() && index.row() > -1 && index.row() < d->items.count())
0094     {
0095         ItemData* item = d->items[index.row()];
0096         switch(role) {
0097             case NameRole:
0098                 data = item->name;
0099                 break;
0100             case DescriptionRole:
0101                 data = item->description;
0102                 break;
0103             case FileRole:
0104                 data = item->file;
0105                 break;
0106             case IconRole:
0107                 data = item->icon;
0108                 break;
0109             case GroupName:
0110                 data = item->groupName;
0111                 break;
0112             case GroupFolded:
0113                 data = item->groupFolded;
0114                 break;
0115             default:
0116                 break;
0117         }
0118     }
0119     return data;
0120 }
0121 
0122 int TemplatesModel::rowCount(const QModelIndex& parent) const
0123 {
0124     if(parent.isValid())
0125         return 0;
0126     return d->items.count();
0127 }
0128 
0129 QString TemplatesModel::groupNameOf(int index) const
0130 {
0131     if(index > 0 && index < d->items.count())
0132         return d->items[index]->groupName;
0133     return QString();
0134 }
0135 
0136 void TemplatesModel::toggleGroup(const QString& name)
0137 {
0138     Q_FOREACH (ItemData* item, d->items) {
0139         if(item->groupName == name)
0140             item->groupFolded = !item->groupFolded;
0141     }
0142     dataChanged(index(0), index(d->items.count() - 1));
0143 }
0144 
0145 void TemplatesModel::populate()
0146 {
0147     KisTemplateTree templateTree( QStringLiteral("templates/"), true);
0148     Q_FOREACH (KisTemplateGroup *group, templateTree.groups()) {
0149         if (group->isHidden()) {
0150             continue;
0151         }
0152         Q_FOREACH (KisTemplate* t, group->templates()) {
0153             if (t->isHidden())
0154                 continue;
0155 
0156             ItemData* item = new ItemData();
0157             item->name = t->name();
0158             item->description = t->description();
0159             item->file = QString("template://").append(t->file());
0160             // QT5TODO: support custom pictures and icon symbol ids again
0161             // item->icon = KIconLoader::global()->iconPath(t->picture(), KIconLoader::Desktop);
0162             item->icon = "filenew-black";
0163             item->groupName = group->name();
0164             item->groupFolded = true; // default hide groups
0165             d->items << item;
0166         }
0167     }
0168 }
0169