diff --git a/Userland/Applications/Browser/InspectorWidget.cpp b/Userland/Applications/Browser/InspectorWidget.cpp index 480df7aa0d..0ef08ac618 100644 --- a/Userland/Applications/Browser/InspectorWidget.cpp +++ b/Userland/Applications/Browser/InspectorWidget.cpp @@ -7,7 +7,9 @@ */ #include "InspectorWidget.h" +#include #include +#include #include #include @@ -26,6 +28,48 @@ InspectorWidget::InspectorWidget(WebView::OutOfProcessWebView& content_view) m_inspector_view = add(); m_inspector_client = make(content_view, *m_inspector_view); + m_edit_node_action = GUI::Action::create("&Edit node"sv, [this](auto&) { m_inspector_client->context_menu_edit_dom_node(); }); + m_delete_node_action = GUI::Action::create("&Delete node"sv, [this](auto&) { m_inspector_client->context_menu_remove_dom_node(); }); + m_add_attribute_action = GUI::Action::create("&Add attribute"sv, [this](auto&) { m_inspector_client->context_menu_add_dom_node_attribute(); }); + m_remove_attribute_action = GUI::Action::create("&Remove attribute"sv, [this](auto&) { m_inspector_client->context_menu_remove_dom_node_attribute(); }); + + m_dom_node_text_context_menu = GUI::Menu::construct(); + m_dom_node_text_context_menu->add_action(*m_edit_node_action); + m_dom_node_text_context_menu->add_separator(); + m_dom_node_text_context_menu->add_action(*m_delete_node_action); + + m_dom_node_tag_context_menu = GUI::Menu::construct(); + m_dom_node_tag_context_menu->add_action(*m_edit_node_action); + m_dom_node_tag_context_menu->add_separator(); + m_dom_node_tag_context_menu->add_action(*m_add_attribute_action); + m_dom_node_tag_context_menu->add_action(*m_delete_node_action); + + m_dom_node_attribute_context_menu = GUI::Menu::construct(); + m_dom_node_attribute_context_menu->add_action(*m_edit_node_action); + m_dom_node_attribute_context_menu->add_action(*m_remove_attribute_action); + m_dom_node_attribute_context_menu->add_separator(); + m_dom_node_attribute_context_menu->add_action(*m_add_attribute_action); + m_dom_node_attribute_context_menu->add_action(*m_delete_node_action); + + m_inspector_client->on_requested_dom_node_text_context_menu = [this](auto position) { + m_edit_node_action->set_text("&Edit text"); + + m_dom_node_text_context_menu->popup(to_widget_position(position)); + }; + + m_inspector_client->on_requested_dom_node_tag_context_menu = [this](auto position, auto const& tag) { + m_edit_node_action->set_text(DeprecatedString::formatted("&Edit \"{}\"", tag)); + + m_dom_node_tag_context_menu->popup(to_widget_position(position)); + }; + + m_inspector_client->on_requested_dom_node_attribute_context_menu = [this](auto position, auto const& attribute) { + m_edit_node_action->set_text(DeprecatedString::formatted("&Edit attribute \"{}\"", attribute)); + m_remove_attribute_action->set_text(DeprecatedString::formatted("&Remove attribute \"{}\"", attribute)); + + m_dom_node_attribute_context_menu->popup(to_widget_position(position)); + }; + m_inspector_view->set_focus(true); } @@ -51,4 +95,9 @@ void InspectorWidget::select_hovered_node() m_inspector_client->select_hovered_node(); } +Gfx::IntPoint InspectorWidget::to_widget_position(Gfx::IntPoint position) const +{ + return m_inspector_view->screen_relative_rect().location().translated(position); +} + } diff --git a/Userland/Applications/Browser/InspectorWidget.h b/Userland/Applications/Browser/InspectorWidget.h index 2d651ca2aa..90623d2e99 100644 --- a/Userland/Applications/Browser/InspectorWidget.h +++ b/Userland/Applications/Browser/InspectorWidget.h @@ -30,8 +30,19 @@ public: private: explicit InspectorWidget(WebView::OutOfProcessWebView& content_view); + Gfx::IntPoint to_widget_position(Gfx::IntPoint) const; + RefPtr m_inspector_view; OwnPtr m_inspector_client; + + RefPtr m_dom_node_text_context_menu; + RefPtr m_dom_node_tag_context_menu; + RefPtr m_dom_node_attribute_context_menu; + + RefPtr m_edit_node_action; + RefPtr m_delete_node_action; + RefPtr m_add_attribute_action; + RefPtr m_remove_attribute_action; }; }