47 lines
1.4 KiB
Rust
47 lines
1.4 KiB
Rust
pub trait CyclicEnum: Sized + Copy + PartialEq + 'static {
|
|
const VARIANTS: &'static [Self];
|
|
|
|
fn next(self) -> Self {
|
|
let pos = Self::VARIANTS.iter().position(|v| *v == self).unwrap_or(0);
|
|
Self::VARIANTS[(pos + 1) % Self::VARIANTS.len()]
|
|
}
|
|
|
|
fn prev(self) -> Self {
|
|
let len = Self::VARIANTS.len();
|
|
let pos = Self::VARIANTS.iter().position(|v| *v == self).unwrap_or(0);
|
|
Self::VARIANTS[(pos + len - 1) % len]
|
|
}
|
|
}
|
|
|
|
pub mod audio;
|
|
pub mod color_scheme;
|
|
pub mod editor;
|
|
pub mod file_browser;
|
|
pub mod live_keys;
|
|
pub mod modal;
|
|
pub mod mute;
|
|
pub mod options;
|
|
pub mod panel;
|
|
pub mod patterns_nav;
|
|
pub mod playback;
|
|
pub mod project;
|
|
pub mod sample_browser;
|
|
pub mod ui;
|
|
|
|
pub use audio::{AudioSettings, DeviceKind, EngineSection, MainLayout, Metrics, SettingKind};
|
|
pub use color_scheme::ColorScheme;
|
|
pub use editor::{
|
|
CopiedStepData, CopiedSteps, EditorContext, EuclideanField, PatternField, PatternPropsField,
|
|
StackCache,
|
|
};
|
|
pub use live_keys::LiveKeyState;
|
|
pub use modal::Modal;
|
|
pub use options::{OptionsFocus, OptionsState};
|
|
pub use panel::{PanelFocus, PanelState, SidePanel};
|
|
pub use patterns_nav::{PatternsColumn, PatternsNav};
|
|
pub use mute::MuteState;
|
|
pub use playback::{PlaybackState, StagedChange, StagedMuteChange};
|
|
pub use project::ProjectState;
|
|
pub use sample_browser::SampleBrowserState;
|
|
pub use ui::{DictFocus, FlashKind, HelpFocus, UiState};
|