Introduce auto-detect-theme feature

This commit is contained in:
Héctor Ramón Jiménez 2024-03-19 23:58:17 +01:00
parent af6bc4643d
commit 9db6ac8f20
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
3 changed files with 34 additions and 3 deletions

View file

@ -18,7 +18,7 @@ all-features = true
maintenance = { status = "actively-developed" } maintenance = { status = "actively-developed" }
[features] [features]
default = ["wgpu", "fira-sans"] default = ["wgpu", "fira-sans", "auto-detect-theme"]
# Enable the `wgpu` GPU-accelerated renderer backend # Enable the `wgpu` GPU-accelerated renderer backend
wgpu = ["iced_renderer/wgpu", "iced_widget/wgpu"] wgpu = ["iced_renderer/wgpu", "iced_widget/wgpu"]
# Enables the `Image` widget # Enables the `Image` widget
@ -53,8 +53,11 @@ multi-window = ["iced_winit/multi-window"]
advanced = [] advanced = []
# Enables embedding Fira Sans as the default font on Wasm builds # Enables embedding Fira Sans as the default font on Wasm builds
fira-sans = ["iced_renderer/fira-sans"] fira-sans = ["iced_renderer/fira-sans"]
# Enables auto-detecting light/dark mode for the built-in theme
auto-detect-theme = ["iced_core/auto-detect-theme"]
[dependencies] [dependencies]
iced_core.workspace = true
iced_futures.workspace = true iced_futures.workspace = true
iced_renderer.workspace = true iced_renderer.workspace = true
iced_widget.workspace = true iced_widget.workspace = true
@ -121,6 +124,7 @@ async-std = "1.0"
bitflags = "2.0" bitflags = "2.0"
bytemuck = { version = "1.0", features = ["derive"] } bytemuck = { version = "1.0", features = ["derive"] }
cosmic-text = "0.10" cosmic-text = "0.10"
dark-light = "1.0"
futures = "0.3" futures = "0.3"
glam = "0.25" glam = "0.25"
glyphon = "0.5" glyphon = "0.5"

View file

@ -10,6 +10,9 @@ homepage.workspace = true
categories.workspace = true categories.workspace = true
keywords.workspace = true keywords.workspace = true
[features]
auto-detect-theme = ["dep:dark-light"]
[dependencies] [dependencies]
bitflags.workspace = true bitflags.workspace = true
glam.workspace = true glam.workspace = true
@ -22,6 +25,9 @@ thiserror.workspace = true
web-time.workspace = true web-time.workspace = true
xxhash-rust.workspace = true xxhash-rust.workspace = true
dark-light.workspace = true
dark-light.optional = true
[target.'cfg(windows)'.dependencies] [target.'cfg(windows)'.dependencies]
raw-window-handle.workspace = true raw-window-handle.workspace = true

View file

@ -7,10 +7,9 @@ use std::fmt;
use std::sync::Arc; use std::sync::Arc;
/// A built-in theme. /// A built-in theme.
#[derive(Debug, Clone, PartialEq, Default)] #[derive(Debug, Clone, PartialEq)]
pub enum Theme { pub enum Theme {
/// The built-in light variant. /// The built-in light variant.
#[default]
Light, Light,
/// The built-in dark variant. /// The built-in dark variant.
Dark, Dark,
@ -161,6 +160,28 @@ impl Theme {
} }
} }
impl Default for Theme {
fn default() -> Self {
#[cfg(feature = "auto-detect-theme")]
{
use once_cell::sync::Lazy;
static DEFAULT: Lazy<Theme> =
Lazy::new(|| match dark_light::detect() {
dark_light::Mode::Dark => Theme::Dark,
dark_light::Mode::Light | dark_light::Mode::Default => {
Theme::Light
}
});
DEFAULT.clone()
}
#[cfg(not(feature = "auto-detect-theme"))]
Theme::Light
}
}
impl fmt::Display for Theme { impl fmt::Display for Theme {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self { match self {