mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 11:46:41 +01:00
94 lines
3.7 KiB
Rust
94 lines
3.7 KiB
Rust
use crate::*;
|
|
impl Tek {
|
|
pub(crate) fn inputs_sizes (&self) -> impl PortsSizes<'_> {
|
|
let mut y = 0;
|
|
self.midi_ins.iter().enumerate().map(move|(i, input)|{
|
|
let height = 1 + input.conn().len();
|
|
let data = (i, input.name(), input.conn(), y, y + height);
|
|
y += height;
|
|
data
|
|
})
|
|
}
|
|
pub(crate) fn outputs_sizes (&self) -> impl PortsSizes<'_> {
|
|
let mut y = 0;
|
|
self.midi_outs.iter().enumerate().map(move|(i, output)|{
|
|
let height = 1 + output.conn().len();
|
|
let data = (i, output.name(), output.conn(), y, y + height);
|
|
y += height;
|
|
data
|
|
})
|
|
}
|
|
pub(crate) fn tracks_sizes <'a> (&'a self) -> impl TracksSizes<'a> {
|
|
let editing = self.is_editing();
|
|
let bigger = self.editor_w();
|
|
let mut x = 0;
|
|
let active = match self.selected() {
|
|
Selection::Track(t) if editing => Some(t),
|
|
Selection::Clip(t, _) if editing => Some(t),
|
|
_ => None
|
|
};
|
|
self.tracks().iter().enumerate().map(move |(index, track)|{
|
|
let width = if Some(index) == active.copied() { bigger } else { track.width.max(8) };
|
|
let data = (index, track, x, x + width);
|
|
x += width + Self::TRACK_SPACING;
|
|
data
|
|
})
|
|
}
|
|
pub(crate) fn tracks_sizes_scrolled <'a> (&'a self) -> impl TracksSizes<'a> {
|
|
let width = self.w_tracks_area();
|
|
self.tracks_sizes().map_while(move|(t, track, x1, x2)|{
|
|
(width > x2 as u16).then_some((t, track, x1, x2))
|
|
})
|
|
}
|
|
pub(crate) fn scenes_sizes (&self, editing: bool, height: usize, larger: usize) -> impl ScenesSizes<'_> {
|
|
let (selected_track, selected_scene) = match self.selected() {
|
|
Selection::Track(t) => (Some(*t), None),
|
|
Selection::Scene(s) => (None, Some(*s)),
|
|
Selection::Clip(t, s) => (Some(*t), Some(*s)),
|
|
_ => (None, None)
|
|
};
|
|
let mut y = 0;
|
|
self.scenes().iter().enumerate().map(move|(s, scene)|{
|
|
let active = editing && selected_track.is_some() && selected_scene == Some(s);
|
|
let height = if active { larger } else { height };
|
|
let data = (s, scene, y, y + height);
|
|
y += height;
|
|
data
|
|
})
|
|
}
|
|
pub(crate) fn scenes_with_colors (&self, editing: bool, h: u16) -> impl ScenesColors<'_> {
|
|
self.scenes_sizes(editing, Self::H_SCENE, Self::H_EDITOR).map_while(
|
|
move|(s, scene, y1, y2)|if y2 as u16 > h {
|
|
None
|
|
} else { Some((s, scene, y1, y2, if s == 0 {
|
|
None
|
|
} else {
|
|
Some(self.scenes[s-1].color)
|
|
}))
|
|
})
|
|
}
|
|
pub(crate) fn scenes_with_track_colors (&self, editing: bool, h: u16, t: usize) -> impl ScenesColors<'_> {
|
|
self.scenes_sizes(editing, Self::H_SCENE, Self::H_EDITOR).map_while(
|
|
move|(s, scene, y1, y2)|if y2 as u16 > h {
|
|
None
|
|
} else { Some((s, scene, y1, y2, if s == 0 {
|
|
None
|
|
} else {
|
|
Some(self.scenes[s-1].clips[t].as_ref()
|
|
.map(|c|c.read().unwrap().color)
|
|
.unwrap_or(ItemPalette::G[32]))
|
|
}))
|
|
})
|
|
}
|
|
}
|
|
|
|
#[cfg(test)] #[test] fn test_view_iter () {
|
|
let mut tek = Tek::default();
|
|
tek.editor = Some(Default::default());
|
|
let _: Vec<_> = tek.inputs_sizes().collect();
|
|
let _: Vec<_> = tek.outputs_sizes().collect();
|
|
let _: Vec<_> = tek.tracks_sizes().collect();
|
|
let _: Vec<_> = tek.scenes_sizes(true, 10, 10).collect();
|
|
let _: Vec<_> = tek.scenes_with_colors(true, 10).collect();
|
|
let _: Vec<_> = tek.scenes_with_track_colors(true, 10, 10).collect();
|
|
}
|