From 2adf0028c36e084a37cb32f86f1aff7758ec3eb1 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Thu, 26 Sep 2024 03:29:18 +0300 Subject: [PATCH] wip: fixing the modal --- crates/tek_core/src/engine.rs | 6 +++ crates/tek_core/src/space.rs | 10 +---- crates/tek_core/src/tui.rs | 15 ------- crates/tek_sequencer/src/main_arranger.rs | 46 ++++++++++++--------- crates/tek_sequencer/src/sequencer.rs | 49 +++++++++++------------ 5 files changed, 57 insertions(+), 69 deletions(-) diff --git a/crates/tek_core/src/engine.rs b/crates/tek_core/src/engine.rs index 5cee6900..ee76a8ce 100644 --- a/crates/tek_core/src/engine.rs +++ b/crates/tek_core/src/engine.rs @@ -178,6 +178,11 @@ impl Handle for Arc> where H: Handle { pub trait Component: Widget + Handle {} /// Everything that implements [Render] and [Handle] is a [Component]. impl + Handle> Component for C {} +/// A UI component that can render itself and handle input +pub trait ContentComponent: Widget + Handle {} +/// Everything that implements [Render] and [Handle] is a [Component]. +impl + Handle> ContentComponent for C {} + pub trait Exit: Send { fn exited (&self) -> bool; fn exit (&mut self); @@ -185,6 +190,7 @@ pub trait Exit: Send { Box::new(self) } } + /// Marker trait for [Component]s that can [Exit] pub trait ExitableComponent: Exit + Component where E: Engine { /// Perform type erasure for collecting heterogeneous components. diff --git a/crates/tek_core/src/space.rs b/crates/tek_core/src/space.rs index 51e8f4ab..ea96d55b 100644 --- a/crates/tek_core/src/space.rs +++ b/crates/tek_core/src/space.rs @@ -217,15 +217,7 @@ impl> Layout for W {} pub struct DebugOverlay>(pub W); -pub struct ModalHost, W: Widget>( - pub bool, pub M, pub W -); - -pub enum Fill> { - X(W), - Y(W), - XY(W) -} +pub enum Fill> { X(W), Y(W), XY(W) } impl> Fill { fn inner (&self) -> &W { diff --git a/crates/tek_core/src/tui.rs b/crates/tek_core/src/tui.rs index d2496b36..59b697e9 100644 --- a/crates/tek_core/src/tui.rs +++ b/crates/tek_core/src/tui.rs @@ -410,21 +410,6 @@ pub trait TuiStyle: Widget + Sized { } } impl> TuiStyle for W {} -impl, W: Widget> Widget for ModalHost { - type Engine = Tui; - fn layout (&self, to: [u16;2]) -> Perhaps<[u16;2]> { - Ok(Some(to)) - } - fn render (&self, to: &mut TuiOutput) -> Usually<()> { - self.2.render(to)?; - if self.0 { - to.fill_bg(to.area(), COLOR_BG1); - to.fill_fg(to.area(), COLOR_BG2); - self.1.render(to)?; - } - Ok(()) - } -} pub struct Foreground(pub Color); impl Widget for Foreground { diff --git a/crates/tek_sequencer/src/main_arranger.rs b/crates/tek_sequencer/src/main_arranger.rs index ba155dcb..55df5e3a 100644 --- a/crates/tek_sequencer/src/main_arranger.rs +++ b/crates/tek_sequencer/src/main_arranger.rs @@ -72,27 +72,33 @@ struct ArrangerStandalone { impl Content for ArrangerStandalone { type Engine = Tui; fn content (&self) -> impl Widget { - let show = self.arranger.modal.is_some(); - let modal = self.arranger.modal.as_ref().map(|x|x as &dyn Content); - ModalHost(show, modal, Split::down(move|add|{ - add(&(&self.transport as &dyn Widget).debug())?; - if let (Some(direction), Some(sequencer)) = ( - self.show_sequencer, - self.arranger.sequencer(), - ) { - add(&Split::new(direction, move|add|{ - add(&(&self.arranger as &dyn Widget) - .shrink_y(30) - .debug())?; - add(&(sequencer as &dyn Widget) - .min_y(20) - .debug())?; - Ok(()) - })) - } else { - add(&self.arranger) + Layers::new(|add|{ + add(&Split::down(move|add|{ + add(&(&self.transport as &dyn Widget).debug())?; + if let (Some(direction), Some(sequencer)) = ( + self.show_sequencer, + self.arranger.sequencer(), + ) { + add(&Split::new(direction, move|add|{ + add(&(&self.arranger as &dyn Widget) + .shrink_y(30) + .debug())?; + add(&(sequencer as &dyn Widget) + .min_y(20) + .debug())?; + Ok(()) + })) + } else { + add(&self.arranger) + } + })); + if let Some(ref modal) = self.arranger.modal { + add(&Background(COLOR_BG1))?; + add(&Foreground(COLOR_BG2))?; + add(&modal as &dyn Widget)?; } - })) + Ok(()) + }) } } diff --git a/crates/tek_sequencer/src/sequencer.rs b/crates/tek_sequencer/src/sequencer.rs index f35df83f..0c7e04c7 100644 --- a/crates/tek_sequencer/src/sequencer.rs +++ b/crates/tek_sequencer/src/sequencer.rs @@ -34,7 +34,7 @@ pub struct Arranger { /// Display mode of arranger pub mode: ArrangerViewMode, /// Slot for modal dialog displayed on top of app. - pub modal: Option>>, + pub modal: Option>>, /// Whether the arranger is currently focused pub focused: bool } @@ -223,7 +223,7 @@ impl Handle for Arranger { fn handle (&mut self, from: &TuiInput) -> Perhaps { if let Some(modal) = self.modal.as_mut() { let result = modal.handle(from)?; - if modal.exited() { + if from.is_done() { self.modal = None; } return Ok(result) @@ -974,31 +974,30 @@ impl ArrangerRenameModal { } } -impl Widget for ArrangerRenameModal { +impl Content for ArrangerRenameModal { type Engine = Tui; - fn layout (&self, _to: [u16;2]) -> Perhaps<[u16;2]> { - todo!() - } - fn render (&self, to: &mut TuiOutput) -> Usually<()> { - let area = to.area(); - let y = area.y() + area.h() / 2; - let bg_area = [1, y - 1, area.w() - 2, 3]; - to.fill_bg(bg_area, COLOR_BG1); - Lozenge(Style::default().bold().white().dim()).draw(to.with_rect(bg_area)); - let label = match self.target { - ArrangerFocus::Mix => "Rename project:", - ArrangerFocus::Track(_) => "Rename track:", - ArrangerFocus::Scene(_) => "Rename scene:", - ArrangerFocus::Clip(_, _) => "Rename clip:", - }; - let style = Some(Style::default().not_bold().white().not_dim()); - to.blit(&label, area.x() + 3, y, style); - let style = Some(Style::default().bold().white().not_dim()); - to.blit(&self.value, area.x() + 3 + label.len() as u16 + 1, y, style); - let style = Some(Style::default().bold().white().not_dim().reversed()); - to.blit(&"▂", area.x() + 3 + label.len() as u16 + 1 + self.cursor as u16, y, style); + fn content (&self) -> impl Widget { + todo!(); + Layers::new(|add|{Ok(())}) + //let area = to.area(); + //let y = area.y() + area.h() / 2; + //let bg_area = [1, y - 1, area.w() - 2, 3]; + //to.fill_bg(bg_area, COLOR_BG1); + //Lozenge(Style::default().bold().white().dim()).draw(to.with_rect(bg_area)); + //let label = match self.target { + //ArrangerFocus::Mix => "Rename project:", + //ArrangerFocus::Track(_) => "Rename track:", + //ArrangerFocus::Scene(_) => "Rename scene:", + //ArrangerFocus::Clip(_, _) => "Rename clip:", + //}; + //let style = Some(Style::default().not_bold().white().not_dim()); + //to.blit(&label, area.x() + 3, y, style); + //let style = Some(Style::default().bold().white().not_dim()); + //to.blit(&self.value, area.x() + 3 + label.len() as u16 + 1, y, style); + //let style = Some(Style::default().bold().white().not_dim().reversed()); + //to.blit(&"▂", area.x() + 3 + label.len() as u16 + 1 + self.cursor as u16, y, style); //Ok(Some(area)) - Ok(()) + //Ok(()) } }