diff --git a/frontend/src/page/lights.rs b/frontend/src/page/lights.rs index e30e230..01739cb 100644 --- a/frontend/src/page/lights.rs +++ b/frontend/src/page/lights.rs @@ -2,6 +2,7 @@ use crate::components::color_picker::{ColorPicker, ColorPickerMsg}; use crate::css::C; use common::{BulbGroup, BulbGroupShape, BulbMap, ClientMessage, ServerMessage}; use lighter_lib::{BulbId, BulbMode}; +use seed::app::cmd_manager::CmdHandle; use seed::prelude::*; use seed::{attrs, button, div, C}; use seed_router::Page; @@ -22,6 +23,8 @@ pub struct Model { groups_interacted: bool, color_picker: ColorPicker, + + party_mode: Option, } #[derive(Debug)] @@ -32,6 +35,9 @@ pub enum Msg { DeselectGroups, ColorPicker(ColorPickerMsg), SetBulbPower(bool), + + TogglePartyMode, + PartyModeStep { hue: f32 }, } impl Page for Model { @@ -108,6 +114,33 @@ impl Page for Model { orders.notify(message); }); } + Msg::TogglePartyMode => { + if self.party_mode.take().is_none() { + self.update(Msg::PartyModeStep { hue: 0.0 }, orders) + } + } + Msg::PartyModeStep { hue } => { + self.for_selected_bulbs(|id, _| { + let message = ClientMessage::SetBulbColor { + id: id.clone(), + color: lighter_lib::BulbColor::HSB { + h: hue, + s: 1.0, + b: 1.0, + }, + }; + orders.notify(message); + }); + + let handle = orders.perform_cmd_with_handle(cmds::timeout(500, move || { + Msg::PartyModeStep { + // rotate hue + hue: (hue + 0.02).rem_euclid(1.0).clamp(0.0, 1.0), + } + })); + + self.party_mode = Some(handle); + } } } @@ -223,6 +256,7 @@ impl Page for Model { div![attrs! { At::Id => "lever_stem" }], div![attrs! { At::Id => "lever_face" }], ], + button!["Party mode", ev(Ev::Click, move |_| Msg::TogglePartyMode)], ], ] }