wip: broken collect enum

This commit is contained in:
🪞👃🪞 2024-08-21 16:46:31 +03:00
parent bb0230b6e5
commit 72f47bc837
6 changed files with 301 additions and 157 deletions

View file

@ -20,8 +20,36 @@ impl ArrangerViewMode {
}
}
use std::iter::IntoIterator;
struct Split<'a>(Collection<'a>, Direction);
impl<'a> Split<'a> {
fn new (direction: Direction) -> Self {
Self(Collection::new(), direction)
}
}
impl<'a> Render for Split<'a> {
fn render (&self, buf: &mut Buffer, area: Rect) -> Usually<Rect> {
Ok(area)
}
}
impl<'a> Collect<'a> for Split<'a> {
fn add (mut self, item: Box<dyn Render>) -> Self {
self.0 = self.0.add(item);
self
}
fn add_ref (mut self, item: &'a dyn Render) -> Self {
self.0 = self.0.add_ref(item);
self
}
}
render!(Arranger |self, buf, area| {
let arrangement = |buf: &mut Buffer, area: Rect| {
let arrangement = Box::new(|buf: &mut Buffer, area: Rect| {
let area = Rect {
x: area.x + 1, width: area.width - 2, y: area.y + 1, height: area.height - 2
};
@ -42,47 +70,87 @@ render!(Arranger |self, buf, area| {
height: area.height + 2,
};
Lozenge(Style::default().fg(Nord::BG2)).draw(buf, area)
};
let area = if let Some(direction) = self.show_sequencer {
let arrangement = arrangement(buf, area)?;
match direction {
Direction::Down => {
let sequencer = if let Some(sequencer) = self.sequencer() {
sequencer.render(buf, Rect {
y: area.y + arrangement.height,
height: area.height - arrangement.height,
..area
})?
} else {
Rect::default()
};
match self.focus_sequencer {
true => {
"[Arrows] Move, [A]dd, [D]elete, [R]ecord, [P]lay".blit(
buf, area.x + 1, area.height - 1, Some(Style::default().dim())
)?;
},
false => {
"[Arrows] Move, [P]lay, [R]ecord, [N]ame, [E]dit, [C-T]rack add, [C-A]dd scene".blit(
buf, area.x + 1, area.y + arrangement.height, Some(Style::default().dim())
)?;
},
}
Corners(Style::default().green().not_dim()).draw(buf, match self.focus_sequencer {
true => sequencer,
false => arrangement,
})?;
},
_ => unimplemented!()
}
Ok(area)
});
let mut layout = Split::new(Direction::Down)
.add_ref(match &self.transport {
Some(transport) => transport as &dyn Render,
None => &() as &dyn Render
});
if let Some(direction) = self.show_sequencer {
layout = layout.add(Box::new(Split::new(direction)
.add(arrangement)));
} else {
arrangement(buf, area)
}?;
if let Some(ref modal) = self.modal {
fill_bg(buf, area, Nord::bg_lo(false, false));
fill_fg(buf, area, Nord::bg_hi(false, false));
modal.render(buf, area)?;
layout = layout.add(arrangement);
}
Ok(area)
layout.render(buf, area)
//.add(if let Some(direction) = self.show_sequencer {
//Box::new(Split::new(direction)
//.add(arrangement))
////.add_ref(&self.sequencer())) as Box<dyn Render>
//} else {
//Box::new(arrangement) as Box<dyn Render>
//})
//.render(buf, area)
//Column([
//self.transport,
//match self.mode {
//ArrangerViewMode::Horizontal =>
//super::arranger_view_h::draw(self, buf, area),
//ArrangerViewMode::VerticalCompact1 =>
//super::arranger_view_v::draw_compact_1(self, buf, area),
//ArrangerViewMode::VerticalCompact2 =>
//super::arranger_view_v::draw_compact_2(self, buf, area),
//ArrangerViewMode::VerticalExpanded =>
//super::arranger_view_v::draw_expanded(self, buf, area),
//},
//let area = if let Some(direction) = self.show_sequencer {
//let arrangement = arrangement(buf, area)?;
//match direction {
//Direction::Down => {
//let sequencer = if let Some(sequencer) = self.sequencer() {
//sequencer.render(buf, Rect {
//y: area.y + arrangement.height,
//height: area.height - arrangement.height,
//..area
//})?
//} else {
//Rect::default()
//};
//match self.focus_sequencer {
//true => {
//"[Arrows] Move, [A]dd, [D]elete, [R]ecord, [P]lay".blit(
//buf, area.x + 1, area.height - 1, Some(Style::default().dim())
//)?;
//},
//false => {
//"[Arrows] Move, [P]lay, [R]ecord, [N]ame, [E]dit, [C-T]rack add, [C-A]dd scene".blit(
//buf, area.x + 1, area.y + arrangement.height, Some(Style::default().dim())
//)?;
//},
//}
//Corners(Style::default().green().not_dim()).draw(buf, match self.focus_sequencer {
//true => sequencer,
//false => arrangement,
//})?;
//},
//_ => unimplemented!()
//}
//Ok(area)
//} else {
//arrangement(buf, area)
//}?;
//if let Some(ref modal) = self.modal {
//fill_bg(buf, area, Nord::bg_lo(false, false));
//fill_fg(buf, area, Nord::bg_hi(false, false));
//modal.render(buf, area)?;
//}
//Ok(area)
});