/* * Copyright (c) 2020, Idan Horowitz * Copyright (c) 2021-2022, the SerenityOS developers. * Copyright (c) 2021-2022, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace GUI { class SettingsWindow : public GUI::Window { C_OBJECT(SettingsWindow) public: class Tab : public GUI::Widget { public: virtual void apply_settings() = 0; virtual void cancel_settings() { } virtual void reset_default_values() { } SettingsWindow& settings_window() { return *m_window; } void set_settings_window(SettingsWindow& settings_window) { m_window = settings_window; } void set_modified(bool modified) { if (m_window) m_window->set_modified(modified); } private: WeakPtr m_window; }; enum class ShowDefaultsButton { Yes, No, }; static ErrorOr> create(DeprecatedString title, ShowDefaultsButton = ShowDefaultsButton::No); virtual ~SettingsWindow() override = default; template ErrorOr> add_tab(String title, StringView id, Args&&... args) { auto tab = TRY(m_tab_widget->try_add_tab(move(title), forward(args)...)); TRY(m_tabs.try_set(id, tab)); tab->set_settings_window(*this); return tab; } ErrorOr add_tab(NonnullRefPtr const& tab, String title, StringView id) { tab->set_title(move(title)); TRY(m_tab_widget->try_add_widget(*tab)); TRY(m_tabs.try_set(id, tab)); tab->set_settings_window(*this); return {}; } Optional> get_tab(StringView id) const; void set_active_tab(StringView id); void apply_settings(); void cancel_settings(); void reset_default_values(); void set_modified(bool); private: SettingsWindow() = default; RefPtr m_tab_widget; HashMap> m_tabs; RefPtr m_ok_button; RefPtr m_cancel_button; RefPtr m_apply_button; RefPtr m_reset_button; }; }