Jelajahi Sumber

LibCards: Add a CardGame base class

For now, the only feature of this is that it sets the background colour
from the `Games::Cards::BackgroundColor` config value. Later, other
card game configuration and shared behaviour can go here, to save
duplicating it in each game.
Sam Atkins 2 tahun lalu
induk
melakukan
c5b7ad6004

+ 2 - 1
Userland/Libraries/LibCards/CMakeLists.txt

@@ -1,7 +1,8 @@
 set(SOURCES
     Card.cpp
+    CardGame.cpp
     CardStack.cpp
 )
 
 serenity_lib(LibCards cards)
-target_link_libraries(LibCards LibC LibCore)
+target_link_libraries(LibCards LibC LibCore LibConfig LibGUI)

+ 39 - 0
Userland/Libraries/LibCards/CardGame.cpp

@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include "CardGame.h"
+#include <LibConfig/Client.h>
+#include <LibGfx/Palette.h>
+
+namespace Cards {
+
+CardGame::CardGame()
+{
+    auto background_color = Gfx::Color::from_string(Config::read_string("Games"sv, "Cards"sv, "BackgroundColor"sv));
+    set_background_color(background_color.value_or(Color::from_rgb(0x008000)));
+}
+
+void CardGame::config_string_did_change(String const& domain, String const& group, String const& key, String const& value)
+{
+    if (domain == "Games" && group == "Cards" && key == "BackgroundColor") {
+        if (auto maybe_color = Gfx::Color::from_string(value); maybe_color.has_value()) {
+            set_background_color(maybe_color.value());
+        }
+    }
+}
+
+Gfx::Color CardGame::background_color() const
+{
+    return palette().color(background_role());
+}
+
+void CardGame::set_background_color(Gfx::Color const& color)
+{
+    auto new_palette = palette();
+    new_palette.set_color(Gfx::ColorRole::Background, color);
+    set_palette(new_palette);
+}
+}

+ 30 - 0
Userland/Libraries/LibCards/CardGame.h

@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibConfig/Listener.h>
+#include <LibGUI/Frame.h>
+
+namespace Cards {
+
+class CardGame
+    : public GUI::Frame
+    , public Config::Listener {
+public:
+    virtual ~CardGame() = default;
+
+    Gfx::Color background_color() const;
+    void set_background_color(Gfx::Color const&);
+
+protected:
+    CardGame();
+
+private:
+    virtual void config_string_did_change(String const& domain, String const& group, String const& key, String const& value) override;
+};
+
+}