From a01c4c50d1a6d1892ded89e57373e109a22171e0 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Sat, 20 Aug 2022 14:14:48 +0100 Subject: [PATCH] GamesSettings: Introduce a new GamesSettings application :^) This currently has exactly one setting: The background colour for card games. My thinking is, it's better to not have a Settings application for each individual game we include in the system, since most will only have a small number of settings, all Settings windows have tabs anyway, and I don't want to flood the Settings app list unnecessarily. As for having a single setting for all the card games: it's nice when things match. :^) --- Base/res/apps/GamesSettings.af | 5 +++ Userland/Applications/CMakeLists.txt | 1 + .../Applications/GamesSettings/CMakeLists.txt | 17 ++++++++ .../GamesSettings/CardSettingsWidget.cpp | 29 ++++++++++++++ .../GamesSettings/CardSettingsWidget.gml | 19 +++++++++ .../GamesSettings/CardSettingsWidget.h | 24 ++++++++++++ Userland/Applications/GamesSettings/main.cpp | 39 +++++++++++++++++++ 7 files changed, 134 insertions(+) create mode 100644 Base/res/apps/GamesSettings.af create mode 100644 Userland/Applications/GamesSettings/CMakeLists.txt create mode 100644 Userland/Applications/GamesSettings/CardSettingsWidget.cpp create mode 100644 Userland/Applications/GamesSettings/CardSettingsWidget.gml create mode 100644 Userland/Applications/GamesSettings/CardSettingsWidget.h create mode 100644 Userland/Applications/GamesSettings/main.cpp diff --git a/Base/res/apps/GamesSettings.af b/Base/res/apps/GamesSettings.af new file mode 100644 index 0000000000..bac017ee0a --- /dev/null +++ b/Base/res/apps/GamesSettings.af @@ -0,0 +1,5 @@ +[App] +Name=Games Settings +Executable=/bin/GamesSettings +Category=Settings +Description=Configure games diff --git a/Userland/Applications/CMakeLists.txt b/Userland/Applications/CMakeLists.txt index 04c4046326..3842e2e6ac 100644 --- a/Userland/Applications/CMakeLists.txt +++ b/Userland/Applications/CMakeLists.txt @@ -13,6 +13,7 @@ add_subdirectory(Debugger) add_subdirectory(DisplaySettings) add_subdirectory(FileManager) add_subdirectory(FontEditor) +add_subdirectory(GamesSettings) add_subdirectory(Help) add_subdirectory(HexEditor) add_subdirectory(ImageViewer) diff --git a/Userland/Applications/GamesSettings/CMakeLists.txt b/Userland/Applications/GamesSettings/CMakeLists.txt new file mode 100644 index 0000000000..3793d46ebf --- /dev/null +++ b/Userland/Applications/GamesSettings/CMakeLists.txt @@ -0,0 +1,17 @@ +serenity_component( + GamesSettings + REQUIRED + TARGETS GamesSettings +) + +compile_gml(CardSettingsWidget.gml CardSettingsWidgetGML.h card_settings_widget_gml) + +set(SOURCES + main.cpp + CardSettingsWidgetGML.h + CardSettingsWidget.cpp + CardSettingsWidget.h + ) + +serenity_app(GamesSettings ICON games) +target_link_libraries(GamesSettings LibGUI LibMain) diff --git a/Userland/Applications/GamesSettings/CardSettingsWidget.cpp b/Userland/Applications/GamesSettings/CardSettingsWidget.cpp new file mode 100644 index 0000000000..cf13e413f3 --- /dev/null +++ b/Userland/Applications/GamesSettings/CardSettingsWidget.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022, Sam Atkins + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "CardSettingsWidget.h" +#include +#include + +CardSettingsWidget::CardSettingsWidget() +{ + load_from_gml(card_settings_widget_gml); + + m_background_color_input = find_descendant_of_type_named("cards_background_color"); + auto background_color = Gfx::Color::from_string(Config::read_string("Games"sv, "Cards"sv, "BackgroundColor"sv)).value_or(Gfx::Color::from_rgb(0x008000)); + m_background_color_input->set_color(background_color, GUI::AllowCallback::No); + m_background_color_input->on_change = [&]() { set_modified(true); }; +} + +void CardSettingsWidget::apply_settings() +{ + Config::write_string("Games"sv, "Cards"sv, "BackgroundColor"sv, m_background_color_input->text()); +} + +void CardSettingsWidget::reset_default_values() +{ + m_background_color_input->set_color(Gfx::Color::from_rgb(0x008000)); +} diff --git a/Userland/Applications/GamesSettings/CardSettingsWidget.gml b/Userland/Applications/GamesSettings/CardSettingsWidget.gml new file mode 100644 index 0000000000..6cc6a6e2dd --- /dev/null +++ b/Userland/Applications/GamesSettings/CardSettingsWidget.gml @@ -0,0 +1,19 @@ +@GUI::Frame { + fill_with_background_color: true + layout: @GUI::VerticalBoxLayout { + margins: [8] + } + + @GUI::GroupBox { + title: "Background Color" + max_height: "shrink" + layout: @GUI::VerticalBoxLayout { + margins: [8] + } + + @GUI::ColorInput { + name: "cards_background_color" + has_alpha_channel: false + } + } +} diff --git a/Userland/Applications/GamesSettings/CardSettingsWidget.h b/Userland/Applications/GamesSettings/CardSettingsWidget.h new file mode 100644 index 0000000000..503a445eed --- /dev/null +++ b/Userland/Applications/GamesSettings/CardSettingsWidget.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2022, Sam Atkins + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +class CardSettingsWidget final : public GUI::SettingsWindow::Tab { + C_OBJECT(CardSettingsWidget) +public: + virtual ~CardSettingsWidget() override = default; + + virtual void apply_settings() override; + virtual void reset_default_values() override; + +private: + CardSettingsWidget(); + + RefPtr m_background_color_input; +}; diff --git a/Userland/Applications/GamesSettings/main.cpp b/Userland/Applications/GamesSettings/main.cpp new file mode 100644 index 0000000000..6753f9355d --- /dev/null +++ b/Userland/Applications/GamesSettings/main.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022, Sam Atkins + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "CardSettingsWidget.h" +#include +#include +#include +#include +#include +#include +#include + +ErrorOr serenity_main(Main::Arguments arguments) +{ + TRY(Core::System::pledge("stdio rpath recvfd sendfd unix")); + auto app = TRY(GUI::Application::try_create(arguments)); + Config::pledge_domain("Games"); + + StringView selected_tab; + Core::ArgsParser args_parser; + args_parser.add_option(selected_tab, "Tab, must be 'cards'", "open-tab", 't', "tab"); + args_parser.parse(arguments); + + TRY(Core::System::unveil("/res", "r")); + TRY(Core::System::unveil(nullptr, nullptr)); + + auto app_icon = GUI::Icon::default_icon("games"sv); + + auto window = TRY(GUI::SettingsWindow::create("Games Settings", GUI::SettingsWindow::ShowDefaultsButton::Yes)); + window->set_icon(app_icon.bitmap_for_size(16)); + (void)TRY(window->add_tab("Cards"sv, "cards"sv)); + window->set_active_tab(selected_tab); + + window->show(); + return app->exec(); +}