mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 11:46:41 +01:00
app: wrap keys and view in Configuration
This commit is contained in:
parent
0e5207a79d
commit
6ed0627056
4 changed files with 102 additions and 94 deletions
|
|
@ -75,8 +75,7 @@ provide!(usize: |self: MidiEditor| {
|
|||
":time-zoom-prev" => self.time_zoom().get().saturating_sub(1).max(1),
|
||||
});
|
||||
|
||||
|
||||
handle!(TuiIn: |self: Tek, input|Ok(if let Some(command) = self.keys.command(self, input) {
|
||||
handle!(TuiIn: |self: Tek, input|Ok(if let Some(command) = self.config.keys.command(self, input) {
|
||||
let undo = command.execute(self)?;
|
||||
if let Some(undo) = undo {
|
||||
self.history.push(undo);
|
||||
|
|
|
|||
|
|
@ -48,14 +48,12 @@ pub struct Tek {
|
|||
pub history: Vec<TekCommand>,
|
||||
/// Port handles
|
||||
pub ports: std::collections::BTreeMap<u32, Port<Unowned>>,
|
||||
/// View definition
|
||||
pub view: SourceIter<'static>,
|
||||
// Cache of formatted strings
|
||||
pub view_cache: Arc<RwLock<ViewCache>>,
|
||||
// Modal overlay
|
||||
pub modal: Option<Modal>,
|
||||
// Input keymap
|
||||
pub keys: InputMap<'static, Self, TekCommand, TuiIn, TokenIter<'static>>
|
||||
// View and input definition
|
||||
pub config: Configuration
|
||||
}
|
||||
|
||||
impl Tek {
|
||||
|
|
@ -421,6 +419,15 @@ pub trait HasSelection {
|
|||
fn selected_mut (&mut self) -> &mut Selection;
|
||||
}
|
||||
|
||||
/// Configuration
|
||||
#[derive(Default, Debug)]
|
||||
pub struct Configuration {
|
||||
/// View definition
|
||||
pub view: SourceIter<'static>,
|
||||
// Input keymap
|
||||
pub keys: InputMap<'static, Tek, TekCommand, TuiIn, TokenIter<'static>>
|
||||
}
|
||||
|
||||
/// Various possible modal overlays
|
||||
#[derive(PartialEq, Clone, Copy, Debug)]
|
||||
pub enum Modal {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ use crate::*;
|
|||
pub(crate) use std::fmt::Write;
|
||||
pub(crate) use ::tengri::tui::ratatui::prelude::Position;
|
||||
|
||||
view!(TuiOut: |self: Tek| self.size.of(View(self, self.view)); {
|
||||
view!(TuiOut: |self: Tek| self.size.of(View(self, self.config.view)); {
|
||||
":nil" => Box::new("nil"),
|
||||
":modal" => self.view_modal(),
|
||||
":status" => self.view_status(),
|
||||
|
|
@ -42,7 +42,7 @@ impl Tek {
|
|||
}
|
||||
|
||||
fn view_modal_help (&self) -> impl Content<TuiOut> + use<'_> {
|
||||
let bindings = ||self.keys.layers.iter()
|
||||
let bindings = ||self.config.keys.layers.iter()
|
||||
.filter_map(|a|(a.0)(self).then_some(a.1))
|
||||
.flat_map(|a|a)
|
||||
.filter_map(|x|if let Value::Exp(_, iter)=x.value{
|
||||
|
|
|
|||
|
|
@ -105,6 +105,41 @@ impl Cli {
|
|||
jack: jack.clone(),
|
||||
color: ItemTheme::random(),
|
||||
clock: Clock::new(jack, self.bpm)?,
|
||||
pool: match mode {
|
||||
LaunchMode::Sequencer | LaunchMode::Groovebox => clip.as_ref().map(Into::into),
|
||||
LaunchMode::Arranger { .. } => Some(Default::default()),
|
||||
_ => None,
|
||||
},
|
||||
editor: match mode {
|
||||
LaunchMode::Sequencer | LaunchMode::Groovebox => clip.as_ref().map(Into::into),
|
||||
LaunchMode::Arranger { .. } => Some(Default::default()),
|
||||
_ => None
|
||||
},
|
||||
midi_ins,
|
||||
midi_outs,
|
||||
midi_buf: match mode {
|
||||
LaunchMode::Clock
|
||||
| LaunchMode::Sampler => vec![],
|
||||
LaunchMode::Sequencer
|
||||
| LaunchMode::Groovebox
|
||||
| LaunchMode::Arranger {..} => vec![vec![];65536],
|
||||
_ => todo!("{mode:?}"),
|
||||
},
|
||||
tracks: match mode {
|
||||
LaunchMode::Sequencer => vec![
|
||||
Track::new_sequencer()
|
||||
],
|
||||
LaunchMode::Groovebox => vec![
|
||||
Track::new_groovebox(jack, midi_froms.as_slice(), audio_froms, audio_tos)?
|
||||
],
|
||||
LaunchMode::Sampler => vec![
|
||||
Track::new_sampler(jack, midi_froms.as_slice(), audio_froms, audio_tos)?
|
||||
],
|
||||
_ => vec![]
|
||||
},
|
||||
scenes,
|
||||
selected: Selection::TrackClip { track: 0, scene: 0 },
|
||||
config: Configuration {
|
||||
view: SourceIter(match mode {
|
||||
LaunchMode::Clock =>
|
||||
include_str!("../../config/view_transport.edn"),
|
||||
|
|
@ -188,40 +223,7 @@ impl Cli {
|
|||
.layer(SourceIter(include_str!("../../config/keys_arranger.edn")).into()),
|
||||
_ => todo!("{mode:?}"),
|
||||
},
|
||||
pool: match mode {
|
||||
LaunchMode::Sequencer | LaunchMode::Groovebox => clip.as_ref().map(Into::into),
|
||||
LaunchMode::Arranger { .. } => Some(Default::default()),
|
||||
_ => None,
|
||||
},
|
||||
editor: match mode {
|
||||
LaunchMode::Sequencer | LaunchMode::Groovebox => clip.as_ref().map(Into::into),
|
||||
LaunchMode::Arranger { .. } => Some(Default::default()),
|
||||
_ => None
|
||||
},
|
||||
midi_ins,
|
||||
midi_outs,
|
||||
midi_buf: match mode {
|
||||
LaunchMode::Clock
|
||||
| LaunchMode::Sampler => vec![],
|
||||
LaunchMode::Sequencer
|
||||
| LaunchMode::Groovebox
|
||||
| LaunchMode::Arranger {..} => vec![vec![];65536],
|
||||
_ => todo!("{mode:?}"),
|
||||
},
|
||||
tracks: match mode {
|
||||
LaunchMode::Sequencer => vec![
|
||||
Track::new_sequencer()
|
||||
],
|
||||
LaunchMode::Groovebox => vec![
|
||||
Track::new_groovebox(jack, midi_froms.as_slice(), audio_froms, audio_tos)?
|
||||
],
|
||||
LaunchMode::Sampler => vec![
|
||||
Track::new_sampler(jack, midi_froms.as_slice(), audio_froms, audio_tos)?
|
||||
],
|
||||
_ => vec![]
|
||||
},
|
||||
scenes,
|
||||
selected: Selection::TrackClip { track: 0, scene: 0 },
|
||||
..Default::default()
|
||||
};
|
||||
if let &LaunchMode::Arranger { scenes, tracks, track_width, .. } = mode {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue