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};