1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 06:24:58 +00:00

Userland/TaskbarWindow: Show context menu on right click

This commit is contained in:
nyyakko 2024-01-17 12:26:45 -03:00 committed by Andrew Kaster
parent 70eac0fbe8
commit e981197ee3

View file

@ -2,6 +2,7 @@
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2021, Spencer Dixon <spencercdixon@gmail.com>
* Copyright (c) 2023, David Ganz <david.g.ganz@gmail.com>
* Copyright (c) 2024, Wellington Santos <nyakonyns@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -14,6 +15,7 @@
#include <AK/Error.h>
#include <AK/String.h>
#include <LibCore/StandardPaths.h>
#include <LibGUI/Action.h>
#include <LibGUI/BoxLayout.h>
#include <LibGUI/Button.h>
#include <LibGUI/ConnectionToWindowManagerServer.h>
@ -24,6 +26,7 @@
#include <LibGUI/Menu.h>
#include <LibGUI/MessageBox.h>
#include <LibGUI/Painter.h>
#include <LibGUI/Process.h>
#include <LibGUI/Window.h>
#include <LibGfx/Font/FontDatabase.h>
#include <LibGfx/Palette.h>
@ -36,6 +39,20 @@ class TaskbarWidget final : public GUI::Widget {
public:
virtual ~TaskbarWidget() override = default;
static ErrorOr<NonnullRefPtr<TaskbarWidget>> create();
protected:
virtual void context_menu_event(GUI::ContextMenuEvent& event) override
{
size_t visible_windows_count = 0;
WindowList::the().for_each_window([&](auto& window) {
if (!window.is_minimized())
visible_windows_count += 1;
});
m_show_desktop_action->set_text(visible_windows_count >= 1 ? "Show Desktop" : "Show open Windows");
m_context_menu->popup(event.screen_position());
}
private:
TaskbarWidget() = default;
@ -54,8 +71,44 @@ private:
static_cast<TaskbarButton*>(button)->update_taskbar_rect();
});
}
ErrorOr<void> create_context_menu();
RefPtr<GUI::Menu> m_context_menu;
RefPtr<GUI::Action> m_show_desktop_action;
};
ErrorOr<NonnullRefPtr<TaskbarWidget>> TaskbarWidget::create()
{
auto widget = TaskbarWidget::construct();
TRY(widget->create_context_menu());
return widget;
}
ErrorOr<void> TaskbarWidget::create_context_menu()
{
m_context_menu = GUI::Menu::construct();
m_show_desktop_action = GUI::Action::create("Show Desktop", TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/desktop.png"sv)), [](auto&) {
GUI::ConnectionToWindowManagerServer::the().async_toggle_show_desktop();
});
auto open_settings_action = GUI::Action::create("&Settings", TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/settings.png"sv)), [this](auto&) {
GUI::Process::spawn_or_show_error(window(), "/bin/Settings"sv);
});
auto open_system_monitor_action = GUI::Action::create("System &Monitor", TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/app-system-monitor.png"sv)), [this](auto&) {
GUI::Process::spawn_or_show_error(window(), "/bin/SystemMonitor"sv);
});
m_context_menu->add_action(*open_system_monitor_action);
m_context_menu->add_action(*open_settings_action);
m_context_menu->add_separator();
m_context_menu->add_action(*m_show_desktop_action);
return {};
}
ErrorOr<NonnullRefPtr<TaskbarWindow>> TaskbarWindow::create()
{
auto window = TRY(AK::adopt_nonnull_ref_or_enomem(new (nothrow) TaskbarWindow()));
@ -74,7 +127,9 @@ TaskbarWindow::TaskbarWindow()
ErrorOr<void> TaskbarWindow::populate_taskbar()
{
auto main_widget = set_main_widget<TaskbarWidget>();
auto main_widget = TRY(TaskbarWidget::create());
set_main_widget(main_widget);
main_widget->set_layout<GUI::HorizontalBoxLayout>(GUI::Margins { 2, 3, 0, 3 });
m_quick_launch = TRY(Taskbar::QuickLaunchWidget::create());