mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
arranger/sequencer control
This commit is contained in:
parent
a533951fc6
commit
52e9613d52
6 changed files with 243 additions and 209 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue