maolan 0.1.0

Rust DAW application for recording, editing, routing, automation, export, and plugin hosting
use super::*;

impl Maolan {
    pub(super) fn handle_track_selection_message(
        &mut self,
        message: Message,
    ) -> Option<Task<Message>> {
        match message {
            Message::ShiftPressed => {
                if !self.state.blocking_read().hw_loaded {
                    return Some(Task::none());
                }
                self.state.blocking_write().shift = true;
                None
            }
            Message::ShiftReleased => {
                if !self.state.blocking_read().hw_loaded {
                    return Some(Task::none());
                }
                self.state.blocking_write().shift = false;
                None
            }
            Message::CtrlPressed => {
                if !self.state.blocking_read().hw_loaded {
                    return Some(Task::none());
                }
                self.state.blocking_write().ctrl = true;
                None
            }
            Message::CtrlReleased => {
                if !self.state.blocking_read().hw_loaded {
                    return Some(Task::none());
                }
                self.state.blocking_write().ctrl = false;
                None
            }
            Message::SelectTrack(ref name) => {
                let now = Instant::now();
                let track_name = name.clone();
                let ctrl = self.state.blocking_read().ctrl;
                let mut state = self.state.blocking_write();
                state.track_context_menu = None;
                if ctrl {
                    state.connections_last_track_click = None;
                } else if let Some((last_track, last_time)) = &state.connections_last_track_click
                    && *last_track == track_name
                    && now.duration_since(*last_time) <= DOUBLE_CLICK.saturating_mul(2)
                {
                    state.connections_last_track_click = None;
                    return Some(Task::perform(async {}, move |_| {
                        Message::OpenTrackPlugins(track_name)
                    }));
                } else {
                    state.connections_last_track_click = Some((track_name.clone(), now));
                }

                if ctrl {
                    state.selected.insert(name.clone());
                    if let ConnectionViewSelection::Tracks(set) =
                        &mut state.connection_view_selection
                    {
                        set.insert(name.clone());
                    } else {
                        let mut set = std::collections::HashSet::new();
                        set.insert(name.clone());
                        state.connection_view_selection = ConnectionViewSelection::Tracks(set);
                    }
                } else {
                    state.selected.clear();
                    state.selected.insert(name.clone());
                    let mut set = std::collections::HashSet::new();
                    set.insert(name.clone());
                    state.connection_view_selection = ConnectionViewSelection::Tracks(set);
                }
                None
            }
            Message::SelectTrackFromMixer(ref name) => {
                let ctrl = self.state.blocking_read().ctrl;
                let mut state = self.state.blocking_write();
                state.track_context_menu = None;
                state.connections_last_track_click = None;

                if ctrl {
                    state.selected.insert(name.clone());
                    if let ConnectionViewSelection::Tracks(set) =
                        &mut state.connection_view_selection
                    {
                        set.insert(name.clone());
                    } else {
                        let mut set = std::collections::HashSet::new();
                        set.insert(name.clone());
                        state.connection_view_selection = ConnectionViewSelection::Tracks(set);
                    }
                } else {
                    state.selected.clear();
                    state.selected.insert(name.clone());
                    let mut set = std::collections::HashSet::new();
                    set.insert(name.clone());
                    state.connection_view_selection = ConnectionViewSelection::Tracks(set);
                }
                None
            }
            _ => None,
        }
    }
}