fix arranger cursor width

This commit is contained in:
🪞👃🪞 2024-12-23 20:00:17 +01:00
parent 2b08738992
commit 3a4f069aa6
2 changed files with 14 additions and 13 deletions

View file

@ -10,16 +10,13 @@ pub fn main () -> Usually<()> {
pub struct ArrangerCli { pub struct ArrangerCli {
/// Name of JACK client /// Name of JACK client
#[arg(short, long)] #[arg(short, long)]
name: Option<String>, name: Option<String>,
/// Whether to include a transport toolbar (default: true) /// Whether to include a transport toolbar (default: true)
#[arg(short, long, default_value_t = true)] #[arg(short, long, default_value_t = true)]
transport: bool, transport: bool,
/// Number of tracks /// Number of tracks
#[arg(short = 'x', long, default_value_t = 4)] #[arg(short = 'x', long, default_value_t = 4)]
tracks: usize, tracks: usize,
/// Number of scenes /// Number of scenes
#[arg(short, long, default_value_t = 8)] #[arg(short, long, default_value_t = 8)]
scenes: usize, scenes: usize,

View file

@ -1,11 +1,15 @@
use crate::*; use crate::*;
const HEADER_H: u16 = 3; const HEADER_H: u16 = 5;
const SCENES_W_OFFSET: u16 = 3; const SCENES_W_OFFSET: u16 = 3;
impl ArrangerTui { impl ArrangerTui {
pub fn render_mode_v (state: &ArrangerTui, factor: usize) -> impl Render<Tui> + use<'_> { pub fn render_mode_v (state: &ArrangerTui, factor: usize) -> impl Render<Tui> + use<'_> {
lay!([ lay!([
ArrangerVColSep::from(state), ArrangerVRowSep::from((state, factor)), ArrangerVColSep::from(state),
col!([ArrangerVHead::from(state), ArrangerVBody::from((state, factor))]), ArrangerVRowSep::from((state, factor)),
col!([
ArrangerVHead::from(state),
ArrangerVClips::from((state, factor))
]),
ArrangerVCursor::from((state, factor)), ArrangerVCursor::from((state, factor)),
]) ])
} }
@ -172,8 +176,8 @@ render!(<Tui>|self: ArrangerVCursor|render(move|to: &mut TuiOutput|{
to.fill_fg([x + width, y, 1, height], bg); to.fill_fg([x + width, y, 1, height], bg);
} }
if let Some([_, y, _, height]) = scene_area { if let Some([_, y, _, height]) = scene_area {
to.fill_ul([area.x(), y - 1, area.w(), 1], bg); to.fill_ul([area.x(), y - 1, area.w() + self.scenes_w, 1], bg);
to.fill_ul([area.x(), y + height - 1, area.w(), 1], bg); to.fill_ul([area.x(), y + height - 1, area.w() + self.scenes_w, 1], bg);
} }
Ok(if focused { Ok(if focused {
to.render_in(if let Some(clip_area) = clip_area { clip_area } to.render_in(if let Some(clip_area) = clip_area { clip_area }
@ -182,25 +186,25 @@ render!(<Tui>|self: ArrangerVCursor|render(move|to: &mut TuiOutput|{
else { area.clip_w(self.scenes_w).clip_h(HEADER_H) }, &RETICLE)? else { area.clip_w(self.scenes_w).clip_h(HEADER_H) }, &RETICLE)?
}) })
})); }));
pub struct ArrangerVBody<'a> { pub struct ArrangerVClips<'a> {
size: &'a Measure<Tui>, size: &'a Measure<Tui>,
scenes: &'a Vec<ArrangerScene>, scenes: &'a Vec<ArrangerScene>,
tracks: &'a Vec<ArrangerTrack>, tracks: &'a Vec<ArrangerTrack>,
rows: Vec<(usize, usize)>, rows: Vec<(usize, usize)>,
} }
from!(<'a>|args:(&'a ArrangerTui, usize)|ArrangerVBody<'a> = Self { from!(<'a>|args:(&'a ArrangerTui, usize)|ArrangerVClips<'a> = Self {
size: &args.0.size, size: &args.0.size,
scenes: &args.0.scenes, scenes: &args.0.scenes,
tracks: &args.0.tracks, tracks: &args.0.tracks,
rows: ArrangerScene::ppqs(args.0.scenes(), args.1), rows: ArrangerScene::ppqs(args.0.scenes(), args.1),
}); });
render!(<Tui>|self: ArrangerVBody<'a>|Fixed::h( render!(<Tui>|self: ArrangerVClips<'a>|Fixed::h(
(self.size.h() as u16).saturating_sub(HEADER_H), (self.size.h() as u16).saturating_sub(HEADER_H),
col!((scene, pulses) in self.scenes.iter().zip(self.rows.iter().map(|row|row.0)) => { col!((scene, pulses) in self.scenes.iter().zip(self.rows.iter().map(|row|row.0)) => {
Self::format_scene(&self.tracks, scene, pulses) Self::format_scene(&self.tracks, scene, pulses)
}) })
)); ));
impl<'a> ArrangerVBody<'a> { impl<'a> ArrangerVClips<'a> {
fn format_scene ( fn format_scene (
tracks: &'a [ArrangerTrack], scene: &'a ArrangerScene, pulses: usize tracks: &'a [ArrangerTrack], scene: &'a ArrangerScene, pulses: usize
) -> impl Render<Tui> + use<'a> { ) -> impl Render<Tui> + use<'a> {