Serenity Operating System
1/*
2 * Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#define AK_DONT_REPLACE_STD
8
9#include "ModelTranslator.h"
10#include "Utilities.h"
11#include <QIcon>
12
13namespace Ladybird {
14
15ModelTranslator::~ModelTranslator() = default;
16
17int ModelTranslator::columnCount(QModelIndex const& parent) const
18{
19 if (!m_model)
20 return 0;
21 return m_model->column_count(to_gui(parent));
22}
23
24int ModelTranslator::rowCount(QModelIndex const& parent) const
25{
26 if (!m_model)
27 return 0;
28 return m_model->row_count(to_gui(parent));
29}
30
31static QVariant convert_variant(GUI::Variant const& value)
32{
33 if (value.is_string())
34 return qstring_from_ak_deprecated_string(value.as_string());
35 if (value.is_icon()) {
36 auto const& gui_icon = value.as_icon();
37 auto bitmap = gui_icon.bitmap_for_size(16);
38 VERIFY(bitmap);
39 auto qt_image = QImage(bitmap->scanline_u8(0), 16, 16, QImage::Format_ARGB32);
40 QIcon qt_icon;
41 qt_icon.addPixmap(QPixmap::fromImage(qt_image.convertToFormat(QImage::Format::Format_ARGB32_Premultiplied)));
42 return qt_icon;
43 }
44 return {};
45}
46
47QVariant ModelTranslator::data(QModelIndex const& index, int role) const
48{
49 VERIFY(m_model);
50 switch (role) {
51 case Qt::DisplayRole:
52 return convert_variant(m_model->data(to_gui(index), GUI::ModelRole::Display));
53 case Qt::DecorationRole:
54 return convert_variant(m_model->data(to_gui(index), GUI::ModelRole::Icon));
55 default:
56 return {};
57 }
58}
59
60QModelIndex ModelTranslator::index(int row, int column, QModelIndex const& parent) const
61{
62 VERIFY(m_model);
63 return to_qt(m_model->index(row, column, to_gui(parent)));
64}
65
66QModelIndex ModelTranslator::parent(QModelIndex const& index) const
67{
68 VERIFY(m_model);
69 return to_qt(m_model->parent_index(to_gui(index)));
70}
71
72QModelIndex ModelTranslator::to_qt(GUI::ModelIndex const& index) const
73{
74 if (!index.is_valid())
75 return {};
76 return createIndex(index.row(), index.column(), index.internal_data());
77}
78
79GUI::ModelIndex ModelTranslator::to_gui(QModelIndex const& index) const
80{
81 VERIFY(m_model);
82 if (!index.isValid())
83 return {};
84 return m_model->unsafe_create_index(index.row(), index.column(), index.internalPointer());
85}
86
87}