1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-22 06:18:07 +00:00

feat(core/ui): allow text without header

This commit is contained in:
Martin Milata 2021-10-14 13:35:38 +02:00
parent 13c4fb97df
commit 8eb4bcff29
5 changed files with 40 additions and 16 deletions

View File

@ -9,6 +9,7 @@ from ...constants import (
TEXT_LINE_HEIGHT_HALF, TEXT_LINE_HEIGHT_HALF,
TEXT_MARGIN_LEFT, TEXT_MARGIN_LEFT,
TEXT_MAX_LINES, TEXT_MAX_LINES,
TEXT_MAX_LINES_NO_HEADER,
) )
LINE_WIDTH = ui.WIDTH - TEXT_MARGIN_LEFT LINE_WIDTH = ui.WIDTH - TEXT_MARGIN_LEFT
@ -232,7 +233,7 @@ def render_text(
""" """
# initial rendering state # initial rendering state
INITIAL_OFFSET_X = offset_x INITIAL_OFFSET_X = offset_x
offset_y_max = TEXT_HEADER_HEIGHT + (TEXT_LINE_HEIGHT * max_lines) offset_y_max = offset_y + (TEXT_LINE_HEIGHT * (max_lines - 1))
span = _WORKING_SPAN span = _WORKING_SPAN
# scan through up to item_offset so that the current font & color is up to date # scan through up to item_offset so that the current font & color is up to date
@ -364,10 +365,10 @@ if __debug__:
class TextBase(ui.Component): class TextBase(ui.Component):
def __init__( def __init__(
self, self,
header_text: str, header_text: str | None,
header_icon: str = ui.ICON_DEFAULT, header_icon: str = ui.ICON_DEFAULT,
icon_color: int = ui.ORANGE_ICON, icon_color: int = ui.ORANGE_ICON,
max_lines: int = TEXT_MAX_LINES, max_lines: int | None = None,
new_lines: bool = True, new_lines: bool = True,
break_words: bool = False, break_words: bool = False,
render_page_overflow: bool = True, render_page_overflow: bool = True,
@ -379,7 +380,14 @@ class TextBase(ui.Component):
self.header_text = header_text self.header_text = header_text
self.header_icon = header_icon self.header_icon = header_icon
self.icon_color = icon_color self.icon_color = icon_color
self.max_lines = max_lines
if max_lines is None:
self.max_lines = (
TEXT_MAX_LINES_NO_HEADER if self.header_text is None else TEXT_MAX_LINES
)
else:
self.max_lines = max_lines
self.new_lines = new_lines self.new_lines = new_lines
self.break_words = break_words self.break_words = break_words
self.render_page_overflow = render_page_overflow self.render_page_overflow = render_page_overflow
@ -436,7 +444,7 @@ class TextBase(ui.Component):
self.on_render() self.on_render()
finally: finally:
self.repaint = should_repaint self.repaint = should_repaint
return [self.header_text] + display_mock.screen_contents return [self.header_text or ""] + display_mock.screen_contents
LABEL_LEFT = const(0) LABEL_LEFT = const(0)

View File

@ -7,7 +7,13 @@ from trezor.messages import ButtonAck, ButtonRequest
from .button import Button, ButtonCancel, ButtonConfirm, ButtonDefault from .button import Button, ButtonCancel, ButtonConfirm, ButtonDefault
from .confirm import CANCELLED, CONFIRMED, Confirm from .confirm import CANCELLED, CONFIRMED, Confirm
from .swipe import SWIPE_DOWN, SWIPE_UP, SWIPE_VERTICAL, Swipe from .swipe import SWIPE_DOWN, SWIPE_UP, SWIPE_VERTICAL, Swipe
from .text import LINE_WIDTH_PAGINATED, TEXT_MAX_LINES, Span, Text from .text import (
LINE_WIDTH_PAGINATED,
TEXT_MAX_LINES,
TEXT_MAX_LINES_NO_HEADER,
Span,
Text,
)
if False: if False:
from typing import Callable, Iterable from typing import Callable, Iterable
@ -310,7 +316,7 @@ PAGEBREAK = 0, ""
def paginate_paragraphs( def paginate_paragraphs(
para: Iterable[tuple[int, str]], para: Iterable[tuple[int, str]],
header: str, header: str | None,
header_icon: str = ui.ICON_DEFAULT, header_icon: str = ui.ICON_DEFAULT,
icon_color: int = ui.ORANGE_ICON, icon_color: int = ui.ORANGE_ICON,
break_words: bool = False, break_words: bool = False,
@ -319,6 +325,7 @@ def paginate_paragraphs(
span = Span("", 0, ui.NORMAL, break_words=break_words) span = Span("", 0, ui.NORMAL, break_words=break_words)
lines = 0 lines = 0
content: list[TextContent] = [] content: list[TextContent] = []
max_lines = TEXT_MAX_LINES_NO_HEADER if header is None else TEXT_MAX_LINES
for item in para: for item in para:
if item is PAGEBREAK: if item is PAGEBREAK:
continue continue
@ -330,7 +337,7 @@ def paginate_paragraphs(
content.append("\n") content.append("\n")
content.extend(item) content.extend(item)
if lines <= TEXT_MAX_LINES: if lines <= max_lines:
result = Text( result = Text(
header, header,
header_icon=header_icon, header_icon=header_icon,
@ -377,7 +384,7 @@ def paginate_paragraphs(
) )
page.content = content page.content = content
pages.append(page) pages.append(page)
lines_left = TEXT_MAX_LINES - 1 lines_left = max_lines - 1
else: else:
lines_left -= 1 lines_left -= 1

View File

@ -8,7 +8,10 @@ from ..common.text import ( # noqa: F401
BR_HALF, BR_HALF,
LINE_WIDTH, LINE_WIDTH,
LINE_WIDTH_PAGINATED, LINE_WIDTH_PAGINATED,
TEXT_HEADER_HEIGHT,
TEXT_LINE_HEIGHT,
TEXT_MAX_LINES, TEXT_MAX_LINES,
TEXT_MAX_LINES_NO_HEADER,
Span, Span,
TextBase, TextBase,
render_text, render_text,
@ -30,13 +33,16 @@ def header(
class Text(TextBase): class Text(TextBase):
def on_render(self) -> None: def on_render(self) -> None:
if self.repaint: if self.repaint:
header( offset_y = TEXT_LINE_HEIGHT
self.header_text, if self.header_text is not None:
self.header_icon, header(
ui.TITLE_GREY, self.header_text,
ui.BG, self.header_icon,
self.icon_color, ui.TITLE_GREY,
) ui.BG,
self.icon_color,
)
offset_y = TEXT_HEADER_HEIGHT + TEXT_LINE_HEIGHT
render_text( render_text(
self.content, self.content,
self.new_lines, self.new_lines,
@ -46,6 +52,7 @@ class Text(TextBase):
break_words=self.break_words, break_words=self.break_words,
line_width=self.line_width, line_width=self.line_width,
render_page_overflow=self.render_page_overflow, render_page_overflow=self.render_page_overflow,
offset_y=offset_y,
) )
self.repaint = False self.repaint = False

View File

@ -5,3 +5,4 @@ TEXT_LINE_HEIGHT = const(9)
TEXT_LINE_HEIGHT_HALF = const(4) TEXT_LINE_HEIGHT_HALF = const(4)
TEXT_MARGIN_LEFT = const(0) TEXT_MARGIN_LEFT = const(0)
TEXT_MAX_LINES = const(4) TEXT_MAX_LINES = const(4)
TEXT_MAX_LINES_NO_HEADER = const(5)

View File

@ -5,6 +5,7 @@ TEXT_LINE_HEIGHT = const(26)
TEXT_LINE_HEIGHT_HALF = const(13) TEXT_LINE_HEIGHT_HALF = const(13)
TEXT_MARGIN_LEFT = const(14) TEXT_MARGIN_LEFT = const(14)
TEXT_MAX_LINES = const(5) TEXT_MAX_LINES = const(5)
TEXT_MAX_LINES_NO_HEADER = const(7)
PAGINATION_MARGIN_RIGHT = const(22) PAGINATION_MARGIN_RIGHT = const(22)
MONO_ADDR_PER_LINE = const(17) MONO_ADDR_PER_LINE = const(17)