mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-22 14:28:07 +00:00
feat(core/ui): allow text without header
This commit is contained in:
parent
13c4fb97df
commit
8eb4bcff29
@ -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
|
||||||
|
|
||||||
|
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.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)
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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,6 +33,8 @@ def header(
|
|||||||
class Text(TextBase):
|
class Text(TextBase):
|
||||||
def on_render(self) -> None:
|
def on_render(self) -> None:
|
||||||
if self.repaint:
|
if self.repaint:
|
||||||
|
offset_y = TEXT_LINE_HEIGHT
|
||||||
|
if self.header_text is not None:
|
||||||
header(
|
header(
|
||||||
self.header_text,
|
self.header_text,
|
||||||
self.header_icon,
|
self.header_icon,
|
||||||
@ -37,6 +42,7 @@ class Text(TextBase):
|
|||||||
ui.BG,
|
ui.BG,
|
||||||
self.icon_color,
|
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
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user