From 019412543c604602c7b1aeadbdae4ba66413e789 Mon Sep 17 00:00:00 2001 From: Jonathan Johnson Date: Sat, 11 Nov 2023 13:47:35 -0800 Subject: [PATCH] Lerp for ThemeMode --- examples/theme.rs | 13 +++---------- src/window.rs | 31 +++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/examples/theme.rs b/examples/theme.rs index ee605c9..e315a06 100644 --- a/examples/theme.rs +++ b/examples/theme.rs @@ -72,18 +72,11 @@ fn main() -> gooey::Result { } fn dark_mode_slider() -> (Dynamic, impl MakeWidget) { - let on_off = Dynamic::new(true); - let theme_mode = on_off.map_each(|dark| { - if *dark { - ThemeMode::Dark - } else { - ThemeMode::Light - } - }); + let theme_mode = Dynamic::default(); ( - theme_mode, - Stack::rows(Label::new("Theme Mode").and(Slider::::from_value(on_off))), + theme_mode.clone(), + Stack::rows(Label::new("Theme Mode").and(Slider::::from_value(theme_mode))), ) } diff --git a/src/window.rs b/src/window.rs index 615a56f..79e8a63 100644 --- a/src/window.rs +++ b/src/window.rs @@ -18,12 +18,13 @@ use kludgine::app::winit::keyboard::Key; use kludgine::app::winit::window; use kludgine::app::WindowBehavior as _; use kludgine::figures::units::{Px, UPx}; -use kludgine::figures::{IntoSigned, IntoUnsigned, Point, Rect, ScreenScale, Size}; +use kludgine::figures::{IntoSigned, IntoUnsigned, Point, Ranged, Rect, ScreenScale, Size}; use kludgine::render::Drawing; use kludgine::wgpu::CompositeAlphaMode; use kludgine::Kludgine; use tracing::Level; +use crate::animation::{LinearInterpolate, PercentBetween, ZeroToOne}; use crate::context::{ AsEventContext, EventContext, Exclusive, GraphicsContext, LayoutContext, RedrawStatus, WidgetContext, @@ -1057,11 +1058,12 @@ pub(crate) mod sealed { } /// Controls whether the light or dark theme is applied. -#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)] +#[derive(Default, Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)] pub enum ThemeMode { /// Applies the light theme Light, /// Applies the dark theme + #[default] Dark, } @@ -1082,3 +1084,28 @@ impl From for window::Theme { } } } + +impl LinearInterpolate for ThemeMode { + fn lerp(&self, target: &Self, percent: f32) -> Self { + if percent >= 0.5 { + *target + } else { + *self + } + } +} + +impl PercentBetween for ThemeMode { + fn percent_between(&self, min: &Self, max: &Self) -> ZeroToOne { + if *min == *max || *self == *min { + ZeroToOne::ZERO + } else { + ZeroToOne::ONE + } + } +} + +impl Ranged for ThemeMode { + const MAX: Self = Self::Dark; + const MIN: Self = Self::Light; +}