mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
crop track name
This commit is contained in:
parent
1d8b5d75b9
commit
1891cdabfd
1 changed files with 45 additions and 31 deletions
|
|
@ -23,7 +23,7 @@ impl Content for Arrangement<Tui> {
|
||||||
fn content (&self) -> impl Widget<Engine = Tui> {
|
fn content (&self) -> impl Widget<Engine = Tui> {
|
||||||
Layers::new(move |add|{
|
Layers::new(move |add|{
|
||||||
match self.mode {
|
match self.mode {
|
||||||
ArrangementViewMode::Horizontal => add(&HorizontalArranger(&self)),
|
ArrangementViewMode::Horizontal => add(&HorizontalArranger(&self)),
|
||||||
ArrangementViewMode::Vertical(factor) => add(&VerticalArranger(&self, factor))
|
ArrangementViewMode::Vertical(factor) => add(&VerticalArranger(&self, factor))
|
||||||
}?;
|
}?;
|
||||||
let color = if self.focused{Color::Rgb(150, 160, 90)}else{Color::Rgb(120, 130, 100)};
|
let color = if self.focused{Color::Rgb(150, 160, 90)}else{Color::Rgb(120, 130, 100)};
|
||||||
|
|
@ -45,33 +45,42 @@ impl<'a> Content for VerticalArranger<'a, Tui> {
|
||||||
fn content (&self) -> impl Widget<Engine = Tui> {
|
fn content (&self) -> impl Widget<Engine = Tui> {
|
||||||
let Self(state, factor) = self;
|
let Self(state, factor) = self;
|
||||||
let (cols, rows) = if *factor == 0 {(
|
let (cols, rows) = if *factor == 0 {(
|
||||||
state.track_widths(),
|
state.track_widths(), Scene::ppqs(state.tracks.as_slice(), state.scenes.as_slice()),
|
||||||
Scene::ppqs(state.tracks.as_slice(), state.scenes.as_slice()),
|
|
||||||
)} else {(
|
)} else {(
|
||||||
state.track_widths(),
|
state.track_widths(),
|
||||||
(0..=state.scenes.len()).map(|i|(factor*PPQ, factor*PPQ*i)).collect::<Vec<_>>(),
|
(0..=state.scenes.len()).map(|i|(factor*PPQ, factor*PPQ*i)).collect::<Vec<_>>(),
|
||||||
)};
|
)};
|
||||||
//let height = rows.last().map(|(w,y)|(y+w)/PPQ).unwrap_or(16);
|
|
||||||
let tracks: &[ArrangementTrack<Tui>] = state.tracks.as_ref();
|
let tracks: &[ArrangementTrack<Tui>] = state.tracks.as_ref();
|
||||||
let scenes: &[Scene] = state.scenes.as_ref();
|
let scenes: &[Scene] = state.scenes.as_ref();
|
||||||
let offset = 3 + Scene::longest_name(scenes) as u16;
|
let offset = 3 + Scene::longest_name(scenes) as u16; // x of 1st track
|
||||||
let border_fg = if self.0.focused{Color::Rgb(100, 110, 40)}else{Color::Rgb( 70, 80, 50)};
|
let bg = Color::Rgb(28, 35, 25);
|
||||||
|
let clip_bg = Color::Rgb(40, 50, 30);
|
||||||
let border_bg = Color::Rgb(40, 50, 30);
|
let border_bg = Color::Rgb(40, 50, 30);
|
||||||
let border = Lozenge(Style::default().bg(border_bg).fg(border_fg));
|
let border_hi = Color::Rgb(100, 110, 40);
|
||||||
|
let border_lo = Color::Rgb(70, 80, 50);
|
||||||
|
let border_fg = if self.0.focused { border_hi } else { border_lo };
|
||||||
|
let border = Lozenge(Style::default().bg(border_bg).fg(border_fg));
|
||||||
Layers::new(move |add|{
|
Layers::new(move |add|{
|
||||||
let rows: &[(usize, usize)] = rows.as_ref();
|
let rows: &[(usize, usize)] = rows.as_ref();
|
||||||
let cols: &[(usize, usize)] = cols.as_ref();
|
let cols: &[(usize, usize)] = cols.as_ref();
|
||||||
|
|
||||||
// grid
|
// column separators
|
||||||
add(&CustomWidget::new(|_|Ok(Some([0,0])), move|to: &mut TuiOutput|{
|
add(&CustomWidget::new(|_|Ok(Some([0,0])), move|to: &mut TuiOutput|{
|
||||||
let area = to.area();
|
let area = to.area();
|
||||||
let style = Some(Style::default().fg(COLOR_SEPARATOR));
|
let style = Some(Style::default().fg(COLOR_SEPARATOR));
|
||||||
for (_, x) in cols.iter() {
|
for x in cols.iter().map(|col|col.1) {
|
||||||
let x = offset + area.x() + *x as u16 - 1;
|
let x = offset + area.x() + x as u16 - 1;
|
||||||
for y in area.y()..area.y2() { to.blit(&"▎", x, y, style); }
|
for y in area.y()..area.y2() { to.blit(&"▎", x, y, style); }
|
||||||
}
|
}
|
||||||
for (_, y) in rows.iter() {
|
Ok(())
|
||||||
let y = area.y() + (*y / PPQ) as u16 + 1;
|
}))?;
|
||||||
|
|
||||||
|
// row separators
|
||||||
|
add(&CustomWidget::new(|_|Ok(Some([0,0])), move|to: &mut TuiOutput|{
|
||||||
|
let area = to.area();
|
||||||
|
let style = Some(Style::default().fg(COLOR_SEPARATOR));
|
||||||
|
for y in rows.iter().map(|row|row.1) {
|
||||||
|
let y = area.y() + (y / PPQ) as u16 + 1;
|
||||||
if y >= to.buffer.area.height { break }
|
if y >= to.buffer.area.height { break }
|
||||||
for x in area.x()..area.x2().saturating_sub(2) {
|
for x in area.x()..area.x2().saturating_sub(2) {
|
||||||
if x < to.buffer.area.x && y < to.buffer.area.y {
|
if x < to.buffer.area.x && y < to.buffer.area.y {
|
||||||
|
|
@ -141,11 +150,13 @@ impl<'a> Content for VerticalArranger<'a, Tui> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}))?;
|
}))?;
|
||||||
|
|
||||||
let track_titles = row!((track, (w, _)) in tracks.iter().zip(cols) =>
|
let track_titles = row!((track, w) in tracks.iter().zip(cols.iter().map(|col|col.0))=>{
|
||||||
(&format!("▎{}", &track.name.read().unwrap()).as_str() as &dyn Widget<Engine = Tui>)
|
let name = track.name.read().unwrap();
|
||||||
.min_xy(*w as u16, 2)
|
(&format!("▎{}", &name).as_str())[0..(w+1).min(name.len()+3)]
|
||||||
|
.min_xy(w as u16, 2)
|
||||||
.bg(track.color)
|
.bg(track.color)
|
||||||
.push_x(offset - 1));
|
.push_x(offset - 1)
|
||||||
|
});
|
||||||
|
|
||||||
let scene_name = |scene, playing: bool, height|row!(
|
let scene_name = |scene, playing: bool, height|row!(
|
||||||
if playing { "▶ " } else { " " },
|
if playing { "▶ " } else { " " },
|
||||||
|
|
@ -153,7 +164,7 @@ impl<'a> Content for VerticalArranger<'a, Tui> {
|
||||||
).fixed_xy(offset.saturating_sub(1), height);
|
).fixed_xy(offset.saturating_sub(1), height);
|
||||||
|
|
||||||
let scene_clip = |scene, track: usize, w: u16, h: u16|Layers::new(move |add|{
|
let scene_clip = |scene, track: usize, w: u16, h: u16|Layers::new(move |add|{
|
||||||
let mut color = Color::Rgb(40, 50, 30);
|
let mut color = clip_bg;
|
||||||
match (tracks.get(track), (scene as &Scene).clips.get(track)) {
|
match (tracks.get(track), (scene as &Scene).clips.get(track)) {
|
||||||
(Some(_), Some(Some(phrase))) => {
|
(Some(_), Some(Some(phrase))) => {
|
||||||
let name = &(phrase as &Arc<RwLock<Phrase>>).read().unwrap().name;
|
let name = &(phrase as &Arc<RwLock<Phrase>>).read().unwrap().name;
|
||||||
|
|
@ -166,20 +177,23 @@ impl<'a> Content for VerticalArranger<'a, Tui> {
|
||||||
add(&Background(color))
|
add(&Background(color))
|
||||||
}).fixed_xy(w, h);
|
}).fixed_xy(w, h);
|
||||||
|
|
||||||
let tracks_clips = col!((scene, (pulses, _)) in scenes.iter().zip(rows) => {
|
add(&col!(track_titles, col!(
|
||||||
let height = 1.max((pulses / PPQ) as u16);
|
// scenes:
|
||||||
let playing = scene.is_playing(tracks);
|
(scene, pulses) in scenes.iter().zip(rows.iter().map(|row|row.0)) => {
|
||||||
Stack::right(move |add| {
|
let height = 1.max((pulses / PPQ) as u16);
|
||||||
add(&scene_name(scene, playing, height).bg(scene.color))?;
|
let playing = scene.is_playing(tracks);
|
||||||
for (track, (w, _)) in cols.iter().enumerate() {
|
Stack::right(move |add| {
|
||||||
add(&scene_clip(scene, track, *w as u16, height))?;
|
// scene title:
|
||||||
}
|
add(&scene_name(scene, playing, height).bg(scene.color))?;
|
||||||
Ok(())
|
// clip per track:
|
||||||
}).fixed_y(height)
|
for (track, w) in cols.iter().map(|col|col.0).enumerate() {
|
||||||
});
|
add(&scene_clip(scene, track, w as u16, height))?;
|
||||||
|
}
|
||||||
add(&col!(track_titles, tracks_clips))
|
Ok(())
|
||||||
}).bg(Color::Rgb(28, 35, 25)).border(border)
|
}).fixed_y(height)
|
||||||
|
}
|
||||||
|
)))
|
||||||
|
}).bg(bg).border(border)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl<'a> Content for HorizontalArranger<'a, Tui> {
|
impl<'a> Content for HorizontalArranger<'a, Tui> {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue