59 lines
1.8 KiB
Rust
59 lines
1.8 KiB
Rust
// SPDX-License-Identifier: (0BSD or MIT)
|
|
/*
|
|
* OrbTK - The Orbital Widget Toolkit
|
|
*
|
|
* Copyright 2021 Ralf Zerres <ralf.zerres@networkx.de>
|
|
*/
|
|
|
|
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<SenderAction>,
|
|
// 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::<u32>("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<SenderAction> = 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'");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|