rate-app 0.40.0

RillRate App
Documentation
use crate::cases::state::{GlobalScene, SceneState, SCENE};
use anyhow::Error;
use rate_ui::shared_object::{DataChanged, SharedObject};
use rate_ui::widget::{Context, NotificationHandler, Widget, WidgetRuntime};
use strum::IntoEnumIterator;
use yew::{html, Html};
use yew_components::Select;

pub type SceneSelector = WidgetRuntime<SceneSelectorWidget>;

pub struct SceneSelectorWidget {
    scene: SharedObject<SceneState>,
}

impl Default for SceneSelectorWidget {
    fn default() -> Self {
        Self {
            scene: SCENE.with(SharedObject::clone),
        }
    }
}

#[derive(Clone)]
pub enum Msg {
    ChangeScene(GlobalScene),
}

impl Widget for SceneSelectorWidget {
    type Event = Msg;
    type Tag = ();
    type Properties = ();
    type Meta = ();

    fn init(&mut self, ctx: &mut Context<Self>) {
        self.scene.subscribe(ctx);
    }

    fn on_event(&mut self, event: Self::Event, _ctx: &mut Context<Self>) {
        match event {
            Msg::ChangeScene(scene) => {
                self.scene.write().global_scene = scene;
            }
        }
    }

    fn view(&self, ctx: &Context<Self>) -> Html {
        let selected = self.scene.read().global_scene.clone();
        let options: Vec<_> = GlobalScene::iter().collect();
        html! {
            <form yew=module_path!() class="d-flex">
                <Select<GlobalScene>
                    class="form-select pointer"
                    options=options
                    selected=selected
                    on_change=ctx.callback(Msg::ChangeScene)
                />
            </form>
        }
    }
}

impl NotificationHandler<DataChanged<SceneState>> for SceneSelectorWidget {
    fn handle(
        &mut self,
        _event: DataChanged<SceneState>,
        ctx: &mut Context<Self>,
    ) -> Result<(), Error> {
        ctx.redraw();
        Ok(())
    }
}