mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-26 17:38:39 +00:00
fix(core/ui): set page_count through rust ButtonRequest
This commit is contained in:
parent
53609a85fd
commit
198693259d
@ -7,7 +7,7 @@ use crate::{
|
|||||||
time::Duration,
|
time::Duration,
|
||||||
ui::{
|
ui::{
|
||||||
button_request::{ButtonRequest, ButtonRequestCode},
|
button_request::{ButtonRequest, ButtonRequestCode},
|
||||||
component::{maybe::PaintOverlapping, MsgMap},
|
component::{maybe::PaintOverlapping, MsgMap, PageMap},
|
||||||
display::{self, Color},
|
display::{self, Color},
|
||||||
geometry::{Offset, Rect},
|
geometry::{Offset, Rect},
|
||||||
shape::Renderer,
|
shape::Renderer,
|
||||||
@ -415,6 +415,7 @@ where
|
|||||||
|
|
||||||
pub trait ComponentExt: Sized {
|
pub trait ComponentExt: Sized {
|
||||||
fn map<F>(self, func: F) -> MsgMap<Self, F>;
|
fn map<F>(self, func: F) -> MsgMap<Self, F>;
|
||||||
|
fn with_pages<F>(self, func: F) -> PageMap<Self, F>;
|
||||||
fn into_child(self) -> Child<Self>;
|
fn into_child(self) -> Child<Self>;
|
||||||
fn request_complete_repaint(&mut self, ctx: &mut EventCtx);
|
fn request_complete_repaint(&mut self, ctx: &mut EventCtx);
|
||||||
}
|
}
|
||||||
@ -427,6 +428,10 @@ where
|
|||||||
MsgMap::new(self, func)
|
MsgMap::new(self, func)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn with_pages<F>(self, func: F) -> PageMap<Self, F> {
|
||||||
|
PageMap::new(self, func)
|
||||||
|
}
|
||||||
|
|
||||||
fn into_child(self) -> Child<Self> {
|
fn into_child(self) -> Child<Self> {
|
||||||
Child::new(self)
|
Child::new(self)
|
||||||
}
|
}
|
||||||
@ -569,6 +574,10 @@ impl EventCtx {
|
|||||||
self.page_count = Some(count);
|
self.page_count = Some(count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn map_page_count(&mut self, func: impl Fn(usize) -> usize) {
|
||||||
|
self.page_count = Some(func(self.page_count.unwrap_or(1)));
|
||||||
|
}
|
||||||
|
|
||||||
pub fn page_count(&self) -> Option<usize> {
|
pub fn page_count(&self) -> Option<usize> {
|
||||||
self.page_count
|
self.page_count
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ pub struct OneButtonRequest<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T> OneButtonRequest<T> {
|
impl<T> OneButtonRequest<T> {
|
||||||
pub fn new(button_request: ButtonRequest, inner: T) -> Self {
|
pub const fn new(button_request: ButtonRequest, inner: T) -> Self {
|
||||||
Self {
|
Self {
|
||||||
button_request: Some(button_request),
|
button_request: Some(button_request),
|
||||||
inner,
|
inner,
|
||||||
|
@ -64,3 +64,69 @@ where
|
|||||||
self.inner.swipe_finished()
|
self.inner.swipe_finished()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct PageMap<T, F> {
|
||||||
|
inner: T,
|
||||||
|
func: F,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T, F> PageMap<T, F> {
|
||||||
|
pub fn new(inner: T, func: F) -> Self {
|
||||||
|
Self { inner, func }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T, F> Component for PageMap<T, F>
|
||||||
|
where
|
||||||
|
T: Component,
|
||||||
|
F: Fn(usize) -> usize,
|
||||||
|
{
|
||||||
|
type Msg = T::Msg;
|
||||||
|
|
||||||
|
fn place(&mut self, bounds: Rect) -> Rect {
|
||||||
|
self.inner.place(bounds)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option<Self::Msg> {
|
||||||
|
let res = self.inner.event(ctx, event);
|
||||||
|
ctx.map_page_count(&self.func);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
|
||||||
|
fn paint(&mut self) {
|
||||||
|
self.inner.paint()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||||
|
self.inner.render(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "ui_bounds")]
|
||||||
|
fn bounds(&self, sink: &mut dyn FnMut(Rect)) {
|
||||||
|
self.inner.bounds(sink);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "ui_debug")]
|
||||||
|
impl<T, F> crate::trace::Trace for PageMap<T, F>
|
||||||
|
where
|
||||||
|
T: Component + crate::trace::Trace,
|
||||||
|
{
|
||||||
|
fn trace(&self, t: &mut dyn crate::trace::Tracer) {
|
||||||
|
self.inner.trace(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(all(feature = "micropython", feature = "touch", feature = "new_rendering"))]
|
||||||
|
impl<T, F> crate::ui::flow::Swipable for PageMap<T, F>
|
||||||
|
where
|
||||||
|
T: Component + crate::ui::flow::Swipable,
|
||||||
|
{
|
||||||
|
fn swipe_start(&mut self, ctx: &mut EventCtx, direction: super::SwipeDirection) -> bool {
|
||||||
|
self.inner.swipe_start(ctx, direction)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn swipe_finished(&self) -> bool {
|
||||||
|
self.inner.swipe_finished()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -30,7 +30,7 @@ pub use empty::Empty;
|
|||||||
#[cfg(all(feature = "jpeg", feature = "micropython"))]
|
#[cfg(all(feature = "jpeg", feature = "micropython"))]
|
||||||
pub use jpeg::Jpeg;
|
pub use jpeg::Jpeg;
|
||||||
pub use label::Label;
|
pub use label::Label;
|
||||||
pub use map::MsgMap;
|
pub use map::{MsgMap, PageMap};
|
||||||
pub use marquee::Marquee;
|
pub use marquee::Marquee;
|
||||||
pub use maybe::Maybe;
|
pub use maybe::Maybe;
|
||||||
pub use pad::Pad;
|
pub use pad::Pad;
|
||||||
|
@ -105,7 +105,9 @@ impl ConfirmSummary {
|
|||||||
}
|
}
|
||||||
let content_summary = summary
|
let content_summary = summary
|
||||||
.into_layout()?
|
.into_layout()?
|
||||||
.one_button_request(ButtonRequest::from_tstring(br_code, br_type));
|
.one_button_request(ButtonRequest::from_tstring(br_code, br_type))
|
||||||
|
// Summary(1) + Hold(1)
|
||||||
|
.with_pages(|summary_pages| summary_pages + 1);
|
||||||
|
|
||||||
// Hold to confirm
|
// Hold to confirm
|
||||||
let content_hold = Frame::left_aligned(
|
let content_hold = Frame::left_aligned(
|
||||||
|
@ -171,7 +171,9 @@ impl GetAddress {
|
|||||||
.with_menu_button()
|
.with_menu_button()
|
||||||
.with_footer(TR::instructions__swipe_up.into(), None)
|
.with_footer(TR::instructions__swipe_up.into(), None)
|
||||||
.map(|msg| matches!(msg, FrameMsg::Button(_)).then_some(FlowMsg::Info))
|
.map(|msg| matches!(msg, FrameMsg::Button(_)).then_some(FlowMsg::Info))
|
||||||
.one_button_request(ButtonRequest::from_tstring(br_code, br_type));
|
.one_button_request(ButtonRequest::from_tstring(br_code, br_type))
|
||||||
|
// Count tap-to-confirm screen towards page count
|
||||||
|
.with_pages(|address_pages| address_pages + 1);
|
||||||
|
|
||||||
// Tap
|
// Tap
|
||||||
let content_tap = Frame::left_aligned(title, PromptScreen::new_tap_to_confirm())
|
let content_tap = Frame::left_aligned(title, PromptScreen::new_tap_to_confirm())
|
||||||
|
Loading…
Reference in New Issue
Block a user