diff options
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Libraries/LibGUI/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/SettingsWindow.cpp | 76 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/SettingsWindow.h | 53 |
3 files changed, 130 insertions, 0 deletions
diff --git a/Userland/Libraries/LibGUI/CMakeLists.txt b/Userland/Libraries/LibGUI/CMakeLists.txt index 21f1c4c8f8..1648dc9634 100644 --- a/Userland/Libraries/LibGUI/CMakeLists.txt +++ b/Userland/Libraries/LibGUI/CMakeLists.txt @@ -84,6 +84,7 @@ set(SOURCES ScrollableContainerWidget.cpp Scrollbar.cpp SeparatorWidget.cpp + SettingsWindow.cpp Shortcut.cpp Slider.cpp SortingProxyModel.cpp diff --git a/Userland/Libraries/LibGUI/SettingsWindow.cpp b/Userland/Libraries/LibGUI/SettingsWindow.cpp new file mode 100644 index 0000000000..463c9c5939 --- /dev/null +++ b/Userland/Libraries/LibGUI/SettingsWindow.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020, Idan Horowitz <idan.horowitz@serenityos.org> + * Copyright (c) 2021, the SerenityOS developers. + * Copyright (c) 2021, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <LibGUI/Application.h> +#include <LibGUI/BoxLayout.h> +#include <LibGUI/Button.h> +#include <LibGUI/SettingsWindow.h> +#include <LibGUI/Widget.h> + +namespace GUI { + +SettingsWindow::SettingsWindow(StringView title, ShowDefaultsButton show_defaults_button) +{ + set_title(title); + resize(400, 480); + set_resizable(false); + set_minimizable(false); + + auto& main_widget = set_main_widget<GUI::Widget>(); + main_widget.set_fill_with_background_color(true); + main_widget.set_layout<GUI::VerticalBoxLayout>(); + main_widget.layout()->set_margins(4); + main_widget.layout()->set_spacing(6); + + m_tab_widget = main_widget.add<GUI::TabWidget>(); + + auto& button_container = main_widget.add<GUI::Widget>(); + button_container.set_shrink_to_fit(true); + button_container.set_layout<GUI::HorizontalBoxLayout>(); + button_container.layout()->set_spacing(6); + + if (show_defaults_button == ShowDefaultsButton::Yes) { + m_reset_button = button_container.add<GUI::Button>("Defaults"); + m_reset_button->on_click = [&](auto) { + for (auto& tab : m_tabs) { + tab.reset_default_values(); + tab.apply_settings(); + } + }; + } + + button_container.layout()->add_spacer(); + + m_ok_button = button_container.add<GUI::Button>("OK"); + m_ok_button->set_fixed_width(75); + m_ok_button->on_click = [&](auto) { + for (auto& tab : m_tabs) + tab.apply_settings(); + GUI::Application::the()->quit(); + }; + + m_cancel_button = button_container.add<GUI::Button>("Cancel"); + m_cancel_button->set_fixed_width(75); + m_cancel_button->on_click = [&](auto) { + GUI::Application::the()->quit(); + }; + + m_apply_button = button_container.add<GUI::Button>("Apply"); + m_apply_button->set_fixed_width(75); + m_apply_button->on_click = [&](auto) { + for (auto& tab : m_tabs) + tab.apply_settings(); + }; +} + +SettingsWindow::~SettingsWindow() +{ +} + +} diff --git a/Userland/Libraries/LibGUI/SettingsWindow.h b/Userland/Libraries/LibGUI/SettingsWindow.h new file mode 100644 index 0000000000..96e897ac2c --- /dev/null +++ b/Userland/Libraries/LibGUI/SettingsWindow.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020, Idan Horowitz <idan.horowitz@serenityos.org> + * Copyright (c) 2021, the SerenityOS developers. + * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <LibGUI/Button.h> +#include <LibGUI/TabWidget.h> +#include <LibGUI/Window.h> + +namespace GUI { + +class SettingsWindow : public GUI::Window { + C_OBJECT(SettingsWindow) +public: + class Tab : public GUI::Widget { + public: + virtual void apply_settings() = 0; + virtual void reset_default_values() {}; + }; + + enum class ShowDefaultsButton { + Yes, + No, + }; + + virtual ~SettingsWindow() override; + + template<class T, class... Args> + T& add_tab(StringView const& title, Args&&... args) + { + auto& t = m_tab_widget->add_tab<T>(title, forward<Args>(args)...); + m_tabs.append(t); + return t; + } + +private: + SettingsWindow(StringView title, ShowDefaultsButton = ShowDefaultsButton::No); + + RefPtr<GUI::TabWidget> m_tab_widget; + NonnullRefPtrVector<Tab> m_tabs; + + RefPtr<GUI::Button> m_ok_button; + RefPtr<GUI::Button> m_cancel_button; + RefPtr<GUI::Button> m_apply_button; + RefPtr<GUI::Button> m_reset_button; +}; + +} |