Warning, file /office/calligra/gemini/TemplatesModel.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2014 Dan Leinir Turthra Jensen <admin@leinir.dk>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "TemplatesModel.h"
0008 #include "TemplateVariantsModel.h"
0009 #include <KoTemplateTree.h>
0010 #include <KoTemplateGroup.h>
0011 #include <KoTemplate.h>
0012 #include <KWFactory.h>
0013 #include <KWDocument.h>
0014 #include <part/KPrFactory.h>
0015 #include <part/KPrDocument.h>
0016 
0017 struct TemplateEntry {
0018     TemplateEntry()
0019         : variants(new TemplateVariantsModel())
0020     {}
0021     ~TemplateEntry()
0022     {
0023         variants->deleteLater();
0024     }
0025 
0026     QString title;
0027     QString description;
0028     TemplateVariantsModel* variants;
0029 };
0030 
0031 class TemplatesModel::Private {
0032 public:
0033     Private()
0034         : showWide(false)
0035     {}
0036 
0037     QString templateType;
0038     bool showWide;
0039     QList<TemplateEntry*> entries;
0040 
0041     void refresh()
0042     {
0043         qDeleteAll(entries);
0044         entries.clear();
0045 
0046         KoTemplateTree* tree(0);
0047         if(templateType == WORDS_MIME_TYPE)
0048             tree = new KoTemplateTree("calligrawords/templates/", true);
0049         else if(templateType == STAGE_MIME_TYPE)
0050             tree = new KoTemplateTree("calligrastage/templates/", true);
0051         if(!tree)
0052             return;
0053 
0054         Q_FOREACH(const KoTemplateGroup* group , tree->groups()) {
0055             Q_FOREACH(const KoTemplate* tmplate, group->templates()) {
0056                 if(tmplate->wide() != showWide)
0057                     continue;
0058 
0059                 QString title = tmplate->name();
0060 
0061                 TemplateEntry* found(0);
0062                 Q_FOREACH(TemplateEntry* otherEntry, entries) {
0063                     if(otherEntry->title == title) {
0064                         found = otherEntry;
0065                         break;
0066                     }
0067                 }
0068                 TemplateEntry* entry(0);
0069                 if(found) {
0070                     entry = found;
0071                 }
0072                 else {
0073                     entry = new TemplateEntry();
0074                     entry->title = title;
0075                     entry->description = tmplate->description();
0076                     entries.append(entry);
0077                 }
0078 
0079                 entry->variants->addVariant(tmplate->variantName(),
0080                                             tmplate->color(),
0081                                             tmplate->swatch(),
0082                                             tmplate->thumbnail().isEmpty() ? tmplate->picture() : tmplate->thumbnail(),
0083                                             tmplate->file());
0084             }
0085         }
0086     }
0087 };
0088 
0089 TemplatesModel::TemplatesModel(QObject* parent)
0090     : QAbstractListModel(parent)
0091     , d(new Private())
0092 {
0093 }
0094 
0095 TemplatesModel::~TemplatesModel()
0096 {
0097     delete d;
0098 }
0099 
0100 QHash<int, QByteArray> TemplatesModel::roleNames() const
0101 {
0102     QHash<int, QByteArray> roles;
0103     roles[TitleRole] = "text";
0104     roles[DescriptionRole] = "description";
0105     roles[ColorRole] = "color";
0106     roles[ThumbnailRole] = "thumbnail";
0107     roles[UrlRole] = "url";
0108     roles[VariantCountRole] = "variantCount";
0109     roles[VariantsRole] = "variants";
0110     return roles;
0111 }
0112 
0113 QVariant TemplatesModel::data(const QModelIndex& index, int role) const
0114 {
0115     QVariant result;
0116 
0117     if(index.isValid() && index.row() > -1 && index.row() < d->entries.count())
0118     {
0119         TemplateEntry* entry = d->entries.at(index.row());
0120         switch(role)
0121         {
0122             case TitleRole:
0123                 result = entry->title;
0124                 break;
0125             case DescriptionRole:
0126                 result = entry->description;
0127                 break;
0128             case ColorRole:
0129                 result = entry->variants->data(entry->variants->firstIndex(), TemplateVariantsModel::ColorRole);
0130                 break;
0131             case ThumbnailRole:
0132                 result = entry->variants->data(entry->variants->firstIndex(), TemplateVariantsModel::ThumbnailRole);
0133                 break;
0134             case UrlRole:
0135                 result = entry->variants->data(entry->variants->firstIndex(), TemplateVariantsModel::UrlRole);
0136                 break;
0137             case VariantCountRole:
0138                 result = entry->variants->rowCount();
0139                 break;
0140             case VariantsRole:
0141                 result = QVariant::fromValue<QObject*>(entry->variants);
0142                 break;
0143             default:
0144                 break;
0145         }
0146     }
0147 
0148     return result;
0149 }
0150 
0151 int TemplatesModel::rowCount(const QModelIndex& parent) const
0152 {
0153     if(parent.isValid())
0154         return 0;
0155     return d->entries.count();
0156 }
0157 
0158 QString TemplatesModel::templateType() const
0159 {
0160     return d->templateType;
0161 }
0162 
0163 void TemplatesModel::setTemplateType(const QString& newType)
0164 {
0165     d->templateType = newType;
0166     emit templateTypeChanged();
0167     qApp->processEvents();
0168     beginResetModel();
0169     d->refresh();
0170     endResetModel();
0171 }
0172 
0173 bool TemplatesModel::showWide() const
0174 {
0175     return d->showWide;
0176 }
0177 
0178 void TemplatesModel::setShowWide(const bool& newValue)
0179 {
0180     d->showWide = newValue;
0181     emit showWideChanged();
0182     qApp->processEvents();
0183     beginResetModel();
0184     d->refresh();
0185     endResetModel();
0186 }