def render(self): offset_x = TEXT_MARGIN_LEFT offset_y = TEXT_LINE_HEIGHT + TEXT_HEADER_HEIGHT style = ui.NORMAL fg = ui.FG bg = ui.BG ui.header(self.header_text, self.header_icon, ui.TITLE_GREY, ui.BG, self.icon_color) def process(eitem): nonlocal offset_y nonlocal style nonlocal fg if isinstance(eitem, str): ui.display.text(offset_x, offset_y, eitem, style, fg, bg) offset_y += TEXT_LINE_HEIGHT elif isinstance(eitem, (tuple, list, dict, set)): for i in eitem: process(i) elif eitem == ui.MONO or eitem == ui.NORMAL or eitem == ui.BOLD: style = eitem else: fg = eitem for item in self.content: process(item)
async def show_mnemonic_page(page, page_count, mnemonic): from trezor.ui.button import Button, CONFIRM_BUTTON, CONFIRM_BUTTON_ACTIVE from trezor.ui.scroll import render_scrollbar, animate_swipe ui.display.clear() ui.header('Write down your seed', ui.ICON_RESET, ui.BLACK, ui.LIGHT_GREEN) render_scrollbar(page, page_count) for pi, (wi, word) in enumerate(mnemonic[page]): top = pi * 35 + 68 pos = wi + 1 offset = 0 if pos > 9: offset += 12 ui.display.text( 10, top, '%d.' % pos, ui.BOLD, ui.LIGHT_GREEN, ui.BLACK) ui.display.text( 30 + offset, top, '%s' % word, ui.BOLD, ui.WHITE, ui.BLACK) if page + 1 == page_count: await Button( (0, 240 - 48, 240, 48), 'Finish', normal_style=CONFIRM_BUTTON, active_style=CONFIRM_BUTTON_ACTIVE) else: await animate_swipe()
def on_render(self): current = self.current ui.header("Refreshing", ui.ICON_SEND, ui.TITLE_GREY, ui.BG, ui.BLUE) p = (1000 * current // 8) % 1000 ui.display.loader(p, True, 18, ui.WHITE, ui.BG) ui.display.text_center(ui.WIDTH // 2, 145, "%d" % current, ui.NORMAL, ui.FG, ui.BG)
def _start_progress() -> None: workflow.closedefault() ui.backlight_fade(ui.BACKLIGHT_DIM) ui.display.clear() ui.header("Please wait") ui.display.refresh() ui.backlight_fade(ui.BACKLIGHT_NORMAL)
def on_render(self): if self.repaint: count = self.input.count # render the headline if self.step is ShamirNumInput.SET_SHARES: header = "Set num. of shares" elif self.step is ShamirNumInput.SET_THRESHOLD: header = "Set the threshold" ui.header(header, ui.ICON_RESET, ui.TITLE_GREY, ui.BG, ui.ORANGE_ICON) # render the counter if self.step is ShamirNumInput.SET_SHARES: ui.display.text(12, 130, "%s people or locations" % count, ui.BOLD, ui.FG, ui.BG) ui.display.text(12, 156, "will each host one share.", ui.NORMAL, ui.FG, ui.BG) elif self.step is ShamirNumInput.SET_THRESHOLD: ui.display.text(12, 130, "For recovery you'll need", ui.NORMAL, ui.FG, ui.BG) ui.display.text(12, 156, "any %s of shares." % count, ui.BOLD, ui.FG, ui.BG) self.repaint = False
def on_render(self): if self.repaint: count = self.input.count # render the headline if self.step is ShamirNumInput.SET_SHARES: header = "Set num. of shares" elif self.step is ShamirNumInput.SET_THRESHOLD: header = "Set threshold" elif self.step is ShamirNumInput.SET_GROUPS: header = "Set num. of groups" elif self.step is ShamirNumInput.SET_GROUP_THRESHOLD: header = "Set group threshold" ui.header(header, ui.ICON_RESET, ui.TITLE_GREY, ui.BG, ui.ORANGE_ICON) # render the counter if self.step is ShamirNumInput.SET_SHARES: if self.group_id is None: first_line_text = "%s people or locations" % count second_line_text = "will each hold one share." else: first_line_text = "Set the total number of" second_line_text = "shares in Group %s." % (self.group_id + 1) ui.display.text(12, 130, first_line_text, ui.NORMAL, ui.FG, ui.BG, ui.WIDTH - 12) ui.display.text(12, 156, second_line_text, ui.NORMAL, ui.FG, ui.BG) elif self.step is ShamirNumInput.SET_THRESHOLD: if self.group_id is None: first_line_text = "For recovery you need" second_line_text = "any %s of the shares." % count else: first_line_text = "The required number of " second_line_text = "shares to form Group %s." % ( self.group_id + 1) ui.display.text(12, 130, first_line_text, ui.NORMAL, ui.FG, ui.BG) ui.display.text(12, 156, second_line_text, ui.NORMAL, ui.FG, ui.BG, ui.WIDTH - 12) elif self.step is ShamirNumInput.SET_GROUPS: ui.display.text(12, 130, "A group is made up of", ui.NORMAL, ui.FG, ui.BG) ui.display.text(12, 156, "recovery shares.", ui.NORMAL, ui.FG, ui.BG, ui.WIDTH - 12) elif self.step is ShamirNumInput.SET_GROUP_THRESHOLD: ui.display.text(12, 130, "The required number of", ui.NORMAL, ui.FG, ui.BG) ui.display.text( 12, 156, "groups for recovery.", ui.NORMAL, ui.FG, ui.BG, ui.WIDTH - 12, ) self.repaint = False
async def layout_recovery_device(ctx, msg): msg = 'Please enter ' + nth(msg.word_count) + ' word' ui.display.clear() ui.header('Recovery device', ui.ICON_RECOVERY, ui.BLACK, ui.LIGHT_GREEN) ui.display.text(10, 74, msg, ui.BOLD, ui.WHITE, ui.BLACK) ui.display.text(10, 104, 'of your mnemonic.', ui.BOLD, ui.WHITE, ui.BLACK)
def render(self) -> None: if self.action == _CONFIRM_REGISTER: header = 'U2F Register' else: header = 'U2F Authenticate' ui.header(header, ui.ICON_RESET, ui.GREEN, ui.BG) ui.display.image((240 - 64) // 2, 90, self.app_icon) ui.display.text_center(120, 185, self.app_name, ui.MONO, ui.FG, ui.BG)
def render(self) -> None: if self.action == _CONFIRM_REGISTER: header = "U2F Register" else: header = "U2F Authenticate" ui.header(header, ui.ICON_DEFAULT, ui.GREEN, ui.BG, ui.GREEN) ui.display.image((ui.WIDTH - 64) // 2, 64, self.app_icon) ui.display.text_center(ui.WIDTH // 2, 168, self.app_name, ui.MONO, ui.FG, ui.BG)
def on_render(self): state = self.state info = self.info ui.header("Signing transaction", ui.ICON_SEND, ui.TITLE_GREY, ui.BG, ui.BLUE) p = 1000 * state.progress_cur // state.progress_total ui.display.loader(p, False, -4, ui.WHITE, ui.BG) ui.display.text_center(ui.WIDTH // 2, 210, info[0], ui.NORMAL, ui.FG, ui.BG) if len(info) > 1: ui.display.text_center(ui.WIDTH // 2, 235, info[1], ui.NORMAL, ui.FG, ui.BG)
def _start_progress() -> None: # Because we are drawing to the screen manually, without a layout, we # should make sure that no other layout is running. At this point, only # the homescreen should be on, so shut it down. workflow.close_default() ui.backlight_fade(ui.BACKLIGHT_DIM) ui.display.clear() ui.header("Please wait") ui.display.refresh() ui.backlight_fade(ui.BACKLIGHT_NORMAL)
def on_render(self): if self.repaint: ui.header(self.title, self.icon) text.render_text( self.words, new_lines=False, # we are adding line breaks manually max_lines=_CHECKLIST_MAX_LINES, offset_x=_CHECKLIST_OFFSET_X, ) self.repaint = False
def render(self): if self.tainted: ui.header( self.header_text, self.header_icon, ui.TITLE_GREY, ui.BG, self.icon_color, ) render_text(self.content, self.new_lines, self.max_lines) self.tainted = False
def on_render(self) -> None: if self.repaint: ui.header( self.header_text, self.header_icon, ui.TITLE_GREY, ui.BG, self.icon_color, ) render_text(self.content, self.new_lines, self.max_lines) self.repaint = False
def render(self): offset_x = TEXT_MARGIN_LEFT offset_y = TEXT_LINE_HEIGHT + TEXT_HEADER_HEIGHT style = ui.NORMAL fg = ui.WHITE bg = ui.BLACK ui.header(self.header_text, self.header_icon, ui.BLACK, ui.LIGHT_GREEN) for item in self.content: if isinstance(item, str): ui.display.text(offset_x, offset_y, item, style, fg, bg) offset_y += TEXT_LINE_HEIGHT elif item == ui.MONO or item == ui.NORMAL or item == ui.BOLD: style = item else: fg = item
def on_render(self) -> None: if self.repaint: ui.header( self.header_text, self.header_icon, ui.TITLE_GREY, ui.BG, self.icon_color, ) render_text( self.content, self.new_lines, self.max_lines, item_offset=self.content_offset, char_offset=self.char_offset, break_words=self.break_words, line_width=self.line_width, render_page_overflow=self.render_page_overflow, ) self.repaint = False
def on_render(self) -> None: if self.repaint: header = self.info.get_header() ui.header(header, ui.ICON_DEFAULT, ui.GREEN, ui.BG, ui.GREEN) if self.info.app_icon is not None: ui.display.image((ui.WIDTH - 64) // 2, 48, self.info.app_icon) app_name = self.info.app_name() account_name = self.info.account_name() # Dummy requests usually have some text as both app_name and account_name, # in that case show the text only once. if account_name is not None: if app_name != account_name: text_center_trim_left(ui.WIDTH // 2, 140, app_name) text_center_trim_right(ui.WIDTH // 2, 172, account_name) else: text_center_trim_right(ui.WIDTH // 2, 156, account_name) else: text_center_trim_left(ui.WIDTH // 2, 156, app_name) self.repaint = False
def render(self): offset_x = TEXT_MARGIN_LEFT offset_y = TEXT_LINE_HEIGHT + TEXT_HEADER_HEIGHT style = ui.NORMAL fg = ui.FG bg = ui.BG ui.header(self.header_text, self.header_icon, ui.TITLE_GREY, ui.BG, self.icon_color) line = 1 for item in self.content: if isinstance(item, str): if self.max_lines is not None and line >= self.max_lines: ui.display.text(offset_x, offset_y, item + '...', style, fg, bg) break else: ui.display.text(offset_x, offset_y, item, style, fg, bg) offset_y += TEXT_LINE_HEIGHT line += 1 elif item == ui.MONO or item == ui.NORMAL or item == ui.BOLD: style = item else: fg = item
def on_render(self): current = self.current total_num = self.total_num ui.header("Syncing", ui.ICON_SEND, ui.TITLE_GREY, ui.BG, ui.BLUE) p = (1000 * (current + 1) // total_num) if total_num > 0 else 0 ui.display.loader(p, False, 18, ui.WHITE, ui.BG)
def on_render(self) -> None: if self.repaint: ui.header(self.title, self.icon) self.render_items() self.repaint = False
def on_render(self) -> None: if self.repaint: count = self.input.count # render the headline if self.step is Slip39NumInput.SET_SHARES: header = "Set num. of shares" elif self.step is Slip39NumInput.SET_THRESHOLD: header = "Set threshold" elif self.step is Slip39NumInput.SET_GROUPS: header = "Set num. of groups" elif self.step is Slip39NumInput.SET_GROUP_THRESHOLD: header = "Set group threshold" else: raise RuntimeError # invalid step ui.header(header, ui.ICON_RESET, ui.TITLE_GREY, ui.BG, ui.ORANGE_ICON) # render the counter if self.step is Slip39NumInput.SET_SHARES: if self.group_id is None: if count == 1: first_line_text = "Only one share will" second_line_text = "be created." else: first_line_text = f"{count} people or locations" second_line_text = "will each hold one share." else: first_line_text = "Set the total number of" second_line_text = f"shares in Group {self.group_id + 1}." ui.display.bar(0, 110, ui.WIDTH, 52, ui.BG) ui.display.text(12, 130, first_line_text, ui.NORMAL, ui.FG, ui.BG) ui.display.text(12, 156, second_line_text, ui.NORMAL, ui.FG, ui.BG) elif self.step is Slip39NumInput.SET_THRESHOLD: if self.group_id is None: first_line_text = "For recovery you need" if count == 1: second_line_text = "1 share." elif count == self.input.max_count: second_line_text = f"all {count} of the shares." else: second_line_text = f"any {count} of the shares." else: first_line_text = "The required number of " second_line_text = f"shares to form Group {self.group_id + 1}." ui.display.bar(0, 110, ui.WIDTH, 52, ui.BG) ui.display.text(12, 130, first_line_text, ui.NORMAL, ui.FG, ui.BG) ui.display.text(12, 156, second_line_text, ui.NORMAL, ui.FG, ui.BG) elif self.step is Slip39NumInput.SET_GROUPS: ui.display.bar(0, 110, ui.WIDTH, 52, ui.BG) ui.display.text(12, 130, "A group is made up of", ui.NORMAL, ui.FG, ui.BG) ui.display.text(12, 156, "recovery shares.", ui.NORMAL, ui.FG, ui.BG) elif self.step is Slip39NumInput.SET_GROUP_THRESHOLD: ui.display.bar(0, 110, ui.WIDTH, 52, ui.BG) ui.display.text(12, 130, "The required number of", ui.NORMAL, ui.FG, ui.BG) ui.display.text(12, 156, "groups for recovery.", ui.NORMAL, ui.FG, ui.BG) self.repaint = False
def _start_progress(): ui.backlight_fade(ui.BACKLIGHT_DIM) ui.display.clear() ui.header("Please wait") ui.display.refresh() ui.backlight_fade(ui.BACKLIGHT_NORMAL)
def report_init(text): ui.display.clear() ui.header(text)
def report_init() -> None: workflow.close_others() ui.display.clear() ui.header("Signing transaction")
def report_init(): ui.display.clear() ui.header("Signing transaction")
def render(self): ui.header(self.header_text, self.header_icon, ui.TITLE_GREY, ui.BG, self.icon_color) render_text(self.content, self.new_lines, self.max_lines)
def _start_bip39_progress(): ui.display.clear() ui.header("Please wait") ui.display.refresh()
def _start_bip39_progress(): ui.backlight_slide_sync(ui.BACKLIGHT_DIM) ui.display.clear() ui.header("Please wait") ui.display.refresh() ui.backlight_slide_sync(ui.BACKLIGHT_NORMAL)