use cushy::animation::{LinearInterpolate, PercentBetween};
use cushy::figures::units::Lp;
use cushy::figures::Ranged;
use cushy::value::{Destination, Dynamic, ForEach, IntoReader, Source};
use cushy::widget::MakeWidget;
use cushy::widgets::checkbox::Checkable;
use cushy::widgets::input::InputValue;
use cushy::widgets::slider::Slidable;
use cushy::Run;
fn main() -> cushy::Result {
let enabled = Dynamic::new(true);
u8_slider()
.and(u8_range_slider())
.and(enum_slider())
.into_rows()
.with_enabled(enabled.clone())
.and(enabled.into_checkbox("Enabled"))
.into_rows()
.expand_horizontally()
.contain()
.width(..Lp::points(800))
.pad()
.centered()
.run()
}
fn u8_slider() -> impl MakeWidget {
let min = Dynamic::new(u8::MIN);
let min_text = min.linked_string();
let max = Dynamic::new(u8::MAX);
let max_text = max.linked_string();
let value = Dynamic::new(128_u8);
"Min"
.and(min_text.into_input())
.and("Max")
.and(max_text.into_input())
.into_columns()
.centered()
.and(value.clone().slider_between(min, max))
.and(value.into_label().centered())
.into_rows()
}
fn u8_range_slider() -> impl MakeWidget {
let range = Dynamic::new(42..=127);
let start = range.map_each(|range| *range.start());
let end = range.map_each(|range| *range.end());
range.set_source((&start, &end).for_each({
let range = range.clone();
move |(start, end)| {
range.set(*start..=*end);
}
}));
let min = Dynamic::new(u8::MIN);
let min_text = min.linked_string();
let start_text = start.linked_string();
let end_text = end.linked_string();
let max = Dynamic::new(u8::MAX);
let max_text = max.linked_string();
let value_text = range.map_each(|r| format!("{}..={}", r.start(), r.end()));
"Min"
.and(min_text.into_input())
.and("Start")
.and(start_text.into_input())
.and("End")
.and(end_text.into_input())
.and("Max")
.and(max_text.into_input())
.into_columns()
.centered()
.and(range.slider_between(min, max))
.and(value_text.centered())
.into_rows()
}
#[derive(LinearInterpolate, Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd)]
enum SlidableEnum {
A,
B,
C,
}
impl PercentBetween for SlidableEnum {
fn percent_between(&self, min: &Self, max: &Self) -> cushy::animation::ZeroToOne {
let min = *min as u8;
let max = *max as u8;
let value = *self as u8;
value.percent_between(&min, &max)
}
}
impl Ranged for SlidableEnum {
const MAX: Self = Self::C;
const MIN: Self = Self::A;
}
fn enum_slider() -> impl MakeWidget {
let enum_value = Dynamic::new(SlidableEnum::A);
let enum_text = enum_value.map_each(|value| format!("{value:?}"));
"Custom Enum"
.and(enum_value.slider())
.and(enum_text)
.into_rows()
}