SettingsWindow.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /*
  2. * Copyright (c) 2020, Idan Horowitz <idan.horowitz@serenityos.org>
  3. * Copyright (c) 2021-2022, the SerenityOS developers.
  4. * Copyright (c) 2021-2022, Sam Atkins <atkinssj@serenityos.org>
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #pragma once
  9. #include <AK/HashMap.h>
  10. #include <LibGUI/Button.h>
  11. #include <LibGUI/TabWidget.h>
  12. #include <LibGUI/Window.h>
  13. namespace GUI {
  14. class SettingsWindow : public GUI::Window {
  15. C_OBJECT(SettingsWindow)
  16. public:
  17. class Tab : public GUI::Widget {
  18. public:
  19. virtual void apply_settings() = 0;
  20. virtual void cancel_settings() { }
  21. virtual void reset_default_values() { }
  22. SettingsWindow& settings_window() { return *m_window; }
  23. void set_settings_window(SettingsWindow& settings_window) { m_window = settings_window; }
  24. void set_modified(bool modified)
  25. {
  26. if (m_window)
  27. m_window->set_modified(modified);
  28. }
  29. private:
  30. WeakPtr<SettingsWindow> m_window;
  31. };
  32. enum class ShowDefaultsButton {
  33. Yes,
  34. No,
  35. };
  36. static ErrorOr<NonnullRefPtr<SettingsWindow>> create(String title, ShowDefaultsButton = ShowDefaultsButton::No);
  37. virtual ~SettingsWindow() override = default;
  38. template<class T, class... Args>
  39. ErrorOr<NonnullRefPtr<T>> add_tab(String title, StringView id, Args&&... args)
  40. {
  41. auto tab = TRY(m_tab_widget->try_add_tab<T>(move(title), forward<Args>(args)...));
  42. TRY(m_tabs.try_set(id, tab));
  43. tab->set_settings_window(*this);
  44. return tab;
  45. }
  46. Optional<NonnullRefPtr<Tab>> get_tab(StringView id) const;
  47. void set_active_tab(StringView id);
  48. void apply_settings();
  49. void cancel_settings();
  50. void reset_default_values();
  51. void set_modified(bool);
  52. private:
  53. SettingsWindow() = default;
  54. RefPtr<GUI::TabWidget> m_tab_widget;
  55. HashMap<StringView, NonnullRefPtr<Tab>> m_tabs;
  56. RefPtr<GUI::Button> m_ok_button;
  57. RefPtr<GUI::Button> m_cancel_button;
  58. RefPtr<GUI::Button> m_apply_button;
  59. RefPtr<GUI::Button> m_reset_button;
  60. };
  61. }