mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-10 13:46:42 +01:00
wip: borrow checker battles
This commit is contained in:
parent
1d4db3c629
commit
7fbb40fad6
38 changed files with 778 additions and 708 deletions
|
|
@ -22,52 +22,7 @@ pub struct TransportToolbar {
|
|||
pub sync: TransportSync,
|
||||
pub clock: TransportClock,
|
||||
}
|
||||
|
||||
focusable!(TransportToolbar);
|
||||
|
||||
focus!(TransportToolbar (focus) : 5 => [
|
||||
playing, bpm, quant, sync, clock
|
||||
]);
|
||||
process!(TransportToolbar |self, _client, scope| {
|
||||
self.update(&scope);
|
||||
Control::Continue
|
||||
});
|
||||
|
||||
pub struct TransportPlayPauseButton {
|
||||
pub value: Option<TransportState>,
|
||||
pub focused: bool
|
||||
}
|
||||
focusable!(TransportPlayPauseButton);
|
||||
|
||||
pub struct TransportBPM {
|
||||
pub value: f64,
|
||||
pub focused: bool
|
||||
}
|
||||
focusable!(TransportBPM);
|
||||
|
||||
pub struct TransportQuantize {
|
||||
pub value: usize,
|
||||
pub focused: bool
|
||||
}
|
||||
focusable!(TransportQuantize);
|
||||
|
||||
pub struct TransportSync {
|
||||
pub value: usize,
|
||||
pub focused: bool
|
||||
}
|
||||
focusable!(TransportSync);
|
||||
|
||||
pub struct TransportClock {
|
||||
pub frame: usize,
|
||||
pub pulse: usize,
|
||||
pub ppq: usize,
|
||||
pub usecs: usize,
|
||||
pub focused: bool,
|
||||
}
|
||||
focusable!(TransportClock);
|
||||
|
||||
impl TransportToolbar {
|
||||
|
||||
pub fn standalone () -> Usually<Arc<RwLock<Self>>> {
|
||||
let mut transport = Self::new(None);
|
||||
transport.focused = true;
|
||||
|
|
@ -86,7 +41,6 @@ impl TransportToolbar {
|
|||
);
|
||||
Ok(transport)
|
||||
}
|
||||
|
||||
pub fn new (transport: Option<Transport>) -> Self {
|
||||
let timebase = Arc::new(Timebase::default());
|
||||
Self {
|
||||
|
|
@ -124,7 +78,6 @@ impl TransportToolbar {
|
|||
jack: None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn toggle_play (&mut self) -> Usually<()> {
|
||||
let transport = self.transport.as_ref().unwrap();
|
||||
self.playing.value = match self.playing.value.expect("1st frame has not been processed yet") {
|
||||
|
|
@ -140,7 +93,6 @@ impl TransportToolbar {
|
|||
};
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn update (&mut self, scope: &ProcessScope) -> (bool, usize, usize, usize, usize, f64) {
|
||||
let CycleTimes {
|
||||
current_frames,
|
||||
|
|
@ -177,21 +129,122 @@ impl TransportToolbar {
|
|||
period_usecs as f64
|
||||
)
|
||||
}
|
||||
|
||||
pub fn bpm (&self) -> usize {
|
||||
self.timebase.bpm() as usize
|
||||
}
|
||||
|
||||
pub fn ppq (&self) -> usize {
|
||||
self.timebase.ppq() as usize
|
||||
}
|
||||
|
||||
pub fn pulse (&self) -> usize {
|
||||
self.timebase.frame_to_pulse(self.clock.frame as f64) as usize
|
||||
}
|
||||
|
||||
pub fn usecs (&self) -> usize {
|
||||
self.timebase.frame_to_usec(self.clock.frame as f64) as usize
|
||||
}
|
||||
|
||||
}
|
||||
impl<'a> Focus<5, TuiOutput<'a>, Rect> for TransportToolbar {
|
||||
fn focus (&self) -> usize {
|
||||
self.focus
|
||||
}
|
||||
fn focus_mut (&mut self) -> &mut usize {
|
||||
&mut self.focus
|
||||
}
|
||||
fn focusable (&self) -> [&dyn Focusable<TuiOutput<'a>, Rect>;5] {
|
||||
[
|
||||
&self.playing as &dyn Focusable<TuiOutput<'a>, Rect>,
|
||||
&self.bpm as &dyn Focusable<TuiOutput<'a>, Rect>,
|
||||
&self.quant as &dyn Focusable<TuiOutput<'a>, Rect>,
|
||||
&self.sync as &dyn Focusable<TuiOutput<'a>, Rect>,
|
||||
&self.clock as &dyn Focusable<TuiOutput<'a>, Rect>,
|
||||
]
|
||||
}
|
||||
fn focusable_mut (&mut self) -> [&mut dyn Focusable<TuiOutput<'a>, Rect>;5] {
|
||||
[
|
||||
&mut self.playing as &mut dyn Focusable<TuiOutput<'a>, Rect>,
|
||||
&mut self.bpm as &mut dyn Focusable<TuiOutput<'a>, Rect>,
|
||||
&mut self.quant as &mut dyn Focusable<TuiOutput<'a>, Rect>,
|
||||
&mut self.sync as &mut dyn Focusable<TuiOutput<'a>, Rect>,
|
||||
&mut self.clock as &mut dyn Focusable<TuiOutput<'a>, Rect>,
|
||||
]
|
||||
}
|
||||
}
|
||||
impl<'a> Focusable<TuiOutput<'a>, Rect> for TransportToolbar {
|
||||
fn is_focused (&self) -> bool {
|
||||
self.focused
|
||||
}
|
||||
fn set_focused (&mut self, focused: bool) {
|
||||
self.focused = focused
|
||||
}
|
||||
}
|
||||
process!(TransportToolbar |self, _client, scope| {
|
||||
self.update(&scope);
|
||||
Control::Continue
|
||||
});
|
||||
|
||||
pub struct TransportPlayPauseButton {
|
||||
pub value: Option<TransportState>,
|
||||
pub focused: bool
|
||||
}
|
||||
impl<'a> Focusable<TuiOutput<'a>, Rect> for TransportPlayPauseButton {
|
||||
fn is_focused (&self) -> bool {
|
||||
self.focused
|
||||
}
|
||||
fn set_focused (&mut self, focused: bool) {
|
||||
self.focused = focused
|
||||
}
|
||||
}
|
||||
|
||||
pub struct TransportBPM {
|
||||
pub value: f64,
|
||||
pub focused: bool
|
||||
}
|
||||
impl<'a> Focusable<TuiOutput<'a>, Rect> for TransportBPM {
|
||||
fn is_focused (&self) -> bool {
|
||||
self.focused
|
||||
}
|
||||
fn set_focused (&mut self, focused: bool) {
|
||||
self.focused = focused
|
||||
}
|
||||
}
|
||||
|
||||
pub struct TransportQuantize {
|
||||
pub value: usize,
|
||||
pub focused: bool
|
||||
}
|
||||
impl<'a> Focusable<TuiOutput<'a>, Rect> for TransportQuantize {
|
||||
fn is_focused (&self) -> bool {
|
||||
self.focused
|
||||
}
|
||||
fn set_focused (&mut self, focused: bool) {
|
||||
self.focused = focused
|
||||
}
|
||||
}
|
||||
|
||||
pub struct TransportSync {
|
||||
pub value: usize,
|
||||
pub focused: bool
|
||||
}
|
||||
impl<'a> Focusable<TuiOutput<'a>, Rect> for TransportSync {
|
||||
fn is_focused (&self) -> bool {
|
||||
self.focused
|
||||
}
|
||||
fn set_focused (&mut self, focused: bool) {
|
||||
self.focused = focused
|
||||
}
|
||||
}
|
||||
|
||||
pub struct TransportClock {
|
||||
pub frame: usize,
|
||||
pub pulse: usize,
|
||||
pub ppq: usize,
|
||||
pub usecs: usize,
|
||||
pub focused: bool,
|
||||
}
|
||||
impl<'a> Focusable<TuiOutput<'a>, Rect> for TransportClock {
|
||||
fn is_focused (&self) -> bool {
|
||||
self.focused
|
||||
}
|
||||
fn set_focused (&mut self, focused: bool) {
|
||||
self.focused = focused
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue