toggle edit mode with editor

This commit is contained in:
i do not exist 2026-09-24 11:24:36 +03:00
parent ea74aba7b7
commit 767f917302
5 changed files with 156 additions and 144 deletions

View file

@ -906,61 +906,11 @@ fn view_modes <'a, S: HasModeStack> (state: &'a S) -> impl Draw<Tui> + 'a {
})
}
/// Draw clips per scene
fn view_scenes_clips <S: TracksView + ScenesView> (state: &S) -> impl Draw<Tui> {
let select = state.selection();
let editor = state.editor();
let editing = state.is_editing();
let sized = move|it|state.with_clips_size(true, it).align_c();
let tracks = move|it|iter_east(move||state.tracks_with_sizes().map(it));
let scenes = move|it|iter_south(move||state.scenes_with_sizes().map(it));
sized(tracks(move|(track_index, track, _, _)|{
let w = view_track_w(select, track_index, track, editor.as_ref()) as u16;
scenes(move|(scene_index, scene, _, _)|{
let (name, theme): (Arc<str>, ItemTheme) = view_scene_name_theme(scene, track_index);
let f = theme.lightest.term;
let (b, o) = view_scene_bg(theme, select, track_index, scene_index);
let is_sel = view_scene_sel(select, track_index, scene_index, editing);
below(
Outer(true, Style::default().fg(o)).full_wh(),
above(
below(
fg_bg(o, b, "".full_wh()),
fg_bg(f, b, bold(true, name)).align_nw().full_wh(),
),
when(is_sel, editor).full_wh()
).full_wh()
).exact_wh(w, view_scene_y(select, scene_index, editor.as_ref()),)
}).exact_w(w)
}))
}
pub fn view_scene_bg (
theme: ItemTheme, select: &Selection, track_index: usize, scene_index: usize
) -> (Color, Color) {
let mut outline = theme.base.term;
(if select.track() == Some(track_index) && select.scene() == Some(scene_index) {
outline = theme.lighter.term;
theme.light.term
} else if select.track() == Some(track_index) || select.scene() == Some(scene_index) {
outline = theme.darkest.term;
theme.base.term
} else {
theme.dark.term
}, outline)
}
pub fn view_scene_sel (
select: &Selection, track_index: usize, scene_index: usize, editing: bool
) -> bool {
editing && select.track() == Some(track_index) && select.scene() == Some(scene_index)
}
pub fn view_track_w (
select: &Selection, track_index: usize, track: &Track, editor: Option<&MidiEditor>
) -> u16 {
if select.track() == Some(track_index) && let Some(editor) = editor {
(editor.size.w() as usize).max(24).max(track.width) as u16
(editor.size.w() as usize).max(20).max(track.width) as u16
} else {
track.width as u16
}
@ -970,16 +920,6 @@ pub(crate) fn track_width (_index: usize, track: &Track) -> u16 {
track.width as u16
}
pub fn view_scene_y (
select: &Selection, scene_index: usize, editor: Option<&MidiEditor>
) -> u16 {
if select.scene() == Some(scene_index) && let Some(editor) = editor {
editor.size.h().max(12)
} else {
Scene::DEFAULT_HEIGHT as u16
}
}
pub fn draw_sample (
to: &mut Tui, x: u16, y: u16, note: Option<&u7>, sample: &Sample, focus: bool
) -> Usually<usize> {
@ -1169,6 +1109,61 @@ pub fn view_scene_name <'a> (
bg(c, above(a, b.push_y(1)).align_nw().exact_h(h))
}
/// Draw clips per scene
fn view_scenes_clips <S: TracksView + ScenesView> (state: &S) -> impl Draw<Tui> {
let select = state.selection();
let editor = state.editor();
let editing = state.is_editing();
let sized = move|it|state.with_clips_size(true, it).align_c();
let tracks = move|it|iter_east(move||state.tracks_with_sizes().map(it));
let scenes = move|it|iter_south(move||state.scenes_with_sizes().map(it));
sized(tracks(move|(track_index, track, _, _)|{
let w = view_track_w(select, track_index, track, editor.as_ref()) as u16;
scenes(move|(scene_index, scene, _, _)|{
let (name, theme): (Arc<str>, ItemTheme) = view_scene_name_theme(scene, track_index);
let f = theme.lightest.term;
let (b, o) = view_scene_bg(theme, select, track_index, scene_index);
let is_sel = view_scene_sel(select, track_index, scene_index, editing);
let border = Outer(true, Style::default().fg(o)).full_wh();
let title = below(fg_bg(o, b, "".full_wh()),
fg_bg(f, b, bold(true, name)).align_nw().full_wh());
above(border, above(title, when(is_sel, editor).full_wh()).full_wh())
.exact_wh(w, view_scene_y(select, scene_index, editor.as_ref()),)
}).exact_w(w)
}))
}
pub fn view_scene_bg (
theme: ItemTheme, select: &Selection, track_index: usize, scene_index: usize
) -> (Color, Color) {
let mut outline = theme.base.term;
(if select.track() == Some(track_index) && select.scene() == Some(scene_index) {
outline = theme.lighter.term;
theme.light.term
} else if select.track() == Some(track_index) || select.scene() == Some(scene_index) {
outline = theme.darkest.term;
theme.base.term
} else {
theme.dark.term
}, outline)
}
pub fn view_scene_sel (
select: &Selection, track_index: usize, scene_index: usize, editing: bool
) -> bool {
editing && select.track() == Some(track_index) && select.scene() == Some(scene_index)
}
pub fn view_scene_y (
select: &Selection, scene_index: usize, editor: Option<&MidiEditor>
) -> u16 {
if select.scene() == Some(scene_index) && let Some(editor) = editor {
editor.size.h().max(13)
} else {
Scene::DEFAULT_HEIGHT as u16
}
}
pub fn view_clip_info (editor: &MidiEditor) -> impl Draw<Tui> + '_ {
let (
_color, name, length, looped
@ -1512,7 +1507,7 @@ pub fn draw_piano_bg (
cell.set_char('=');
} else if (127 - note) % 6 == 0 {
cell.set_fg(clip.color.darker.term);
cell.set_char('—');
cell.set_char('-');
} else {
cell.set_fg(clip.color.darker.term);
cell.set_char('·');