#![allow(non_snake_case)]
use crate::composable;
use crate::modifier::Modifier;
use crate::widgets::wear::scaling_list::WearScalingListState;
use crate::widgets::wear::scroll_indicator::{ScrollIndicator, ScrollIndicatorSpec};
use crate::widgets::{Box as CranposeBox, BoxSpec};
use cranpose_core::NodeId;
use cranpose_ui_layout::Alignment;
#[derive(Clone, Copy, Debug, PartialEq, Default)]
pub struct ScreenScaffoldSpec {
pub indicator: ScrollIndicatorSpec,
pub show_indicator: bool,
}
impl ScreenScaffoldSpec {
pub fn indicator(mut self, indicator: ScrollIndicatorSpec) -> Self {
self.indicator = indicator;
self.show_indicator = true;
self
}
}
pub const INDICATOR_IDLE_DELAY_MS: u64 = 2000;
pub const INDICATOR_FADE_STIFFNESS: f32 = 400.0;
pub const INDICATOR_FADE_DAMPING_RATIO: f32 = 1.0;
#[composable]
pub fn ScreenScaffold<F>(
modifier: Modifier,
state: WearScalingListState,
spec: ScreenScaffoldSpec,
content: F,
) -> NodeId
where
F: FnMut() + 'static,
{
CranposeBox(
modifier.fill_max_size(),
BoxSpec::default().content_alignment(Alignment::TOP_START),
move || {
content();
if spec.show_indicator {
ScrollIndicator(Modifier::empty(), state.clone(), spec.indicator);
}
},
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_fade_is_the_spring_and_the_delay_wear_declares() {
assert_eq!(INDICATOR_IDLE_DELAY_MS, 2000);
assert_eq!(INDICATOR_FADE_STIFFNESS, 400.0, "StiffnessMediumLow");
assert_eq!(INDICATOR_FADE_DAMPING_RATIO, 1.0);
}
#[test]
fn a_scaffold_shows_no_indicator_until_one_is_asked_for() {
assert!(!ScreenScaffoldSpec::default().show_indicator);
assert!(
ScreenScaffoldSpec::default()
.indicator(ScrollIndicatorSpec::default())
.show_indicator
);
}
}