From 5c2d405e1fa9214d095b51ac2f9de601f97550a8 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 16 Mar 2019 01:10:48 +0100 Subject: [PATCH] IRCClient: Add menus. --- Applications/IRCClient/IRCAppWindow.cpp | 92 +++++++++++++++++-------- Applications/IRCClient/IRCAppWindow.h | 9 +++ LibGUI/GMenu.cpp | 2 +- LibGUI/GMenu.h | 2 +- LibGUI/GMenuItem.cpp | 2 +- LibGUI/GMenuItem.h | 2 +- 6 files changed, 75 insertions(+), 34 deletions(-) diff --git a/Applications/IRCClient/IRCAppWindow.cpp b/Applications/IRCClient/IRCAppWindow.cpp index 01ee8d101d..751c110598 100644 --- a/Applications/IRCClient/IRCAppWindow.cpp +++ b/Applications/IRCClient/IRCAppWindow.cpp @@ -1,11 +1,14 @@ #include "IRCAppWindow.h" #include "IRCClientWindow.h" #include "IRCClientWindowListModel.h" +#include #include #include #include #include #include +#include +#include #include IRCAppWindow::IRCAppWindow() @@ -15,6 +18,8 @@ IRCAppWindow::IRCAppWindow() set_title(String::format("IRC Client: %s@%s:%d", m_client.nickname().characters(), m_client.hostname().characters(), m_client.port())); set_rect(200, 200, 600, 400); setup_client(); + setup_actions(); + setup_menus(); setup_widgets(); } @@ -43,45 +48,73 @@ void IRCAppWindow::setup_client() m_client.connect(); } +void IRCAppWindow::setup_actions() +{ + m_join_action = GAction::create("Join channel", GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/16x16/irc-join.rgb", { 16, 16 }), [] (auto&) { + printf("FIXME: Implement join action\n"); + }); + + m_part_action = GAction::create("Part from channel", GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/16x16/irc-part.rgb", { 16, 16 }), [] (auto&) { + printf("FIXME: Implement part action\n"); + }); + + m_whois_action = GAction::create("Whois user", GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/16x16/irc-whois.rgb", { 16, 16 }), [] (auto&) { + printf("FIXME: Implement whois action\n"); + }); + + m_open_query_action = GAction::create("Open query", GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/16x16/irc-open-query.rgb", { 16, 16 }), [] (auto&) { + printf("FIXME: Implement open-query action\n"); + }); + + m_close_query_action = GAction::create("Close query", GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/16x16/irc-close-query.rgb", { 16, 16 }), [] (auto&) { + printf("FIXME: Implement close-query action\n"); + }); +} + +void IRCAppWindow::setup_menus() +{ + auto menubar = make(); + auto app_menu = make("IRC Client"); + app_menu->add_action(GAction::create("Quit", { Mod_Alt, Key_F4 }, [] (const GAction&) { + dbgprintf("Terminal: Quit menu activated!\n"); + GApplication::the().quit(0); + return; + })); + menubar->add_menu(move(app_menu)); + + auto server_menu = make("Server"); + server_menu->add_action(*m_join_action); + server_menu->add_action(*m_part_action); + server_menu->add_separator(); + server_menu->add_action(*m_whois_action); + server_menu->add_action(*m_open_query_action); + server_menu->add_action(*m_close_query_action); + menubar->add_menu(move(server_menu)); + + auto help_menu = make("Help"); + help_menu->add_action(GAction::create("About", [] (const GAction&) { + dbgprintf("FIXME: Implement Help/About\n"); + })); + menubar->add_menu(move(help_menu)); + + GApplication::the().set_menubar(move(menubar)); +} + void IRCAppWindow::setup_widgets() { auto* widget = new GWidget(nullptr); set_main_widget(widget); widget->set_layout(make(Orientation::Vertical)); - printf("main_widget: %s{%p}\n", widget->class_name(), widget); - - auto join_action = GAction::create("Join channel", GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/16x16/irc-join.rgb", { 16, 16 }), [] (auto&) { - printf("FIXME: Implement join action\n"); - }); - - auto part_action = GAction::create("Part from channel", GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/16x16/irc-part.rgb", { 16, 16 }), [] (auto&) { - printf("FIXME: Implement part action\n"); - }); - - auto whois_action = GAction::create("Whois user", GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/16x16/irc-whois.rgb", { 16, 16 }), [] (auto&) { - printf("FIXME: Implement whois action\n"); - }); - - auto open_query_action = GAction::create("Open query", GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/16x16/irc-open-query.rgb", { 16, 16 }), [] (auto&) { - printf("FIXME: Implement open-query action\n"); - }); - - auto close_query_action = GAction::create("Close query", GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/16x16/irc-close-query.rgb", { 16, 16 }), [] (auto&) { - printf("FIXME: Implement close-query action\n"); - }); - auto* toolbar = new GToolBar(widget); - toolbar->add_action(join_action.copy_ref()); - toolbar->add_action(part_action.copy_ref()); + toolbar->add_action(*m_join_action); + toolbar->add_action(*m_part_action.copy_ref()); toolbar->add_separator(); - toolbar->add_action(whois_action.copy_ref()); - toolbar->add_action(open_query_action.copy_ref()); - toolbar->add_action(close_query_action.copy_ref()); - + toolbar->add_action(*m_whois_action); + toolbar->add_action(*m_open_query_action); + toolbar->add_action(*m_close_query_action); auto* horizontal_container = new GWidget(widget); - printf("horizontal_widget: %s{%p}\n", horizontal_container->class_name(), horizontal_container); horizontal_container->set_layout(make(Orientation::Horizontal)); auto* window_list = new GTableView(horizontal_container); @@ -95,7 +128,6 @@ void IRCAppWindow::setup_widgets() }; m_container = new GStackWidget(horizontal_container); - printf("m_container: %s{%p}\n", ((GWidget*)m_container)->class_name(), m_container); create_subwindow(IRCClientWindow::Server, "Server"); } diff --git a/Applications/IRCClient/IRCAppWindow.h b/Applications/IRCClient/IRCAppWindow.h index 3dcfd89224..2a7068c5d1 100644 --- a/Applications/IRCClient/IRCAppWindow.h +++ b/Applications/IRCClient/IRCAppWindow.h @@ -5,6 +5,7 @@ #include "IRCClient.h" #include "IRCClientWindow.h" +class GAction; class GStackWidget; class IRCAppWindow : public GWindow { @@ -14,6 +15,8 @@ public: private: void setup_client(); + void setup_actions(); + void setup_menus(); void setup_widgets(); IRCClientWindow& create_subwindow(IRCClientWindow::Type, const String& name); @@ -22,4 +25,10 @@ private: IRCClient m_client; GStackWidget* m_container { nullptr }; + + RetainPtr m_join_action; + RetainPtr m_part_action; + RetainPtr m_whois_action; + RetainPtr m_open_query_action; + RetainPtr m_close_query_action; }; diff --git a/LibGUI/GMenu.cpp b/LibGUI/GMenu.cpp index 91a22655f9..69ecad518d 100644 --- a/LibGUI/GMenu.cpp +++ b/LibGUI/GMenu.cpp @@ -29,7 +29,7 @@ GMenu::~GMenu() unrealize_menu(); } -void GMenu::add_action(RetainPtr&& action) +void GMenu::add_action(Retained&& action) { m_items.append(make(move(action))); } diff --git a/LibGUI/GMenu.h b/LibGUI/GMenu.h index 7896bfe6f1..d4a38951d1 100644 --- a/LibGUI/GMenu.h +++ b/LibGUI/GMenu.h @@ -15,7 +15,7 @@ public: GAction* action_at(int); - void add_action(RetainPtr&&); + void add_action(Retained&&); void add_separator(); Function on_item_activation; diff --git a/LibGUI/GMenuItem.cpp b/LibGUI/GMenuItem.cpp index ba877a927b..f15bb44c4f 100644 --- a/LibGUI/GMenuItem.cpp +++ b/LibGUI/GMenuItem.cpp @@ -6,7 +6,7 @@ GMenuItem::GMenuItem(Type type) { } -GMenuItem::GMenuItem(RetainPtr&& action) +GMenuItem::GMenuItem(Retained&& action) : m_type(Action) , m_action(move(action)) { diff --git a/LibGUI/GMenuItem.h b/LibGUI/GMenuItem.h index a26dea394c..9c391d9574 100644 --- a/LibGUI/GMenuItem.h +++ b/LibGUI/GMenuItem.h @@ -9,7 +9,7 @@ public: enum Type { Invalid, Action, Separator }; explicit GMenuItem(Type); - explicit GMenuItem(RetainPtr&&); + explicit GMenuItem(Retained&&); ~GMenuItem(); Type type() const { return m_type; }