Warning, file /graphics/glaxnimate/src/gui/item_models/python_snippet_model.hpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002  * SPDX-FileCopyrightText: 2019-2023 Mattia Basaglia <dev@dragon.best>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #pragma once
0008 
0009 #include <QAbstractListModel>
0010 #include "plugin/snippet.hpp"
0011 
0012 namespace glaxnimate::gui::item_models {
0013 
0014 class PythonSnippetModel : public QAbstractListModel
0015 {
0016 public:
0017     /**
0018      * \brief Reloads all snippets
0019      */
0020     void reload()
0021     {
0022         beginResetModel();
0023         snippets.clear();
0024         QDir dir(plugin::Snippet::snippet_path());
0025         for ( const auto& sub : dir.entryInfoList({"*.py"}, QDir::Files|QDir::Readable|QDir::Writable, QDir::Name) )
0026         {
0027             snippets.emplace_back(sub.baseName());
0028         }
0029         endResetModel();
0030     }
0031 
0032     QModelIndex append()
0033     {
0034         beginInsertRows({}, snippets.size(), snippets.size());
0035         QString name_template = i18n("New Snippet %1");
0036         QString name = name_template.arg("").trimmed();
0037         for ( int i = 1; name_used(name); i++ )
0038             name = name_template.arg(i);
0039         snippets.emplace_back(name);
0040         endInsertRows();
0041         return createIndex(snippets.size() - 1, 0);
0042     }
0043 
0044     int rowCount(const QModelIndex &) const override
0045     {
0046         return snippets.size();
0047     }
0048 
0049     Qt::ItemFlags flags(const QModelIndex &) const override
0050     {
0051         return Qt::ItemIsEnabled|Qt::ItemIsEditable|Qt::ItemIsSelectable|Qt::ItemNeverHasChildren;
0052     }
0053 
0054     QVariant data(const QModelIndex & index, int role) const override
0055     {
0056         if ( index.row() >= 0 && index.row() < int(snippets.size()) )
0057         {
0058             switch ( role )
0059             {
0060                 case Qt::DisplayRole:
0061                 case Qt::EditRole:
0062                     return snippets[index.row()].name();
0063                 case Qt::DecorationRole:
0064                     return QIcon::fromTheme("text-x-python");
0065                 case Qt::ToolTipRole:
0066                     return snippets[index.row()].filename();
0067             }
0068         }
0069 
0070         return {};
0071     }
0072 
0073     bool setData(const QModelIndex & index, const QVariant & value, int role) override
0074     {
0075         if ( index.row() >= 0 && index.row() < int(snippets.size()) && role == Qt::EditRole )
0076         {
0077             QString name = snippets[index.row()].set_name(value.toString());
0078             Q_EMIT dataChanged(index, index, {});
0079             return true;
0080         }
0081 
0082         return false;
0083     }
0084 
0085     plugin::Snippet snippet(const QModelIndex& index)
0086     {
0087         if ( index.row() >= 0 && index.row() < int(snippets.size()) )
0088             return snippets[index.row()];
0089         return plugin::Snippet{};
0090     }
0091 
0092     bool removeRows(int row, int count, const QModelIndex & index) override
0093     {
0094         if ( row > 0 && count > 0 && row + count <= int(snippets.size()) )
0095         {
0096             beginRemoveRows(index, row, row + count);
0097             snippets.erase(snippets.begin() + row, snippets.begin() + row + count);
0098             endRemoveRows();
0099             return true;
0100         }
0101 
0102         return false;
0103     }
0104 
0105 private:
0106     bool name_used(const QString& name) const
0107     {
0108         for ( const auto & snip : snippets )
0109             if ( snip.name() == name )
0110                 return true;
0111         return false;
0112     }
0113 
0114     std::vector<plugin::Snippet> snippets;
0115 };
0116 
0117 } // namespace glaxnimate::gui::item_models