From 9d6827e2fbea191598f56fa399d8c160aa77de59 Mon Sep 17 00:00:00 2001 From: cepetr Date: Mon, 11 Mar 2024 16:16:35 +0100 Subject: [PATCH] refactor(core): remove unused ui components [no changelog] --- .../rust/src/ui/model_tr/component/mod.rs | 4 - .../src/ui/model_tr/component/result_anim.rs | 152 --------------- .../src/ui/model_tr/component/result_popup.rs | 183 ------------------ 3 files changed, 339 deletions(-) delete mode 100644 core/embed/rust/src/ui/model_tr/component/result_anim.rs delete mode 100644 core/embed/rust/src/ui/model_tr/component/result_popup.rs diff --git a/core/embed/rust/src/ui/model_tr/component/mod.rs b/core/embed/rust/src/ui/model_tr/component/mod.rs index 77e42855ad..2fdc1b8227 100644 --- a/core/embed/rust/src/ui/model_tr/component/mod.rs +++ b/core/embed/rust/src/ui/model_tr/component/mod.rs @@ -39,8 +39,6 @@ mod homescreen; #[cfg(feature = "translations")] mod page; mod progress; -mod result_anim; -mod result_popup; mod scrollbar; #[cfg(feature = "translations")] mod share_words; @@ -69,8 +67,6 @@ pub use input_methods::{ #[cfg(feature = "translations")] pub use page::ButtonPage; pub use progress::Progress; -pub use result_anim::{ResultAnim, ResultAnimMsg}; -pub use result_popup::{ResultPopup, ResultPopupMsg}; pub use scrollbar::ScrollBar; #[cfg(feature = "translations")] pub use share_words::ShareWords; diff --git a/core/embed/rust/src/ui/model_tr/component/result_anim.rs b/core/embed/rust/src/ui/model_tr/component/result_anim.rs deleted file mode 100644 index ff15da7ee8..0000000000 --- a/core/embed/rust/src/ui/model_tr/component/result_anim.rs +++ /dev/null @@ -1,152 +0,0 @@ -use crate::{ - time::{Duration, Instant}, - ui::{ - animation::Animation, - component::{Component, Event, EventCtx}, - display, - display::toif::Icon, - geometry::Rect, - }, -}; - -use super::super::theme; - -pub enum ResultAnimMsg { - FullyGrown, -} - -enum State { - Initial, - Growing(Animation), - Grown, -} - -pub struct ResultAnim { - area: Rect, - state: State, - growing_duration: Duration, - icon: Icon, -} - -impl ResultAnim { - pub fn new(icon: Icon) -> Self { - Self { - area: Rect::zero(), - state: State::Initial, - growing_duration: Duration::from_millis(2000), - icon, - } - } - - pub fn start_growing(&mut self, ctx: &mut EventCtx, now: Instant) { - let anim = Animation::new( - display::LOADER_MIN, - display::LOADER_MAX, - self.growing_duration, - now, - ); - - self.state = State::Growing(anim); - - // The animation is starting, request an animation frame event. - ctx.request_anim_frame(); - - // We don't have to wait for the animation frame event with the first paint, - // let's do that now. - ctx.request_paint(); - } - - pub fn reset(&mut self) { - self.state = State::Initial; - } - - pub fn animation(&self) -> Option<&Animation> { - match &self.state { - State::Initial => None, - State::Grown => None, - State::Growing(a) => Some(a), - } - } - - pub fn progress(&self, now: Instant) -> Option { - self.animation().map(|a| a.value(now)) - } - - pub fn is_animating(&self) -> bool { - self.animation().is_some() - } - - pub fn is_completely_grown(&self, now: Instant) -> bool { - matches!(self.progress(now), Some(display::LOADER_MAX)) - } - - pub fn paint_anim(&mut self, done: i16) { - display::rect_rounded2_partial( - self.area, - theme::FG, - theme::BG, - 100 * done / 1000, - Some((self.icon, theme::FG)), - ); - } -} - -impl Component for ResultAnim { - type Msg = ResultAnimMsg; - - fn place(&mut self, bounds: Rect) -> Rect { - self.area = bounds; - self.area - } - - fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { - let now = Instant::now(); - - if let Event::Timer(EventCtx::ANIM_FRAME_TIMER) = event { - if let State::Growing(_) = self.state { - // We have something to paint, so request to be painted in the next pass. - ctx.request_paint(); - - if self.is_completely_grown(now) { - self.state = State::Grown; - return Some(ResultAnimMsg::FullyGrown); - } else { - // There is further progress in the animation, request an animation frame event. - ctx.request_anim_frame(); - } - } - } - None - } - - fn paint(&mut self) { - // TODO: Consider passing the current instant along with the event -- that way, - // we could synchronize painting across the component tree. Also could be useful - // in automated tests. - // In practice, taking the current instant here is more precise in case some - // other component in the tree takes a long time to draw. - let now = Instant::now(); - - if let State::Initial = self.state { - self.paint_anim(0); - } else if let State::Grown = self.state { - self.paint_anim(display::LOADER_MAX as i16); - } else { - let progress = self.progress(now); - if let Some(done) = progress { - self.paint_anim(done as i16); - } else { - self.paint_anim(0); - } - } - } -} - -// DEBUG-ONLY SECTION BELOW - -#[cfg(feature = "ui_debug")] -impl crate::trace::Trace for ResultAnim { - fn trace(&self, t: &mut dyn crate::trace::Tracer) { - t.component("ResultAnim"); - } -} diff --git a/core/embed/rust/src/ui/model_tr/component/result_popup.rs b/core/embed/rust/src/ui/model_tr/component/result_popup.rs deleted file mode 100644 index b94c4ca9e9..0000000000 --- a/core/embed/rust/src/ui/model_tr/component/result_popup.rs +++ /dev/null @@ -1,183 +0,0 @@ -use crate::{ - strutil::StringType, - time::Instant, - ui::{ - component::{ - text::paragraphs::{Paragraph, Paragraphs}, - Child, Component, ComponentExt, Event, EventCtx, Label, Pad, - }, - constant::screen, - display::toif::Icon, - geometry::{Insets, LinearPlacement, Rect}, - }, -}; - -use super::{ - super::theme, ButtonController, ButtonControllerMsg, ButtonLayout, ButtonPos, ResultAnim, - ResultAnimMsg, -}; - -pub enum ResultPopupMsg { - Confirmed, -} - -pub struct ResultPopup -where - T: StringType, -{ - area: Rect, - pad: Pad, - result_anim: Child, - headline: Option>, - text: Child>>, - buttons: Option>, - autoclose: bool, -} - -const ANIM_SIZE: i16 = 18; -const ANIM_SPACE: i16 = 11; -const ANIM_POS: i16 = 32; -const ANIM_POS_ADJ_HEADLINE: i16 = 10; -const ANIM_POS_ADJ_BUTTON: i16 = 6; - -impl ResultPopup -where - T: StringType + Clone, -{ - pub fn new( - icon: Icon, - text: T, - headline: Option<&'static str>, - button_text: Option<&'static str>, - ) -> Self { - let p1 = Paragraphs::new(Paragraph::new(&theme::TEXT_BIG, text)) - .with_placement(LinearPlacement::vertical().align_at_center()); - - let buttons = button_text.map(|text| { - let btn_layout = ButtonLayout::none_none_text(text.into()); - Child::new(ButtonController::new(btn_layout)) - }); - - let mut pad = Pad::with_background(theme::BG); - pad.clear(); - - Self { - area: Rect::zero(), - pad, - result_anim: Child::new(ResultAnim::new(icon)), - headline: headline.map(|a| Label::centered(a, theme::TEXT_BOLD)), - text: Child::new(p1), - buttons, - autoclose: false, - } - } - - // autoclose even if button is used - pub fn autoclose(&mut self) { - self.autoclose = true; - } - - pub fn start(&mut self, ctx: &mut EventCtx) { - self.text.request_complete_repaint(ctx); - self.headline.request_complete_repaint(ctx); - self.buttons.request_complete_repaint(ctx); - self.result_anim.mutate(ctx, |ctx, c| { - let now = Instant::now(); - c.start_growing(ctx, now); - }); - ctx.request_paint(); - } -} - -impl Component for ResultPopup -where - T: StringType + Clone, -{ - type Msg = ResultPopupMsg; - - fn place(&mut self, bounds: Rect) -> Rect { - self.area = bounds; - - let anim_margins = (screen().width() - ANIM_SIZE) / 2; - let mut anim_adjust = 0; - let mut headline_height = 0; - let mut button_height = 0; - - if let Some(h) = self.headline.as_mut() { - headline_height = h.max_size().y; - anim_adjust += ANIM_POS_ADJ_HEADLINE; - } - if self.buttons.is_some() { - button_height = theme::BUTTON_HEIGHT; - anim_adjust += ANIM_POS_ADJ_BUTTON; - } - - let (_, rest) = bounds.split_top(ANIM_POS - anim_adjust); - let (anim, rest) = rest.split_top(ANIM_SIZE); - let (_, rest) = rest.split_top(ANIM_SPACE); - let (headline, rest) = rest.split_top(headline_height); - let (text, buttons) = rest.split_bottom(button_height); - - self.pad.place(bounds); - self.buttons.place(buttons); - self.headline.place(headline); - self.text.place(text); - self.result_anim - .place(anim.inset(Insets::sides(anim_margins))); - - self.area - } - - fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { - let mut button_confirmed = false; - - self.text.event(ctx, event); - self.headline.event(ctx, event); - - if let Some(ButtonControllerMsg::Triggered(ButtonPos::Right, _)) = - self.buttons.event(ctx, event) - { - button_confirmed = true; - } - - if let Some(ResultAnimMsg::FullyGrown) = self.result_anim.event(ctx, event) { - if self.buttons.is_none() || self.autoclose { - return Some(ResultPopupMsg::Confirmed); - } - } - - if button_confirmed { - return Some(ResultPopupMsg::Confirmed); - } - - None - } - - fn paint(&mut self) { - self.pad.paint(); - self.text.paint(); - self.buttons.paint(); - self.headline.paint(); - self.result_anim.paint(); - } -} - -// DEBUG-ONLY SECTION BELOW - -#[cfg(feature = "ui_debug")] -impl crate::trace::Trace for ResultPopup -where - T: StringType + Clone, -{ - fn trace(&self, t: &mut dyn crate::trace::Tracer) { - t.component("ResultPopup"); - t.child("text", &self.text); - if let Some(button) = &self.buttons { - t.child("button", button); - } - if let Some(headline) = &self.headline { - t.child("headline", headline); - } - t.child("result_anim", &self.result_anim); - } -}