diff --git a/Libraries/LibGUI/GJsonArrayModel.cpp b/Libraries/LibGUI/GJsonArrayModel.cpp new file mode 100644 index 0000000000..5721e0fd8e --- /dev/null +++ b/Libraries/LibGUI/GJsonArrayModel.cpp @@ -0,0 +1,41 @@ +#include +#include +#include + +void GJsonArrayModel::update() +{ + CFile file(m_json_path); + if (!file.open(CIODevice::ReadOnly)) { + dbg() << "Unable to open " << file.filename(); + return; + } + + auto json = JsonValue::from_string(file.read_all()); + + ASSERT(json.is_array()); + m_array = json.as_array(); + + did_update(); +} + +GModel::ColumnMetadata GJsonArrayModel::column_metadata(int column) const +{ + ASSERT(column < m_fields.size()); + return { 100, m_fields[column].text_alignment }; +} + +GVariant GJsonArrayModel::data(const GModelIndex& index, Role role) const +{ + auto& object = m_array.at(index.row()).as_object(); + + if (role == GModel::Role::Display) { + auto& json_field_name = m_fields[index.column()].json_field_name; + auto data = object.get(json_field_name); + if (data.is_int()) + return data.as_int(); + if (data.is_uint()) + return data.as_uint(); + return object.get(json_field_name).to_string(); + } + return {}; +} diff --git a/Libraries/LibGUI/GJsonArrayModel.h b/Libraries/LibGUI/GJsonArrayModel.h new file mode 100644 index 0000000000..5a75f620ba --- /dev/null +++ b/Libraries/LibGUI/GJsonArrayModel.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include + +class GJsonArrayModel final : public GModel { +public: + struct FieldSpec { + String json_field_name; + String column_name; + TextAlignment text_alignment; + }; + + static NonnullRefPtr create(const String& json_path, Vector&& fields) + { + return adopt(*new GJsonArrayModel(json_path, move(fields))); + } + + virtual ~GJsonArrayModel() override {} + + virtual int row_count(const GModelIndex& = GModelIndex()) const override { return m_array.size(); } + virtual int column_count(const GModelIndex& = GModelIndex()) const override { return m_fields.size(); } + virtual String column_name(int column) const override { return m_fields[column].column_name; } + virtual ColumnMetadata column_metadata(int) const override; + virtual GVariant data(const GModelIndex&, Role = Role::Display) const override; + virtual void update() override; + +private: + GJsonArrayModel(const String& json_path, Vector&& fields) + : m_json_path(json_path) + , m_fields(move(fields)) + { + } + + String m_json_path; + Vector m_fields; + JsonArray m_array; +}; diff --git a/Libraries/LibGUI/Makefile b/Libraries/LibGUI/Makefile index 86224b3c65..6e67e30373 100644 --- a/Libraries/LibGUI/Makefile +++ b/Libraries/LibGUI/Makefile @@ -52,6 +52,7 @@ OBJS = \ GAbstractButton.o \ GListView.o \ GComboBox.o \ + GJsonArrayModel.o \ GWindow.o LIBRARY = libgui.a