mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-07-04 05:42:34 +00:00
fixup! refactor(core/rust) use TString in Label and Button
This commit is contained in:
parent
578dc94201
commit
7486a5c915
@ -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() }
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -169,7 +169,7 @@ impl Page {
|
||||
}
|
||||
|
||||
pub fn title(&self) -> Option<TString<'static>> {
|
||||
self.title.clone()
|
||||
self.title
|
||||
}
|
||||
|
||||
pub fn has_prev_page(&self) -> bool {
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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())
|
||||
|
@ -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()
|
||||
|
@ -40,10 +40,7 @@ impl<U> CoinJoinProgress<U> {
|
||||
indeterminate: bool,
|
||||
) -> Result<CoinJoinProgress<impl Component<Msg = Never> + MaybeTrace>, Error> {
|
||||
let style = theme::label_coinjoin_progress();
|
||||
let label = Label::centered(
|
||||
TryInto::<TString>::try_into(TR::coinjoin__title_do_not_disconnect)?,
|
||||
style,
|
||||
)
|
||||
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);
|
||||
@ -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(),
|
||||
|
@ -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(),
|
||||
})
|
||||
|
@ -49,8 +49,8 @@ where
|
||||
T: Component,
|
||||
{
|
||||
pub fn with_hold(mut self) -> Result<Self, Error> {
|
||||
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)
|
||||
}
|
||||
|
@ -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,12 +1500,11 @@ 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(
|
||||
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),
|
||||
)),
|
||||
theme::button_bar(Button::with_text(TR::buttons__continue.into()).map(|msg| {
|
||||
(matches!(msg, ButtonMsg::Clicked)).then(|| CancelConfirmMsg::Confirmed)
|
||||
})),
|
||||
))?;
|
||||
Ok(obj.into())
|
||||
};
|
||||
@ -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 ")
|
||||
|
Loading…
Reference in New Issue
Block a user