Skip to content

Commit

Permalink
fdt: moved qt generator to separate files.
Browse files Browse the repository at this point in the history
Signed-off-by: Bartłomiej Burdukiewicz <bartlomiej.burdukiewicz@gmail.com>
  • Loading branch information
dev-0x7C6 committed Mar 28, 2022
1 parent 086c65f commit ab3b234
Show file tree
Hide file tree
Showing 7 changed files with 135 additions and 115 deletions.
3 changes: 3 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
60 changes: 60 additions & 0 deletions src/fdt/fdt-generator-qt.cpp
Original file line number Diff line number Diff line change
@@ -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));
}
49 changes: 49 additions & 0 deletions src/fdt/fdt-generator-qt.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#pragma once

#include <fdt/fdt-generator.hpp>
#include <fdt/fdt-header.hpp>
#include <fdt/fdt-property-types.hpp>
#include <types.hpp>

#include <QMetaType>
#include <QTreeWidgetItem>
#include <QHash>
#include <stack>

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 <typename... types>
using hash_map = QHash<types...>;

using node_map = hash_map<string, tree_widget_item *>;

struct tree_info {
string id;
tree_widget_item *root{nullptr};
node_map nodes;
};

using tree_map = hash_map<string, tree_info>;

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<tree_widget_item *> m_tree_stack;
};
20 changes: 20 additions & 0 deletions src/fdt/fdt-generator.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#pragma once

#include <QByteArray>
#include <QString>

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;
};
19 changes: 1 addition & 18 deletions src/fdt/fdt-parser.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,7 @@
#include <string_view>
#include <vector>

#include <QByteArray>
#include <QString>

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 <fdt/fdt-generator.hpp>

using fdt_property_callback = std::function<void(const fdt_property &property, iface_fdt_generator &generator)>;

Expand Down
66 changes: 1 addition & 65 deletions src/fdt/fdt-view.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "fdt-view.hpp"

#include <endian-conversions.hpp>
#include <fdt/fdt-generator-qt.hpp>
#include <fdt/fdt-parser.hpp>

#include <QTreeWidget>
Expand Down Expand Up @@ -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<tree_widget_item *> 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));

Expand Down
33 changes: 1 addition & 32 deletions src/fdt/fdt-view.hpp
Original file line number Diff line number Diff line change
@@ -1,40 +1,9 @@
#pragma once

#include <QMetaType>
#include <QHash>

#include <fdt/fdt-property-types.hpp>
#include <fdt/fdt-parser.hpp>
#include <types.hpp>

template <typename... types>
using hash_map = QHash<types...>;

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 <fdt/fdt-generator-qt.hpp>

namespace fdt {

using node_map = hash_map<string, tree_widget_item *>;

struct tree_info {
string id;
tree_widget_item *root{nullptr};
node_map nodes;
};

using tree_map = hash_map<string, tree_info>;

class viewer {
public:
viewer(tree_widget *target);
Expand Down

0 comments on commit ab3b234

Please sign in to comment.