top-level view bindings now use proc macro

This commit is contained in:
🪞👃🪞 2025-05-04 15:30:10 +03:00
parent ff2e981e18
commit 79bf493004
4 changed files with 62 additions and 33 deletions

10
Cargo.lock generated
View file

@ -1521,6 +1521,7 @@ dependencies = [
"tek_device",
"tek_engine",
"tengri",
"tengri_proc",
"toml",
]
@ -1601,6 +1602,15 @@ dependencies = [
"tengri_dsl",
]
[[package]]
name = "tengri_proc"
version = "0.13.0"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tengri_tui"
version = "0.13.0"

View file

@ -23,15 +23,13 @@ lto = false
[workspace.dependencies.tengri]
path = "./deps/tengri/tengri"
#git = "https://codeberg.org/unspeaker/tengri"
#rev = "6048d24"
features = [ "tui", "dsl" ]
[workspace.dependencies.tengri_proc]
path = "./deps/tengri/proc"
[workspace.dependencies.jack]
#git = "https://codeberg.org/unspeaker/rust-jack"
#rev = "a13c1c4"
path = "./deps/rust-jack"
#default-features = false
[workspace.dependencies]
tek_device = { path = "./crates/device" }

View file

@ -2,12 +2,16 @@ use crate::*;
pub(crate) use std::fmt::Write;
pub(crate) use ::tengri::tui::ratatui::prelude::Position;
#[tengri_proc::view(self.config.view)]
#[tengri_proc::view(TuiOut)]
impl Tek {
#[view(":nil")] "nil"
#[tengri::view(":nil")]
fn view_nil (&self) -> impl Content<TuiOut> + use<'_> {
"nil"
}
#[view(":status")] {
#[tengri::view(":status")]
fn view_status (&self) -> impl Content<TuiOut> + use<'_> {
self.update_clock();
let cache = self.view_cache.read().unwrap();
view_status(
@ -16,7 +20,8 @@ impl Tek {
)
}
#[view(":transport")] {
#[tengri::view(":transport")]
fn view_transport (&self) -> impl Content<TuiOut> + use<'_> {
self.update_clock();
let cache = self.view_cache.read().unwrap();
view_transport(
@ -25,34 +30,50 @@ impl Tek {
)
}
#[view(":arranger")] ArrangerView::new(self)
#[tengri::view(":arranger")]
fn view_arranger (&self) -> impl Content<TuiOut> + use<'_> {
ArrangerView::new(self)
}
#[view(":pool")] self.pool()
.map(|p|Fixed::x(self.w_sidebar(), PoolView(self.is_editing(), p)))
#[tengri::view(":pool")]
fn view_pool (&self) -> impl Content<TuiOut> + use<'_> {
self.pool().map(|p|Fixed::x(self.w_sidebar(), PoolView(self.is_editing(), p)))
}
#[view(":editor")] self.editor()
.map(|e|Bsp::n(Bsp::e(e.clip_status(), e.edit_status()), e))
#[tengri::view(":editor")]
fn view_editor (&self) -> impl Content<TuiOut> + use<'_> {
self.editor().map(|e|Bsp::n(Bsp::e(e.clip_status(), e.edit_status()), e))
}
#[view(":samples-keys")] self.sampler()
.map(|s|s.view_list(false, self.editor().unwrap()))
#[tengri::view(":samples-keys")]
fn view_samples_keys (&self) -> impl Content<TuiOut> + use<'_> {
self.sampler().map(|s|s.view_list(false, self.editor().unwrap()))
}
#[view(":samples-grid")] self.sampler()
.map(|s|s.view_grid())
#[tengri::view(":samples-grid")]
fn view_samples_grid (&self) -> impl Content<TuiOut> + use<'_> {
self.sampler().map(|s|s.view_grid())
}
#[view(":sample-viewer")] self.sampler()
.map(|s|s.view_sample(self.editor().unwrap().note_pos()))
#[tengri::view(":sample-viewer")]
fn view_sample_viewer (&self) -> impl Content<TuiOut> + use<'_> {
self.sampler().map(|s|s.view_sample(self.editor().unwrap().note_pos()))
}
#[view(":modal")] When::new(self.modal.is_some(), Bsp::b(
Fill::xy(Tui::fg_bg(Rgb(64,64,64), Rgb(32,32,32), "")),
Fixed::xy(30, 15, Tui::fg_bg(Rgb(255,255,255), Rgb(16,16,16), Bsp::b(
Repeat(" "),
Outer(true, Style::default().fg(Tui::g(96)))
.enclose(self.modal.map(|modal|match modal {
Modal::Menu => self.view_modal_menu().boxed(),
Modal::Help => self.view_modal_help().boxed(),
}))
)))
))
#[tengri::view(":modal")]
fn view_modal (&self) -> impl Content<TuiOut> + use<'_> {
When::new(self.modal.is_some(), Bsp::b(
Fill::xy(Tui::fg_bg(Rgb(64,64,64), Rgb(32,32,32), "")),
Fixed::xy(30, 15, Tui::fg_bg(Rgb(255,255,255), Rgb(16,16,16), Bsp::b(
Repeat(" "),
Outer(true, Style::default().fg(Tui::g(96)))
.enclose(self.modal.map(|modal|match modal {
Modal::Menu => self.view_modal_menu().boxed(),
Modal::Help => self.view_modal_help().boxed(),
}))
)))
))
}
fn view_modal_menu (&self) -> impl Content<TuiOut> {
let options = ||["Projects", "Settings", "Help", "Quit"].iter();
@ -189,7 +210,7 @@ impl Tek {
TrackClip { track, .. } if editing => Some(track),
_ => None
};
let bigger = self.editor_w();
let bigger = self.editor_w();
self.tracks().iter().enumerate().map(move |(index, track)|{
let width = if Some(index) == active.copied() { bigger } else { track.width.max(8) };
let data = (index, track, x, x + width);

2
deps/tengri vendored

@ -1 +1 @@
Subproject commit 21f7f6b38afc966b7b45af442935d48c8c5067d3
Subproject commit b543c43e68154f049019da648064f36af1537434