95 lines
2.4 KiB
Rust
95 lines
2.4 KiB
Rust
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
|
|
pub enum Page {
|
|
#[default]
|
|
Main,
|
|
Patterns,
|
|
Engine,
|
|
Help,
|
|
Dict,
|
|
Options,
|
|
}
|
|
|
|
impl Page {
|
|
/// All pages for iteration
|
|
pub const ALL: &'static [Page] = &[
|
|
Page::Main,
|
|
Page::Patterns,
|
|
Page::Engine,
|
|
Page::Help,
|
|
Page::Dict,
|
|
Page::Options,
|
|
];
|
|
|
|
/// Grid dimensions (cols, rows)
|
|
pub const GRID_SIZE: (i8, i8) = (3, 2);
|
|
|
|
/// Grid position (col, row) for each page
|
|
/// Layout:
|
|
/// col 0 col 1 col 2
|
|
/// row 0 Dict Patterns Options
|
|
/// row 1 Help Sequencer Engine
|
|
pub const fn grid_pos(self) -> (i8, i8) {
|
|
match self {
|
|
Page::Dict => (0, 0),
|
|
Page::Help => (0, 1),
|
|
Page::Patterns => (1, 0),
|
|
Page::Main => (1, 1),
|
|
Page::Options => (2, 0),
|
|
Page::Engine => (2, 1),
|
|
}
|
|
}
|
|
|
|
/// Find page at grid position, if any
|
|
pub fn at_pos(col: i8, row: i8) -> Option<Page> {
|
|
Self::ALL.iter().copied().find(|p| p.grid_pos() == (col, row))
|
|
}
|
|
|
|
/// Display name for the page
|
|
pub const fn name(self) -> &'static str {
|
|
match self {
|
|
Page::Main => "Sequencer",
|
|
Page::Patterns => "Patterns",
|
|
Page::Engine => "Engine",
|
|
Page::Help => "Help",
|
|
Page::Dict => "Dict",
|
|
Page::Options => "Options",
|
|
}
|
|
}
|
|
|
|
pub fn left(&mut self) {
|
|
let (col, row) = self.grid_pos();
|
|
for offset in 1..=Self::GRID_SIZE.0 {
|
|
let new_col = (col - offset).rem_euclid(Self::GRID_SIZE.0);
|
|
if let Some(page) = Self::at_pos(new_col, row) {
|
|
*self = page;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn right(&mut self) {
|
|
let (col, row) = self.grid_pos();
|
|
for offset in 1..=Self::GRID_SIZE.0 {
|
|
let new_col = (col + offset).rem_euclid(Self::GRID_SIZE.0);
|
|
if let Some(page) = Self::at_pos(new_col, row) {
|
|
*self = page;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn up(&mut self) {
|
|
let (col, row) = self.grid_pos();
|
|
if let Some(page) = Self::at_pos(col, row - 1) {
|
|
*self = page;
|
|
}
|
|
}
|
|
|
|
pub fn down(&mut self) {
|
|
let (col, row) = self.grid_pos();
|
|
if let Some(page) = Self::at_pos(col, row + 1) {
|
|
*self = page;
|
|
}
|
|
}
|
|
}
|