/* * OrbTK - The Orbital Widget Toolkit * * Copyright 2021 Ralf Zerres * SPDX-License-Identifier: (0BSD or MIT) */ use orbtk::prelude::*; /// Enumeration of valid `action variants` that need to be handled as /// state changes for the `SenderView` widget. #[derive(Clone, Debug)] pub enum SenderAction { UpdateProgress(f64), } /// Valid `structure members` of the `SenderState` used to react on /// state changes inside the `SenderView` widget. #[derive(AsAny, Default)] pub struct SenderState { // actions actions: Vec, // entity that will receive the message target: Entity } /// Method definitions, we provide inside the `SenderState`. impl SenderState { /// Sending message 'UpdateProgress' pub fn send_message(&mut self) { println!("Sender: push 'UpdateProgress' action"); self.actions.push(SenderAction::UpdateProgress(0.1)); } } /// Trait methods provided for the `SenderState` impl State for SenderState { // initialize the view entities fn init(&mut self, _registry: &mut Registry, ctx: &mut Context) { // create the target entity, that receives the Sender messages self.target = Entity::from(ctx.widget().try_clone::("target") .expect("ERROR: SenderState::init(): target entity not found!")); } // update entities, before we render the view fn update(&mut self, _: &mut Registry, ctx: &mut Context) { let actions: Vec = self.actions.drain(..).collect(); for action in actions { match action { SenderAction::UpdateProgress(amount) => { ctx.send_message(SenderAction::UpdateProgress(amount), self.target); println!("Sender: send message 'SenderAction::UpdateProgress'"); } } } } }