From 98b6aea234c952a17134015b5636751b21f8f3c9 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 25 Sep 2022 12:08:42 +0200 Subject: [PATCH] Ladybird: Add a ModelTranslator to translate a GUI::Model to a Qt model This will be used to expose the DOMTreeModel from LibWebView :^) --- Ladybird/ModelTranslator.cpp | 84 ++++++++++++++++++++++++++++++++++++ Ladybird/ModelTranslator.h | 33 ++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 Ladybird/ModelTranslator.cpp create mode 100644 Ladybird/ModelTranslator.h diff --git a/Ladybird/ModelTranslator.cpp b/Ladybird/ModelTranslator.cpp new file mode 100644 index 0000000000..e342c788ee --- /dev/null +++ b/Ladybird/ModelTranslator.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2022, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define AK_DONT_REPLACE_STD + +#include "ModelTranslator.h" +#include "Utilities.h" +#include + +namespace Ladybird { + +ModelTranslator::ModelTranslator(NonnullRefPtr model) + : m_model(move(model)) +{ +} + +ModelTranslator::~ModelTranslator() = default; + +int ModelTranslator::columnCount(QModelIndex const& parent) const +{ + return m_model->column_count(to_gui(parent)); +} + +int ModelTranslator::rowCount(QModelIndex const& parent) const +{ + return m_model->row_count(to_gui(parent)); +} + +static QVariant convert_variant(GUI::Variant const& value) +{ + if (value.is_string()) + return qstring_from_akstring(value.as_string()); + if (value.is_icon()) { + auto const& gui_icon = value.as_icon(); + auto bitmap = gui_icon.bitmap_for_size(16); + VERIFY(bitmap); + auto qt_image = QImage(bitmap->scanline_u8(0), 16, 16, QImage::Format_ARGB32); + QIcon qt_icon; + qt_icon.addPixmap(QPixmap::fromImage(qt_image.convertToFormat(QImage::Format::Format_ARGB32_Premultiplied))); + return qt_icon; + } + return {}; +} + +QVariant ModelTranslator::data(QModelIndex const& index, int role) const +{ + switch (role) { + case Qt::DisplayRole: + return convert_variant(m_model->data(to_gui(index), GUI::ModelRole::Display)); + case Qt::DecorationRole: + return convert_variant(m_model->data(to_gui(index), GUI::ModelRole::Icon)); + default: + return {}; + } +} + +QModelIndex ModelTranslator::index(int row, int column, QModelIndex const& parent) const +{ + return to_qt(m_model->index(row, column, to_gui(parent))); +} + +QModelIndex ModelTranslator::parent(QModelIndex const& index) const +{ + return to_qt(m_model->parent_index(to_gui(index))); +} + +QModelIndex ModelTranslator::to_qt(GUI::ModelIndex const& index) const +{ + if (!index.is_valid()) + return {}; + return createIndex(index.row(), index.column(), index.internal_data()); +} + +GUI::ModelIndex ModelTranslator::to_gui(QModelIndex const& index) const +{ + if (!index.isValid()) + return {}; + return m_model->create_index_unsafe(index.row(), index.column(), index.internalPointer()); +} + +} diff --git a/Ladybird/ModelTranslator.h b/Ladybird/ModelTranslator.h new file mode 100644 index 0000000000..6890b1e2d0 --- /dev/null +++ b/Ladybird/ModelTranslator.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Ladybird { + +class ModelTranslator final : public QAbstractItemModel { + Q_OBJECT +public: + explicit ModelTranslator(NonnullRefPtr); + virtual ~ModelTranslator() override; + + virtual int columnCount(QModelIndex const& parent) const override; + virtual int rowCount(QModelIndex const& parent) const override; + virtual QVariant data(QModelIndex const&, int role) const override; + virtual QModelIndex index(int row, int column, QModelIndex const& parent) const override; + virtual QModelIndex parent(QModelIndex const& index) const override; + + QModelIndex to_qt(GUI::ModelIndex const&) const; + GUI::ModelIndex to_gui(QModelIndex const&) const; + +private: + RefPtr m_model; +}; + +}