From 7f224ab36d4baee039ca01f6185c25b08f541585 Mon Sep 17 00:00:00 2001 From: Martin Milata Date: Tue, 7 Dec 2021 13:09:45 +0100 Subject: [PATCH] refactor(core/rust): model-agnostic Paginated [no changelog] --- core/embed/rust/src/ui/component/mod.rs | 2 + .../ui/{model_tt => }/component/paginated.rs | 59 +++++++++++-------- .../rust/src/ui/model_tt/component/mod.rs | 3 +- .../rust/src/ui/model_tt/component/page.rs | 51 +++++++++------- 4 files changed, 69 insertions(+), 46 deletions(-) rename core/embed/rust/src/ui/{model_tt => }/component/paginated.rs (70%) diff --git a/core/embed/rust/src/ui/component/mod.rs b/core/embed/rust/src/ui/component/mod.rs index 783563349..bb1d0a6f1 100644 --- a/core/embed/rust/src/ui/component/mod.rs +++ b/core/embed/rust/src/ui/component/mod.rs @@ -5,6 +5,7 @@ pub mod empty; pub mod label; pub mod map; pub mod pad; +pub mod paginated; pub mod text; pub mod tuple; @@ -12,6 +13,7 @@ pub use base::{Child, Component, ComponentExt, Event, EventCtx, Never, TimerToke pub use empty::Empty; pub use label::{Label, LabelStyle}; pub use pad::Pad; +pub use paginated::{Paginate, Paginated}; pub use text::{ formatted::FormattedText, layout::{LineBreaking, PageBreaking, TextLayout}, diff --git a/core/embed/rust/src/ui/model_tt/component/paginated.rs b/core/embed/rust/src/ui/component/paginated.rs similarity index 70% rename from core/embed/rust/src/ui/model_tt/component/paginated.rs rename to core/embed/rust/src/ui/component/paginated.rs index 850ad95fe..d6f25a893 100644 --- a/core/embed/rust/src/ui/model_tt/component/paginated.rs +++ b/core/embed/rust/src/ui/component/paginated.rs @@ -3,48 +3,61 @@ use crate::ui::{ text::layout::{LayoutFit, TextNoOp}, Component, ComponentExt, Event, EventCtx, FormattedText, Pad, }, - display, + display::Color, geometry::Rect, }; -use super::{ - page::{Page, PageMsg}, - theme, -}; +pub trait Page { + type Content; + + fn new(area: Rect, page: Self::Content, page_count: usize, active_page: usize) -> Self; + + fn inner_mut(&mut self) -> &mut Self::Content; + fn page_count(&self) -> usize; + fn active_page(&self) -> usize; + fn fade_after_next_paint(&mut self); +} -pub struct Paginated { - page: Page, +pub enum PageMsg { + Content(T), + ChangePage(usize), +} + +pub struct Paginated

{ + page: P, pad: Pad, - fade_after_next_paint: Option, } -impl Paginated +impl

Paginated

where - T: Paginate, + P: Page, + P::Content: Paginate, { - pub fn new(area: Rect, mut content: T) -> Self { + pub fn new(area: Rect, content: impl FnOnce(Rect) -> P::Content, background: Color) -> Self { let active_page = 0; + let mut content = content(area); let page_count = content.page_count(); Self { - page: Page::new(area, content, page_count, active_page), - pad: Pad::with_background(area, theme::BG), - fade_after_next_paint: None, + page: P::new(area, content, page_count, active_page), + pad: Pad::with_background(area, background), } } } -impl Component for Paginated +impl

Component for Paginated

where - T: Paginate, - T: Component, + P: Page, + P: Component::Content as Component>::Msg>>, + P::Content: Paginate, + P::Content: Component, { - type Msg = T::Msg; + type Msg = <

::Content as Component>::Msg; fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { self.page.event(ctx, event).and_then(|msg| match msg { PageMsg::Content(c) => Some(c), PageMsg::ChangePage(page) => { - self.fade_after_next_paint = Some(theme::BACKLIGHT_NORMAL); + self.page.fade_after_next_paint(); self.page.inner_mut().change_page(page); self.page.inner_mut().request_complete_repaint(ctx); self.pad.clear(); @@ -56,16 +69,14 @@ where fn paint(&mut self) { self.pad.paint(); self.page.paint(); - if let Some(val) = self.fade_after_next_paint.take() { - display::fade_backlight(val); - } } } #[cfg(feature = "ui_debug")] -impl crate::trace::Trace for Paginated +impl

crate::trace::Trace for Paginated

where - T: crate::trace::Trace, + P: Page + crate::trace::Trace, + P::Content: crate::trace::Trace, { fn trace(&self, t: &mut dyn crate::trace::Tracer) { self.page.trace(t); diff --git a/core/embed/rust/src/ui/model_tt/component/mod.rs b/core/embed/rust/src/ui/model_tt/component/mod.rs index 870d4d51d..47c86bdbb 100644 --- a/core/embed/rust/src/ui/model_tt/component/mod.rs +++ b/core/embed/rust/src/ui/model_tt/component/mod.rs @@ -3,7 +3,6 @@ mod confirm; mod dialog; mod loader; mod page; -mod paginated; mod passphrase; mod pin; mod swipe; @@ -12,7 +11,7 @@ pub use button::{Button, ButtonContent, ButtonMsg, ButtonStyle, ButtonStyleSheet pub use confirm::{HoldToConfirm, HoldToConfirmMsg}; pub use dialog::{Dialog, DialogLayout, DialogMsg}; pub use loader::{Loader, LoaderMsg, LoaderStyle, LoaderStyleSheet}; -pub use paginated::{Paginate, Paginated}; +pub use page::SwipePage; pub use swipe::{Swipe, SwipeDirection}; use super::{event, theme}; diff --git a/core/embed/rust/src/ui/model_tt/component/page.rs b/core/embed/rust/src/ui/model_tt/component/page.rs index 59aa987bd..37feca9b7 100644 --- a/core/embed/rust/src/ui/model_tt/component/page.rs +++ b/core/embed/rust/src/ui/model_tt/component/page.rs @@ -1,24 +1,32 @@ use crate::ui::{ - component::{Component, Event, EventCtx, Never}, + component::{ + paginated::{Page, PageMsg}, + Component, Event, EventCtx, Never, + }, display, geometry::{Offset, Point, Rect}, }; use super::{theme, Swipe, SwipeDirection}; -pub enum PageMsg { - Content(T), - ChangePage(usize), -} - -pub struct Page { +pub struct SwipePage { swipe: Swipe, scrollbar: ScrollBar, page: T, + fade: Option, } -impl Page { - pub fn new(area: Rect, page: T, page_count: usize, active_page: usize) -> Self { +impl SwipePage { + fn setup_swipe(scrollbar: &ScrollBar, swipe: &mut Swipe) { + swipe.allow_up = scrollbar.has_next_page(); + swipe.allow_down = scrollbar.has_previous_page(); + } +} + +impl Page for SwipePage { + type Content = T; + + fn new(area: Rect, page: T, page_count: usize, active_page: usize) -> Self { let scrollbar = ScrollBar::vertical_right(area, page_count, active_page); let mut swipe = Swipe::new(area); Self::setup_swipe(&scrollbar, &mut swipe); @@ -26,28 +34,28 @@ impl Page { swipe, scrollbar, page, + fade: None, } } - fn setup_swipe(scrollbar: &ScrollBar, swipe: &mut Swipe) { - swipe.allow_up = scrollbar.has_next_page(); - swipe.allow_down = scrollbar.has_previous_page(); - } - - pub fn inner_mut(&mut self) -> &mut T { + fn inner_mut(&mut self) -> &mut T { &mut self.page } - pub fn page_count(&self) -> usize { + fn page_count(&self) -> usize { self.scrollbar.page_count } - pub fn active_page(&self) -> usize { + fn active_page(&self) -> usize { self.scrollbar.active_page } + + fn fade_after_next_paint(&mut self) { + self.fade = Some(theme::BACKLIGHT_NORMAL); + } } -impl Component for Page { +impl Component for SwipePage { type Msg = PageMsg; fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { @@ -79,16 +87,19 @@ impl Component for Page { fn paint(&mut self) { self.page.paint(); self.scrollbar.paint(); + if let Some(val) = self.fade.take() { + display::fade_backlight(val); + } } } #[cfg(feature = "ui_debug")] -impl crate::trace::Trace for Page +impl crate::trace::Trace for SwipePage where T: crate::trace::Trace, { fn trace(&self, t: &mut dyn crate::trace::Tracer) { - t.open("Page"); + t.open("SwipePage"); t.field("active_page", &self.active_page()); t.field("page_count", &self.page_count()); t.field("content", &self.page);