fix ci; fix deps breakage from upgrade

This commit is contained in:
🪞👃🪞 2024-12-30 23:08:49 +01:00
parent 6600d8fc3c
commit 7c652135ad
6 changed files with 25 additions and 38 deletions
.forgejo/workflows
.gitmodulesREADME.md
engine/src
layout/src
src

View file

@ -5,9 +5,7 @@ jobs:
image: nixos/nix:latest image: nixos/nix:latest
steps: steps:
- run: nix-channel --list && nix-channel --update - run: nix-channel --list && nix-channel --update
- run: nix-shell -p git --command 'git clone $GITHUB_SERVER_URL/$GITHUB_REPOSITORY .' - run: nix-shell -p git --command 'git clone --recursive $GITHUB_SERVER_URL/$GITHUB_REPOSITORY .'
- run: nix-shell -p git --command 'cd rust-jack && git remote set-url origin https://codeberg.org/unspeaker/rust-jack'
- run: nix-shell -p git --command 'git submodule update --init --recursive'
- run: whoami && pwd && ls -al - run: whoami && pwd && ls -al
- run: nix-shell --command 'cargo version -vv && cargo test && cargo build --release && cloc crates/tek/src' .forgejo/workflows/build.nix - run: nix-shell --command 'cargo version -vv && cargo test && cargo build --release && cloc crates/tek/src' .forgejo/workflows/build.nix
- run: "docker run --security-opt seccomp=unconfined -v $PWD:/volume xd009642/tarpaulin cargo tarpaulin --out Html --all-features" - run: "docker run --security-opt seccomp=unconfined -v $PWD:/volume xd009642/tarpaulin cargo tarpaulin --out Html --all-features"

2
.gitmodules vendored
View file

@ -1,4 +1,4 @@
[submodule "rust-jack"] [submodule "rust-jack"]
path = rust-jack path = rust-jack
url = git@codeberg.org:unspeaker/rust-jack.git url = https://codeberg.org/unspeaker/rust-jack
branch = timebase branch = timebase

View file

