8#include "configmodel.h"
9#include "Plasma/Applet"
10#include "Plasma/Containment"
11#include "configcategory_p.h"
12#include "configview.h"
14#include "sharedqmlengine.h"
18#include <QQmlComponent>
23#include <KLocalizedString>
24#include <KQuickConfigModule>
25#include <KQuickConfigModuleLoader>
27#include <Plasma/Corona>
28#include <Plasma/PluginLoader>
29#include <kquickconfigmoduleloader.h>
35class ConfigModelPrivate
38 ConfigModelPrivate(ConfigModel *model);
39 ~ConfigModelPrivate();
42 QList<ConfigCategory *> categories;
43 QPointer<Plasma::Applet> appletInterface;
44 QHash<QString, KQuickConfigModule *> kcms;
46 void appendCategory(ConfigCategory *c);
47 void removeCategory(ConfigCategory *c);
48 void removeCategoryAt(
int index);
50 QVariant get(
int row)
const;
52 static ConfigCategory *categories_at(QQmlListProperty<ConfigCategory> *prop, qsizetype index);
53 static qsizetype categories_count(QQmlListProperty<ConfigCategory> *prop);
54 static void categories_append(QQmlListProperty<ConfigCategory> *prop, ConfigCategory *o);
55 static void categories_clear(QQmlListProperty<ConfigCategory> *prop);
58ConfigModelPrivate::ConfigModelPrivate(
ConfigModel *model)
63ConfigModelPrivate::~ConfigModelPrivate()
69 ConfigModel *model = qobject_cast<ConfigModel *>(prop->object);
70 if (!model || index >= model->d->categories.count() || index < 0) {
73 return model->d->categories.at(index);
79 ConfigModel *model = qobject_cast<ConfigModel *>(prop->object);
84 if (o->parent() == prop->object) {
85 o->setParent(
nullptr);
88 o->setParent(prop->object);
89 model->d->appendCategory(o);
94 ConfigModel *model = qobject_cast<ConfigModel *>(prop->object);
96 return model->d->categories.count();
104 ConfigModel *model = qobject_cast<ConfigModel *>(prop->object);
112void ConfigModelPrivate::clear()
114 q->beginResetModel();
115 while (!categories.isEmpty()) {
116 categories.first()->setParent(
nullptr);
117 categories.pop_front();
120 Q_EMIT q->countChanged();
123void ConfigModelPrivate::appendCategory(ConfigCategory *c)
129 q->beginInsertRows(
QModelIndex(), categories.size(), categories.size());
130 categories.append(c);
132 auto emitChange = [
this, c] {
133 const int row = categories.indexOf(c);
136 Q_EMIT q->dataChanged(modelIndex, modelIndex);
147 Q_EMIT q->countChanged();
150void ConfigModelPrivate::removeCategory(ConfigCategory *c)
152 const int index = categories.indexOf(c);
154 removeCategoryAt(index);
158void ConfigModelPrivate::removeCategoryAt(
int index)
160 if (index < 0 || index >= categories.count()) {
166 ConfigCategory *c = categories.takeAt(index);
167 if (c->parent() == q) {
172 Q_EMIT q->countChanged();
175QVariant ConfigModelPrivate::get(
int row)
const
178 if (row < 0 || row >= categories.count()) {
182 value[QStringLiteral(
"name")] = categories.at(row)->name();
183 value[QStringLiteral(
"icon")] = categories.at(row)->icon();
184 value[QStringLiteral(
"pluginName")] = categories.at(row)->pluginName();
185 value[QStringLiteral(
"source")] = q->
data(q->index(row, 0), ConfigModel::SourceRole);
186 value[QStringLiteral(
"visible")] = categories.at(row)->visible();
191ConfigModel::ConfigModel(
QObject *parent)
193 , d(new ConfigModelPrivate(this))
197ConfigModel::~ConfigModel()
202int ConfigModel::rowCount(
const QModelIndex &index)
const
207 return d->categories.count();
212 if (index.
row() < 0 || index.
row() >= d->categories.count()) {
217 return d->categories.at(index.
row())->name();
219 return d->categories.at(index.
row())->icon();
221 const QString source = d->categories.
at(index.
row())->source();
224 return d->appletInterface.data()->fileUrl(
"ui", source);
230 return d->categories.at(index.
row())->pluginName();
232 return d->categories.at(index.
row())->visible();
243 {SourceRole,
"source"},
244 {PluginNameRole,
"pluginName"},
245 {VisibleRole,
"visible"},
256 ConfigCategory *cat =
new ConfigCategory(
this);
257 cat->setIcon(iconName);
259 cat->setSource(path);
260 cat->setPluginName(pluginName);
261 d->appendCategory(cat);
266 ConfigCategory *cat =
new ConfigCategory(
this);
267 cat->setIcon(iconName);
269 cat->setSource(path);
270 cat->setPluginName(pluginName);
271 cat->setVisible(visible);
272 d->appendCategory(cat);
275void ConfigModel::appendCategory(ConfigCategory *category)
277 d->appendCategory(category);
280void ConfigModel::removeCategory(ConfigCategory *category)
282 d->removeCategory(category);
285void ConfigModel::removeCategoryAt(
int index)
287 d->removeCategoryAt(index);
297 d->appletInterface = interface;
302 return d->appletInterface.data();
309 ConfigModelPrivate::categories_append,
310 ConfigModelPrivate::categories_count,
311 ConfigModelPrivate::categories_at,
312 ConfigModelPrivate::categories_clear);
317#include "moc_configmodel.cpp"
This model contains all the possible config categories for a dialog, such as categories of the config...
void clear()
clears the model
void appendCategory(const QString &iconName, const QString &name, const QString &path, const QString &pluginName)
add a new category in the model
Q_INVOKABLE QVariant get(int row) const
The EdgeEventForwarder class This class forwards edge events to be replayed within the given margin T...
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
const QChar at(qsizetype position) const const
bool endsWith(QChar c, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
bool startsWith(QChar c, Qt::CaseSensitivity cs) const const