File indexing completed on 2024-05-12 04:54:25

0001 /*
0002     SPDX-FileCopyrightText: 2017 Nicolas Carion
0003     SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 */
0005 
0006 #include "transitiontreemodel.hpp"
0007 #include "abstractmodel/treeitem.hpp"
0008 #include "kdenlivesettings.h"
0009 #include "transitions/transitionsrepository.hpp"
0010 #include <KLocalizedString>
0011 
0012 #include <KActionCategory>
0013 #include <QDebug>
0014 #include <QMenu>
0015 #include <QMimeData>
0016 
0017 TransitionTreeModel::TransitionTreeModel(QObject *parent)
0018     : AssetTreeModel(parent)
0019 {
0020     m_assetIconProvider = new AssetIconProvider(false, this);
0021 }
0022 
0023 std::shared_ptr<TransitionTreeModel> TransitionTreeModel::construct(bool flat, QObject *parent)
0024 {
0025     std::shared_ptr<TransitionTreeModel> self(new TransitionTreeModel(parent));
0026     QList<QVariant> rootData{"Name", "ID", "Type", "isFav"};
0027     self->rootItem = TreeItem::construct(rootData, self, true);
0028 
0029     // We create categories, if requested
0030     std::shared_ptr<TreeItem> compoCategory, transCategory;
0031     if (!flat) {
0032         compoCategory = self->rootItem->appendChild(QList<QVariant>{i18n("Compositions"), QStringLiteral("root")});
0033         transCategory = self->rootItem->appendChild(QList<QVariant>{i18n("Transitions"), QStringLiteral("root")});
0034     }
0035 
0036     // We parse transitions
0037     auto allTransitions = TransitionsRepository::get()->getNames();
0038     for (const auto &transition : qAsConst(allTransitions)) {
0039         std::shared_ptr<TreeItem> targetCategory = compoCategory;
0040         AssetListType::AssetType type = TransitionsRepository::get()->getType(transition.first);
0041         if (flat) {
0042             targetCategory = self->rootItem;
0043         } else if (type == AssetListType::AssetType::AudioTransition || type == AssetListType::AssetType::VideoTransition) {
0044             targetCategory = transCategory;
0045         }
0046 
0047         // we create the data list corresponding to this transition
0048         bool isFav = KdenliveSettings::favorite_transitions().contains(transition.first);
0049         // qDebug() << transition.second << transition.first << "in " << targetCategory->dataColumn(0).toString();
0050         QList<QVariant> data{transition.second, transition.first, QVariant::fromValue(type), isFav};
0051 
0052         targetCategory->appendChild(data);
0053     }
0054     return self;
0055 }
0056 
0057 void TransitionTreeModel::reloadAssetMenu(QMenu *effectsMenu, KActionCategory *effectActions)
0058 {
0059     for (int i = 0; i < rowCount(); i++) {
0060         std::shared_ptr<TreeItem> item = rootItem->child(i);
0061         if (item->childCount() > 0) {
0062             QMenu *catMenu = new QMenu(item->dataColumn(NameCol).toString(), effectsMenu);
0063             effectsMenu->addMenu(catMenu);
0064             for (int j = 0; j < item->childCount(); j++) {
0065                 std::shared_ptr<TreeItem> child = item->child(j);
0066                 QAction *a = new QAction(child->dataColumn(NameCol).toString(), catMenu);
0067                 const QString id = child->dataColumn(IdCol).toString();
0068                 a->setData(id);
0069                 catMenu->addAction(a);
0070                 effectActions->addAction("transition_" + id, a);
0071             }
0072         }
0073     }
0074 }
0075 
0076 void TransitionTreeModel::setFavorite(const QModelIndex &index, bool favorite, bool isEffect)
0077 {
0078     if (!index.isValid()) {
0079         return;
0080     }
0081     std::shared_ptr<TreeItem> item = getItemById(int(index.internalId()));
0082     if (isEffect && item->depth() == 1) {
0083         return;
0084     }
0085     item->setData(AssetTreeModel::FavCol, favorite);
0086     auto id = item->dataColumn(AssetTreeModel::IdCol).toString();
0087     QStringList favs = KdenliveSettings::favorite_transitions();
0088     if (favorite) {
0089         favs << id;
0090     } else {
0091         favs.removeAll(id);
0092     }
0093     KdenliveSettings::setFavorite_transitions(favs);
0094 }
0095 
0096 void TransitionTreeModel::deleteEffect(const QModelIndex &) {}
0097 
0098 void TransitionTreeModel::editCustomAsset(const QString &, const QString &, const QModelIndex &) {}
0099 
0100 QMimeData *TransitionTreeModel::mimeData(const QModelIndexList &indexes) const
0101 {
0102     QMimeData *mimeData = new QMimeData;
0103     std::shared_ptr<TreeItem> item = getItemById(int(indexes.first().internalId()));
0104     if (item) {
0105         mimeData->setData(QStringLiteral("kdenlive/composition"), item->dataColumn(AssetTreeModel::IdCol).toString().toUtf8());
0106     }
0107     return mimeData;
0108 }