示例#1
0
    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)
示例#2
0
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()
示例#3
0
 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)
示例#4
0
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)
示例#5
0
    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
示例#6
0
    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
示例#7
0
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)
示例#8
0
 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)
示例#9
0
 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)
示例#10
0
 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)
示例#11
0
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)
示例#12
0
 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
示例#13
0
文件: text.py 项目: stopstopstop/emu
 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
示例#14
0
 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
示例#15
0
    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
示例#16
0
 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
示例#17
0
    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
示例#18
0
    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
示例#19
0
 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)
示例#20
0
 def on_render(self) -> None:
     if self.repaint:
         ui.header(self.title, self.icon)
         self.render_items()
         self.repaint = False
示例#21
0
    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
示例#22
0
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)
示例#23
0
def report_init(text):
    ui.display.clear()
    ui.header(text)
示例#24
0
def report_init() -> None:
    workflow.close_others()
    ui.display.clear()
    ui.header("Signing transaction")
示例#25
0
def report_init():
    ui.display.clear()
    ui.header("Signing transaction")
示例#26
0
 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)
示例#27
0
def _start_bip39_progress():
    ui.display.clear()
    ui.header("Please wait")
    ui.display.refresh()
示例#28
0
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)