diff --git a/apps/taskbar.cpp b/apps/taskbar.cpp index 5e39803f..291c599f 100644 --- a/apps/taskbar.cpp +++ b/apps/taskbar.cpp @@ -15,6 +15,26 @@ void sigchld_handler(int) wait(nullptr); } +Result create_widget_group_for_app(ui::HorizontalLayout& layout, Slice args, StringView icon) +{ + auto* button = new (std::nothrow) ui::Button({ 0, 0, 50, 50 }); + if (!button) return err(ENOMEM); + layout.add_widget(*button); + + auto* container = new (std::nothrow) + ui::Container({ 0, 0, 50, 50 }, ui::VerticalAlignment::Center, ui::HorizontalAlignment::Center); + if (!container) return err(ENOMEM); + button->set_widget(*container); + button->set_action([=] { os::Process::spawn(args[0], args, false); }); + + auto image = TRY(ui::ImageWidget::load(icon)); + container->set_widget(*image); + + image.leak(); + + return {}; +} + Result luna_main(int argc, char** argv) { ui::App app; @@ -30,34 +50,14 @@ Result luna_main(int argc, char** argv) app.set_main_window(window); window->set_background(TASKBAR_COLOR); - ui::HorizontalLayout layout(ui::AdjustHeight::Yes, ui::AdjustWidth::No); + ui::HorizontalLayout layout(ui::Margins { 0, 0, 0, 0 }, ui::AdjustHeight::Yes, ui::AdjustWidth::No); window->set_main_widget(layout); - ui::Button term_button({ 0, 0, 50, 50 }); - layout.add_widget(term_button); + StringView terminal_command[] = { "/usr/bin/terminal" }; + TRY(create_widget_group_for_app(layout, { terminal_command, 1 }, "/usr/share/icons/32x32/app-terminal.tga")); - ui::Container term_container({ 0, 0, 50, 50 }, ui::VerticalAlignment::Center, ui::HorizontalAlignment::Center); - term_button.set_widget(term_container); - term_button.set_action([] { - StringView args[] = { "/usr/bin/terminal" }; - os::Process::spawn("/usr/bin/terminal", Slice { args, 1 }, false); - }); - - auto term_image = TRY(ui::ImageWidget::load("/usr/share/icons/32x32/app-terminal.tga")); - term_container.set_widget(*term_image); - - ui::Button about_button({ 0, 0, 50, 50 }); - layout.add_widget(about_button); - - ui::Container about_container({ 0, 0, 50, 50 }, ui::VerticalAlignment::Center, ui::HorizontalAlignment::Center); - about_button.set_widget(about_container); - about_button.set_action([] { - StringView args[] = { "/usr/bin/about" }; - os::Process::spawn("/usr/bin/about", Slice { args, 1 }, false); - }); - - auto about_image = TRY(ui::ImageWidget::load("/usr/share/icons/32x32/app-about.tga")); - about_container.set_widget(*about_image); + StringView about_command[] = { "/usr/bin/about" }; + TRY(create_widget_group_for_app(layout, { about_command, 1 }, "/usr/share/icons/32x32/app-about.tga")); window->draw(); diff --git a/libui/include/ui/Button.h b/libui/include/ui/Button.h index 0fbcd2df..a73df5df 100644 --- a/libui/include/ui/Button.h +++ b/libui/include/ui/Button.h @@ -8,6 +8,7 @@ */ #pragma once +#include #include namespace ui @@ -18,7 +19,7 @@ namespace ui Button(Rect rect); void set_widget(Widget& widget); - void set_action(void (*action)(void)); + void set_action(Action&& action); Result handle_mouse_move(Point position) override; Result handle_mouse_leave() override; @@ -31,6 +32,6 @@ namespace ui bool m_hovered { false }; bool m_clicked { false }; Widget* m_child; - void (*m_action)(void); + Action m_action; }; } diff --git a/libui/src/Button.cpp b/libui/src/Button.cpp index dd99d65b..ab412cb1 100644 --- a/libui/src/Button.cpp +++ b/libui/src/Button.cpp @@ -24,9 +24,9 @@ namespace ui widget.set_parent(this); } - void Button::set_action(void (*action)(void)) + void Button::set_action(Action&& action) { - m_action = action; + m_action = move(action); } Result Button::handle_mouse_move(Point position)