From 643a814ba1c0b1887ffbbd74cbd85df81dc59eba Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 11 Feb 2019 13:24:39 +0100 Subject: [PATCH] Utils: Add a JsonTreeItem JsonTreeItem is used to visualize json values in tree views. It will automatically generate new child items if the value contains an object or array. Change-Id: I316ea9f626050c21c05cbfc0628d0a5e20ad5a49 Reviewed-by: Christian Stenger --- src/libs/utils/jsontreeitem.cpp | 99 +++++++++++++++++++++++++++++++++ src/libs/utils/jsontreeitem.h | 56 +++++++++++++++++++ src/libs/utils/utils-lib.pri | 7 ++- src/libs/utils/utils.qbs | 2 + 4 files changed, 162 insertions(+), 2 deletions(-) create mode 100644 src/libs/utils/jsontreeitem.cpp create mode 100644 src/libs/utils/jsontreeitem.h diff --git a/src/libs/utils/jsontreeitem.cpp b/src/libs/utils/jsontreeitem.cpp new file mode 100644 index 00000000000..a70f5631ec8 --- /dev/null +++ b/src/libs/utils/jsontreeitem.cpp @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "jsontreeitem.h" + +#include +#include + +Utils::JsonTreeItem::JsonTreeItem(const QString &displayName, const QJsonValue &value) + : m_name(displayName) + , m_value(value) +{ } + +static QString typeName(QJsonValue::Type type) +{ + switch (type) { + case QJsonValue::Null: + return Utils::JsonTreeItem::tr("Null"); + case QJsonValue::Bool: + return Utils::JsonTreeItem::tr("Bool"); + case QJsonValue::Double: + return Utils::JsonTreeItem::tr("Double"); + case QJsonValue::String: + return Utils::JsonTreeItem::tr("String"); + case QJsonValue::Array: + return Utils::JsonTreeItem::tr("Array"); + case QJsonValue::Object: + return Utils::JsonTreeItem::tr("Object"); + case QJsonValue::Undefined: + return Utils::JsonTreeItem::tr("Undefined"); + } + return {}; +} + +QVariant Utils::JsonTreeItem::data(int column, int role) const +{ + if (role != Qt::DisplayRole) + return {}; + if (column == 0) + return m_name; + if (column == 2) + return typeName(m_value.type()); + if (m_value.isObject()) + return QString('[' + QString::number(m_value.toObject().size()) + ' ' + tr("Items") + ']'); + if (m_value.isArray()) + return QString('[' + QString::number(m_value.toArray().size()) + ' ' + tr("Items") + ']'); + return m_value.toVariant(); +} + +bool Utils::JsonTreeItem::canFetchMore() const +{ + return canFetchObjectChildren() || canFetchArrayChildren(); +} + +void Utils::JsonTreeItem::fetchMore() +{ + if (canFetchObjectChildren()) { + const QJsonObject &object = m_value.toObject(); + for (const QString &key : object.keys()) + appendChild(new JsonTreeItem(key, object.value(key))); + } else if (canFetchArrayChildren()) { + int index = 0; + const QJsonArray &array = m_value.toArray(); + for (const QJsonValue &val : array) + appendChild(new JsonTreeItem(QString::number(index++), val)); + } +} + +bool Utils::JsonTreeItem::canFetchObjectChildren() const +{ + return m_value.isObject() && m_value.toObject().size() > childCount(); +} + +bool Utils::JsonTreeItem::canFetchArrayChildren() const +{ + return m_value.isArray() && m_value.toArray().size() > childCount(); +} diff --git a/src/libs/utils/jsontreeitem.h b/src/libs/utils/jsontreeitem.h new file mode 100644 index 00000000000..57eea36536c --- /dev/null +++ b/src/libs/utils/jsontreeitem.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include "treemodel.h" + +#include "utils_global.h" + +#include +#include + +namespace Utils { + +class QTCREATOR_UTILS_EXPORT JsonTreeItem : public TypedTreeItem +{ + Q_DECLARE_TR_FUNCTIONS(JsonTreeModelItem) +public: + JsonTreeItem() = default; + JsonTreeItem(const QString &displayName, const QJsonValue &value); + + QVariant data(int column, int role) const override; + bool canFetchMore() const override; + void fetchMore() override; + +private: + bool canFetchObjectChildren() const; + bool canFetchArrayChildren() const; + + QString m_name; + QJsonValue m_value; +}; + +} // namespace Utils diff --git a/src/libs/utils/utils-lib.pri b/src/libs/utils/utils-lib.pri index 7de3faefc97..5a2712cc3f9 100644 --- a/src/libs/utils/utils-lib.pri +++ b/src/libs/utils/utils-lib.pri @@ -123,7 +123,9 @@ SOURCES += \ $$PWD/filecrumblabel.cpp \ $$PWD/fixedsizeclicklabel.cpp \ $$PWD/removefiledialog.cpp \ - $$PWD/differ.cpp + $$PWD/differ.cpp \ + $$PWD/jsontreeitem.cpp + win32:SOURCES += $$PWD/consoleprocess_win.cpp else:SOURCES += $$PWD/consoleprocess_unix.cpp @@ -263,7 +265,8 @@ HEADERS += \ $$PWD/fixedsizeclicklabel.h \ $$PWD/removefiledialog.h \ $$PWD/differ.h \ - $$PWD/cpplanguage_details.h + $$PWD/cpplanguage_details.h \ + $$PWD/jsontreeitem.h FORMS += $$PWD/filewizardpage.ui \ $$PWD/newclasswidget.ui \ diff --git a/src/libs/utils/utils.qbs b/src/libs/utils/utils.qbs index a646e21973c..d50f7f41f60 100644 --- a/src/libs/utils/utils.qbs +++ b/src/libs/utils/utils.qbs @@ -142,6 +142,8 @@ Project { "itemviews.h", "json.cpp", "json.h", + "jsontreeitem.cpp", + "jsontreeitem.h", "linecolumn.h", "link.h", "listutils.h",