refactor(egui): wrap `Invoker<...>` inside new `ActivityContext`

This commit is contained in:
Mikolaj Wielgus 2024-10-04 22:43:17 +02:00
parent 8b9d4074e4
commit a9b72334f7
3 changed files with 26 additions and 30 deletions

View File

@ -15,18 +15,16 @@ use topola::{
stepper::{Abort, Step}, stepper::{Abort, Step},
}; };
pub struct ActivityContext<'a> {
pub invoker: &'a mut Invoker<SpecctraMesadata>,
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum ActivityStatus { pub enum ActivityStatus {
Running, Running,
Finished(String), Finished(String),
} }
#[derive(Error, Debug, Clone)]
pub enum ActivityError {
#[error(transparent)]
Invoker(#[from] InvokerError),
}
impl From<InvokerStatus> for ActivityStatus { impl From<InvokerStatus> for ActivityStatus {
fn from(status: InvokerStatus) -> Self { fn from(status: InvokerStatus) -> Self {
match status { match status {
@ -46,26 +44,29 @@ impl TryInto<()> for ActivityStatus {
} }
} }
#[derive(Error, Debug, Clone)]
pub enum ActivityError {
#[error(transparent)]
Invoker(#[from] InvokerError),
}
pub enum ActivityStepper { pub enum ActivityStepper {
// There will be another variant for interactive activities here soon. (TODO) // There will be another variant for interactive activities here soon. (TODO)
Execution(ExecutionStepper), Execution(ExecutionStepper),
} }
impl Step<Invoker<SpecctraMesadata>, ActivityStatus, ActivityError, ()> for ActivityStepper { impl Step<ActivityContext<'_>, ActivityStatus, ActivityError, ()> for ActivityStepper {
fn step( fn step(&mut self, context: &mut ActivityContext) -> Result<ActivityStatus, ActivityError> {
&mut self,
invoker: &mut Invoker<SpecctraMesadata>,
) -> Result<ActivityStatus, ActivityError> {
match self { match self {
ActivityStepper::Execution(execution) => Ok(execution.step(invoker)?.into()), ActivityStepper::Execution(execution) => Ok(execution.step(context.invoker)?.into()),
} }
} }
} }
impl Abort<Invoker<SpecctraMesadata>> for ActivityStepper { impl Abort<ActivityContext<'_>> for ActivityStepper {
fn abort(&mut self, invoker: &mut Invoker<SpecctraMesadata>) { fn abort(&mut self, context: &mut ActivityContext) {
match self { match self {
ActivityStepper::Execution(execution) => execution.finish(invoker), // TODO. ActivityStepper::Execution(execution) => execution.finish(context.invoker), // TODO.
}; };
} }
} }
@ -124,23 +125,18 @@ impl ActivityStepperWithStatus {
} }
} }
impl Step<Invoker<SpecctraMesadata>, ActivityStatus, ActivityError, ()> impl Step<ActivityContext<'_>, ActivityStatus, ActivityError, ()> for ActivityStepperWithStatus {
for ActivityStepperWithStatus fn step(&mut self, context: &mut ActivityContext) -> Result<ActivityStatus, ActivityError> {
{ let status = self.activity.step(context)?;
fn step(
&mut self,
invoker: &mut Invoker<SpecctraMesadata>,
) -> Result<ActivityStatus, ActivityError> {
let status = self.activity.step(invoker)?;
self.maybe_status = Some(status.clone()); self.maybe_status = Some(status.clone());
Ok(status.into()) Ok(status.into())
} }
} }
impl Abort<Invoker<SpecctraMesadata>> for ActivityStepperWithStatus { impl Abort<ActivityContext<'_>> for ActivityStepperWithStatus {
fn abort(&mut self, invoker: &mut Invoker<SpecctraMesadata>) { fn abort(&mut self, context: &mut ActivityContext) {
self.maybe_status = Some(ActivityStatus::Finished(String::from("aborted"))); self.maybe_status = Some(ActivityStatus::Finished(String::from("aborted")));
self.activity.abort(invoker); self.activity.abort(context);
} }
} }

View File

@ -19,7 +19,7 @@ use topola::{
}; };
use crate::{ use crate::{
activity::{ActivityStatus, ActivityStepperWithStatus}, activity::{ActivityContext, ActivityStatus, ActivityStepperWithStatus},
config::Config, config::Config,
error_dialog::ErrorDialog, error_dialog::ErrorDialog,
layers::Layers, layers::Layers,
@ -170,7 +170,7 @@ impl App {
} }
if let Some(ref mut activity) = self.maybe_activity { if let Some(ref mut activity) = self.maybe_activity {
return match activity.step(invoker) { return match activity.step(&mut ActivityContext { invoker }) {
Ok(ActivityStatus::Running) => true, Ok(ActivityStatus::Running) => true,
Ok(ActivityStatus::Finished(..)) => false, Ok(ActivityStatus::Finished(..)) => false,
Err(err) => { Err(err) => {

View File

@ -20,7 +20,7 @@ use topola::{
use crate::{ use crate::{
action::{Action, Switch, Trigger}, action::{Action, Switch, Trigger},
activity::{ActivityStatus, ActivityStepperWithStatus}, activity::{ActivityContext, ActivityStatus, ActivityStepperWithStatus},
app::{execute, handle_file}, app::{execute, handle_file},
overlay::Overlay, overlay::Overlay,
translator::Translator, translator::Translator,
@ -331,7 +331,7 @@ impl MenuBar {
} else if abort.consume_key_triggered(ctx, ui) { } else if abort.consume_key_triggered(ctx, ui) {
if let Some(activity) = maybe_activity { if let Some(activity) = maybe_activity {
if let Some(invoker) = arc_mutex_maybe_invoker.lock().unwrap().as_mut() { if let Some(invoker) = arc_mutex_maybe_invoker.lock().unwrap().as_mut() {
activity.abort(invoker); activity.abort(&mut ActivityContext { invoker });
} }
} }
} else if remove_bands.consume_key_triggered(ctx, ui) { } else if remove_bands.consume_key_triggered(ctx, ui) {