From 34070de5f7ea22bc53e8d29d50debfb13f2be7d4 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Mon, 1 Sep 2025 21:27:30 +0300 Subject: [PATCH] flatten keybinds, stack component broken --- crates/app/tek_view.rs | 26 ++-- deps/tengri | 2 +- tek.edn | 302 +++++++++++++++++++++-------------------- 3 files changed, 169 insertions(+), 161 deletions(-) diff --git a/crates/app/tek_view.rs b/crates/app/tek_view.rs index 68588942..880bdf6f 100644 --- a/crates/app/tek_view.rs +++ b/crates/app/tek_view.rs @@ -1,8 +1,12 @@ use crate::*; -content!(TuiOut:|self: App|Fill::xy(Stack::above(|add|{ - for dsl in self.mode.view.iter() { add(&Fill::xy(self.view(dsl.as_ref()))); } -}))); +impl Content for App { + fn content (&self) -> impl Render + '_ { + Stack::above(move|add|for dsl in self.mode.view.iter() { + add(&Fill::xy(self.view(dsl.as_ref()))); + }) + } +} impl App { fn view <'t, D: Dsl> (&'t self, index: D) -> TuiBox<'t> { @@ -123,7 +127,7 @@ impl<'t> DslNs<'t, TuiBox<'t>> for App { ":templates" => Box::new({ let modes = app.config.modes.clone(); let height = (modes.read().unwrap().len() * 2) as u16; - Fixed::y(height, Min::x(30, Stack::south(move|add: &mut dyn FnMut(&dyn Render)|{ + Fixed::y(height, Min::x(30, Stack::south(move|add|{ for (index, (id, profile)) in modes.read().unwrap().iter().enumerate() { let bg = if index == 0 { Rgb(70,70,70) } else { Rgb(50,50,50) }; let name = profile.name.get(0).map(|x|x.as_ref()).unwrap_or(""); @@ -138,15 +142,13 @@ impl<'t> DslNs<'t, TuiBox<'t>> for App { } }))) }), - ":sessions" => Box::new(Fixed::y(6, Min::x(30, Stack::south( - move|add: &mut dyn FnMut(&dyn Render)|{ - let fg = Rgb(224, 192, 128); - for (index, name) in ["session1", "session2", "session3"].iter().enumerate() { - let bg = if index == 0 { Rgb(50,50,50) } else { Rgb(40,40,40) }; - add(&Fixed::y(2, Fill::x(Tui::bg(bg, Align::w(Tui::fg(fg, name)))))); - } + ":sessions" => Box::new(Fixed::y(6, Min::x(30, Stack::south(move|add|{ + let fg = Rgb(224, 192, 128); + for (index, name) in ["session1", "session2", "session3"].iter().enumerate() { + let bg = if index == 0 { Rgb(50,50,50) } else { Rgb(40,40,40) }; + add(&Fixed::y(2, Fill::x(Tui::bg(bg, Align::w(Tui::fg(fg, name)))))); } - )))), + })))), ":browse/title" => Box::new(Fill::x(Align::w(FieldV(Default::default(), match app.dialog.browser_target().unwrap() { BrowseTarget::SaveProject => "Save project:", diff --git a/deps/tengri b/deps/tengri index 34982a12..b98fccd9 160000 --- a/deps/tengri +++ b/deps/tengri @@ -1 +1 @@ -Subproject commit 34982a12ba5a3ed989fc032fe490e9cc9cb57334 +Subproject commit b98fccd98ba13be8eabe29d66621a15d025b2042 diff --git a/tek.edn b/tek.edn index c9bd9de5..8f4c82d0 100644 --- a/tek.edn +++ b/tek.edn @@ -1,163 +1,169 @@ -(keys :axis/x (@left x/dec) (@right x/inc)) -(keys :axis/x2 (@shift/left x2/dec) (@shift/right x2/inc)) -(keys :axis/y (@up y/dec) (@down y/inc)) -(keys :axis/y2 (@shift/up y2/dec) (@shift/down y2/inc)) -(keys :axis/z (@minus z/dec) (@equal z/inc)) -(keys :axis/z2 (@underscore z2/dec) (@plus z2/inc)) -(keys :axis/i (@comma i/dec) (@period z/inc)) -(keys :axis/i2 (@lt i2/dec) (@gt z2/inc)) -(keys :axis/w (@openbracket w/dec) (@closebracket w/inc)) -(keys :axis/w2 (@openbrace w2/dec) (@closebrace w2/inc)) +(keys :axis/x + (@left x/dec) + (@right x/inc)) +(keys :axis/x2 + (@shift/left x2/dec) + (@shift/right x2/inc)) +(keys :axis/y + (@up y/dec) + (@down y/inc)) +(keys :axis/y2 + (@shift/up y2/dec) + (@shift/down y2/inc)) +(keys :axis/z + (@minus z/dec) + (@equal z/inc)) +(keys :axis/z2 + (@underscore z2/dec) + (@plus z2/inc)) +(keys :axis/i + (@comma i/dec) + (@period z/inc)) +(keys :axis/i2 + (@lt i2/dec) + (@gt z2/inc)) +(keys :axis/w + (@openbracket w/dec) + (@closebracket w/inc)) +(keys :axis/w2 + (@openbrace w2/dec) + (@closebrace w2/inc)) (mode :menu (keys :axis/y :confirm) :menu) -(keys :confirm (@enter confirm)) -(view :menu (bg (g 40) (bsp/s :ports/out (bsp/n :ports/in - (bg (g 30) (bsp/s (fixed/y 7 :logo) (fill/xy :dialog/menu))))))) -(view :ports/out (fill/x (fixed/y 3 (bsp/a (fill/x (align/w (text L-AUDIO-OUT))) - (bsp/a (text MIDI-OUT) (fill/x (align/e (text AUDIO-OUT-R)))))))) -(view :ports/in (fill/x (fixed/y 3 (bsp/a (fill/x (align/w (text L-AUDIO-IN))) - (bsp/a (text MIDI-IN) (fill/x (align/e (text AUDIO-IN-R)))))))) -(view :browse (bsp/s (padding/xy 3 1 :browse-title) (enclose (fg (g 96)) browser))) - -(keys :help (@f1 dialog :help)) -(keys :back (@escape back)) -(keys :page (@pgup page/up) (@pgdn page/down)) -(keys :delete (@delete delete) (@backspace delete/back)) -(keys :input (see :axis/x :delete) (:char input)) -(keys :list (see :axis/y :confirm)) -(keys :length (see :axis/x :axis/y :confirm)) -(keys :browse (see :list :input :focus)) -(keys :history (@u undo 1) (@r redo 1)) -(keys :clock (@space clock/toggle 0) (@shift/space clock/toggle 0)) -(keys :color (@c color)) -(keys :launch (@q launch)) -(keys :saveload (@f6 dialog :save) (@f9 dialog :load)) -(keys :global (see :history :saveload) (@f8 dialog :options) (@f10 dialog :quit)) +(keys :confirm + (@enter confirm)) +(view :menu (bg (g 40) (bsp/s + :ports/out + (bsp/n :ports/in (bg (g 30) (bsp/s (fixed/y 7 :logo) (fill/xy :dialog/menu))))))) +(view :ports/out (fill/x (fixed/y 3 (bsp/a + (fill/x (align/w (text L-AUDIO-OUT))) + (bsp/a (text MIDI-OUT) (fill/x (align/e (text AUDIO-OUT-R)))))))) +(view :ports/in (fill/x (fixed/y 3 (bsp/a + (fill/x (align/w (text L-AUDIO-IN))) + (bsp/a (text MIDI-IN) (fill/x (align/e (text AUDIO-IN-R)))))))) +(view :browse (bsp/s + (padding/xy 3 1 :browse-title) + (enclose (fg (g 96)) browser))) +(keys :help + (@f1 dialog :help)) +(keys :back + (@escape back)) +(keys :page + (@pgup page/up) + (@pgdn page/down)) +(keys :delete + (@delete delete) + (@backspace delete/back)) +(keys :input (see :axis/x :delete) + (:char input)) +(keys :list (see :axis/y :confirm)) +(keys :length (see :axis/x :axis/y :confirm)) +(keys :browse (see :list :input :focus)) +(keys :history + (@u undo 1) + (@r redo 1)) +(keys :clock + (@space clock/toggle 0) + (@shift/space clock/toggle 0)) +(keys :color + (@c color)) +(keys :launch + (@q launch)) +(keys :saveload + (@f6 dialog :save) + (@f9 dialog :load)) +(keys :global (see :history :saveload) + (@f8 dialog :options) + (@f10 dialog :quit)) (keys :focus) - -(mode :transport (name Transport) - (info A JACK transport controller.) - (keys :clock :global) - (view :transport)) - -(mode :arranger - (name Arranger) - (info A grid of launchable clips arranged by track and scene.) - (mode :editor (keys :editor)) - (mode :dialog (keys :dialog)) - (mode :message (keys :message)) - (mode :add-device (keys :add-device)) - (mode :browse (keys :browse)) - (mode :rename (keys :input)) - (mode :length (keys :rename)) - (mode :clip (keys :clip)) - (mode :track (keys :track)) - (mode :scene (keys :scene)) - (mode :mix (keys :mix)) - (keys :clock :arranger :global) - :arranger) - -(view :arranger (bsp/n :status (bsp/w :meters/output (bsp/e :meters/input - (bsp/n :tracks/inputs (bsp/s :tracks/outputs (bsp/s :tracks/names (bsp/s :tracks/devices - (fill/xy (either :mode/editor (bsp/e :scenes/names :editor) :scenes)))))))))) - +(mode :transport (name Transport) (info A JACK transport controller.) (keys :clock :global) + (view :transport)) +(mode :arranger (name Arranger) (info A grid of launchable clips arranged by track and scene.) + (mode :editor (keys :editor)) (mode :dialog (keys :dialog)) (mode :message (keys :message)) + (mode :add-device (keys :add-device)) (mode :browse (keys :browse)) (mode :rename (keys :input)) + (mode :length (keys :rename)) (mode :clip (keys :clip)) (mode :track (keys :track)) + (mode :scene (keys :scene)) (mode :mix (keys :mix)) + (keys :clock :arranger :global) :arranger) +(view :arranger (bsp/n + :status + (bsp/w :meters/output (bsp/e :meters/input :arrangement)))) +(view :arrangement (bsp/n + :tracks/inputs + (bsp/s :tracks/outputs (bsp/s :tracks/names (bsp/s :tracks/devices + (fill/xy (either :mode/editor (bsp/e :scenes/names :editor) :scenes))))))) (keys :arranger (see :color :launch :scenes :tracks) - (@tab project/edit) (@enter project/edit) - (@shift/I project/input/add) (@shift/O project/output/add) - (@shift/S project/scene/add) (@shift/T project/track/add) - (@shift/D dialog/show :dialog/device)) - + (@tab project/edit) (@enter project/edit) + (@shift/I project/input/add) (@shift/O project/output/add) + (@shift/S project/scene/add) (@shift/T project/track/add) + (@shift/D dialog/show :dialog/device)) (keys :tracks - (@t select :select/track) - (@left select :select/track/dec) - (@right select :select/track/inc)) - + (@t select :select/track) + (@left select :select/track/dec) + (@right select :select/track/inc)) (keys :scenes - (@s select :select/scene) - (@up select :select/scene/dec) - (@down select :select/scene/inc)) - + (@s select :select/scene) + (@up select :select/scene/dec) + (@down select :select/scene/inc)) (keys :track (see :color :launch :axis/z :axis/z2 :delete) - (@r toggle :rec) - (@m toggle :mon) - (@p toggle :play) - (@P toggle :solo)) - + (@r toggle :rec) + (@m toggle :mon) + (@p toggle :play) + (@P toggle :solo)) (keys :scene (see :color :launch :axis/z :axis/z2 :delete)) - -(keys :clip (see :color :launch :axis/z :axis/z2 :delete) - (@l toggle :loop)) - -(mode :groovebox - (name Groovebox) - (info A sequencer with built-in sampler.) - (mode browse (keys :browse)) - (mode rename (keys :pool-rename)) - (mode length (keys :pool-length)) - (keys :clock :editor :sampler :global) - (view :groovebox)) - -(view :groovebox (bsp/w :meters/output (bsp/e :meters/input (bsp/w - (fill/y (align/n - (stack/s :midi-ins/status :midi-outs/status :audio-ins/status :audio-outs/status :pool))) - (bsp/n - (fixed/y :h-sample-detail (bsp/e - (fill/y (fixed/x 20 (align/nw :sample-status))) - :sample-viewer)) - (bsp/e (fill/y (align/n (bsp/s :status/v :editor-status))) - (bsp/e :samples/keys :editor))))))) - -(mode :sampler - (name Sampler) - (info A sampling soundboard.) - (keys :sampler :global) - (view :sampler)) - -(view :sampler - (bsp/s (fixed/y 1 :transport) (bsp/n (fixed/y 1 :status) (fill/xy :samples/grid)))) - -(keys :sampler - (see :sampler/directions :sampler/record :sampler/play)) -(keys :sampler/play - (@p sampler/play/sample :sample/selected) - (@P sampler/stop/sample :sample/selected)) +(keys :clip (see :color :launch :axis/z :axis/z2 :delete) + (@l toggle :loop)) +(mode :groovebox (name Groovebox) (info A sequencer with built-in sampler.) + (mode browse (keys :browse)) + (mode rename (keys :pool-rename)) + (mode length (keys :pool-length)) + (keys :clock :editor :sampler :global) (view :groovebox)) +(view :groovebox (bsp/w + :meters/output + (bsp/e :meters/input (bsp/w :groove/meta :groove/editor)))) +(view :groove/meta (fill/y (align/n (stack/s + :midi-ins/status :midi-outs/status :audio-ins/status :audio-outs/status :pool)))) +(view :groove/editor (bsp/n + :groove/sample + :groove/sequence)) +(view :groove/sample (fixed/y :h-sample-detail (bsp/e + (fill/y (fixed/x 20 (align/nw :sample-status))) + :sample-viewer))) +(view :groove/sequence (bsp/e + (fill/y (align/n (bsp/s :status/v :editor-status))) + (bsp/e :samples/keys :editor))) +(mode :sampler (name Sampler) (info A sampling soundboard.) + (keys :sampler :global) (view :sampler)) +(view :sampler (bsp/s + (fixed/y 1 :transport) + (bsp/n (fixed/y 1 :status) (fill/xy :samples/grid)))) +(keys :sampler (see :sampler/directions :sampler/record :sampler/play)) (keys :sampler/record - (@r sampler/record/toggle :sample/selected) - (@shift/R sampler/record/back)) + (@r sampler/record/toggle :sample/selected) (@shift/R sampler/record/back)) +(keys :sampler/play + (@p sampler/play/sample :sample/selected) (@P sampler/stop/sample :sample/selected)) (keys :sampler/import-export - (@shift/f6 dialog :dialog/export/sample) - (@shift/f9 dialog :dialog/import/sample)) + (@shift/f6 dialog :dialog/export/sample) (@shift/f9 dialog :dialog/import/sample)) (keys :sampler/directions - (@up sampler/select :sample/above) - (@down sampler/select :sample/below) - (@left sampler/select :sample/to/left) - (@right sampler/select :sample/to/right)) - -(mode :sequencer - (name Sequencer) - (info A MIDI sequencer.) - (mode browse (keys :browse)) - (mode rename (keys :pool/rename)) - (mode length (keys :pool/length)) - (keys :editor :clock :global) - (view :sequencer)) - + (@up sampler/select :sample/above) + (@down sampler/select :sample/below) + (@left sampler/select :sample/to/left) + (@right sampler/select :sample/to/right)) +(mode :sequencer (name Sequencer) (info A MIDI sequencer.) + (mode browse (keys :browse)) (mode rename (keys :pool/rename)) (mode length (keys :pool/length)) + (keys :editor :clock :global) (view :sequencer)) (view :sequencer (bsp/s - (fixed/y 1 :transport) - (bsp/n (fixed/y 1 :status) - (fill/xy (bsp/a (fill/xy (align/e :pool)) - :editor))))) - -(keys :sequencer (see :color :launch) - (@shift/I input/add) - (@shift/O output/add)) -(keys :pool (see :axis-y :axis-w :axis/z2 :color :delete) - (@n rename/begin) (@t length/begin) (@m import/begin) (@x export/begin) - (@shift/A clip/add :after :new/clip) - (@shift/D clip/add :after :cloned/clip)) + (fixed/y 1 :transport) + (bsp/n (fixed/y 1 :status) (fill/xy (bsp/a (fill/xy (align/e :pool)) :editor))))) (keys :editor (see :editor/view :editor/note)) (keys :editor/view (see :axis/x :axis/x2 :axis/z :axis/z2) - (@z toggle :lock)) + (@z toggle :lock)) (keys :editor/note (see :axis/i :axis/i2 :axis/y :page) - (@a editor/append :true) (@enter editor/append :false) - (@del editor/delete/note) (@shift/del editor/delete/note)) + (@a editor/append :true) + (@enter editor/append :false) + (@del editor/delete/note) + (@shift/del editor/delete/note)) +(keys :pool (see :axis-y :axis-w :axis/z2 :color :delete) + (@n rename/begin) (@t length/begin) (@m import/begin) (@x export/begin) + (@shift/A clip/add :after :new/clip) (@shift/D clip/add :after :cloned/clip)) +(keys :sequencer (see :color :launch) + (@shift/I input/add) (@shift/O output/add))