14class PluginList :
public QAbstractListModel
22 plugins::PluginRegistry &plugin_registry,
23 QObject * parent =
nullptr)
24 : QAbstractListModel (parent), plugin_registry_ (plugin_registry)
34 PluginVariantRole = Qt::UserRole + 1,
37 QHash<int, QByteArray> roleNames ()
const override
39 static QHash<int, QByteArray> roles = {
40 { PluginVariantRole,
"plugin" },
44 int rowCount (
const QModelIndex &parent = QModelIndex ())
const override
46 if (parent.isValid ())
48 return static_cast<int> (plugins_.size ());
51 data (
const QModelIndex &index,
int role = Qt::DisplayRole)
const override
53 if (!index.isValid () || index.row () >=
static_cast<int> (plugins_.size ()))
58 case PluginVariantRole:
59 return QVariant::fromStdVariant (
60 plugins_.at (index.row ()).get_object ());
74 void insert_plugin (plugins::PluginUuidReference plugin_ref,
int index = -1)
76 index = std::clamp (index, -1,
static_cast<int> (plugins_.size ()));
81 {},
static_cast<int> (plugins_.size ()),
82 static_cast<int> (plugins_.size ()));
83 plugins_.push_back (plugin_ref);
87 beginInsertRows ({}, index, index);
89 std::ranges::next (plugins_.begin (), index), plugin_ref);
93 void append_plugin (plugins::PluginUuidReference plugin_ref)
95 insert_plugin (plugin_ref, -1);
97 plugins::PluginUuidReference
98 remove_plugin (
const plugins::Plugin::Uuid &plugin_id)
100 auto it = std::ranges::find (
101 plugins_, plugin_id, &plugins::PluginUuidReference::id);
102 if (it == plugins_.end ())
103 throw std::invalid_argument (
"Plugin ID not found");
105 const auto index = std::ranges::distance (plugins_.begin (), it);
107 beginRemoveRows ({},
static_cast<int> (index),
static_cast<int> (index));
114 auto &plugins ()
const {
return plugins_; }
117 static constexpr auto kPluginsKey =
"plugins"sv;
118 friend void to_json (nlohmann::json &j,
const PluginList &l)
120 j[kPluginsKey] = l.plugins_;
122 friend void from_json (
const nlohmann::json &j, PluginList &l)
125 const auto &[index, pl_json] :
126 utils::views::enumerate (j.at (kPluginsKey)))
128 plugins::PluginUuidReference ref{ l.plugin_registry_ };
129 from_json (pl_json, ref);
130 l.append_plugin (ref);
135 plugins::PluginRegistry &plugin_registry_;
136 std::vector<plugins::PluginUuidReference> plugins_;