mirror of
https://codeberg.org/unspeaker/tek.git
synced 2026-04-03 21:00:44 +02:00
Some checks are pending
/ build (push) Waiting to run
gotta replace that Measure thing with RwLock<[u16;2]>
106 lines
3.9 KiB
Rust
106 lines
3.9 KiB
Rust
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<str>),
|
|
Browse(BrowseTarget, Arc<Browse>),
|
|
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<usize> {
|
|
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<usize> {
|
|
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<usize> {
|
|
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<usize> {
|
|
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<Browse>> { todo!() }
|
|
/// FIXME: implement
|
|
pub fn browser_target (&self) -> Option<&BrowseTarget> { todo!() }
|
|
}
|
|
|