diff --git a/Ladybird/Qt/InspectorWidget.cpp b/Ladybird/Qt/InspectorWidget.cpp index ed59b69bff5..0735b90c070 100644 --- a/Ladybird/Qt/InspectorWidget.cpp +++ b/Ladybird/Qt/InspectorWidget.cpp @@ -5,8 +5,11 @@ */ #include "InspectorWidget.h" +#include #include +#include #include +#include #include namespace Ladybird { @@ -23,6 +26,55 @@ InspectorWidget::InspectorWidget(QWidget* tab, WebContentView& content_view) m_inspector_client = make(content_view, *m_inspector_view); + m_edit_node_action = new QAction("&Edit node", this); + connect(m_edit_node_action, &QAction::triggered, [this]() { m_inspector_client->context_menu_edit_dom_node(); }); + + m_delete_node_action = new QAction("&Delete node", this); + connect(m_delete_node_action, &QAction::triggered, [this]() { m_inspector_client->context_menu_remove_dom_node(); }); + + m_add_attribute_action = new QAction("&Add attribute", this); + connect(m_add_attribute_action, &QAction::triggered, [this]() { m_inspector_client->context_menu_add_dom_node_attribute(); }); + + m_remove_attribute_action = new QAction("&Remove attribute", this); + connect(m_remove_attribute_action, &QAction::triggered, [this]() { m_inspector_client->context_menu_remove_dom_node_attribute(); }); + + m_dom_node_text_context_menu = new QMenu("DOM text context menu", this); + m_dom_node_text_context_menu->addAction(m_edit_node_action); + m_dom_node_text_context_menu->addSeparator(); + m_dom_node_text_context_menu->addAction(m_delete_node_action); + + m_dom_node_tag_context_menu = new QMenu("DOM tag context menu", this); + m_dom_node_tag_context_menu->addAction(m_edit_node_action); + m_dom_node_tag_context_menu->addSeparator(); + m_dom_node_tag_context_menu->addAction(m_add_attribute_action); + m_dom_node_tag_context_menu->addAction(m_delete_node_action); + + m_dom_node_attribute_context_menu = new QMenu("DOM attribute context menu", this); + m_dom_node_attribute_context_menu->addAction(m_edit_node_action); + m_dom_node_attribute_context_menu->addAction(m_remove_attribute_action); + m_dom_node_attribute_context_menu->addSeparator(); + m_dom_node_attribute_context_menu->addAction(m_add_attribute_action); + m_dom_node_attribute_context_menu->addAction(m_delete_node_action); + + m_inspector_client->on_requested_dom_node_text_context_menu = [this](auto position) { + m_edit_node_action->setText("&Edit text"); + + m_dom_node_text_context_menu->exec(to_widget_position(position)); + }; + + m_inspector_client->on_requested_dom_node_tag_context_menu = [this](auto position, auto const& tag) { + m_edit_node_action->setText(qstring_from_ak_string(MUST(String::formatted("&Edit \"{}\"", tag)))); + + m_dom_node_tag_context_menu->exec(to_widget_position(position)); + }; + + m_inspector_client->on_requested_dom_node_attribute_context_menu = [this](auto position, auto const& attribute) { + m_edit_node_action->setText(qstring_from_ak_string(MUST(String::formatted("&Edit attribute \"{}\"", attribute)))); + m_remove_attribute_action->setText(qstring_from_ak_string(MUST(String::formatted("&Remove attribute \"{}\"", attribute)))); + + m_dom_node_attribute_context_menu->exec(to_widget_position(position)); + }; + setLayout(new QVBoxLayout); layout()->addWidget(m_inspector_view); @@ -58,4 +110,10 @@ void InspectorWidget::closeEvent(QCloseEvent* event) m_inspector_client->clear_selection(); } +QPoint InspectorWidget::to_widget_position(Gfx::IntPoint position) const +{ + auto widget_position = m_inspector_view->mapTo(this, QPoint { position.x(), position.y() }); + return mapToGlobal(widget_position); +} + } diff --git a/Ladybird/Qt/InspectorWidget.h b/Ladybird/Qt/InspectorWidget.h index 4e8c551e993..1951be8aa82 100644 --- a/Ladybird/Qt/InspectorWidget.h +++ b/Ladybird/Qt/InspectorWidget.h @@ -7,9 +7,13 @@ #pragma once #include "WebContentView.h" +#include #include #include +class QAction; +class QMenu; + namespace Ladybird { class WebContentView; @@ -30,8 +34,19 @@ public: private: void closeEvent(QCloseEvent*) override; + QPoint to_widget_position(Gfx::IntPoint) const; + WebContentView* m_inspector_view; OwnPtr m_inspector_client; + + QMenu* m_dom_node_text_context_menu { nullptr }; + QMenu* m_dom_node_tag_context_menu { nullptr }; + QMenu* m_dom_node_attribute_context_menu { nullptr }; + + QAction* m_edit_node_action { nullptr }; + QAction* m_delete_node_action { nullptr }; + QAction* m_add_attribute_action { nullptr }; + QAction* m_remove_attribute_action { nullptr }; }; }