arranger/sequencer control

This commit is contained in:
🪞👃🪞 2024-08-18 20:01:09 +03:00
parent a533951fc6
commit 52e9613d52
6 changed files with 243 additions and 209 deletions

View file

@ -6,63 +6,35 @@ use tek_core::Direction;
/// Represents the tracks and scenes of the composition.
pub struct Arranger {
/// Name of arranger
pub name: String,
pub name: String,
/// Display mode of arranger
pub mode: ArrangerViewMode,
pub mode: ArrangerViewMode,
/// Currently selected element.
pub selected: ArrangerFocus,
pub selected: ArrangerFocus,
/// Collection of tracks.
pub tracks: Vec<Sequencer>,
pub tracks: Vec<Sequencer>,
/// Collection of scenes.
pub scenes: Vec<Scene>,
pub focused: bool,
pub entered: bool,
pub transport: Option<Arc<RwLock<TransportToolbar>>>,
pub show_sequencer: Option<Direction>
pub scenes: Vec<Scene>,
pub focused: bool,
pub entered: bool,
pub transport: Option<Arc<RwLock<TransportToolbar>>>,
pub show_sequencer: Option<Direction>,
pub focus_sequencer: bool,
}
render!(Arranger |self, buf, area| {
let arrangement = |buf, area| 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),
};
if let Some(direction) = self.show_sequencer {
let used = arrangement(buf, area)?;
match direction {
Direction::Down => {
let area = Rect {
y: area.y + used.height,
height: area.height - used.height,
..area
};
self.sequencer().map(|sequencer|sequencer.render(buf, area));
},
_ => unimplemented!()
}
Ok(area)
} else {
arrangement(buf, area)
}
});
impl Arranger {
pub fn new (name: &str) -> Self {
Self {
name: name.into(),
mode: ArrangerViewMode::VerticalCompact2,
selected: ArrangerFocus::Clip(0, 0),
scenes: vec![],
tracks: vec![],
entered: true,
focused: true,
transport: None,
show_sequencer: Some(Direction::Down),
name: name.into(),
mode: ArrangerViewMode::VerticalCompact2,
selected: ArrangerFocus::Clip(0, 0),
scenes: vec![],
tracks: vec![],
entered: true,
focused: true,
transport: None,
show_sequencer: Some(Direction::Down),
focus_sequencer: false,
}
}
pub fn activate (&mut self) {

View file

@ -1,6 +1,24 @@
use crate::*;
handle!(Arranger |self, e| handle_keymap(self, e, KEYMAP_ARRANGER));
handle!(Arranger |self, e| {
match e {
AppEvent::Input(Event::Key(k)) => {
if k.code == KeyCode::Tab {
self.focus_sequencer = !self.focus_sequencer;
Ok(true)
} else if self.focus_sequencer {
if let Some(sequencer) = self.sequencer_mut() {
handle_keymap(sequencer, e, KEYMAP_SEQUENCER)
} else {
Ok(false)
}
} else {
handle_keymap(self, e, KEYMAP_ARRANGER)
}
},
_ => Ok(false),
}
});
/// Key bindings for arranger section.
pub const KEYMAP_ARRANGER: &'static [KeyBinding<Arranger>] = keymap!(Arranger {

View file

@ -1,3 +1,6 @@
use crate::*;
use tek_core::Direction;
/// Display mode of arranger
pub enum ArrangerViewMode {
VerticalExpanded,
@ -16,3 +19,40 @@ impl ArrangerViewMode {
}
}
}
render!(Arranger |self, buf, area| {
let arrangement = |buf, area| 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),
};
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()
};
Corners(Style::default().green().not_dim()).draw(buf, match self.focus_sequencer {
true => sequencer,
false => arrangement,
})?;
},
_ => unimplemented!()
}
Ok(area)
} else {
arrangement(buf, area)
}
});