Serenity Operating System
at master 80 lines 2.1 kB view raw
1/* 2 * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include <AK/Format.h> 10#include <AK/Traits.h> 11#include <LibGUI/Forward.h> 12#include <LibGUI/ModelRole.h> 13 14namespace GUI { 15 16class ModelIndex { 17 friend class Model; 18 19public: 20 ModelIndex() = default; 21 22 bool is_valid() const { return m_model && m_row != -1 && m_column != -1; } 23 int row() const { return m_row; } 24 int column() const { return m_column; } 25 26 void* internal_data() const { return m_internal_data; } 27 28 ModelIndex parent() const; 29 bool is_parent_of(ModelIndex const&) const; 30 31 bool operator==(ModelIndex const& other) const 32 { 33 return m_model == other.m_model && m_row == other.m_row && m_column == other.m_column && m_internal_data == other.m_internal_data; 34 } 35 36 Model const* model() const { return m_model; } 37 38 Variant data(ModelRole = ModelRole::Display) const; 39 40 ModelIndex sibling(int row, int column) const; 41 ModelIndex sibling_at_column(int column) const; 42 43private: 44 ModelIndex(Model const& model, int row, int column, void* internal_data) 45 : m_model(&model) 46 , m_row(row) 47 , m_column(column) 48 , m_internal_data(internal_data) 49 { 50 } 51 52 Model const* m_model { nullptr }; 53 int m_row { -1 }; 54 int m_column { -1 }; 55 void* m_internal_data { nullptr }; 56}; 57 58} 59 60namespace AK { 61 62template<> 63struct Formatter<GUI::ModelIndex> : Formatter<FormatString> { 64 ErrorOr<void> format(FormatBuilder& builder, GUI::ModelIndex const& value) 65 { 66 if (value.internal_data()) 67 return Formatter<FormatString>::format(builder, "ModelIndex({},{},{})"sv, value.row(), value.column(), value.internal_data()); 68 return Formatter<FormatString>::format(builder, "ModelIndex({},{})"sv, value.row(), value.column()); 69 } 70}; 71 72template<> 73struct Traits<GUI::ModelIndex> : public GenericTraits<GUI::ModelIndex> { 74 static unsigned hash(const GUI::ModelIndex& index) 75 { 76 return pair_int_hash(pair_int_hash(index.row(), index.column()), reinterpret_cast<FlatPtr>(index.internal_data())); 77 } 78}; 79 80}