diff --git a/Applications/PaintBrush/Tool.cpp b/Applications/PaintBrush/Tool.cpp index 68c2270b9d..831f48c3c6 100644 --- a/Applications/PaintBrush/Tool.cpp +++ b/Applications/PaintBrush/Tool.cpp @@ -26,6 +26,7 @@ #include "Tool.h" #include "ImageEditor.h" +#include namespace PaintBrush { @@ -42,4 +43,9 @@ void Tool::setup(ImageEditor& editor) m_editor = editor.make_weak_ptr(); } +void Tool::set_action(GUI::Action* action) +{ + m_action = action; +} + } diff --git a/Applications/PaintBrush/Tool.h b/Applications/PaintBrush/Tool.h index e76e825a84..f2061ad269 100644 --- a/Applications/PaintBrush/Tool.h +++ b/Applications/PaintBrush/Tool.h @@ -27,6 +27,7 @@ #pragma once #include +#include namespace PaintBrush { @@ -50,9 +51,13 @@ public: void clear() { m_editor = nullptr; } void setup(ImageEditor&); + GUI::Action* action() { return m_action; } + void set_action(GUI::Action*); + protected: Tool(); WeakPtr m_editor; + RefPtr m_action; }; } diff --git a/Applications/PaintBrush/ToolboxWidget.cpp b/Applications/PaintBrush/ToolboxWidget.cpp index 124a51aa14..5eca0510ec 100644 --- a/Applications/PaintBrush/ToolboxWidget.cpp +++ b/Applications/PaintBrush/ToolboxWidget.cpp @@ -44,7 +44,7 @@ namespace PaintBrush { class ToolButton final : public GUI::Button { C_OBJECT(ToolButton) public: - ToolButton(ToolboxWidget& toolbox, const String& name, const GUI::Shortcut& shortcut, OwnPtr&& tool) + ToolButton(ToolboxWidget& toolbox, const String& name, const GUI::Shortcut& shortcut, OwnPtr tool) : m_toolbox(toolbox) , m_tool(move(tool)) { @@ -62,6 +62,7 @@ public: m_toolbox.on_tool_selection(nullptr); }); + m_tool->set_action(m_action); set_action(*m_action); m_toolbox.m_action_group.add_action(*m_action); } @@ -101,6 +102,7 @@ ToolboxWidget::ToolboxWidget() m_action_group.set_unchecking_allowed(false); auto add_tool = [&](const StringView& name, const StringView& icon_name, const GUI::Shortcut& shortcut, NonnullOwnPtr tool) -> ToolButton& { + m_tools.append(tool.ptr()); auto& button = add(*this, name, shortcut, move(tool)); button.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed); button.set_preferred_size(0, 32); @@ -110,7 +112,7 @@ ToolboxWidget::ToolboxWidget() }; add_tool("Move", "move", { 0, Key_M }, make()); - add_tool("Pen", "pen", { 0, Key_N }, make()).set_checked(true); + add_tool("Pen", "pen", { 0, Key_N }, make()); add_tool("Bucket Fill", "bucket", { Mod_Shift, Key_B }, make()); add_tool("Spray", "spray", { Mod_Shift, Key_S }, make()); add_tool("Color Picker", "picker", { 0, Key_O }, make()); diff --git a/Applications/PaintBrush/ToolboxWidget.h b/Applications/PaintBrush/ToolboxWidget.h index 4f71565dc7..60a3de0c5a 100644 --- a/Applications/PaintBrush/ToolboxWidget.h +++ b/Applications/PaintBrush/ToolboxWidget.h @@ -40,12 +40,19 @@ public: Function on_tool_selection; + template + void for_each_tool(Callback callback) + { + for (auto& tool : m_tools) + callback(*tool); + } + private: friend class ToolButton; explicit ToolboxWidget(); - GUI::ActionGroup m_action_group; + Vector m_tools; }; } diff --git a/Applications/PaintBrush/main.cpp b/Applications/PaintBrush/main.cpp index c9bc6513fa..606bae7645 100644 --- a/Applications/PaintBrush/main.cpp +++ b/Applications/PaintBrush/main.cpp @@ -28,6 +28,7 @@ #include "ImageEditor.h" #include "Layer.h" #include "PaletteWidget.h" +#include "Tool.h" #include "ToolboxWidget.h" #include #include @@ -114,6 +115,13 @@ int main(int argc, char** argv) menubar->add_menu("Edit"); + auto& tool_menu = menubar->add_menu("Tool"); + toolbox.for_each_tool([&](auto& tool) { + if (tool.action()) + tool_menu.add_action(*tool.action()); + return IterationDecision::Continue; + }); + auto& help_menu = menubar->add_menu("Help"); help_menu.add_action(GUI::Action::create("About", [&](auto&) { GUI::AboutDialog::show("PaintBrush", Gfx::Bitmap::load_from_file("/res/icons/32x32/app-paintbrush.png"), window);