From 9249d6e1654b588faa54dcd59f095153de274aa3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 4 Mar 2015 20:22:58 +0100 Subject: [PATCH] Add QJsonModel. --- src/libcalamaresui/CMakeLists.txt | 3 + src/libcalamaresui/utils/qjsonitem.cpp | 138 +++++++++++++++++++ src/libcalamaresui/utils/qjsonitem.h | 60 +++++++++ src/libcalamaresui/utils/qjsonmodel.cpp | 172 ++++++++++++++++++++++++ src/libcalamaresui/utils/qjsonmodel.h | 56 ++++++++ 5 files changed, 429 insertions(+) create mode 100644 src/libcalamaresui/utils/qjsonitem.cpp create mode 100644 src/libcalamaresui/utils/qjsonitem.h create mode 100644 src/libcalamaresui/utils/qjsonmodel.cpp create mode 100644 src/libcalamaresui/utils/qjsonmodel.h diff --git a/src/libcalamaresui/CMakeLists.txt b/src/libcalamaresui/CMakeLists.txt index 2eb7fd6d4..df36f3b0d 100644 --- a/src/libcalamaresui/CMakeLists.txt +++ b/src/libcalamaresui/CMakeLists.txt @@ -11,6 +11,9 @@ list( APPEND ${CALAMARESUI_LIBRARY_TARGET}_SOURCES utils/ImageRegistry.cpp utils/YamlUtils.cpp + utils/qjsonmodel.cpp + utils/qjsonitem.cpp + viewpages/AbstractPage.cpp viewpages/ViewStep.cpp diff --git a/src/libcalamaresui/utils/qjsonitem.cpp b/src/libcalamaresui/utils/qjsonitem.cpp new file mode 100644 index 000000000..76e17f550 --- /dev/null +++ b/src/libcalamaresui/utils/qjsonitem.cpp @@ -0,0 +1,138 @@ +/* === This file is part of Calamares - === + * + * Originally from QJsonModel + * Copyright 2015, Sacha Schutz + * + * Calamares 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 3 of the License, or + * (at your option) any later version. + * + * Calamares 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 Calamares. If not, see . + */ + + +#include "qjsonitem.h" + +QJsonTreeItem::QJsonTreeItem(QJsonTreeItem *parent) +{ + + mParent = parent; + + +} + +QJsonTreeItem::~QJsonTreeItem() +{ + qDeleteAll(mChilds); + +} + +void QJsonTreeItem::appendChild(QJsonTreeItem *item) +{ + mChilds.append(item); +} + +QJsonTreeItem *QJsonTreeItem::child(int row) +{ + return mChilds.value(row); +} + +QJsonTreeItem *QJsonTreeItem::parent() +{ + return mParent; +} + +int QJsonTreeItem::childCount() const +{ + return mChilds.count(); +} + +int QJsonTreeItem::row() const +{ + if (mParent) + return mParent->mChilds.indexOf(const_cast(this)); + + return 0; +} + +void QJsonTreeItem::setKey(const QString &key) +{ + mKey = key; +} + +void QJsonTreeItem::setValue(const QString &value) +{ + mValue = value; +} + +void QJsonTreeItem::setType(const QJsonValue::Type &type) +{ + mType = type; +} + +QString QJsonTreeItem::key() const +{ + return mKey; +} + +QString QJsonTreeItem::value() const +{ + return mValue; +} + +QJsonValue::Type QJsonTreeItem::type() const +{ + return mType; +} + +QJsonTreeItem* QJsonTreeItem::load(const QJsonValue& value, QJsonTreeItem* parent) +{ + + + QJsonTreeItem * rootItem = new QJsonTreeItem(parent); + rootItem->setKey("root"); + + if ( value.isObject()) + { + + //Get all QJsonValue childs + foreach (QString key , value.toObject().keys()){ + QJsonValue v = value.toObject().value(key); + QJsonTreeItem * child = load(v,rootItem); + child->setKey(key); + child->setType(v.type()); + rootItem->appendChild(child); + + } + + } + + else if ( value.isArray()) + { + //Get all QJsonValue childs + int index = 0; + foreach (QJsonValue v , value.toArray()){ + + QJsonTreeItem * child = load(v,rootItem); + child->setKey(QString::number(index)); + child->setType(v.type()); + rootItem->appendChild(child); + ++index; + } + } + else + { + rootItem->setValue(value.toVariant().toString()); + rootItem->setType(value.type()); + } + + return rootItem; +} + diff --git a/src/libcalamaresui/utils/qjsonitem.h b/src/libcalamaresui/utils/qjsonitem.h new file mode 100644 index 000000000..260281236 --- /dev/null +++ b/src/libcalamaresui/utils/qjsonitem.h @@ -0,0 +1,60 @@ +/* === This file is part of Calamares - === + * + * Originally from QJsonModel + * Copyright 2015, Sacha Schutz + * + * Calamares 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 3 of the License, or + * (at your option) any later version. + * + * Calamares 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 Calamares. If not, see . + */ + +#ifndef JSONITEM_H +#define JSONITEM_H +#include +#include +#include +#include +class QJsonTreeItem +{ +public: + QJsonTreeItem(QJsonTreeItem * parent = 0); + ~QJsonTreeItem(); + void appendChild(QJsonTreeItem * item); + QJsonTreeItem *child(int row); + QJsonTreeItem *parent(); + int childCount() const; + int row() const; + void setKey(const QString& key); + void setValue(const QString& value); + void setType(const QJsonValue::Type& type); + QString key() const; + QString value() const; + QJsonValue::Type type() const; + + + static QJsonTreeItem* load(const QJsonValue& value, QJsonTreeItem * parent = 0); + +protected: + + +private: + QString mKey; + QString mValue; + QJsonValue::Type mType; + + QList mChilds; + QJsonTreeItem * mParent; + + +}; + +#endif // JSONITEM_H diff --git a/src/libcalamaresui/utils/qjsonmodel.cpp b/src/libcalamaresui/utils/qjsonmodel.cpp new file mode 100644 index 000000000..4162e819e --- /dev/null +++ b/src/libcalamaresui/utils/qjsonmodel.cpp @@ -0,0 +1,172 @@ +/* === This file is part of Calamares - === + * + * Originally from QJsonModel + * Copyright 2015, Sacha Schutz + * + * Calamares 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 3 of the License, or + * (at your option) any later version. + * + * Calamares 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 Calamares. If not, see . + */ + + +#include "qjsonmodel.h" +#include +#include +#include +#include +#include +#include + +QJsonModel::QJsonModel(QObject *parent) : + QAbstractItemModel(parent) +{ + mRootItem = new QJsonTreeItem; + mHeaders.append("key"); + mHeaders.append("value"); + + +} + +bool QJsonModel::load(const QString &fileName) +{ + QFile file(fileName); + bool success = false; + if (file.open(QIODevice::ReadOnly)) { + success = load(&file); + file.close(); + } + else success = false; + + return success; +} + +bool QJsonModel::load(QIODevice *device) +{ + return loadJson(device->readAll()); +} + +bool QJsonModel::loadJson(const QByteArray &json) +{ + mDocument = QJsonDocument::fromJson(json); + + if (!mDocument.isNull()) + { + beginResetModel(); + mRootItem = QJsonTreeItem::load(QJsonValue(mDocument.object())); + endResetModel(); + return true; + } + return false; +} + + +QVariant QJsonModel::data(const QModelIndex &index, int role) const +{ + + if (!index.isValid()) + return QVariant(); + + + QJsonTreeItem *item = static_cast(index.internalPointer()); + + + if ((role == Qt::DecorationRole) && (index.column() == 0)){ + + return mTypeIcons.value(item->type()); + } + + + if (role == Qt::DisplayRole) { + + if (index.column() == 0) + return QString("%1").arg(item->key()); + + if (index.column() == 1) + return QString("%1").arg(item->value()); + } + + + + return QVariant(); + +} + +QVariant QJsonModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (role != Qt::DisplayRole) + return QVariant(); + + if (orientation == Qt::Horizontal) { + + return mHeaders.value(section); + } + else + return QVariant(); +} + +QModelIndex QJsonModel::index(int row, int column, const QModelIndex &parent) const +{ + if (!hasIndex(row, column, parent)) + return QModelIndex(); + + QJsonTreeItem *parentItem; + + if (!parent.isValid()) + parentItem = mRootItem; + else + parentItem = static_cast(parent.internalPointer()); + + QJsonTreeItem *childItem = parentItem->child(row); + if (childItem) + return createIndex(row, column, childItem); + else + return QModelIndex(); +} + +QModelIndex QJsonModel::parent(const QModelIndex &index) const +{ + if (!index.isValid()) + return QModelIndex(); + + QJsonTreeItem *childItem = static_cast(index.internalPointer()); + QJsonTreeItem *parentItem = childItem->parent(); + + if (parentItem == mRootItem) + return QModelIndex(); + + return createIndex(parentItem->row(), 0, parentItem); +} + +int QJsonModel::rowCount(const QModelIndex &parent) const +{ + QJsonTreeItem *parentItem; + if (parent.column() > 0) + return 0; + + if (!parent.isValid()) + parentItem = mRootItem; + else + parentItem = static_cast(parent.internalPointer()); + + return parentItem->childCount(); +} + +int QJsonModel::columnCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + return 2; +} + +void QJsonModel::setIcon(const QJsonValue::Type &type, const QIcon &icon) +{ + mTypeIcons.insert(type,icon); +} diff --git a/src/libcalamaresui/utils/qjsonmodel.h b/src/libcalamaresui/utils/qjsonmodel.h new file mode 100644 index 000000000..615c37020 --- /dev/null +++ b/src/libcalamaresui/utils/qjsonmodel.h @@ -0,0 +1,56 @@ +/* === This file is part of Calamares - === + * + * Originally from QJsonModel + * Copyright 2015, Sacha Schutz + * + * Calamares 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 3 of the License, or + * (at your option) any later version. + * + * Calamares 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 Calamares. If not, see . + */ + + +#ifndef QJSONMODEL_H +#define QJSONMODEL_H + +#include +#include "qjsonitem.h" +#include +#include +#include +class QJsonModel : public QAbstractItemModel +{ + Q_OBJECT +public: + explicit QJsonModel(QObject *parent = 0); + bool load(const QString& fileName); + bool load(QIODevice * device); + bool loadJson(const QByteArray& json); + QVariant data(const QModelIndex &index, int role) const; + QVariant headerData(int section, Qt::Orientation orientation, int role) const; + QModelIndex index(int row, int column,const QModelIndex &parent = QModelIndex()) const; + QModelIndex parent(const QModelIndex &index) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + void setIcon(const QJsonValue::Type& type, const QIcon& icon); + + + +private: + QJsonTreeItem * mRootItem; + QJsonDocument mDocument; + QStringList mHeaders; + QHash mTypeIcons; + + +}; + +#endif // QJSONMODEL_H