1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-22 23:48:12 +00:00

refactor(core): move show_simple to UiFeatures

- replace `show_passphrase` of model_r with `show_simple`
This commit is contained in:
obrusvit 2024-11-05 16:19:09 +01:00
parent 84ca196f35
commit 46a98b937e
15 changed files with 118 additions and 140 deletions

View File

@ -655,7 +655,6 @@ static void _librust_qstrs(void) {
MP_QSTR_show_instructions; MP_QSTR_show_instructions;
MP_QSTR_show_lockscreen; MP_QSTR_show_lockscreen;
MP_QSTR_show_mismatch; MP_QSTR_show_mismatch;
MP_QSTR_show_passphrase;
MP_QSTR_show_progress; MP_QSTR_show_progress;
MP_QSTR_show_progress_coinjoin; MP_QSTR_show_progress_coinjoin;
MP_QSTR_show_remaining_shares; MP_QSTR_show_remaining_shares;

View File

@ -432,6 +432,24 @@ extern "C" fn new_show_remaining_shares(n_args: usize, args: *const Obj, kwargs:
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
} }
extern "C" fn new_show_simple(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| {
let text: TString = kwargs.get(Qstr::MP_QSTR_text)?.try_into()?;
let title: Option<TString> = kwargs
.get(Qstr::MP_QSTR_title)
.and_then(Obj::try_into_option)
.unwrap_or(None);
let button: Option<TString> = kwargs
.get(Qstr::MP_QSTR_button)
.and_then(Obj::try_into_option)
.unwrap_or(None);
let obj = ModelUI::show_simple(text, title, button)?;
Ok(obj.into())
};
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
}
extern "C" fn new_show_success(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { extern "C" fn new_show_success(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| { let block = move |_args: &[Obj], kwargs: &Map| {
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
@ -834,6 +852,15 @@ pub static mp_module_trezorui_api: Module = obj_module! {
/// """Shows SLIP39 state after info button is pressed on `confirm_recovery`.""" /// """Shows SLIP39 state after info button is pressed on `confirm_recovery`."""
Qstr::MP_QSTR_show_remaining_shares => obj_fn_kw!(0, new_show_remaining_shares).as_obj(), Qstr::MP_QSTR_show_remaining_shares => obj_fn_kw!(0, new_show_remaining_shares).as_obj(),
/// def show_simple(
/// *,
/// text: str,
/// title: str | None = None,
/// button: str | None = None,
/// ) -> LayoutObj[UiResult]:
/// """Simple dialog with text. TT: optional button."""
Qstr::MP_QSTR_show_simple => obj_fn_kw!(0, new_show_simple).as_obj(),
/// def show_success( /// def show_success(
/// *, /// *,
/// title: str, /// title: str,

View File

@ -690,20 +690,6 @@ extern "C" fn new_show_share_words(n_args: usize, args: *const Obj, kwargs: *mut
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
} }
extern "C" fn new_show_simple(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| {
let description: TString = kwargs.get_or(Qstr::MP_QSTR_description, "".into())?;
let obj = LayoutObj::new(Border::new(
theme::borders(),
Paragraphs::new(Paragraph::new(&theme::TEXT_DEMIBOLD, description)),
))?;
Ok(obj.into())
};
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
}
extern "C" fn new_confirm_with_info(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { extern "C" fn new_confirm_with_info(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| { let block = move |_args: &[Obj], kwargs: &Map| {
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
@ -973,15 +959,6 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// """ /// """
Qstr::MP_QSTR_confirm_fido => obj_fn_kw!(0, new_confirm_fido).as_obj(), Qstr::MP_QSTR_confirm_fido => obj_fn_kw!(0, new_confirm_fido).as_obj(),
/// def show_simple(
/// *,
/// title: str | None,
/// description: str = "",
/// button: str = "",
/// ) -> LayoutObj[UiResult]:
/// """Simple dialog with text and one button."""
Qstr::MP_QSTR_show_simple => obj_fn_kw!(0, new_show_simple).as_obj(),
/// def confirm_with_info( /// def confirm_with_info(
/// *, /// *,
/// title: str, /// title: str,

View File

@ -14,7 +14,7 @@ use crate::{
Checklist, Paragraph, ParagraphSource, ParagraphVecLong, ParagraphVecShort, Checklist, Paragraph, ParagraphSource, ParagraphVecLong, ParagraphVecShort,
Paragraphs, VecExt, Paragraphs, VecExt,
}, },
CachedJpeg, ComponentExt, Empty, Never, Timeout, Border, CachedJpeg, ComponentExt, Empty, Never, Timeout,
}, },
geometry::{self, Direction}, geometry::{self, Direction},
layout::{ layout::{
@ -503,6 +503,18 @@ impl UIFeaturesFirmware for ModelMercuryFeatures {
)) ))
} }
fn show_simple(
text: TString<'static>,
_title: Option<TString<'static>>,
_button: Option<TString<'static>>,
) -> Result<Gc<LayoutObj>, Error> {
let obj = LayoutObj::new(Border::new(
theme::borders(),
Paragraphs::new(Paragraph::new(&theme::TEXT_DEMIBOLD, text)),
))?;
Ok(obj)
}
fn show_success( fn show_success(
title: TString<'static>, title: TString<'static>,
button: TString<'static>, button: TString<'static>,

View File

@ -842,28 +842,6 @@ extern "C" fn new_confirm_fido(n_args: usize, args: *const Obj, kwargs: *mut Map
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
} }
extern "C" fn new_show_passphrase() -> Obj {
let block = move || {
let text: TString = TR::passphrase__please_enter.into();
let paragraph = Paragraph::new(&theme::TEXT_NORMAL, text).centered();
let content = Paragraphs::new([paragraph]);
let obj = LayoutObj::new(content)?;
Ok(obj.into())
};
unsafe { util::try_or_raise(block) }
}
extern "C" fn new_show_waiting_text(message: Obj) -> Obj {
let block = || {
let text: TString = message.try_into()?;
let paragraph = Paragraph::new(&theme::TEXT_NORMAL, text).centered();
let content = Paragraphs::new([paragraph]);
let obj = LayoutObj::new(content)?;
Ok(obj.into())
};
unsafe { util::try_or_raise(block) }
}
extern "C" fn new_confirm_with_info(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { extern "C" fn new_confirm_with_info(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| { let block = move |_args: &[Obj], kwargs: &Map| {
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
@ -1132,10 +1110,6 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// """Show multiple texts, each on its own page.""" /// """Show multiple texts, each on its own page."""
Qstr::MP_QSTR_multiple_pages_texts => obj_fn_kw!(0, new_multiple_pages_texts).as_obj(), Qstr::MP_QSTR_multiple_pages_texts => obj_fn_kw!(0, new_multiple_pages_texts).as_obj(),
/// def show_passphrase() -> LayoutObj[UiResult]:
/// """Show passphrase on host dialog."""
Qstr::MP_QSTR_show_passphrase => obj_fn_0!(new_show_passphrase).as_obj(),
/// def confirm_with_info( /// def confirm_with_info(
/// *, /// *,
/// title: str, /// title: str,

View File

@ -510,6 +510,17 @@ impl UIFeaturesFirmware for ModelTRFeatures {
)) ))
} }
fn show_simple(
text: TString<'static>,
_title: Option<TString<'static>>,
_button: Option<TString<'static>>,
) -> Result<Gc<LayoutObj>, Error> {
let paragraph = Paragraph::new(&theme::TEXT_NORMAL, text).centered();
let content = Paragraphs::new([paragraph]);
let obj = LayoutObj::new(content)?;
Ok(obj)
}
fn show_success( fn show_success(
title: TString<'static>, title: TString<'static>,
button: TString<'static>, button: TString<'static>,

View File

@ -733,53 +733,6 @@ extern "C" fn new_confirm_fido(n_args: usize, args: *const Obj, kwargs: *mut Map
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
} }
extern "C" fn new_show_simple(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| {
let title: Option<TString> = kwargs.get(Qstr::MP_QSTR_title)?.try_into_option()?;
let description: TString = kwargs.get_or(Qstr::MP_QSTR_description, "".into())?;
let button: TString = kwargs.get_or(Qstr::MP_QSTR_button, "".into())?;
let obj = if let Some(t) = title {
LayoutObj::new(Frame::left_aligned(
theme::label_title(),
t,
Dialog::new(
Paragraphs::new([Paragraph::new(&theme::TEXT_NORMAL, description)]),
theme::button_bar(Button::with_text(button).map(|msg| {
(matches!(msg, ButtonMsg::Clicked)).then(|| CancelConfirmMsg::Confirmed)
})),
),
))?
.into()
} else if !button.is_empty() {
LayoutObj::new(Border::new(
theme::borders(),
Dialog::new(
Paragraphs::new([Paragraph::new(&theme::TEXT_NORMAL, description)]),
theme::button_bar(Button::with_text(button).map(|msg| {
(matches!(msg, ButtonMsg::Clicked)).then(|| CancelConfirmMsg::Confirmed)
})),
),
))?
.into()
} else {
LayoutObj::new(Border::new(
theme::borders(),
Dialog::new(
Paragraphs::new(
[Paragraph::new(&theme::TEXT_DEMIBOLD, description).centered()],
),
Empty,
),
))?
.into()
};
Ok(obj)
};
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
}
extern "C" fn new_confirm_with_info(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { extern "C" fn new_confirm_with_info(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| { let block = move |_args: &[Obj], kwargs: &Map| {
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
@ -1033,15 +986,6 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// """ /// """
Qstr::MP_QSTR_confirm_fido => obj_fn_kw!(0, new_confirm_fido).as_obj(), Qstr::MP_QSTR_confirm_fido => obj_fn_kw!(0, new_confirm_fido).as_obj(),
/// def show_simple(
/// *,
/// title: str | None,
/// description: str = "",
/// button: str = "",
/// ) -> LayoutObj[UiResult]:
/// """Simple dialog with text and one button."""
Qstr::MP_QSTR_show_simple => obj_fn_kw!(0, new_show_simple).as_obj(),
/// def confirm_with_info( /// def confirm_with_info(
/// *, /// *,
/// title: str, /// title: str,

View File

@ -14,7 +14,7 @@ use crate::{
Checklist, Paragraph, ParagraphSource, ParagraphVecLong, ParagraphVecShort, Checklist, Paragraph, ParagraphSource, ParagraphVecLong, ParagraphVecShort,
Paragraphs, VecExt, Paragraphs, VecExt,
}, },
ComponentExt, Empty, Jpeg, Label, Never, Timeout, Border, ComponentExt, Empty, Jpeg, Label, Never, Timeout,
}, },
layout::{ layout::{
obj::{LayoutMaybeTrace, LayoutObj, RootComponent}, obj::{LayoutMaybeTrace, LayoutObj, RootComponent},
@ -587,6 +587,44 @@ impl UIFeaturesFirmware for ModelTTFeatures {
Ok(layout) Ok(layout)
} }
fn show_simple(
text: TString<'static>,
title: Option<TString<'static>>,
button: Option<TString<'static>>,
) -> Result<Gc<LayoutObj>, Error> {
let button = button.unwrap_or(TString::empty());
if let Some(t) = title {
LayoutObj::new(Frame::left_aligned(
theme::label_title(),
t,
Dialog::new(
Paragraphs::new([Paragraph::new(&theme::TEXT_NORMAL, text)]),
theme::button_bar(Button::with_text(button).map(|msg| {
(matches!(msg, ButtonMsg::Clicked)).then(|| CancelConfirmMsg::Confirmed)
})),
),
))
} else if !button.is_empty() {
LayoutObj::new(Border::new(
theme::borders(),
Dialog::new(
Paragraphs::new([Paragraph::new(&theme::TEXT_NORMAL, text)]),
theme::button_bar(Button::with_text(button).map(|msg| {
(matches!(msg, ButtonMsg::Clicked)).then(|| CancelConfirmMsg::Confirmed)
})),
),
))
} else {
LayoutObj::new(Border::new(
theme::borders(),
Dialog::new(
Paragraphs::new([Paragraph::new(&theme::TEXT_DEMIBOLD, text).centered()]),
Empty,
),
))
}
}
fn show_success( fn show_success(
title: TString<'static>, title: TString<'static>,
button: TString<'static>, button: TString<'static>,

View File

@ -159,6 +159,12 @@ pub trait UIFeaturesFirmware {
pages_iterable: Obj, // TODO: replace Obj pages_iterable: Obj, // TODO: replace Obj
) -> Result<impl LayoutMaybeTrace, Error>; ) -> Result<impl LayoutMaybeTrace, Error>;
fn show_simple(
text: TString<'static>,
title: Option<TString<'static>>,
button: Option<TString<'static>>,
) -> Result<Gc<LayoutObj>, Error>; // TODO: return LayoutMaybeTrace
fn show_success( fn show_success(
title: TString<'static>, title: TString<'static>,
button: TString<'static>, button: TString<'static>,

View File

@ -121,16 +121,6 @@ def confirm_fido(
""" """
# rust/src/ui/model_mercury/layout.rs
def show_simple(
*,
title: str | None,
description: str = "",
button: str = "",
) -> LayoutObj[UiResult]:
"""Simple dialog with text and one button."""
# rust/src/ui/model_mercury/layout.rs # rust/src/ui/model_mercury/layout.rs
def confirm_with_info( def confirm_with_info(
*, *,
@ -412,11 +402,6 @@ def multiple_pages_texts(
"""Show multiple texts, each on its own page.""" """Show multiple texts, each on its own page."""
# rust/src/ui/model_tr/layout.rs
def show_passphrase() -> LayoutObj[UiResult]:
"""Show passphrase on host dialog."""
# rust/src/ui/model_tr/layout.rs # rust/src/ui/model_tr/layout.rs
def confirm_with_info( def confirm_with_info(
*, *,
@ -587,16 +572,6 @@ def confirm_fido(
""" """
# rust/src/ui/model_tt/layout.rs
def show_simple(
*,
title: str | None,
description: str = "",
button: str = "",
) -> LayoutObj[UiResult]:
"""Simple dialog with text and one button."""
# rust/src/ui/model_tt/layout.rs # rust/src/ui/model_tt/layout.rs
def confirm_with_info( def confirm_with_info(
*, *,

View File

@ -335,6 +335,16 @@ def show_remaining_shares(
"""Shows SLIP39 state after info button is pressed on `confirm_recovery`.""" """Shows SLIP39 state after info button is pressed on `confirm_recovery`."""
# rust/src/ui/api/firmware_upy.rs
def show_simple(
*,
text: str,
title: str | None = None,
button: str | None = None,
) -> LayoutObj[UiResult]:
"""Simple dialog with text. TT: optional button."""
# rust/src/ui/api/firmware_upy.rs # rust/src/ui/api/firmware_upy.rs
def show_success( def show_success(
*, *,

View File

@ -1085,9 +1085,9 @@ def error_popup(
def request_passphrase_on_host() -> None: def request_passphrase_on_host() -> None:
draw_simple( draw_simple(
trezorui2.show_simple( trezorui_api.show_simple(
title=None, title=None,
description=TR.passphrase__please_enter, text=TR.passphrase__please_enter,
) )
) )

View File

@ -1136,7 +1136,12 @@ def error_popup(
def request_passphrase_on_host() -> None: def request_passphrase_on_host() -> None:
draw_simple(trezorui2.show_passphrase()) draw_simple(
trezorui_api.show_simple(
title=None,
text=TR.passphrase__please_enter,
)
)
def show_wait_text(message: str) -> None: def show_wait_text(message: str) -> None:

View File

@ -1133,9 +1133,9 @@ def error_popup(
def request_passphrase_on_host() -> None: def request_passphrase_on_host() -> None:
draw_simple( draw_simple(
trezorui2.show_simple( trezorui_api.show_simple(
title=None, title=None,
description=TR.passphrase__please_enter, text=TR.passphrase__please_enter,
) )
) )

View File

@ -168,9 +168,9 @@ async def _prompt_number(
return value return value
await interact( await interact(
trezorui2.show_simple( trezorui_api.show_simple(
title=None, title=None,
description=info(value), text=info(value),
button=TR.buttons__ok_i_understand, button=TR.buttons__ok_i_understand,
), ),
None, None,