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