1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-07-25 16:08:32 +00:00

WIP - improvement comments

This commit is contained in:
grdddj 2022-12-14 13:05:17 +01:00
parent 7aaa5b8fe6
commit 3c38d74a76
3 changed files with 46 additions and 6 deletions

View File

@ -396,11 +396,10 @@ impl ButtonStyleSheet {
force_width, force_width,
offset, offset,
) )
// Self::new(theme::BG, theme::FG, with_outline, with_arms)
} }
} }
/// Describing the button in the choice item. /// Describing the button on the screen - only visuals.
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
pub struct ButtonDetails<T> { pub struct ButtonDetails<T> {
pub text: Option<T>, pub text: Option<T>,

View File

@ -12,10 +12,12 @@ use crate::{
use heapless::Vec; use heapless::Vec;
// TODO: consider moving into T: AsRef<str> instead if StrBuffer? // TODO: consider moving into T: AsRef<str> instead of StrBuffer?
// TODO: document this
#[derive(Clone)] #[derive(Clone)]
pub struct ToDisplay { pub struct ToDisplay {
pub text: StrBuffer, pub text: StrBuffer,
// TODO: rename to "length_from_end"
pub length: usize, pub length: usize,
} }
@ -28,6 +30,15 @@ impl ToDisplay {
} }
} }
#[derive(Clone)]
pub struct QrCodeInfo {
pub text: StrBuffer,
pub max_size: i16,
pub case_sensitive: bool,
pub center: Point,
}
// TODO: add QrCode(QrCodeInfo)
/// Operations that can be done on the screen. /// Operations that can be done on the screen.
#[derive(Clone)] #[derive(Clone)]
pub enum Op { pub enum Op {
@ -167,6 +178,8 @@ impl TextLayout {
/// Baseline `Point` where we are starting to draw the text. /// Baseline `Point` where we are starting to draw the text.
pub fn initial_cursor(&self) -> Point { pub fn initial_cursor(&self) -> Point {
// TODO: do NOT add the text_font height here, as it can be changed - each page
// can have its own font and the Y offset would be wrong.
self.bounds.top_left() + Offset::y(self.style.text_font.text_height() + self.padding_top) self.bounds.top_left() + Offset::y(self.style.text_font.text_height() + self.padding_top)
} }
@ -192,6 +205,10 @@ impl TextLayout {
let init_cursor = *cursor; let init_cursor = *cursor;
let mut total_processed_chars = 0; let mut total_processed_chars = 0;
// TODO: get cursor at the very top of the page and only then subtract
// the font height according to the CURRENT font - which can be different
// from the original font.
let mut skipped = 0; let mut skipped = 0;
for op in ops { for op in ops {
let real_op = { let real_op = {
@ -258,15 +275,22 @@ impl TextLayout {
}; };
} }
// Drawing text or icon // Drawing text or icon
// TODO: add QRCode support - always returning OOB
// to force going to the next page
Op::Text(_) | Op::Icon(_) => { Op::Text(_) | Op::Icon(_) => {
// Text and Icon behave similarly - we try to fit them // Text and Icon behave similarly - we try to fit them
// on the current page and if they do not fit, // on the current page and if they do not fit,
// return the appropriate OutOfBounds message // return the appropriate OutOfBounds message
let fit = if let Op::Text(to_display) = op { let fit = if let Op::Text(to_display) = op {
// TODO: document this a little bit
let text = to_display.text.as_ref(); let text = to_display.text.as_ref();
let text_len = to_display.length; let text_len = to_display.length;
let start = text.len() - text_len; let start = text.len() - text_len;
let to_really_display = &text[start..]; let to_really_display = &text[start..];
// TODO: pass in whether we are in the middle of a string
// (start > 0),
// in which case we could/should start the text with
// an arrow icon (opposite to ellipsis)
self.layout_text(to_really_display, cursor, sink) self.layout_text(to_really_display, cursor, sink)
} else if let Op::Icon(icon) = op { } else if let Op::Icon(icon) = op {
self.layout_icon(icon, cursor, sink) self.layout_icon(icon, cursor, sink)
@ -323,6 +347,12 @@ impl TextLayout {
}; };
} }
// TODO: draw the arrow icon if we are in the middle of a string
// TODO: have the variable `is_last` and in that case tell it to
// `fit_horizontally`, which will then account for the ellipsis icon
// instead of the hyphen (have it `ellipsis_length`)
while !remaining_text.is_empty() { while !remaining_text.is_empty() {
let span = Span::fit_horizontally( let span = Span::fit_horizontally(
remaining_text, remaining_text,
@ -335,9 +365,11 @@ impl TextLayout {
// Not doing it when the span length is 0, as that // Not doing it when the span length is 0, as that
// means we encountered a newline/line-break, which we do not draw. // means we encountered a newline/line-break, which we do not draw.
// Line-breaks are reported later. // Line-breaks are reported later.
let text_to_display = &remaining_text[..span.length];
if span.length > 0 { if span.length > 0 {
sink.text(*cursor, self, &remaining_text[..span.length]); sink.text(*cursor, self, text_to_display);
} }
let last_displayed_char = text_to_display.chars().last().unwrap_or('\n');
// Continue with the rest of the remaining_text. // Continue with the rest of the remaining_text.
remaining_text = &remaining_text[span.length + span.skip_next_chars..]; remaining_text = &remaining_text[span.length + span.skip_next_chars..];
@ -360,7 +392,8 @@ impl TextLayout {
// character is a dot (signalling end of one sentence). // character is a dot (signalling end of one sentence).
let should_append_ellipsis = let should_append_ellipsis =
matches!(self.style.page_breaking, PageBreaking::CutAndInsertEllipsis) matches!(self.style.page_breaking, PageBreaking::CutAndInsertEllipsis)
&& !span.insert_hyphen_before_line_break; && !span.insert_hyphen_before_line_break
&& last_displayed_char != '.';
if should_append_ellipsis { if should_append_ellipsis {
sink.ellipsis(*cursor, self); sink.ellipsis(*cursor, self);
} }
@ -432,6 +465,7 @@ impl TextLayout {
cursor.x += icon.width() as i16; cursor.x += icon.width() as i16;
LayoutFit::Fitting { LayoutFit::Fitting {
// TODO: unify the 1 being returned - make it a CONST probably
processed_chars: 1, processed_chars: 1,
height: 0, // it should just draw on one line height: 0, // it should just draw on one line
} }
@ -471,8 +505,10 @@ impl LayoutFit {
pub trait LayoutSink { pub trait LayoutSink {
/// Text should be processed. /// Text should be processed.
fn text(&mut self, _cursor: Point, _layout: &TextLayout, _text: &str) {} fn text(&mut self, _cursor: Point, _layout: &TextLayout, _text: &str) {}
/// Text should be processed. /// Icon should be displayed.
fn icon(&mut self, _cursor: Point, _layout: &TextLayout, _icon: Icon) {} fn icon(&mut self, _cursor: Point, _layout: &TextLayout, _icon: Icon) {}
/// QR code should be displayed.
fn qrcode(&mut self, _cursor: Point, _layout: &TextLayout, _qr_code: QrCodeInfo) {}
/// Hyphen at the end of line. /// Hyphen at the end of line.
fn hyphen(&mut self, _cursor: Point, _layout: &TextLayout) {} fn hyphen(&mut self, _cursor: Point, _layout: &TextLayout) {}
/// Ellipsis at the end of the page. /// Ellipsis at the end of the page.
@ -545,6 +581,7 @@ impl LayoutSink for TextRenderer {
fn ellipsis(&mut self, cursor: Point, layout: &TextLayout) { fn ellipsis(&mut self, cursor: Point, layout: &TextLayout) {
if let Some(icon) = layout.style.ellipsis_icon { if let Some(icon) = layout.style.ellipsis_icon {
// Icon should end little below the cursor's baseline // Icon should end little below the cursor's baseline
// TODO: add some offset to the right
let bottom_left = cursor + Offset::y(2); let bottom_left = cursor + Offset::y(2);
display::icon_bottom_left( display::icon_bottom_left(
bottom_left, bottom_left,
@ -617,6 +654,7 @@ impl GlyphMetrics for Font {
} }
} }
// TODO: rename to `LineSpan`?
/// Carries info about the content that was processed /// Carries info about the content that was processed
/// on the current line. /// on the current line.
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]

View File

@ -202,6 +202,8 @@ extern "C" fn new_confirm_action(n_args: usize, args: *const Obj, kwargs: *mut M
} }
extern "C" fn new_confirm_text(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { extern "C" fn new_confirm_text(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
// TODO: should be deleted and replaced by new_confirm_action with some default parameters
let block = |_args: &[Obj], kwargs: &Map| { let block = |_args: &[Obj], kwargs: &Map| {
let title: StrBuffer = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; let title: StrBuffer = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
let data: StrBuffer = kwargs.get(Qstr::MP_QSTR_data)?.try_into()?; let data: StrBuffer = kwargs.get(Qstr::MP_QSTR_data)?.try_into()?;
@ -390,6 +392,7 @@ extern "C" fn show_qr(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
} }
// TODO: not supplying tuple of data, supply data itself without unpacking
/// General pattern of most tutorial screens. /// General pattern of most tutorial screens.
/// (title, text, btn_layout, btn_actions) /// (title, text, btn_layout, btn_actions)
fn tutorial_screen( fn tutorial_screen(