use crate::{*, browse::*, device::*, menu::*}; /// Various possible dialog modes. /// /// ``` /// let dialog: tek::Dialog = Default::default(); /// ``` #[derive(Debug, Clone, Default, PartialEq)] pub enum Dialog { #[default] None, Help(usize), Menu(usize, MenuItems), Device(usize), Message(Arc), Browse(BrowseTarget, Arc), Options, } namespace!(App: Dialog { symbol = |app| { ":dialog/none" => Dialog::None, ":dialog/options" => Dialog::Options, ":dialog/device" => Dialog::Device(0), ":dialog/device/prev" => Dialog::Device(0), ":dialog/device/next" => Dialog::Device(0), ":dialog/help" => Dialog::Help(0), ":dialog/save" => Dialog::Browse(BrowseTarget::SaveProject, Browse::new(None).unwrap().into()), ":dialog/load" => Dialog::Browse(BrowseTarget::LoadProject, Browse::new(None).unwrap().into()), ":dialog/import/clip" => Dialog::Browse(BrowseTarget::ImportClip(Default::default()), Browse::new(None).unwrap().into()), ":dialog/export/clip" => Dialog::Browse(BrowseTarget::ExportClip(Default::default()), Browse::new(None).unwrap().into()), ":dialog/import/sample" => Dialog::Browse(BrowseTarget::ImportSample(Default::default()), Browse::new(None).unwrap().into()), ":dialog/export/sample" => Dialog::Browse(BrowseTarget::ExportSample(Default::default()), Browse::new(None).unwrap().into()), }; }); impl Dialog { /// ``` /// let _ = tek::Dialog::welcome(); /// ``` pub fn welcome () -> Self { Self::Menu(1, MenuItems([ MenuItem("Resume session".into(), Arc::new(Box::new(|_|Ok(())))), MenuItem("Create new session".into(), Arc::new(Box::new(|app|Ok({ app.dialog = Dialog::None; app.mode = app.config.modes.clone().read().unwrap().get(":arranger").cloned().unwrap(); })))), MenuItem("Load old session".into(), Arc::new(Box::new(|_|Ok(())))), ].into())) } /// FIXME: generalize /// ``` /// let _ = tek::Dialog::welcome().menu_selected(); /// ``` pub fn menu_selected (&self) -> Option { if let Self::Menu(selected, _) = self { Some(*selected) } else { None } } /// FIXME: generalize /// ``` /// let _ = tek::Dialog::welcome().menu_next(); /// ``` pub fn menu_next (&self) -> Self { match self { Self::Menu(index, items) => Self::Menu(wrap_inc(*index, items.0.len()), items.clone()), _ => Self::None } } /// FIXME: generalize /// ``` /// let _ = tek::Dialog::welcome().menu_prev(); /// ``` pub fn menu_prev (&self) -> Self { match self { Self::Menu(index, items) => Self::Menu(wrap_dec(*index, items.0.len()), items.clone()), _ => Self::None } } /// FIXME: generalize /// ``` /// let _ = tek::Dialog::welcome().device_kind(); /// ``` pub fn device_kind (&self) -> Option { if let Self::Device(index) = self { Some(*index) } else { None } } /// FIXME: generalize /// ``` /// let _ = tek::Dialog::welcome().device_kind_next(); /// ``` pub fn device_kind_next (&self) -> Option { self.device_kind().map(|index|(index + 1) % device_kinds().len()) } /// FIXME: generalize /// ``` /// let _ = tek::Dialog::welcome().device_kind_prev(); /// ``` pub fn device_kind_prev (&self) -> Option { self.device_kind().map(|index|index.overflowing_sub(1).0.min(device_kinds().len().saturating_sub(1))) } /// FIXME: implement pub fn message (&self) -> Option<&str> { todo!() } /// FIXME: implement pub fn browser (&self) -> Option<&Arc> { todo!() } /// FIXME: implement pub fn browser_target (&self) -> Option<&BrowseTarget> { todo!() } }