diff options
author | faxe1008 <fabianblatz@gmail.com> | 2021-11-18 19:43:16 +0100 |
---|---|---|
committer | Brian Gianforcaro <b.gianfo@gmail.com> | 2021-12-28 00:57:48 -0800 |
commit | c74afdde26d4cbb8e158e2da6cf6c6f091e3eb3f (patch) | |
tree | 10b85196243641162ad3cb76bfe5405c2890870b | |
parent | 7e8beadd577aa27c7d0d6748302de492b0473ca9 (diff) | |
download | serenity-c74afdde26d4cbb8e158e2da6cf6c6f091e3eb3f.zip |
Taskbar: Add dropping of AppFiles to QuickLaunch
This change adds the capability to drop AppFiles to the quick launch
section of the Taskbar. All logic was moved to a new
QuickLaunchWidget.
-rw-r--r-- | Userland/Services/Taskbar/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Userland/Services/Taskbar/QuickLaunchWidget.cpp | 111 | ||||
-rw-r--r-- | Userland/Services/Taskbar/QuickLaunchWidget.h | 33 | ||||
-rw-r--r-- | Userland/Services/Taskbar/TaskbarWindow.cpp | 88 | ||||
-rw-r--r-- | Userland/Services/Taskbar/TaskbarWindow.h | 8 |
5 files changed, 148 insertions, 93 deletions
diff --git a/Userland/Services/Taskbar/CMakeLists.txt b/Userland/Services/Taskbar/CMakeLists.txt index b8c6d2293b..08420cb444 100644 --- a/Userland/Services/Taskbar/CMakeLists.txt +++ b/Userland/Services/Taskbar/CMakeLists.txt @@ -7,6 +7,7 @@ serenity_component( set(SOURCES main.cpp ClockWidget.cpp + QuickLaunchWidget.cpp ShutdownDialog.cpp TaskbarButton.cpp TaskbarWindow.cpp diff --git a/Userland/Services/Taskbar/QuickLaunchWidget.cpp b/Userland/Services/Taskbar/QuickLaunchWidget.cpp new file mode 100644 index 0000000000..b74e9ff551 --- /dev/null +++ b/Userland/Services/Taskbar/QuickLaunchWidget.cpp @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2021, Fabian Blatz <fabianblatz@gmail.com> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "QuickLaunchWidget.h" +#include <LibConfig/Client.h> +#include <LibCore/MimeData.h> +#include <LibGUI/BoxLayout.h> +#include <serenity.h> + +namespace Taskbar { + +constexpr auto quick_launch = "QuickLaunch"sv; +constexpr int quick_launch_button_size = 24; + +QuickLaunchWidget::QuickLaunchWidget() +{ + set_shrink_to_fit(true); + set_layout<GUI::HorizontalBoxLayout>(); + layout()->set_spacing(0); + set_frame_thickness(0); + set_fixed_height(24); + + auto keys = Config::list_keys("Taskbar", quick_launch); + for (auto& name : keys) { + auto af_name = Config::read_string("Taskbar", quick_launch, name); + auto af_path = String::formatted("{}/{}", Desktop::AppFile::APP_FILES_DIRECTORY, af_name); + auto af = Desktop::AppFile::open(af_path); + add_or_adjust_button(name, af); + } +} + +QuickLaunchWidget::~QuickLaunchWidget() +{ +} + +void QuickLaunchWidget::add_or_adjust_button(String const& button_name, NonnullRefPtr<Desktop::AppFile> app_file) +{ + if (!app_file->is_valid()) + return; + auto button = find_child_of_type_named<GUI::Button>(button_name); + if (!button) { + button = &add<GUI::Button>(); + } + auto app_executable = app_file->executable(); + auto app_run_in_terminal = app_file->run_in_terminal(); + button->set_fixed_size(quick_launch_button_size, quick_launch_button_size); + button->set_button_style(Gfx::ButtonStyle::Coolbar); + button->set_icon(app_file->icon().bitmap_for_size(16)); + button->set_tooltip(app_file->name()); + button->set_name(button_name); + button->on_click = [app_executable, app_run_in_terminal](auto) { + pid_t pid = fork(); + if (pid < 0) { + perror("fork"); + } else if (pid == 0) { + if (chdir(Core::StandardPaths::home_directory().characters()) < 0) { + perror("chdir"); + exit(1); + } + if (app_run_in_terminal) + execl("/bin/Terminal", "Terminal", "-e", app_executable.characters(), nullptr); + else + execl(app_executable.characters(), app_executable.characters(), nullptr); + perror("execl"); + VERIFY_NOT_REACHED(); + } else { + if (disown(pid) < 0) + perror("disown"); + } + }; +} + +void QuickLaunchWidget::config_key_was_removed(String const& domain, String const& group, String const& key) +{ + if (domain == "Taskbar" && group == quick_launch) { + auto button = find_child_of_type_named<GUI::Button>(key); + if (button) + remove_child(*button); + } +} + +void QuickLaunchWidget::config_string_did_change(String const& domain, String const& group, String const& key, String const& value) +{ + if (domain == "Taskbar" && group == quick_launch) { + auto af_path = String::formatted("{}/{}", Desktop::AppFile::APP_FILES_DIRECTORY, value); + auto af = Desktop::AppFile::open(af_path); + add_or_adjust_button(key, af); + } +} + +void QuickLaunchWidget::drop_event(GUI::DropEvent& event) +{ + event.accept(); + + if (event.mime_data().has_urls()) { + auto urls = event.mime_data().urls(); + for (auto& url : urls) { + auto af = Desktop::AppFile::open(url.path()); + if (af->is_valid()) { + auto item_name = af->name().replace(" ", "", true); + add_or_adjust_button(item_name, af); + Config::write_string("Taskbar", quick_launch, item_name, url.basename()); + } + } + } +} + +} diff --git a/Userland/Services/Taskbar/QuickLaunchWidget.h b/Userland/Services/Taskbar/QuickLaunchWidget.h new file mode 100644 index 0000000000..9e444ca4b1 --- /dev/null +++ b/Userland/Services/Taskbar/QuickLaunchWidget.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021, Fabian Blatz <fabianblatz@gmail.com> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <LibConfig/Listener.h> +#include <LibDesktop/AppFile.h> +#include <LibGUI/Button.h> +#include <LibGUI/Frame.h> + +namespace Taskbar { + +class QuickLaunchWidget : public GUI::Frame + , public Config::Listener { + C_OBJECT(QuickLaunchWidget); + +public: + virtual ~QuickLaunchWidget() override; + + virtual void config_key_was_removed(String const&, String const&, String const&) override; + virtual void config_string_did_change(String const&, String const&, String const&, String const&) override; + + virtual void drop_event(GUI::DropEvent&); + +private: + QuickLaunchWidget(); + void add_or_adjust_button(String const&, NonnullRefPtr<Desktop::AppFile>); +}; + +} diff --git a/Userland/Services/Taskbar/TaskbarWindow.cpp b/Userland/Services/Taskbar/TaskbarWindow.cpp index 071db6ee18..02279520b2 100644 --- a/Userland/Services/Taskbar/TaskbarWindow.cpp +++ b/Userland/Services/Taskbar/TaskbarWindow.cpp @@ -7,9 +7,9 @@ #include "TaskbarWindow.h" #include "ClockWidget.h" +#include "QuickLaunchWidget.h" #include "TaskbarButton.h" #include <AK/Debug.h> -#include <LibCore/ConfigFile.h> #include <LibCore/StandardPaths.h> #include <LibGUI/BoxLayout.h> #include <LibGUI/Button.h> @@ -26,9 +26,6 @@ #include <serenity.h> #include <stdio.h> -constexpr const char* quick_launch = "QuickLaunch"; -constexpr int quick_launch_button_size = 24; - class TaskbarWidget final : public GUI::Widget { C_OBJECT(TaskbarWidget); @@ -75,7 +72,7 @@ TaskbarWindow::TaskbarWindow(NonnullRefPtr<GUI::Menu> start_menu) m_start_button->set_menu(m_start_menu); main_widget.add_child(*m_start_button); - create_quick_launch_bar(); + main_widget.add<Taskbar::QuickLaunchWidget>(); m_task_button_container = main_widget.add<GUI::Widget>(); m_task_button_container->set_layout<GUI::HorizontalBoxLayout>(); @@ -111,87 +108,6 @@ void TaskbarWindow::show_desktop_button_clicked(unsigned) GUI::WindowManagerServerConnection::the().async_toggle_show_desktop(); } -void TaskbarWindow::config_key_was_removed(String const& domain, String const& group, String const& key) -{ - if (domain == "Taskbar" && group == quick_launch) { - auto button = m_quick_launch_bar->find_child_of_type_named<GUI::Button>(key); - if (button) - m_quick_launch_bar->remove_child(*button); - } -} - -void TaskbarWindow::config_string_did_change(String const& domain, String const& group, String const& key, String const& value) -{ - if (domain == "Taskbar" && group == quick_launch) { - auto af_path = String::formatted("{}/{}", Desktop::AppFile::APP_FILES_DIRECTORY, value); - auto af = Desktop::AppFile::open(af_path); - if (!af->is_valid()) - return; - - auto button = m_quick_launch_bar->find_child_of_type_named<GUI::Button>(key); - if (button) { - set_quick_launch_button_data(*button, key, af); - } else { - auto& new_button = m_quick_launch_bar->add<GUI::Button>(); - set_quick_launch_button_data(new_button, key, af); - } - } -} - -void TaskbarWindow::create_quick_launch_bar() -{ - m_quick_launch_bar = main_widget()->add<GUI::Frame>(); - m_quick_launch_bar->set_shrink_to_fit(true); - m_quick_launch_bar->set_layout<GUI::HorizontalBoxLayout>(); - m_quick_launch_bar->layout()->set_spacing(0); - m_quick_launch_bar->set_frame_thickness(0); - - auto config = Core::ConfigFile::open_for_app("Taskbar"); - - // FIXME: Core::ConfigFile does not keep the order of the entries. - for (auto& name : config->keys(quick_launch)) { - auto af_name = config->read_entry(quick_launch, name); - auto af_path = String::formatted("{}/{}", Desktop::AppFile::APP_FILES_DIRECTORY, af_name); - auto af = Desktop::AppFile::open(af_path); - if (!af->is_valid()) - continue; - auto& button = m_quick_launch_bar->add<GUI::Button>(); - set_quick_launch_button_data(button, name, af); - } - m_quick_launch_bar->set_fixed_height(24); -} - -void TaskbarWindow::set_quick_launch_button_data(GUI::Button& button, String const& button_name, NonnullRefPtr<Desktop::AppFile> app_file) -{ - auto app_executable = app_file->executable(); - auto app_run_in_terminal = app_file->run_in_terminal(); - button.set_fixed_size(quick_launch_button_size, quick_launch_button_size); - button.set_button_style(Gfx::ButtonStyle::Coolbar); - button.set_icon(app_file->icon().bitmap_for_size(16)); - button.set_tooltip(app_file->name()); - button.set_name(button_name); - button.on_click = [app_executable, app_run_in_terminal](auto) { - pid_t pid = fork(); - if (pid < 0) { - perror("fork"); - } else if (pid == 0) { - if (chdir(Core::StandardPaths::home_directory().characters()) < 0) { - perror("chdir"); - exit(1); - } - if (app_run_in_terminal) - execl("/bin/Terminal", "Terminal", "-e", app_executable.characters(), nullptr); - else - execl(app_executable.characters(), app_executable.characters(), nullptr); - perror("execl"); - VERIFY_NOT_REACHED(); - } else { - if (disown(pid) < 0) - perror("disown"); - } - }; -} - void TaskbarWindow::on_screen_rects_change(const Vector<Gfx::IntRect, 4>& rects, size_t main_screen_index) { const auto& rect = rects[main_screen_index]; diff --git a/Userland/Services/Taskbar/TaskbarWindow.h b/Userland/Services/Taskbar/TaskbarWindow.h index dd71950453..395d375903 100644 --- a/Userland/Services/Taskbar/TaskbarWindow.h +++ b/Userland/Services/Taskbar/TaskbarWindow.h @@ -14,8 +14,7 @@ #include <LibGfx/ShareableBitmap.h> #include <WindowServer/ScreenLayout.h> -class TaskbarWindow final : public GUI::Window - , public Config::Listener { +class TaskbarWindow final : public GUI::Window { C_OBJECT(TaskbarWindow); public: @@ -24,13 +23,9 @@ public: static int taskbar_height() { return 27; } static int taskbar_icon_size() { return 16; } - virtual void config_key_was_removed(String const&, String const&, String const&) override; - virtual void config_string_did_change(String const&, String const&, String const&, String const&) override; - private: explicit TaskbarWindow(NonnullRefPtr<GUI::Menu> start_menu); static void show_desktop_button_clicked(unsigned); - void create_quick_launch_bar(); void set_quick_launch_button_data(GUI::Button&, String const&, NonnullRefPtr<Desktop::AppFile>); void on_screen_rects_change(const Vector<Gfx::IntRect, 4>&, size_t); NonnullRefPtr<GUI::Button> create_button(const WindowIdentifier&); @@ -53,7 +48,6 @@ private: NonnullRefPtr<GUI::Menu> m_start_menu; RefPtr<GUI::Widget> m_task_button_container; RefPtr<Gfx::Bitmap> m_default_icon; - RefPtr<GUI::Frame> m_quick_launch_bar; Gfx::IntSize m_applet_area_size; RefPtr<GUI::Frame> m_applet_area_container; |