a simple model to parse config categories
ConfigModel will be used in the plasmoid config qml that defines a model for the categories of the config dialog
This commit is contained in:
parent
2168bdec75
commit
872839ecf9
@ -29,10 +29,184 @@
|
|||||||
|
|
||||||
#include <Plasma/Corona>
|
#include <Plasma/Corona>
|
||||||
|
|
||||||
|
///////////////////////ConfigCategory
|
||||||
|
|
||||||
|
ConfigCategory::ConfigCategory(QObject *parent)
|
||||||
|
: QObject(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigCategory::~ConfigCategory()
|
||||||
|
{}
|
||||||
|
|
||||||
|
QString ConfigCategory::name() const
|
||||||
|
{
|
||||||
|
return m_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigCategory::setName(const QString &name)
|
||||||
|
{
|
||||||
|
if (m_name == name) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_name = name;
|
||||||
|
emit nameChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QString ConfigCategory::icon() const
|
||||||
|
{
|
||||||
|
return m_icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigCategory::setIcon(const QString &icon)
|
||||||
|
{
|
||||||
|
if (m_icon == icon) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_icon = icon;
|
||||||
|
emit iconChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QString ConfigCategory::source() const
|
||||||
|
{
|
||||||
|
return m_source;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigCategory::setSource(const QString &source)
|
||||||
|
{
|
||||||
|
if (m_source == source) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_source = source;
|
||||||
|
emit sourceChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////ConfigModel
|
||||||
|
ConfigModel::ConfigModel(QObject *parent)
|
||||||
|
: QAbstractListModel(parent)
|
||||||
|
{
|
||||||
|
QHash<int, QByteArray> roleNames;
|
||||||
|
roleNames[NameRole] = "name";
|
||||||
|
roleNames[IconRole] = "icon";
|
||||||
|
roleNames[SourceRole] = "source";
|
||||||
|
|
||||||
|
setRoleNames(roleNames);
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigModel::~ConfigModel()
|
||||||
|
{}
|
||||||
|
|
||||||
|
int ConfigModel::rowCount(const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
if (index.column() > 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return m_categories.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant ConfigModel::data(const QModelIndex& index, int role) const
|
||||||
|
{
|
||||||
|
if (index.row() < 0 || index.row() >= m_categories.count()) {
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
switch (role) {
|
||||||
|
case NameRole:
|
||||||
|
return m_categories.at(index.row())->name();
|
||||||
|
case IconRole:
|
||||||
|
return m_categories.at(index.row())->icon();
|
||||||
|
case SourceRole:
|
||||||
|
return m_categories.at(index.row())->source();
|
||||||
|
default:
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigModel::appendCategory(ConfigCategory *c)
|
||||||
|
{
|
||||||
|
beginInsertRows(QModelIndex(), m_categories.size(), m_categories.size());
|
||||||
|
m_categories.append(c);
|
||||||
|
endInsertRows();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigModel::clear()
|
||||||
|
{
|
||||||
|
beginResetModel();
|
||||||
|
while (!m_categories.isEmpty()) {
|
||||||
|
m_categories.first()->setParent(0);
|
||||||
|
m_categories.pop_front();
|
||||||
|
}
|
||||||
|
endResetModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
QQmlListProperty<ConfigCategory> ConfigModel::categories()
|
||||||
|
{
|
||||||
|
return QQmlListProperty<ConfigCategory>(this, 0, ConfigModel::categories_append,
|
||||||
|
ConfigModel::categories_count,
|
||||||
|
ConfigModel::categories_at,
|
||||||
|
ConfigModel::categories_clear);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigCategory *ConfigModel::categories_at(QQmlListProperty<ConfigCategory> *prop, int index)
|
||||||
|
{
|
||||||
|
ConfigModel *model = qobject_cast<ConfigModel *>(prop->object);
|
||||||
|
if (!model || index >= model->m_categories.count() || index < 0)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return model->m_categories.at(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigModel::categories_append(QQmlListProperty<ConfigCategory> *prop, ConfigCategory *o)
|
||||||
|
{
|
||||||
|
ConfigModel *model = qobject_cast<ConfigModel *>(prop->object);
|
||||||
|
if (!o || !model) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (o->parent() == prop->object) {
|
||||||
|
o->setParent(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
o->setParent(prop->object);
|
||||||
|
model->appendCategory(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ConfigModel::categories_count(QQmlListProperty<ConfigCategory> *prop)
|
||||||
|
{
|
||||||
|
ConfigModel *model = qobject_cast<ConfigModel *>(prop->object);
|
||||||
|
if (model) {
|
||||||
|
return model->m_categories.count();
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigModel::categories_clear(QQmlListProperty<ConfigCategory> *prop)
|
||||||
|
{
|
||||||
|
ConfigModel *model = qobject_cast<ConfigModel *>(prop->object);
|
||||||
|
if (!model) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
model->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////ConfigView
|
||||||
ConfigView::ConfigView(AppletInterface *interface, QWindow *parent)
|
ConfigView::ConfigView(AppletInterface *interface, QWindow *parent)
|
||||||
: QQuickView(parent),
|
: QQuickView(parent),
|
||||||
m_appletInterface(interface)
|
m_appletInterface(interface)
|
||||||
{
|
{
|
||||||
|
qmlRegisterType<ConfigModel>("org.kde.plasma.configuration", 0, 1, "ConfigModel");
|
||||||
|
qmlRegisterType<ConfigCategory>("org.kde.plasma.configuration", 0, 1, "ConfigCategory");
|
||||||
|
|
||||||
//FIXME: problem on nvidia, all windows should be transparent or won't show
|
//FIXME: problem on nvidia, all windows should be transparent or won't show
|
||||||
setColor(Qt::transparent);
|
setColor(Qt::transparent);
|
||||||
setTitle(i18n("%1 Settings", m_appletInterface->applet()->title()));
|
setTitle(i18n("%1 Settings", m_appletInterface->applet()->title()));
|
||||||
@ -78,6 +252,9 @@ void ConfigView::hideEvent(QHideEvent *ev)
|
|||||||
|
|
||||||
void ConfigView::resizeEvent(QResizeEvent *re)
|
void ConfigView::resizeEvent(QResizeEvent *re)
|
||||||
{
|
{
|
||||||
|
if (!rootObject()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
rootObject()->setWidth(re->size().width());
|
rootObject()->setWidth(re->size().width());
|
||||||
rootObject()->setHeight(re->size().height());
|
rootObject()->setHeight(re->size().height());
|
||||||
QQuickWindow::resizeEvent(re);
|
QQuickWindow::resizeEvent(re);
|
||||||
|
@ -24,9 +24,73 @@
|
|||||||
#include <QQuickView>
|
#include <QQuickView>
|
||||||
#include <QJSValue>
|
#include <QJSValue>
|
||||||
#include <QQmlListProperty>
|
#include <QQmlListProperty>
|
||||||
|
#include <QStandardItemModel>
|
||||||
|
|
||||||
class AppletInterface;
|
class AppletInterface;
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigCategory : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
|
||||||
|
Q_PROPERTY(QString icon READ icon WRITE setIcon NOTIFY iconChanged)
|
||||||
|
Q_PROPERTY(QString source READ source WRITE setSource NOTIFY sourceChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
ConfigCategory(QObject *parent = 0);
|
||||||
|
~ConfigCategory();
|
||||||
|
|
||||||
|
QString name() const;
|
||||||
|
void setName(const QString &name);
|
||||||
|
|
||||||
|
QString icon() const;
|
||||||
|
void setIcon(const QString &icon);
|
||||||
|
|
||||||
|
QString source() const;
|
||||||
|
void setSource(const QString &source);
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void nameChanged();
|
||||||
|
void iconChanged();
|
||||||
|
void sourceChanged();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_name;
|
||||||
|
QString m_icon;
|
||||||
|
QString m_source;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ConfigModel : public QAbstractListModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QQmlListProperty<ConfigCategory> categories READ categories CONSTANT)
|
||||||
|
Q_CLASSINFO("DefaultProperty", "categories")
|
||||||
|
public:
|
||||||
|
enum Roles {
|
||||||
|
NameRole = Qt::UserRole+1,
|
||||||
|
IconRole,
|
||||||
|
SourceRole
|
||||||
|
};
|
||||||
|
ConfigModel(QObject *parent = 0);
|
||||||
|
~ConfigModel();
|
||||||
|
|
||||||
|
void appendCategory(ConfigCategory *c);
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
virtual int rowCount(const QModelIndex &index) const;
|
||||||
|
virtual QVariant data(const QModelIndex&, int) const;
|
||||||
|
|
||||||
|
QQmlListProperty<ConfigCategory> categories();
|
||||||
|
|
||||||
|
static ConfigCategory *categories_at(QQmlListProperty<ConfigCategory> *prop, int index);
|
||||||
|
static void categories_append(QQmlListProperty<ConfigCategory> *prop, ConfigCategory *o);
|
||||||
|
static int categories_count(QQmlListProperty<ConfigCategory> *prop);
|
||||||
|
static void categories_clear(QQmlListProperty<ConfigCategory> *prop);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QList<ConfigCategory*>m_categories;
|
||||||
|
};
|
||||||
|
|
||||||
class ConfigView : public QQuickView
|
class ConfigView : public QQuickView
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -21,6 +21,7 @@ import QtQuick 2.0
|
|||||||
import org.kde.plasma.core 0.1 as PlasmaCore
|
import org.kde.plasma.core 0.1 as PlasmaCore
|
||||||
import org.kde.plasma.components 0.1 as PlasmaComponents
|
import org.kde.plasma.components 0.1 as PlasmaComponents
|
||||||
|
|
||||||
|
|
||||||
QtObject {
|
QtObject {
|
||||||
|
|
||||||
property list<QtObject> modules: [
|
property list<QtObject> modules: [
|
||||||
@ -36,7 +37,17 @@ QtObject {
|
|||||||
implicitHeight: pageColumn.implicitHeight
|
implicitHeight: pageColumn.implicitHeight
|
||||||
|
|
||||||
property alias cfg_Test: testConfigField.text
|
property alias cfg_Test: testConfigField.text
|
||||||
|
/*ListView {
|
||||||
|
model: ConfigModel {
|
||||||
|
ConfigCategory {
|
||||||
|
//property int title: Math.max(3, 9)
|
||||||
|
title: "AAAAA"
|
||||||
|
icon: "plasma"
|
||||||
|
source: "kkkk"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delegate: Text {text: title}
|
||||||
|
}*/
|
||||||
Column {
|
Column {
|
||||||
id: pageColumn
|
id: pageColumn
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2013 Marco Martin <mart@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import QtQuick 2.0
|
||||||
|
import org.kde.plasma.components 0.1 as PlasmaComponents
|
||||||
|
import org.kde.plasma.extras 0.1 as PlasmaExtras
|
||||||
|
import org.kde.plasma.core 0.1 as PlasmaCore
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: delegate
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
left: parent.left
|
||||||
|
right: parent.right
|
||||||
|
}
|
||||||
|
//BEGIN properties
|
||||||
|
width: childrenRect.width
|
||||||
|
height: childrenRect.height
|
||||||
|
property bool current: main.sourceComponent == dataSource[modelData].component
|
||||||
|
//END properties
|
||||||
|
|
||||||
|
//BEGIN model
|
||||||
|
property list<QtObject> dataSource
|
||||||
|
//END model
|
||||||
|
|
||||||
|
//BEGIN connections
|
||||||
|
onClicked: {
|
||||||
|
if (delegate.current) {
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
main.sourceComponent = dataSource[modelData].component
|
||||||
|
root.restoreConfig()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onCurrentChanged: {
|
||||||
|
if (current) {
|
||||||
|
categoriesView.currentItem = delegate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//END connections
|
||||||
|
|
||||||
|
//BEGIN UI components
|
||||||
|
Column {
|
||||||
|
anchors {
|
||||||
|
left: parent.left
|
||||||
|
right: parent.right
|
||||||
|
}
|
||||||
|
PlasmaCore.IconItem {
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
width: theme.IconSizeHuge
|
||||||
|
height: width
|
||||||
|
source: dataSource[modelData].icon
|
||||||
|
}
|
||||||
|
PlasmaComponents.Label {
|
||||||
|
anchors {
|
||||||
|
left: parent.left
|
||||||
|
right: parent.right
|
||||||
|
}
|
||||||
|
text: dataSource[modelData].name
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//END UI components
|
||||||
|
}
|
@ -20,6 +20,8 @@ import QtQuick 2.0
|
|||||||
import org.kde.plasma.components 0.1 as PlasmaComponents
|
import org.kde.plasma.components 0.1 as PlasmaComponents
|
||||||
import org.kde.plasma.extras 0.1 as PlasmaExtras
|
import org.kde.plasma.extras 0.1 as PlasmaExtras
|
||||||
import org.kde.plasma.core 0.1 as PlasmaCore
|
import org.kde.plasma.core 0.1 as PlasmaCore
|
||||||
|
import org.kde.plasma.configuration 0.1
|
||||||
|
|
||||||
|
|
||||||
//TODO: all of this will be done with desktop components
|
//TODO: all of this will be done with desktop components
|
||||||
Rectangle {
|
Rectangle {
|
||||||
|
Loading…
Reference in New Issue
Block a user