use embedded_graphics::{prelude::Point, primitives::Rectangle};
use faststep::{
AppRedraw, FsTheme, I18n, Localized, TouchEvent, TouchPhase, UiApp, ViewDelegate, ViewResponse,
};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
enum ViewId {
Home,
Detail,
}
struct TestDelegate;
impl<'a> ViewDelegate<'a, ViewId> for TestDelegate {
fn title(&self, view: ViewId) -> Localized<'a> {
match view {
ViewId::Home => Localized::new("home.title", "Home"),
ViewId::Detail => Localized::new("detail.title", "Detail"),
}
}
fn draw_view<D>(
&self,
_view: ViewId,
_display: &mut D,
_frame: Rectangle,
_theme: &FsTheme,
_i18n: &I18n<'a>,
) where
D: embedded_graphics::draw_target::DrawTarget<
Color = embedded_graphics::pixelcolor::Rgb565,
>,
{
}
fn handle_view_touch(
&mut self,
view: ViewId,
touch: TouchEvent,
_frame: Rectangle,
_theme: &FsTheme,
_i18n: &I18n<'a>,
) -> ViewResponse<ViewId> {
if touch.phase != TouchPhase::End {
return ViewResponse::none();
}
match view {
ViewId::Home => ViewResponse::push(ViewId::Detail),
ViewId::Detail => ViewResponse::pop(),
}
}
}
#[test]
fn ui_app_uses_explicit_root_and_navigation_responses() {
let bounds = Rectangle::new(
Point::zero(),
embedded_graphics::geometry::Size::new(320, 240),
);
let mut app = UiApp::<ViewId, TestDelegate, 4>::new(
ViewId::Home,
TestDelegate,
FsTheme::default(),
I18n::new("en", "en", &[]),
);
assert_eq!(app.active_view(), ViewId::Home);
assert_eq!(
app.handle_touch(
TouchEvent::new(Point::new(12, 12), TouchPhase::End, 1),
bounds
),
AppRedraw::StackMotion
);
assert_eq!(app.active_view(), ViewId::Detail);
}