wip: refactor pt.28: 16 errors

This commit is contained in:
🪞👃🪞 2024-11-14 16:08:59 +01:00
parent 4522ebaa4b
commit ceead4131c
7 changed files with 84 additions and 62 deletions

View file

@ -1,9 +1,15 @@
use crate::*;
pub trait StatusBar<E: Engine>: Widget<Engine = E> {
fn hotkey_fg () -> Color;
pub trait StatusBar<E: Engine, S>: Widget<Engine = E> {
fn hotkey_fg () -> Color where Self: Sized;
fn command (commands: &[[impl Widget<Engine = Tui>;3]]) -> impl Widget<Engine = Tui> + '_ {
fn update (&mut self, state: &S);
fn command (commands: &[[impl Widget<Engine = Tui>;3]])
-> impl Widget<Engine = Tui> + '_
where
Self: Sized
{
let hotkey_fg = Self::hotkey_fg();
Stack::right(move |add|{
Ok(for [a, b, c] in commands.iter() {

View file

@ -62,7 +62,7 @@ where
pub cursor: (usize, usize),
pub entered: bool,
pub menu_bar: Option<MenuBar<E, A, C>>,
pub status_bar: Option<Box<dyn Widget<Engine = E>>>,
pub status_bar: Option<Box<dyn StatusBar<E, Self>>>,
pub history: Vec<C>,
pub size: Measure<E>,
}
@ -76,7 +76,7 @@ where
pub fn new (
app: A,
menu_bar: Option<MenuBar<E, A, C>>,
status_bar: Option<Box<dyn Widget<Engine = E>>>,
status_bar: Option<Box<dyn StatusBar<E, Self>>>,
) -> Self {
Self {
app,

View file

@ -12,30 +12,30 @@ pub enum ArrangerStatusBar {
PhraseEdit,
}
impl StatusBar<Tui> for ArrangerStatusBar {
fn hotkey_fg () -> Color {
impl StatusBar<Tui, ArrangerApp<Tui>> for ArrangerStatusBar {
fn hotkey_fg () -> Color where Self: Sized {
TuiTheme::hotkey_fg()
}
}
impl ArrangerStatusBar {
fn update <E: Engine> (&mut self, state: &ArrangerView<E>) {
*self = match state.focused() {
fn update (&mut self, state: &ArrangerApp<Tui>) {
use AppViewFocus::*;
if let Content(focused) = state.focused() {
*self = match focused {
ArrangerViewFocus::Transport => ArrangerStatusBar::Transport,
ArrangerViewFocus::Arranger => match state.selected {
ArrangerViewFocus::Arranger => match state.app.selected {
ArrangerFocus::Mix => ArrangerStatusBar::ArrangerMix,
ArrangerFocus::Track(_) => ArrangerStatusBar::ArrangerTrack,
ArrangerFocus::Scene(_) => ArrangerStatusBar::ArrangerScene,
ArrangerFocus::Clip(_, _) => ArrangerStatusBar::ArrangerClip,
},
ArrangerViewFocus::PhrasePool => ArrangerStatusBar::PhrasePool,
ArrangerViewFocus::PhraseEditor => match state.sequencer.editor.entered {
ArrangerViewFocus::PhraseEditor => match state.app.sequencer.editor.entered {
true => ArrangerStatusBar::PhraseEdit,
false => ArrangerStatusBar::PhraseView,
},
}
}
}
}
impl Content for ArrangerStatusBar {
type Engine = Tui;

View file

@ -64,6 +64,9 @@ impl FocusGrid for AppView<Tui, ArrangerView<Tui>, ArrangerViewCommand> {
self.app.sequencer.transport.focused = focused == Content(Transport);
self.app.sequencer.phrases.focused = focused == Content(PhrasePool);
self.app.sequencer.editor.focused = focused == Content(PhraseEditor);
if let Some(status_bar) = self.status_bar {
status_bar.update(&self.app)
}
}
}

View file

@ -17,14 +17,10 @@ impl Handle<Tui> for SequencerView<Tui> {
impl<E: Engine> Command<SequencerView<E>> for SequencerViewCommand {
fn execute (self, state: &mut SequencerView<E>) -> Perhaps<Self> {
match self {
Self::Focus(cmd) =>
delegate(cmd, Self::Focus, state),
Self::Phrases(cmd) =>
delegate(cmd, Self::Phrases, &mut state.phrases),
Self::Editor(cmd) =>
delegate(cmd, Self::Editor, &mut state.editor),
Self::Transport(cmd) =>
delegate(cmd, Self::Transport, &mut state.transport)
Self::Focus(cmd) => delegate(cmd, Self::Focus, state),
Self::Phrases(cmd) => delegate(cmd, Self::Phrases, &mut state.phrases),
Self::Editor(cmd) => delegate(cmd, Self::Editor, &mut state.editor),
Self::Transport(cmd) => delegate(cmd, Self::Transport, &mut state.transport)
}
}
}

View file

@ -52,33 +52,3 @@ impl FocusGrid for AppView<Tui, SequencerView<Tui>, SequencerViewCommand> {
// TODO
}
}
///// Focus layout of sequencer app
//impl<E: Engine> FocusGrid for SequencerView<E> {
//type Item = SequencerFocus;
//fn cursor (&self) -> (usize, usize) {
//self.cursor
//}
//fn cursor_mut (&mut self) -> &mut (usize, usize) {
//&mut self.cursor
//}
//fn layout (&self) -> &[&[SequencerFocus]] { &[
//&[SequencerFocus::Transport],
//&[SequencerFocus::PhrasePool, SequencerFocus::PhraseEditor],
//] }
//fn focus_enter (&mut self) {
//self.entered = true
//}
//fn focus_exit (&mut self) {
//self.entered = false
//}
//fn entered (&self) -> Option<Self::Item> {
//if self.entered { Some(self.focused()) } else { None }
//}
//fn update_focus (&mut self) {
//let focused = self.focused();
//self.transport.focused = focused == SequencerFocus::Transport;
//self.phrases.focused = focused == SequencerFocus::PhrasePool;
//self.editor.focused = focused == SequencerFocus::PhraseEditor;
//}
//}

View file

@ -38,3 +38,50 @@ pub enum TransportViewFocus {
Clock,
Quant,
}
impl FocusGrid for AppView<Tui, TransportView<Tui>, TransportViewCommand> {
type Item = AppViewFocus<TransportViewFocus>;
fn cursor (&self) -> (usize, usize) {
self.cursor
}
fn cursor_mut (&mut self) -> &mut (usize, usize) {
&mut self.cursor
}
fn focus_enter (&mut self) {
let focused = self.focused();
if !self.entered {
self.entered = true;
// TODO
}
}
fn focus_exit (&mut self) {
if self.entered {
self.entered = false;
// TODO
}
}
fn entered (&self) -> Option<Self::Item> {
if self.entered {
Some(self.focused())
} else {
None
}
}
fn layout (&self) -> &[&[Self::Item]] {
use AppViewFocus::*;
use TransportViewFocus::*;
&[
&[Menu],
&[
Content(Bpm),
Content(Sync),
Content(PlayPause),
Content(Clock),
Content(Quant),
],
]
}
fn update_focus (&mut self) {
// TODO
}
}