diff --git a/Applications/TextEditor/main.cpp b/Applications/TextEditor/main.cpp index f9b9cbe994..9905731894 100644 --- a/Applications/TextEditor/main.cpp +++ b/Applications/TextEditor/main.cpp @@ -57,30 +57,6 @@ int main(int argc, char** argv) text_editor->write_to_file(path); }); - auto undo_action = GAction::create("Undo", { Mod_Ctrl, Key_Z }, GraphicsBitmap::load_from_file("/res/icons/16x16/undo.png"), [&] (const GAction&) { - // FIXME: Undo - }); - - auto redo_action = GAction::create("Redo", { Mod_Ctrl, Key_Y }, GraphicsBitmap::load_from_file("/res/icons/16x16/redo.png"), [&] (const GAction&) { - // FIXME: Redo - }); - - auto cut_action = GAction::create("Cut", { Mod_Ctrl, Key_X }, GraphicsBitmap::load_from_file("/res/icons/cut16.png"), [&] (const GAction&) { - text_editor->cut(); - }); - - auto copy_action = GAction::create("Copy", { Mod_Ctrl, Key_C }, GraphicsBitmap::load_from_file("/res/icons/16x16/edit-copy.png"), [&] (const GAction&) { - text_editor->copy(); - }); - - auto paste_action = GAction::create("Paste", { Mod_Ctrl, Key_V }, GraphicsBitmap::load_from_file("/res/icons/paste16.png"), [&] (const GAction&) { - text_editor->paste(); - }); - - auto delete_action = GAction::create("Delete", { 0, Key_Delete }, GraphicsBitmap::load_from_file("/res/icons/16x16/delete.png"), [&] (const GAction&) { - text_editor->do_delete(); - }); - auto menubar = make(); auto app_menu = make("TextEditor"); app_menu->add_action(GAction::create("Quit", { Mod_Alt, Key_F4 }, [] (const GAction&) { @@ -96,13 +72,13 @@ int main(int argc, char** argv) menubar->add_menu(move(file_menu)); auto edit_menu = make("Edit"); - edit_menu->add_action(undo_action.copy_ref()); - edit_menu->add_action(redo_action.copy_ref()); + edit_menu->add_action(text_editor->undo_action()); + edit_menu->add_action(text_editor->redo_action()); edit_menu->add_separator(); - edit_menu->add_action(cut_action.copy_ref()); - edit_menu->add_action(copy_action.copy_ref()); - edit_menu->add_action(paste_action.copy_ref()); - edit_menu->add_action(delete_action.copy_ref()); + edit_menu->add_action(text_editor->cut_action()); + edit_menu->add_action(text_editor->copy_action()); + edit_menu->add_action(text_editor->paste_action()); + edit_menu->add_action(text_editor->delete_action()); menubar->add_menu(move(edit_menu)); auto font_menu = make("Font"); @@ -128,20 +104,15 @@ int main(int argc, char** argv) toolbar->add_separator(); - toolbar->add_action(cut_action.copy_ref()); - toolbar->add_action(copy_action.copy_ref()); - toolbar->add_action(move(paste_action)); - toolbar->add_action(delete_action.copy_ref()); + toolbar->add_action(text_editor->cut_action()); + toolbar->add_action(text_editor->copy_action()); + toolbar->add_action(text_editor->paste_action()); + toolbar->add_action(text_editor->delete_action()); toolbar->add_separator(); - toolbar->add_action(move(undo_action)); - toolbar->add_action(move(redo_action)); - - text_editor->on_selection_change = [&] { - cut_action->set_enabled(text_editor->has_selection()); - copy_action->set_enabled(text_editor->has_selection()); - }; + toolbar->add_action(text_editor->undo_action()); + toolbar->add_action(text_editor->redo_action()); auto* window = new GWindow; window->set_title(String::format("TextEditor: %s", path.characters())); diff --git a/LibGUI/GMenu.cpp b/LibGUI/GMenu.cpp index aad2732f47..13be51b2d4 100644 --- a/LibGUI/GMenu.cpp +++ b/LibGUI/GMenu.cpp @@ -29,7 +29,7 @@ GMenu::~GMenu() unrealize_menu(); } -void GMenu::add_action(Retained&& action) +void GMenu::add_action(Retained action) { m_items.append(make(m_menu_id, move(action))); } diff --git a/LibGUI/GMenu.h b/LibGUI/GMenu.h index 981e7102ba..a5280393dc 100644 --- a/LibGUI/GMenu.h +++ b/LibGUI/GMenu.h @@ -2,6 +2,8 @@ #include #include +#include +#include #include class GAction; @@ -16,7 +18,7 @@ public: GAction* action_at(int); - void add_action(Retained&&); + void add_action(Retained); void add_separator(); void popup(const Point& screen_position); @@ -26,6 +28,7 @@ public: private: friend class GMenuBar; + int menu_id() const { return m_menu_id; } int realize_menu(); void unrealize_menu(); diff --git a/LibGUI/GMenuBar.h b/LibGUI/GMenuBar.h index 8a57cabb27..1615790a9e 100644 --- a/LibGUI/GMenuBar.h +++ b/LibGUI/GMenuBar.h @@ -2,7 +2,6 @@ #include #include -#include #include class GApplication; diff --git a/LibGUI/GTextEditor.cpp b/LibGUI/GTextEditor.cpp index 3e830cf5f3..8fb1c047e9 100644 --- a/LibGUI/GTextEditor.cpp +++ b/LibGUI/GTextEditor.cpp @@ -1,9 +1,11 @@ - #include +#include #include #include #include #include #include +#include +#include #include #include #include @@ -22,12 +24,40 @@ GTextEditor::GTextEditor(Type type, GWidget* parent) set_font(GFontDatabase::the().get_by_name("Csilla Thin")); m_lines.append(make()); m_cursor = { 0, 0 }; + create_actions(); } GTextEditor::~GTextEditor() { } +void GTextEditor::create_actions() +{ + m_undo_action = GAction::create("Undo", { Mod_Ctrl, Key_Z }, GraphicsBitmap::load_from_file("/res/icons/16x16/undo.png"), [&] (const GAction&) { + // FIXME: Undo + }); + + m_redo_action = GAction::create("Redo", { Mod_Ctrl, Key_Y }, GraphicsBitmap::load_from_file("/res/icons/16x16/redo.png"), [&] (const GAction&) { + // FIXME: Redo + }); + + m_cut_action = GAction::create("Cut", { Mod_Ctrl, Key_X }, GraphicsBitmap::load_from_file("/res/icons/cut16.png"), [&] (const GAction&) { + cut(); + }); + + m_copy_action = GAction::create("Copy", { Mod_Ctrl, Key_C }, GraphicsBitmap::load_from_file("/res/icons/16x16/edit-copy.png"), [&] (const GAction&) { + copy(); + }); + + m_paste_action = GAction::create("Paste", { Mod_Ctrl, Key_V }, GraphicsBitmap::load_from_file("/res/icons/paste16.png"), [&] (const GAction&) { + paste(); + }); + + m_delete_action = GAction::create("Delete", { 0, Key_Delete }, GraphicsBitmap::load_from_file("/res/icons/16x16/delete.png"), [&] (const GAction&) { + do_delete(); + }); +} + void GTextEditor::set_text(const String& text) { if (is_single_line() && text.length() == m_lines[0]->length() && !memcmp(text.characters(), m_lines[0]->characters(), text.length())) @@ -865,6 +895,23 @@ void GTextEditor::did_change() void GTextEditor::did_update_selection() { + m_cut_action->set_enabled(has_selection()); + m_copy_action->set_enabled(has_selection()); if (on_selection_change) on_selection_change(); } + +void GTextEditor::context_menu_event(GContextMenuEvent& event) +{ + if (!m_context_menu) { + m_context_menu = make("GTextEditor context menu"); + m_context_menu->add_action(undo_action()); + m_context_menu->add_action(redo_action()); + m_context_menu->add_separator(); + m_context_menu->add_action(cut_action()); + m_context_menu->add_action(copy_action()); + m_context_menu->add_action(paste_action()); + m_context_menu->add_action(delete_action()); + } + m_context_menu->popup(event.screen_position()); +} diff --git a/LibGUI/GTextEditor.h b/LibGUI/GTextEditor.h index c5f1d603b9..08b71611e2 100644 --- a/LibGUI/GTextEditor.h +++ b/LibGUI/GTextEditor.h @@ -4,6 +4,8 @@ #include #include +class GAction; +class GMenu; class GScrollBar; class Painter; @@ -106,6 +108,13 @@ public: virtual const char* class_name() const override { return "GTextEditor"; } + GAction& undo_action() { return *m_undo_action; } + GAction& redo_action() { return *m_redo_action; } + GAction& cut_action() { return *m_cut_action; } + GAction& copy_action() { return *m_copy_action; } + GAction& paste_action() { return *m_paste_action; } + GAction& delete_action() { return *m_delete_action; } + private: virtual void paint_event(GPaintEvent&) override; virtual void mousedown_event(GMouseEvent&) override; @@ -118,7 +127,9 @@ private: virtual bool accepts_focus() const override { return true; } virtual void enter_event(CEvent&) override; virtual void leave_event(CEvent&) override; + virtual void context_menu_event(GContextMenuEvent&) override; + void create_actions(); void paint_ruler(Painter&); void update_content_size(); void did_change(); @@ -175,4 +186,11 @@ private: int m_soft_tab_width { 4 }; int m_horizontal_content_padding { 2 }; GTextRange m_selection; + OwnPtr m_context_menu; + RetainPtr m_undo_action; + RetainPtr m_redo_action; + RetainPtr m_cut_action; + RetainPtr m_copy_action; + RetainPtr m_paste_action; + RetainPtr m_delete_action; };