mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-06-26 18:02:35 +00:00
feat(core): implement show_more dialogue for TR
[no changelog]
This commit is contained in:
parent
99369d555d
commit
09cd64123b
@ -256,7 +256,11 @@ fn content_in_button_page<T: Component + Paginate + MaybeTrace + 'static>(
|
|||||||
// Left button - icon, text or nothing.
|
// Left button - icon, text or nothing.
|
||||||
let cancel_btn = if let Some(verb_cancel) = verb_cancel {
|
let cancel_btn = if let Some(verb_cancel) = verb_cancel {
|
||||||
if !verb_cancel.is_empty() {
|
if !verb_cancel.is_empty() {
|
||||||
Some(ButtonDetails::text(verb_cancel))
|
if verb_cancel.as_ref() == "left_arrow_icon" {
|
||||||
|
Some(ButtonDetails::left_arrow_icon())
|
||||||
|
} else {
|
||||||
|
Some(ButtonDetails::text(verb_cancel))
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Some(ButtonDetails::cancel_icon())
|
Some(ButtonDetails::cancel_icon())
|
||||||
}
|
}
|
||||||
@ -1062,7 +1066,7 @@ extern "C" fn new_confirm_with_info(n_args: usize, args: *const Obj, kwargs: *mu
|
|||||||
|
|
||||||
for para in IterBuf::new().try_iterate(items)? {
|
for para in IterBuf::new().try_iterate(items)? {
|
||||||
let [font, text]: [Obj; 2] = iter_into_array(para)?;
|
let [font, text]: [Obj; 2] = iter_into_array(para)?;
|
||||||
let style: &TextStyle = theme::textstyle_number_bold_or_mono(font.try_into()?);
|
let style: &TextStyle = theme::textstyle_number(font.try_into()?);
|
||||||
let text: StrBuffer = text.try_into()?;
|
let text: StrBuffer = text.try_into()?;
|
||||||
paragraphs.add(Paragraph::new(style, text));
|
paragraphs.add(Paragraph::new(style, text));
|
||||||
if paragraphs.is_full() {
|
if paragraphs.is_full() {
|
||||||
@ -1081,6 +1085,32 @@ extern "C" fn new_confirm_with_info(n_args: usize, args: *const Obj, kwargs: *mu
|
|||||||
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_confirm_more(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
|
||||||
|
let block = move |_args: &[Obj], kwargs: &Map| {
|
||||||
|
let title: StrBuffer = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
|
||||||
|
let button: StrBuffer = kwargs.get(Qstr::MP_QSTR_button)?.try_into()?;
|
||||||
|
let items: Obj = kwargs.get(Qstr::MP_QSTR_items)?;
|
||||||
|
|
||||||
|
let mut paragraphs = ParagraphVecLong::new();
|
||||||
|
|
||||||
|
for para in IterBuf::new().try_iterate(items)? {
|
||||||
|
let [font, text]: [Obj; 2] = iter_into_array(para)?;
|
||||||
|
let style: &TextStyle = theme::textstyle_number(font.try_into()?);
|
||||||
|
let text: StrBuffer = text.try_into()?;
|
||||||
|
paragraphs.add(Paragraph::new(style, text));
|
||||||
|
}
|
||||||
|
|
||||||
|
content_in_button_page(
|
||||||
|
title,
|
||||||
|
paragraphs.into_paragraphs(),
|
||||||
|
button,
|
||||||
|
Some("left_arrow_icon".into()),
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
};
|
||||||
|
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" fn new_confirm_coinjoin(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
|
extern "C" fn new_confirm_coinjoin(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 max_rounds: StrBuffer = kwargs.get(Qstr::MP_QSTR_max_rounds)?.try_into()?;
|
let max_rounds: StrBuffer = kwargs.get(Qstr::MP_QSTR_max_rounds)?.try_into()?;
|
||||||
@ -1648,6 +1678,16 @@ pub static mp_module_trezorui2: Module = obj_module! {
|
|||||||
/// without scrolling."""
|
/// without scrolling."""
|
||||||
Qstr::MP_QSTR_confirm_with_info => obj_fn_kw!(0, new_confirm_with_info).as_obj(),
|
Qstr::MP_QSTR_confirm_with_info => obj_fn_kw!(0, new_confirm_with_info).as_obj(),
|
||||||
|
|
||||||
|
/// def confirm_more(
|
||||||
|
/// *,
|
||||||
|
/// title: str,
|
||||||
|
/// button: str,
|
||||||
|
/// items: Iterable[tuple[int, str]],
|
||||||
|
/// ) -> object:
|
||||||
|
/// """Confirm long content with the possibility to go back from any page.
|
||||||
|
/// Meant to be used with confirm_with_info."""
|
||||||
|
Qstr::MP_QSTR_confirm_more => obj_fn_kw!(0, new_confirm_more).as_obj(),
|
||||||
|
|
||||||
/// def confirm_coinjoin(
|
/// def confirm_coinjoin(
|
||||||
/// *,
|
/// *,
|
||||||
/// max_rounds: str,
|
/// max_rounds: str,
|
||||||
|
@ -37,13 +37,13 @@ pub const TEXT_MONO_DATA: TextStyle =
|
|||||||
TEXT_MONO.with_line_breaking(LineBreaking::BreakWordsNoHyphen);
|
TEXT_MONO.with_line_breaking(LineBreaking::BreakWordsNoHyphen);
|
||||||
|
|
||||||
/// Convert Python-side numeric id to a `TextStyle`.
|
/// Convert Python-side numeric id to a `TextStyle`.
|
||||||
/// Using only BOLD or MONO fonts.
|
pub fn textstyle_number(num: i32) -> &'static TextStyle {
|
||||||
pub fn textstyle_number_bold_or_mono(num: i32) -> &'static TextStyle {
|
|
||||||
let font = Font::from_i32(-num);
|
let font = Font::from_i32(-num);
|
||||||
match font {
|
match font {
|
||||||
Some(Font::BOLD) => &TEXT_BOLD,
|
Some(Font::BOLD) => &TEXT_BOLD,
|
||||||
Some(Font::DEMIBOLD) => &TEXT_BOLD,
|
Some(Font::DEMIBOLD) => &TEXT_BOLD,
|
||||||
_ => &TEXT_MONO,
|
Some(Font::NORMAL) => &TEXT_NORMAL,
|
||||||
|
_ => &TEXT_MONO_DATA,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,6 +231,17 @@ def confirm_with_info(
|
|||||||
without scrolling."""
|
without scrolling."""
|
||||||
|
|
||||||
|
|
||||||
|
# rust/src/ui/model_tr/layout.rs
|
||||||
|
def confirm_more(
|
||||||
|
*,
|
||||||
|
title: str,
|
||||||
|
button: str,
|
||||||
|
items: Iterable[tuple[int, str]],
|
||||||
|
) -> object:
|
||||||
|
"""Confirm long content with the possibility to go back from any page.
|
||||||
|
Meant to be used with confirm_with_info."""
|
||||||
|
|
||||||
|
|
||||||
# rust/src/ui/model_tr/layout.rs
|
# rust/src/ui/model_tr/layout.rs
|
||||||
def confirm_coinjoin(
|
def confirm_coinjoin(
|
||||||
*,
|
*,
|
||||||
|
@ -761,16 +761,61 @@ async def confirm_blob(
|
|||||||
extra=None,
|
extra=None,
|
||||||
verb_cancel="", # to show the cancel icon
|
verb_cancel="", # to show the cancel icon
|
||||||
hold=hold,
|
hold=hold,
|
||||||
|
verb_cancel="", # icon
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
await raise_if_not_confirmed(
|
if ask_pagination and layout.page_count() > 1:
|
||||||
interact(
|
assert not hold
|
||||||
layout,
|
await _confirm_ask_pagination(br_type, title, data, description, br_code)
|
||||||
br_type,
|
|
||||||
br_code,
|
else:
|
||||||
|
await raise_if_not_confirmed(
|
||||||
|
interact(
|
||||||
|
layout,
|
||||||
|
br_type,
|
||||||
|
br_code,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
|
|
||||||
|
async def _confirm_ask_pagination(
|
||||||
|
br_type: str,
|
||||||
|
title: str,
|
||||||
|
data: bytes | str,
|
||||||
|
description: str,
|
||||||
|
br_code: ButtonRequestType,
|
||||||
|
) -> None:
|
||||||
|
paginated: ui.Layout | None = None
|
||||||
|
# TODO: make should_show_more/confirm_more accept bytes directly
|
||||||
|
if isinstance(data, bytes):
|
||||||
|
from ubinascii import hexlify
|
||||||
|
|
||||||
|
data = hexlify(data).decode()
|
||||||
|
while True:
|
||||||
|
if not await should_show_more(
|
||||||
|
title,
|
||||||
|
para=[(ui.NORMAL, description), (ui.MONO, data)],
|
||||||
|
br_type=br_type,
|
||||||
|
br_code=br_code,
|
||||||
|
):
|
||||||
|
return
|
||||||
|
|
||||||
|
if paginated is None:
|
||||||
|
paginated = RustLayout(
|
||||||
|
trezorui2.confirm_more(
|
||||||
|
title=title,
|
||||||
|
button="GO BACK",
|
||||||
|
items=[(ui.MONO, data)],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
paginated.request_complete_repaint()
|
||||||
|
|
||||||
|
result = await interact(paginated, br_type, br_code)
|
||||||
|
assert result in (CONFIRMED, CANCELLED)
|
||||||
|
|
||||||
|
assert False
|
||||||
|
|
||||||
|
|
||||||
async def confirm_address(
|
async def confirm_address(
|
||||||
|
Loading…
Reference in New Issue
Block a user