From 4b831a917d81def2320a5910ea8975acb2baaaf1 Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Wed, 28 Jun 2023 18:51:14 +0200 Subject: runtime: Add `operate` method to `program::State` --- runtime/src/program/state.rs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'runtime') diff --git a/runtime/src/program/state.rs b/runtime/src/program/state.rs index d83e3f54..f57d2d8d 100644 --- a/runtime/src/program/state.rs +++ b/runtime/src/program/state.rs @@ -1,6 +1,7 @@ use crate::core::event::{self, Event}; use crate::core::mouse; use crate::core::renderer; +use crate::core::widget::operation::{Operation, Outcome}; use crate::core::{Clipboard, Size}; use crate::user_interface::{self, UserInterface}; use crate::{Command, Debug, Program}; @@ -173,6 +174,43 @@ where (uncaptured_events, command) } + + /// Applies [`widget::Operation`]s to the [`State`] + pub fn operate<'a>( + &mut self, + renderer: &mut P::Renderer, + operations: impl Iterator>, + bounds: Size, + debug: &mut Debug, + ) { + let mut user_interface = build_user_interface( + &mut self.program, + self.cache.take().unwrap(), + renderer, + bounds, + debug, + ); + + for operation in operations { + let mut owned_op; + let mut current_operation = Some(operation); + while let Some(operation) = current_operation.take() { + user_interface.operate(renderer, operation); + match operation.finish() { + Outcome::None => {} + Outcome::Some(message) => { + self.queued_messages.push(message) + } + Outcome::Chain(op) => { + owned_op = op; + current_operation = Some(owned_op.as_mut()); + } + }; + } + } + + self.cache = Some(user_interface.into_cache()); + } } fn build_user_interface<'a, P: Program>( -- cgit From ae2709f2c4ce30b2006471ef23589e12f41c9a80 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 29 Jun 2023 08:14:44 +0200 Subject: Take `Box` instead of reference in `State::operate` --- runtime/src/program/state.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'runtime') diff --git a/runtime/src/program/state.rs b/runtime/src/program/state.rs index f57d2d8d..9ae504ee 100644 --- a/runtime/src/program/state.rs +++ b/runtime/src/program/state.rs @@ -176,10 +176,10 @@ where } /// Applies [`widget::Operation`]s to the [`State`] - pub fn operate<'a>( + pub fn operate( &mut self, renderer: &mut P::Renderer, - operations: impl Iterator>, + operations: impl Iterator>>, bounds: Size, debug: &mut Debug, ) { @@ -192,18 +192,18 @@ where ); for operation in operations { - let mut owned_op; let mut current_operation = Some(operation); - while let Some(operation) = current_operation.take() { - user_interface.operate(renderer, operation); + + while let Some(mut operation) = current_operation.take() { + user_interface.operate(renderer, operation.as_mut()); + match operation.finish() { Outcome::None => {} Outcome::Some(message) => { self.queued_messages.push(message) } - Outcome::Chain(op) => { - owned_op = op; - current_operation = Some(owned_op.as_mut()); + Outcome::Chain(next) => { + current_operation = Some(next); } }; } -- cgit From af4d65c42862190adc9266dd95d98195bb1107de Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 29 Jun 2023 08:15:30 +0200 Subject: Keep imports consistent in `program::state` --- runtime/src/program/state.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'runtime') diff --git a/runtime/src/program/state.rs b/runtime/src/program/state.rs index 9ae504ee..35df6078 100644 --- a/runtime/src/program/state.rs +++ b/runtime/src/program/state.rs @@ -1,7 +1,7 @@ use crate::core::event::{self, Event}; use crate::core::mouse; use crate::core::renderer; -use crate::core::widget::operation::{Operation, Outcome}; +use crate::core::widget::operation::{self, Operation}; use crate::core::{Clipboard, Size}; use crate::user_interface::{self, UserInterface}; use crate::{Command, Debug, Program}; @@ -198,11 +198,11 @@ where user_interface.operate(renderer, operation.as_mut()); match operation.finish() { - Outcome::None => {} - Outcome::Some(message) => { + operation::Outcome::None => {} + operation::Outcome::Some(message) => { self.queued_messages.push(message) } - Outcome::Chain(next) => { + operation::Outcome::Chain(next) => { current_operation = Some(next); } }; -- cgit