mirror of
https://codeberg.org/unspeaker/tek.git
synced 2026-10-08 18:56:42 +02:00
This commit is contained in:
parent
186b81f29c
commit
ca774cca41
21 changed files with 2160 additions and 2191 deletions
|
|
@ -1,18 +1,5 @@
|
|||
use crate::*;
|
||||
|
||||
pub type Clips = Vec<Arc<RwLock<MidiClip>>>;
|
||||
|
||||
pub trait HasClips {
|
||||
/// Active clip slot (immutable). Use this to access or modify current clip.
|
||||
fn clip (&self) -> Option<Arc<RwLock<MidiClip>>>;
|
||||
/// Active clip slot (mutable). Use this to place or remove a clip at current position.
|
||||
fn clip_mut (&self) -> &mut Option<Arc<RwLock<MidiClip>>>;
|
||||
/// Clip list (immutable). Use this to access or modify more than one clip.
|
||||
fn clips <'a> (&'a self) -> RwLockReadGuard<'a, Clips>;
|
||||
/// Clip list (mutable). Use this to define or delete new clips.
|
||||
fn clips_mut <'a> (&'a self) -> RwLockWriteGuard<'a, Clips>;
|
||||
}
|
||||
|
||||
/// A MIDI sequence.
|
||||
///
|
||||
/// ```
|
||||
|
|
@ -130,88 +117,3 @@ const MIDI_PANIC: MidiMessage = MidiMessage::Controller {
|
|||
pub type MidiData = Vec<Vec<MidiMessage>>;
|
||||
impl PartialEq for MidiClip { fn eq (&self, other: &Self) -> bool { self.uuid == other.uuid } }
|
||||
impl Eq for MidiClip {}
|
||||
|
||||
|
||||
impl HasClipsSize for App { fn clips_size (&self) -> &Sizer { &self.project.size_inner } }
|
||||
impl HasClipsSize for Project { fn clips_size (&self) -> &Sizer { &self.size_inner } }
|
||||
pub trait HasClipsSize {
|
||||
/// Size of clips area.
|
||||
fn clips_size (&self) -> &Sizer;
|
||||
/// Draw content annotated with value of [Self::clips_size].
|
||||
fn with_clips_size (&self, show: bool, content: impl Draw<Tui>) -> impl Draw<Tui> {
|
||||
let size = self.clips_size();
|
||||
above(
|
||||
when(show, fg(Green, east!(size.w() as usize, "x", size.h() as usize)).align_se()),
|
||||
size.of(content.align_c().full_wh())
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: TracksView + ScenesView + Send + Sync> ClipsView for T {}
|
||||
|
||||
pub trait ClipsView: TracksView + ScenesView {
|
||||
|
||||
/// Draw clips per scene
|
||||
fn view_scenes_clips (&self) -> impl Draw<Tui> {
|
||||
let select = self.selection();
|
||||
let editor = self.editor();
|
||||
let editing = self.is_editing();
|
||||
self.with_clips_size(true, iter_east(move||self.tracks_with_sizes()
|
||||
.map(move|(track_index, track, _, _)|iter_south(move||self.scenes_with_sizes()
|
||||
.map(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_selected = view_scene_sel(select, track_index, scene_index, editing);
|
||||
below(
|
||||
Outer(true, Style::default().fg(o)).full_wh(),
|
||||
below(
|
||||
below(
|
||||
fg_bg(o, b, "".full_wh()),
|
||||
fg_bg(f, b, bold(true, name)).align_nw().full_wh(),
|
||||
),
|
||||
when(is_selected, editor).full_wh()
|
||||
).full_wh()
|
||||
).exact_wh(
|
||||
view_scene_w(track, select, track_index, editor.as_ref()),
|
||||
view_scene_y(select, scene_index, editor.as_ref()),
|
||||
)
|
||||
})
|
||||
)
|
||||
.exact_w(track.width as u16))
|
||||
)).align_c()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub fn get_opt_arc_rwlock_midiclip <'a> (state: &App, src: impl Language)
|
||||
-> Perhaps<Option<Arc<RwLock<MidiClip>>>>
|
||||
{
|
||||
eval_word(src, |word|Ok(match word {
|
||||
|
||||
":selected" if let Selection::TrackClip {
|
||||
track, scene
|
||||
} = state.selection() => {
|
||||
state.scenes()[*scene].clips[*track].clone()
|
||||
},
|
||||
|
||||
//":selected-or-create" if let Selection::TrackClip {
|
||||
//track, scene
|
||||
//} = state.selection() => Some(if let Some(Some(clip)) = state.scenes()[*scene].clips.get(*track) {
|
||||
//clip.clone()
|
||||
//} else {
|
||||
//let clip: Arc<RwLock<MidiClip>> = Arc::new(RwLock::new(Default::default()));
|
||||
//state.scenes()[*scene].clips[*track] = Some(clip.clone());
|
||||
//clip
|
||||
//}),
|
||||
|
||||
_ => return err!("not a clip: {word}")
|
||||
|
||||
}))
|
||||
}
|
||||
|
||||
pub fn get_opt_vec_opt_arc_rwlock_midiclip <'a> (_: &App, _: impl Language)
|
||||
-> Perhaps<Option<Vec<Option<Arc<RwLock<MidiClip>>>>>>
|
||||
{
|
||||
todo!()
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue