From 8e270fbabd694dd5f196774a4e63c755ecf5b456 Mon Sep 17 00:00:00 2001 From: Jan Pochyla Date: Mon, 18 Jun 2018 17:48:38 +0200 Subject: [PATCH] src/trezor/ui/text: fix layout issues --- src/trezor/ui/text.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/trezor/ui/text.py b/src/trezor/ui/text.py index 3ed2ed87e4..3abb06b1b2 100644 --- a/src/trezor/ui/text.py +++ b/src/trezor/ui/text.py @@ -4,7 +4,7 @@ from trezor import ui TEXT_HEADER_HEIGHT = const(48) TEXT_LINE_HEIGHT = const(26) TEXT_MARGIN_LEFT = const(14) -TEXT_MAX_LINES = const(4) +TEXT_MAX_LINES = const(5) # needs to be different from all colors and font ids BR = const(-256) @@ -25,11 +25,13 @@ def render_words(words: list, new_lines: bool, max_lines: int) -> None: DASH = ui.display.text_width('-', ui.BOLD) ELLIPSIS = ui.display.text_width('...', ui.BOLD) - for word in words: + for word_index, word in enumerate(words): + has_next_word = word_index < len(words) - 1 + if isinstance(word, int): if word == BR: # line break - if not offset_y < OFFSET_Y_MAX: + if offset_y >= OFFSET_Y_MAX: ui.display.text(offset_x, offset_y, '...', ui.BOLD, ui.GREY, bg) return offset_x = TEXT_MARGIN_LEFT @@ -44,16 +46,16 @@ def render_words(words: list, new_lines: bool, max_lines: int) -> None: width = ui.display.text_width(word, font) - while offset_x + width + SPACE + ELLIPSIS > OFFSET_X_MAX: - space_for_another_line = offset_y < OFFSET_Y_MAX + while offset_x + width > OFFSET_X_MAX or (has_next_word and offset_y >= OFFSET_Y_MAX): + beginning_of_line = offset_x == TEXT_MARGIN_LEFT word_fits_in_one_line = width < (OFFSET_X_MAX - TEXT_MARGIN_LEFT) - if space_for_another_line and word_fits_in_one_line: + if offset_y < OFFSET_Y_MAX and word_fits_in_one_line and not beginning_of_line: # line break offset_x = TEXT_MARGIN_LEFT offset_y += TEXT_LINE_HEIGHT break # word split - if space_for_another_line: + if offset_y < OFFSET_Y_MAX: split = '-' splitw = DASH else: @@ -72,7 +74,7 @@ def render_words(words: list, new_lines: bool, max_lines: int) -> None: ui.display.text(offset_x, offset_y, span, font, fg, bg) ui.display.text(offset_x + width, offset_y, split, ui.BOLD, ui.GREY, bg) # line break - if not space_for_another_line: + if offset_y >= OFFSET_Y_MAX: return offset_x = TEXT_MARGIN_LEFT offset_y += TEXT_LINE_HEIGHT @@ -82,16 +84,18 @@ def render_words(words: list, new_lines: bool, max_lines: int) -> None: # render word ui.display.text(offset_x, offset_y, word, font, fg, bg) - offset_x += width - offset_x += SPACE - # line break - if new_lines: - if not offset_y < OFFSET_Y_MAX: + if new_lines and has_next_word: + # line break + if offset_y >= OFFSET_Y_MAX: ui.display.text(offset_x, offset_y, '...', ui.BOLD, ui.GREY, bg) return offset_x = TEXT_MARGIN_LEFT offset_y += TEXT_LINE_HEIGHT + else: + # shift cursor + offset_x += width + offset_x += SPACE class Text(ui.Widget):