From ab3b23403cbd507e9d319ba0371430f066068ddc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Burdukiewicz?= Date: Mon, 28 Mar 2022 19:08:32 +0200 Subject: [PATCH] fdt: moved qt generator to separate files. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Burdukiewicz --- src/CMakeLists.txt | 3 ++ src/fdt/fdt-generator-qt.cpp | 60 ++++++++++++++++++++++++++++++++ src/fdt/fdt-generator-qt.hpp | 49 ++++++++++++++++++++++++++ src/fdt/fdt-generator.hpp | 20 +++++++++++ src/fdt/fdt-parser.hpp | 19 +---------- src/fdt/fdt-view.cpp | 66 +----------------------------------- src/fdt/fdt-view.hpp | 33 +----------------- 7 files changed, 135 insertions(+), 115 deletions(-) create mode 100644 src/fdt/fdt-generator-qt.cpp create mode 100644 src/fdt/fdt-generator-qt.hpp create mode 100644 src/fdt/fdt-generator.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9b43091..d8e9af7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,6 +6,9 @@ add_executable(fdt-viewer dialogs.cpp dialogs.hpp endian-conversions.hpp + fdt/fdt-generator-qt.cpp + fdt/fdt-generator-qt.hpp + fdt/fdt-generator.hpp fdt/fdt-header.hpp fdt/fdt-parser.cpp fdt/fdt-parser.hpp diff --git a/src/fdt/fdt-generator-qt.cpp b/src/fdt/fdt-generator-qt.cpp new file mode 100644 index 0000000..5406fcf --- /dev/null +++ b/src/fdt/fdt-generator-qt.cpp @@ -0,0 +1,60 @@ +#include "fdt-generator-qt.hpp" + +qt_tree_fdt_generator::qt_tree_fdt_generator(tree_info &reference, tree_widget *target, string &&name, string &&id) { + m_root = [&]() { + if (reference.root) + return reference.root; + + auto ret = new tree_widget_item(target); + reference.root = ret; + return ret; + }(); + + m_root->setText(0, name); + m_root->setData(0, QT_ROLE_FILEPATH, id); + m_root->setIcon(0, QIcon::fromTheme("folder-open")); + m_root->setData(0, QT_ROLE_NODETYPE, QVariant::fromValue(NodeType::Node)); + m_root->setExpanded(true); + m_root->setSelected(true); +} + +void qt_tree_fdt_generator::begin_node(const QString &name) noexcept { + auto child = [&]() { + if (m_tree_stack.empty()) + return m_root; + + tree_widget_item *item = nullptr; + tree_widget_item *root = m_tree_stack.top(); + + for (auto i = 0; i < root->childCount(); ++i) + if (root->child(i)->text(0) == name) { + auto ret = root->child(i); + ret->setIcon(0, QIcon::fromTheme("folder-new")); + ret->setData(0, QT_ROLE_NODETYPE, QVariant::fromValue(NodeType::Node)); + return root->child(i); + } + + return new tree_widget_item(root); + }(); + + if (child->text(0).isEmpty()) { + child->setText(0, name); + child->setIcon(0, QIcon::fromTheme("folder-open")); + child->setData(0, QT_ROLE_NODETYPE, QVariant::fromValue(NodeType::Node)); + } + + m_tree_stack.emplace(child); +} + +void qt_tree_fdt_generator::end_node() noexcept { + m_tree_stack.pop(); +} + +void qt_tree_fdt_generator::insert_property(const fdt_property &property) noexcept { + auto item = new tree_widget_item(m_tree_stack.top()); + + item->setText(0, property.name); + item->setIcon(0, QIcon::fromTheme("flag-green")); + item->setData(0, QT_ROLE_NODETYPE, QVariant::fromValue(NodeType::Property)); + item->setData(0, QT_ROLE_PROPERTY, QVariant::fromValue(property)); +} diff --git a/src/fdt/fdt-generator-qt.hpp b/src/fdt/fdt-generator-qt.hpp new file mode 100644 index 0000000..62f4960 --- /dev/null +++ b/src/fdt/fdt-generator-qt.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include +#include + +Q_DECLARE_METATYPE(fdt_property) + +constexpr auto QT_ROLE_PROPERTY = Qt::UserRole; +constexpr auto QT_ROLE_FILEPATH = Qt::UserRole + 1; +constexpr auto QT_ROLE_NODETYPE = Qt::UserRole + 2; + +enum class NodeType { + Node, + Property +}; + +Q_DECLARE_METATYPE(NodeType) + +template +using hash_map = QHash; + +using node_map = hash_map; + +struct tree_info { + string id; + tree_widget_item *root{nullptr}; + node_map nodes; +}; + +using tree_map = hash_map; + +struct qt_tree_fdt_generator : public iface_fdt_generator { + qt_tree_fdt_generator(tree_info &reference, tree_widget *target, string &&name, string &&id); + + void begin_node(const QString &name) noexcept final; + void end_node() noexcept final; + void insert_property(const fdt_property &property) noexcept final; + +private: + tree_widget_item *m_root{nullptr}; + std::stack m_tree_stack; +}; diff --git a/src/fdt/fdt-generator.hpp b/src/fdt/fdt-generator.hpp new file mode 100644 index 0000000..72b3d86 --- /dev/null +++ b/src/fdt/fdt-generator.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include +#include + +struct fdt_property { + QString name; + QByteArray data; + + auto clear() noexcept { + name.clear(); + data.clear(); + } +}; + +struct iface_fdt_generator { + virtual void begin_node(const QString &name) noexcept = 0; + virtual void end_node() noexcept = 0; + virtual void insert_property(const fdt_property &property) noexcept = 0; +}; diff --git a/src/fdt/fdt-parser.hpp b/src/fdt/fdt-parser.hpp index f74a877..a919267 100644 --- a/src/fdt/fdt-parser.hpp +++ b/src/fdt/fdt-parser.hpp @@ -8,24 +8,7 @@ #include #include -#include -#include - -struct fdt_property { - QString name; - QByteArray data; - - auto clear() noexcept { - name.clear(); - data.clear(); - } -}; - -struct iface_fdt_generator { - virtual void begin_node(const QString &name) noexcept = 0; - virtual void end_node() noexcept = 0; - virtual void insert_property(const fdt_property &property) noexcept = 0; -}; +#include using fdt_property_callback = std::function; diff --git a/src/fdt/fdt-view.cpp b/src/fdt/fdt-view.cpp index e819fc7..84acb05 100644 --- a/src/fdt/fdt-view.cpp +++ b/src/fdt/fdt-view.cpp @@ -1,6 +1,7 @@ #include "fdt-view.hpp" #include +#include #include #include @@ -89,71 +90,6 @@ auto fdt::viewer::is_loaded(const string &id) const noexcept -> bool { return m_tree.contains(id); } -struct qt_tree_fdt_generator : public iface_fdt_generator { - qt_tree_fdt_generator(fdt::tree_info &reference, tree_widget *target, string &&name, string &&id) { - m_root = [&]() { - if (reference.root) - return reference.root; - - auto ret = new tree_widget_item(target); - reference.root = ret; - return ret; - }(); - - m_root->setText(0, name); - m_root->setData(0, QT_ROLE_FILEPATH, id); - m_root->setIcon(0, QIcon::fromTheme("folder-open")); - m_root->setData(0, QT_ROLE_NODETYPE, QVariant::fromValue(NodeType::Node)); - m_root->setExpanded(true); - m_root->setSelected(true); - } - - void begin_node(const QString &name) noexcept final { - auto child = [&]() { - if (m_tree_stack.empty()) - return m_root; - - tree_widget_item *item = nullptr; - tree_widget_item *root = m_tree_stack.top(); - - for (auto i = 0; i < root->childCount(); ++i) - if (root->child(i)->text(0) == name) { - auto ret = root->child(i); - ret->setIcon(0, QIcon::fromTheme("folder-new")); - ret->setData(0, QT_ROLE_NODETYPE, QVariant::fromValue(NodeType::Node)); - return root->child(i); - } - - return new tree_widget_item(root); - }(); - - if (child->text(0).isEmpty()) { - child->setText(0, name); - child->setIcon(0, QIcon::fromTheme("folder-open")); - child->setData(0, QT_ROLE_NODETYPE, QVariant::fromValue(NodeType::Node)); - } - - m_tree_stack.emplace(child); - } - - void end_node() noexcept final { - m_tree_stack.pop(); - } - - void insert_property(const fdt_property &property) noexcept final { - auto item = new tree_widget_item(m_tree_stack.top()); - - item->setText(0, property.name); - item->setIcon(0, QIcon::fromTheme("flag-green")); - item->setData(0, QT_ROLE_NODETYPE, QVariant::fromValue(NodeType::Property)); - item->setData(0, QT_ROLE_PROPERTY, QVariant::fromValue(property)); - } - -private: - tree_widget_item *m_root{nullptr}; - std::stack m_tree_stack; -}; - bool fdt::viewer::load(const byte_array &datamap, string &&name, string &&id) { qt_tree_fdt_generator generator(m_tree[id], m_target, std::move(name), std::move(id)); diff --git a/src/fdt/fdt-view.hpp b/src/fdt/fdt-view.hpp index 6c8a49a..01ca86d 100644 --- a/src/fdt/fdt-view.hpp +++ b/src/fdt/fdt-view.hpp @@ -1,40 +1,9 @@ #pragma once -#include -#include - -#include -#include -#include - -template -using hash_map = QHash; - -Q_DECLARE_METATYPE(fdt_property) - -constexpr auto QT_ROLE_PROPERTY = Qt::UserRole; -constexpr auto QT_ROLE_FILEPATH = Qt::UserRole + 1; -constexpr auto QT_ROLE_NODETYPE = Qt::UserRole + 2; - -enum class NodeType { - Node, - Property -}; - -Q_DECLARE_METATYPE(NodeType) +#include namespace fdt { -using node_map = hash_map; - -struct tree_info { - string id; - tree_widget_item *root{nullptr}; - node_map nodes; -}; - -using tree_map = hash_map; - class viewer { public: viewer(tree_widget *target);