From e824454ab47e84c76af89dc29e4603a05af731bf Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Fri, 27 Aug 2021 17:36:10 +0100 Subject: [PATCH] LibWeb: Implement DOMTreeModel::index_for_node() This will be used to find the index to select when the DOM Inspector is told to inspect a specific node. --- Userland/Libraries/LibWeb/DOMTreeModel.cpp | 18 ++++++++++++++++++ Userland/Libraries/LibWeb/DOMTreeModel.h | 3 +++ 2 files changed, 21 insertions(+) diff --git a/Userland/Libraries/LibWeb/DOMTreeModel.cpp b/Userland/Libraries/LibWeb/DOMTreeModel.cpp index da0a953682f..fda2f593b57 100644 --- a/Userland/Libraries/LibWeb/DOMTreeModel.cpp +++ b/Userland/Libraries/LibWeb/DOMTreeModel.cpp @@ -155,6 +155,7 @@ GUI::Variant DOMTreeModel::data(const GUI::ModelIndex& index, GUI::ModelRole rol void DOMTreeModel::map_dom_nodes_to_parent(JsonObject const* parent, JsonObject const* node) { m_dom_node_to_parent_map.set(node, parent); + m_node_id_to_dom_node_map.set(node->get("id").to_i32(), node); auto const* children = get_children(*node); if (!children) @@ -166,4 +167,21 @@ void DOMTreeModel::map_dom_nodes_to_parent(JsonObject const* parent, JsonObject }); } +GUI::ModelIndex DOMTreeModel::index_for_node(i32 node_id) const +{ + auto node = m_node_id_to_dom_node_map.get(node_id).value_or(nullptr); + if (node) { + auto* parent = get_parent(*node); + auto parent_children = get_children(*parent); + for (size_t i = 0; i < parent_children->size(); i++) { + if (&parent_children->at(i).as_object() == node) { + return create_index(i, 0, node); + } + } + } + + dbgln("Didn't find index for node {}!", node_id); + return {}; +} + } diff --git a/Userland/Libraries/LibWeb/DOMTreeModel.h b/Userland/Libraries/LibWeb/DOMTreeModel.h index b53726d0b63..29af8dac4bf 100644 --- a/Userland/Libraries/LibWeb/DOMTreeModel.h +++ b/Userland/Libraries/LibWeb/DOMTreeModel.h @@ -33,6 +33,8 @@ public: virtual GUI::ModelIndex index(int row, int column, const GUI::ModelIndex& parent = GUI::ModelIndex()) const override; virtual GUI::ModelIndex parent_index(const GUI::ModelIndex&) const override; + GUI::ModelIndex index_for_node(i32 node_id) const; + private: explicit DOMTreeModel(JsonObject); @@ -57,6 +59,7 @@ private: GUI::Icon m_text_icon; JsonObject m_dom_tree; HashMap m_dom_node_to_parent_map; + HashMap m_node_id_to_dom_node_map; }; }