Serenity Operating System
at master 87 lines 2.3 kB view raw
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}