From 3850a46db6e13f2948f5731f4ceec42764391f5d Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector@hecrj.dev>
Date: Wed, 10 Jan 2024 08:15:05 +0100
Subject: Add `Theme` selector to `layout` example

---
 style/src/theme.rs | 36 ++++++++++++++++++++++++++++++------
 1 file changed, 30 insertions(+), 6 deletions(-)

(limited to 'style/src/theme.rs')

diff --git a/style/src/theme.rs b/style/src/theme.rs
index eafb0b47..deccf455 100644
--- a/style/src/theme.rs
+++ b/style/src/theme.rs
@@ -23,6 +23,7 @@ use crate::toggler;
 
 use iced_core::{Background, Color, Vector};
 
+use std::fmt;
 use std::rc::Rc;
 
 /// A built-in theme.
@@ -38,18 +39,22 @@ pub enum Theme {
 }
 
 impl Theme {
+    /// A list with all the defined themes.
+    pub const ALL: &'static [Self] = &[Self::Light, Self::Dark];
+
     /// Creates a new custom [`Theme`] from the given [`Palette`].
-    pub fn custom(palette: Palette) -> Self {
-        Self::custom_with_fn(palette, palette::Extended::generate)
+    pub fn custom(name: String, palette: Palette) -> Self {
+        Self::custom_with_fn(name, palette, palette::Extended::generate)
     }
 
     /// Creates a new custom [`Theme`] from the given [`Palette`], with
     /// a custom generator of a [`palette::Extended`].
     pub fn custom_with_fn(
+        name: String,
         palette: Palette,
         generate: impl FnOnce(Palette) -> palette::Extended,
     ) -> Self {
-        Self::Custom(Box::new(Custom::with_fn(palette, generate)))
+        Self::Custom(Box::new(Custom::with_fn(name, palette, generate)))
     }
 
     /// Returns the [`Palette`] of the [`Theme`].
@@ -71,32 +76,51 @@ impl Theme {
     }
 }
 
+impl fmt::Display for Theme {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            Self::Light => write!(f, "Light"),
+            Self::Dark => write!(f, "Dark"),
+            Self::Custom(custom) => custom.fmt(f),
+        }
+    }
+}
+
 /// A [`Theme`] with a customized [`Palette`].
-#[derive(Debug, Clone, Copy, PartialEq)]
+#[derive(Debug, Clone, PartialEq)]
 pub struct Custom {
+    name: String,
     palette: Palette,
     extended: palette::Extended,
 }
 
 impl Custom {
     /// Creates a [`Custom`] theme from the given [`Palette`].
-    pub fn new(palette: Palette) -> Self {
-        Self::with_fn(palette, palette::Extended::generate)
+    pub fn new(name: String, palette: Palette) -> Self {
+        Self::with_fn(name, palette, palette::Extended::generate)
     }
 
     /// Creates a [`Custom`] theme from the given [`Palette`] with
     /// a custom generator of a [`palette::Extended`].
     pub fn with_fn(
+        name: String,
         palette: Palette,
         generate: impl FnOnce(Palette) -> palette::Extended,
     ) -> Self {
         Self {
+            name,
             palette,
             extended: generate(palette),
         }
     }
 }
 
+impl fmt::Display for Custom {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "{}", self.name)
+    }
+}
+
 /// The style of an application.
 #[derive(Default)]
 pub enum Application {
-- 
cgit