diff --git a/core/embed/rust/src/translations/flash.rs b/core/embed/rust/src/translations/flash.rs index 245b51d44..831f981f9 100644 --- a/core/embed/rust/src/translations/flash.rs +++ b/core/embed/rust/src/translations/flash.rs @@ -64,16 +64,18 @@ pub fn init() { } } -// SAFETY: Invalidates all references coming from the flash-based blob. -// In other words, none should exist when this function is called. +/// # Safety +/// Invalidates all references coming from the flash-based blob. +/// In other words, none should exist when this function is called. pub unsafe fn deinit() { // SAFETY: Given the above, we can safely clear the cached object. unsafe { TRANSLATIONS_ON_FLASH = None }; } -// SAFETY: Gives out a reference to a TranslationsBlob which can be invalidated -// by calling `erase()`. The caller must not store this reference, nor any that -// come from it, beyond the lifetime of the current function. +/// # Safety +/// Gives out a reference to a TranslationsBlob which can be invalidated +/// by calling `erase()`. The caller must not store this reference, nor any that +/// come from it, beyond the lifetime of the current function. pub unsafe fn get<'a>() -> Option<&'a Translations<'a>> { // SAFETY: We are in a single-threaded environment. unsafe { TRANSLATIONS_ON_FLASH.as_ref() } diff --git a/core/embed/rust/src/ui/component/marquee.rs b/core/embed/rust/src/ui/component/marquee.rs index f5181af42..29445bb27 100644 --- a/core/embed/rust/src/ui/component/marquee.rs +++ b/core/embed/rust/src/ui/component/marquee.rs @@ -226,6 +226,6 @@ impl Component for Marquee { impl crate::trace::Trace for Marquee { fn trace(&self, t: &mut dyn crate::trace::Tracer) { t.component("Marquee"); - t.string("text", self.text.into()); + t.string("text", self.text); } } diff --git a/core/embed/rust/src/ui/model_tr/component/flow_pages.rs b/core/embed/rust/src/ui/model_tr/component/flow_pages.rs index dd6439cc0..5ef254848 100644 --- a/core/embed/rust/src/ui/model_tr/component/flow_pages.rs +++ b/core/embed/rust/src/ui/model_tr/component/flow_pages.rs @@ -169,7 +169,7 @@ impl Page { } pub fn title(&self) -> Option> { - self.title.clone() + self.title } pub fn has_prev_page(&self) -> bool { diff --git a/core/embed/rust/src/ui/model_tr/component/homescreen.rs b/core/embed/rust/src/ui/model_tr/component/homescreen.rs index 229c9ebe7..67b8e3d3e 100644 --- a/core/embed/rust/src/ui/model_tr/component/homescreen.rs +++ b/core/embed/rust/src/ui/model_tr/component/homescreen.rs @@ -76,8 +76,8 @@ impl Homescreen { // Buttons will not be visible, we only need both left and right to be existing // so we can get the events from them. let invisible_btn_layout = ButtonLayout::text_none_text("".into(), "".into()); - let loader = loader_description - .map(|desc| Child::new(ProgressLoader::new(desc.into(), HOLD_TO_LOCK_MS))); + let loader = + loader_description.map(|desc| Child::new(ProgressLoader::new(desc, HOLD_TO_LOCK_MS))); Self { label: Label::centered(label, theme::TEXT_BIG), notification, diff --git a/core/embed/rust/src/ui/model_tr/component/input_methods/pin.rs b/core/embed/rust/src/ui/model_tr/component/input_methods/pin.rs index 1b79e9ec5..762d81f64 100644 --- a/core/embed/rust/src/ui/model_tr/component/input_methods/pin.rs +++ b/core/embed/rust/src/ui/model_tr/component/input_methods/pin.rs @@ -152,7 +152,7 @@ impl<'a> PinEntry<'a> { let (showing_real_prompt, header_line_content, pin_line_content) = if show_subprompt { ( false, - TR::pin__title_wrong_pin.map_translated(|t| String::from(t)), + TR::pin__title_wrong_pin.map_translated(String::from), String::from(subprompt.map(|t| t)), ) } else { @@ -331,7 +331,7 @@ impl Component for PinEntry<'_> { impl crate::trace::Trace for PinEntry<'_> { fn trace(&self, t: &mut dyn crate::trace::Tracer) { t.component("PinKeyboard"); - t.string("subprompt", self.subprompt.into()); + t.string("subprompt", self.subprompt); t.string("pin", self.textbox.content().into()); t.child("choice_page", &self.choice_page); } diff --git a/core/embed/rust/src/ui/model_tr/component/title.rs b/core/embed/rust/src/ui/model_tr/component/title.rs index 9549b112a..74a22b7fb 100644 --- a/core/embed/rust/src/ui/model_tr/component/title.rs +++ b/core/embed/rust/src/ui/model_tr/component/title.rs @@ -21,7 +21,7 @@ pub struct Title { impl Title { pub fn new(title: TString<'static>) -> Self { Self { - title: title.clone(), + title, marquee: Marquee::new(title, theme::FONT_HEADER, theme::FG, theme::BG), needs_marquee: false, area: Rect::zero(), @@ -35,13 +35,13 @@ impl Title { } pub fn get_text(&self) -> &str { - self.title.map(|s| s.as_ref()) + self.title.map(|s| s) } pub fn set_text(&mut self, ctx: &mut EventCtx, new_text: TString<'static>) { - self.title = new_text.clone(); - self.marquee.set_text(new_text.clone()); - let text_width = theme::FONT_HEADER.text_width(new_text.map(|s| s.as_ref())); + self.title = new_text; + self.marquee.set_text(new_text); + let text_width = theme::FONT_HEADER.text_width(new_text.map(|s| s)); self.needs_marquee = text_width > self.area.width(); // Resetting the marquee to the beginning and starting it when necessary. self.marquee.reset(); @@ -56,7 +56,7 @@ impl Title { let title_baseline = area.top_left() + Offset::y(text_height - 1); display::text_left( title_baseline, - title.map(|s| s.as_ref()), + title.map(|s| s), theme::FONT_HEADER, theme::FG, theme::BG, @@ -69,7 +69,7 @@ impl Title { let title_baseline = area.top_center() + Offset::y(text_height - 1); display::text_center( title_baseline, - title.map(|s| s.as_ref()), + title.map(|s| s), theme::FONT_HEADER, theme::FG, theme::BG, @@ -83,7 +83,7 @@ impl Component for Title { fn place(&mut self, bounds: Rect) -> Rect { self.area = bounds; self.marquee.place(bounds); - let width = theme::FONT_HEADER.text_width(self.title.map(|s| s.as_ref())); + let width = theme::FONT_HEADER.text_width(self.title.map(|s| s)); self.needs_marquee = width > self.area.width(); bounds } diff --git a/core/embed/rust/src/ui/model_tr/layout.rs b/core/embed/rust/src/ui/model_tr/layout.rs index 5f6052d45..87719e77e 100644 --- a/core/embed/rust/src/ui/model_tr/layout.rs +++ b/core/embed/rust/src/ui/model_tr/layout.rs @@ -730,7 +730,7 @@ extern "C" fn new_altcoin_tx_summary(n_args: usize, args: *const Obj, kwargs: *m let items: Obj = kwargs.get(Qstr::MP_QSTR_items)?; // cached allocated translated strings that get_page can reuse - let tr_title_fee = TR::confirm_total__title_fee.try_into()?; + let tr_title_fee = TR::confirm_total__title_fee.into(); let get_page = move |page_index| { match page_index { @@ -1637,7 +1637,7 @@ extern "C" fn new_confirm_firmware_update( ) .with_info_screen( TR::firmware_update__title_fingerprint.as_tstring(), - fingerprint.into(), + fingerprint, ), )?; Ok(obj.into()) diff --git a/core/embed/rust/src/ui/model_tt/component/button.rs b/core/embed/rust/src/ui/model_tt/component/button.rs index 1476b4887..3dab0430e 100644 --- a/core/embed/rust/src/ui/model_tt/component/button.rs +++ b/core/embed/rust/src/ui/model_tt/component/button.rs @@ -191,7 +191,6 @@ impl Button { match &self.content { ButtonContent::Empty => {} ButtonContent::Text(text) => { - let text = text; let width = style.font.text_width(text.map(|c| c)); let height = style.font.text_height(); let start_of_baseline = self.area.center() diff --git a/core/embed/rust/src/ui/model_tt/component/coinjoin_progress.rs b/core/embed/rust/src/ui/model_tt/component/coinjoin_progress.rs index ee333763c..7cb492d1d 100644 --- a/core/embed/rust/src/ui/model_tt/component/coinjoin_progress.rs +++ b/core/embed/rust/src/ui/model_tt/component/coinjoin_progress.rs @@ -40,11 +40,8 @@ impl CoinJoinProgress { indeterminate: bool, ) -> Result + MaybeTrace>, Error> { let style = theme::label_coinjoin_progress(); - let label = Label::centered( - TryInto::::try_into(TR::coinjoin__title_do_not_disconnect)?, - style, - ) - .vertically_centered(); + let label = Label::centered(TR::coinjoin__title_do_not_disconnect.into(), style) + .vertically_centered(); let bg = painter::rect_painter(style.background_color, theme::BG); let inner = (bg, label); CoinJoinProgress::with_background(text, inner, indeterminate) @@ -65,7 +62,7 @@ where indeterminate, content: Frame::centered( theme::label_title(), - TR::coinjoin__title_progress.try_into()?, + TR::coinjoin__title_progress.into(), Split::bottom(RECTANGLE_HEIGHT, 0, Empty, inner), ) .into_child(), diff --git a/core/embed/rust/src/ui/model_tt/component/number_input.rs b/core/embed/rust/src/ui/model_tt/component/number_input.rs index 04d2172f2..8aa6f14b1 100644 --- a/core/embed/rust/src/ui/model_tt/component/number_input.rs +++ b/core/embed/rust/src/ui/model_tt/component/number_input.rs @@ -47,8 +47,8 @@ where input: NumberInput::new(min, max, init_value).into_child(), paragraphs: Paragraphs::new(Paragraph::new(&theme::TEXT_NORMAL, text)).into_child(), paragraphs_pad: Pad::with_background(theme::BG), - info_button: Button::with_text(TR::buttons__info.try_into()?).into_child(), - confirm_button: Button::with_text(TR::buttons__continue.try_into()?) + info_button: Button::with_text(TR::buttons__info.into()).into_child(), + confirm_button: Button::with_text(TR::buttons__continue.into()) .styled(theme::button_confirm()) .into_child(), }) 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 95056c0da..1603e499d 100644 --- a/core/embed/rust/src/ui/model_tt/component/page.rs +++ b/core/embed/rust/src/ui/model_tt/component/page.rs @@ -49,8 +49,8 @@ where T: Component, { pub fn with_hold(mut self) -> Result { - self.button_confirm = Button::with_text(TR::buttons__hold_to_confirm.try_into()?) - .styled(theme::button_confirm()); + self.button_confirm = + Button::with_text(TR::buttons__hold_to_confirm.into()).styled(theme::button_confirm()); self.loader = Some(Loader::new()); Ok(self) } diff --git a/core/embed/rust/src/ui/model_tt/layout.rs b/core/embed/rust/src/ui/model_tt/layout.rs index 5ce159dc1..d42fdf635 100644 --- a/core/embed/rust/src/ui/model_tt/layout.rs +++ b/core/embed/rust/src/ui/model_tt/layout.rs @@ -623,7 +623,7 @@ extern "C" fn new_confirm_properties(n_args: usize, args: *const Obj, kwargs: *m ButtonPage::new(paragraphs.into_paragraphs(), theme::BG).with_hold()? } else { ButtonPage::new(paragraphs.into_paragraphs(), theme::BG) - .with_cancel_confirm(None, Some(TR::buttons__confirm.try_into()?)) + .with_cancel_confirm(None, Some(TR::buttons__confirm.into())) }; let obj = LayoutObj::new(Frame::left_aligned( theme::label_title(), @@ -861,7 +861,7 @@ extern "C" fn new_confirm_modify_output(n_args: usize, args: *const Obj, kwargs: theme::label_title(), tr_title.into(), ButtonPage::<_>::new(paragraphs, theme::BG) - .with_cancel_confirm(Some("^".into()), Some(TR::buttons__continue.try_into()?)), + .with_cancel_confirm(Some("^".into()), Some(TR::buttons__continue.into())), ))?; Ok(obj.into()) }; @@ -1018,7 +1018,7 @@ extern "C" fn new_confirm_fido(n_args: usize, args: *const Obj, kwargs: *mut Map let controls = Button::cancel_confirm( Button::with_icon(theme::ICON_CANCEL), - Button::with_text(TR::buttons__confirm.try_into()?).styled(theme::button_confirm()), + Button::with_text(TR::buttons__confirm.into()).styled(theme::button_confirm()), true, ); @@ -1253,7 +1253,7 @@ extern "C" fn new_request_pin(n_args: usize, args: *const Obj, kwargs: *mut Map) let allow_cancel: bool = kwargs.get_or(Qstr::MP_QSTR_allow_cancel, true)?; let warning: bool = kwargs.get_or(Qstr::MP_QSTR_wrong_pin, false)?; let warning = if warning { - Some(TR::pin__wrong_pin.try_into()?) + Some(TR::pin__wrong_pin.into()) } else { None }; @@ -1447,8 +1447,8 @@ extern "C" fn new_confirm_recovery(n_args: usize, args: *const Obj, kwargs: *mut Dialog::new( paragraphs, Button::cancel_info_confirm( - TR::buttons__continue.try_into()?, - TR::buttons__more_info.try_into()?, + TR::buttons__continue.into(), + TR::buttons__more_info.into(), ), ), ))? @@ -1500,13 +1500,12 @@ extern "C" fn new_show_group_share_success( let lines_iterable: Obj = kwargs.get(Qstr::MP_QSTR_lines)?; let lines: [StrBuffer; 4] = util::iter_into_array(lines_iterable)?; - let obj = - LayoutObj::new(IconDialog::new_shares( - lines, - theme::button_bar(Button::with_text(TR::buttons__continue.try_into()?).map( - |msg| (matches!(msg, ButtonMsg::Clicked)).then(|| CancelConfirmMsg::Confirmed), - )), - ))?; + let obj = LayoutObj::new(IconDialog::new_shares( + lines, + theme::button_bar(Button::with_text(TR::buttons__continue.into()).map(|msg| { + (matches!(msg, ButtonMsg::Clicked)).then(|| CancelConfirmMsg::Confirmed) + })), + ))?; Ok(obj.into()) }; unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } @@ -1529,7 +1528,7 @@ extern "C" fn new_show_remaining_shares(n_args: usize, args: *const Obj, kwargs: theme::label_title(), tr_title.into(), ButtonPage::<_>::new(paragraphs.into_paragraphs(), theme::BG) - .with_cancel_confirm(None, Some(TR::buttons__continue.try_into()?)) + .with_cancel_confirm(None, Some(TR::buttons__continue.into())) .with_confirm_style(theme::button_default()) .without_cancel(), ))?; @@ -1638,18 +1637,16 @@ extern "C" fn new_confirm_firmware_update( let description: StrBuffer = kwargs.get(Qstr::MP_QSTR_description)?.try_into()?; let fingerprint: StrBuffer = kwargs.get(Qstr::MP_QSTR_fingerprint)?.try_into()?; - let title_str = TR::firmware_update__title.try_into()?; + let title_str = TR::firmware_update__title.into(); let title = Label::left_aligned(title_str, theme::TEXT_BOLD).vertically_centered(); let msg = Label::left_aligned(description.into(), theme::TEXT_NORMAL); - let left = - Button::with_text(TR::buttons__cancel.try_into()?).styled(theme::button_default()); - let right = - Button::with_text(TR::buttons__install.try_into()?).styled(theme::button_confirm()); + let left = Button::with_text(TR::buttons__cancel.into()).styled(theme::button_default()); + let right = Button::with_text(TR::buttons__install.into()).styled(theme::button_confirm()); let obj = LayoutObj::new( Confirm::new(theme::BG, left, right, ConfirmTitle::Text(title), msg).with_info( - TR::firmware_update__title_fingerprint.try_into()?, + TR::firmware_update__title_fingerprint.into(), fingerprint.into(), theme::button_moreinfo(), ), @@ -2186,8 +2183,11 @@ mod tests { #[test] fn trace_example_layout() { - let buttons = - Button::cancel_confirm(Button::with_text("Left"), Button::with_text("Right"), false); + let buttons = Button::cancel_confirm( + Button::with_text("Left".into()), + Button::with_text("Right".into()), + false, + ); let ops = OpTextLayout::new(theme::TEXT_NORMAL) .text_normal("Testing text layout, with some text, and some more text. And ")