@ -32,9 +32,7 @@ the project roadmap is at https://codeberg.org/unspeaker/tek/milestones
* **requirements:** linux; jack or pipewire; 24-bit terminal (i use `kitty`) * **requirements:** linux; jack or pipewire; 24-bit terminal (i use `kitty`)
* **recommended:** midi controller; samples in wav format; lv2 plugins. * **recommended:** midi controller; samples in wav format; lv2 plugins.
### installation ### arch linux
#### arch linux
[tek](https://codeberg.org/unspeaker/tek) is available as a package in the AUR. [tek](https://codeberg.org/unspeaker/tek) is available as a package in the AUR.
you can install it using an AUR helper (e.g. `paru`): you can install it using an AUR helper (e.g. `paru`):

View file

@ -19,6 +19,7 @@ pub(crate) use ratatui::{
prelude::{Color, Style, Buffer}, prelude::{Color, Style, Buffer},
style::Modifier, style::Modifier,
backend::{Backend, CrosstermBackend, ClearType}, backend::{Backend, CrosstermBackend, ClearType},
layout::{Size, Rect},
buffer::Cell buffer::Cell
}; };
@ -64,11 +65,11 @@ impl Tui {
/// Construct a new TUI engine and wrap it for shared ownership. /// Construct a new TUI engine and wrap it for shared ownership.
pub fn new () -> Usually<Arc<RwLock<Self>>> { pub fn new () -> Usually<Arc<RwLock<Self>>> {
let backend = CrosstermBackend::new(stdout()); let backend = CrosstermBackend::new(stdout());
let area = backend.size()?; let Size { width, height } = backend.size()?;
Ok(Arc::new(RwLock::new(Self { Ok(Arc::new(RwLock::new(Self {
exited: Arc::new(AtomicBool::new(false)), exited: Arc::new(AtomicBool::new(false)),
buffer: Buffer::empty(area), buffer: Buffer::empty(Rect { x: 0, y: 0, width, height }),
area: [area.x, area.y, area.width, area.height], area: [0, 0, width, height],
backend, backend,
}))) })))
} }
@ -133,25 +134,23 @@ impl<T: Render<Tui> + Handle<Tui> + Sized + 'static> TuiRun<T> for Arc<RwLock<Tu
let exited = self.read().unwrap().exited.clone(); let exited = self.read().unwrap().exited.clone();
let engine = self.clone(); let engine = self.clone();
let state = state.clone(); let state = state.clone();
let size = engine.read().unwrap().backend.size().expect("get size failed"); let Size { width, height } = engine.read().unwrap().backend.size().expect("get size failed");
let mut buffer = Buffer::empty(size); let mut buffer = Buffer::empty(Rect { x: 0, y: 0, width, height });
spawn(move || loop { spawn(move || loop {
if exited.fetch_and(true, Relaxed) { if exited.fetch_and(true, Relaxed) {
break break
} }
let size = engine.read().unwrap().backend.size() let Size { width, height } = engine.read().unwrap().backend.size()
.expect("get size failed"); .expect("get size failed");
if let Ok(state) = state.try_read() { if let Ok(state) = state.try_read() {
let size = Rect { x: 0, y: 0, width, height };
if buffer.area != size { if buffer.area != size {
engine.write().unwrap().backend.clear_region(ClearType::All) engine.write().unwrap().backend.clear_region(ClearType::All)
.expect("clear failed"); .expect("clear failed");
buffer.resize(size); buffer.resize(size);
buffer.reset(); buffer.reset();
} }
let mut output = TuiOutput { let mut output = TuiOutput { buffer, area: [0, 0, width, height] };
buffer,
area: [size.x, size.y, size.width, size.height]
};
state.render(&mut output).expect("render failed"); state.render(&mut output).expect("render failed");
buffer = engine.write().unwrap().flip(output.buffer, size); buffer = engine.write().unwrap().flip(output.buffer, size);
} }

View file

@ -136,21 +136,12 @@ transform_xy_unit!(Fixed
}); });
transform_xy_unit!(Shrink transform_xy_unit!(Shrink
|self, to|Ok( |self, to|Ok(self.content().min_size(to)?
self.content().min_size(to)?.map(|to|match *self { .map(|wh|wh.wh())
Self::X(w, _) => [ .map(|[w, h]|[
if to.w() > w { to.w() - w } else { 0.into() }, w.minus(self.dx()).into(),
to.h() h.minus(self.dy()).into()
], ].into())),
Self::Y(h, _) => [
to.w(),
if to.h() > h { to.h() - h } else { 0.into() }
],
Self::XY(w, h, _) => [
if to.w() > w { to.w() - w } else { 0.into() },
if to.h() > h { to.h() - h } else { 0.into() }
],
}.into())),
|self, to|Ok(self.min_size(to.area().wh().into())? |self, to|Ok(self.min_size(to.area().wh().into())?
.map(|size|to.render_in(to.area().clip(size).into(), &self.content())) .map(|size|to.render_in(to.area().clip(size).into(), &self.content()))
.transpose()?.unwrap_or(()))); .transpose()?.unwrap_or(())));

View file

@ -10,21 +10,23 @@ pub struct TransportTui {
pub size: Measure<Tui>, pub size: Measure<Tui>,
pub cursor: (usize, usize), pub cursor: (usize, usize),
pub focus: TransportFocus, pub focus: TransportFocus,
pub color: ItemPalette,
} }
from_jack!(|jack|TransportTui Self { from_jack!(|jack|TransportTui Self {
jack: jack.clone(), jack: jack.clone(),
clock: ClockModel::from(jack), clock: ClockModel::from(jack),
size: Measure::new(), size: Measure::new(),
cursor: (0, 0), cursor: (0, 0),
focus: TransportFocus::PlayPause focus: TransportFocus::PlayPause,
color: ItemPalette::random(),
}); });
has_clock!(|self: TransportTui|&self.clock); has_clock!(|self: TransportTui|&self.clock);
audio!(|self: TransportTui, client, scope|ClockAudio(self).process(client, scope)); audio!(|self: TransportTui, client, scope|ClockAudio(self).process(client, scope));
handle!(<Tui>|self: TransportTui, from|TransportCommand::execute_with_state(self, from)); handle!(<Tui>|self: TransportTui, from|TransportCommand::execute_with_state(self, from));
render!(<Tui>|self: TransportTui|row!([ render!(<Tui>|self: TransportTui|Fixed::y(3, row!([
Fixed::xy(5, 3, PlayPause(false)), " ", Fixed::x(5, PlayPause(false)),
Fixed::y(3, TransportView::new(self, None, true)) " ", Shrink::x(1, TransportView::new(self, Some(self.color), true)),
])); ])));
impl std::fmt::Debug for TransportTui { impl std::fmt::Debug for TransportTui {
fn fmt (&self, f: &mut std::fmt::Formatter<'_>) -> std::result::Result<(), std::fmt::Error> { fn fmt (&self, f: &mut std::fmt::Formatter<'_>) -> std::result::Result<(), std::fmt::Error> {
f.debug_struct("TransportTui") f.debug_struct("TransportTui")
@ -88,7 +90,6 @@ impl TransportView {
render!(<Tui>|self: TransportView|{ render!(<Tui>|self: TransportView|{
let color = self.color; let color = self.color;
Fixed::y(3, Tui::bg(color.base.rgb, Fill::x(row!([ Fixed::y(3, Tui::bg(color.base.rgb, Fill::x(row!([
//PlayPause(self.started), " ",
col!([ col!([
TransportField(" Beat", self.beat.as_str(), &color), TransportField(" Beat", self.beat.as_str(), &color),
TransportField(" Time", format!("{:.1}s", self.current_second).as_str(), &color), TransportField(" Time", format!("{:.1}s", self.current_second).as_str(), &color),