core/management: fix word check, add icons to checklist

pull/263/head
Jan Pochyla 5 years ago
parent 10e5ec6135
commit a4039f9459

@ -245,7 +245,6 @@ async def slip39_show_checklist_set_shares(ctx):
checklist.add("Set the threshold") checklist.add("Set the threshold")
checklist.add(("Write down and check", "all backup shares")) checklist.add(("Write down and check", "all backup shares"))
checklist.select(0) checklist.select(0)
checklist.process()
return await confirm( return await confirm(
ctx, ctx,
checklist, checklist,
@ -261,7 +260,6 @@ async def slip39_show_checklist_set_threshold(ctx, num_of_shares):
checklist.add("Set the threshold") checklist.add("Set the threshold")
checklist.add(("Write down and check", "all backup shares")) checklist.add(("Write down and check", "all backup shares"))
checklist.select(1) checklist.select(1)
checklist.process()
return await confirm( return await confirm(
ctx, ctx,
checklist, checklist,
@ -277,7 +275,6 @@ async def slip39_show_checklist_show_shares(ctx, num_of_shares, threshold):
checklist.add("Set the threshold") checklist.add("Set the threshold")
checklist.add(("Write down and check", "all backup shares")) checklist.add(("Write down and check", "all backup shares"))
checklist.select(2) checklist.select(2)
checklist.process()
return await confirm( return await confirm(
ctx, ctx,
checklist, checklist,
@ -395,7 +392,6 @@ async def _slip39_show_share_words(ctx, share_index, share_words):
# middle pages # middle pages
for chunk in chunks: for chunk in chunks:
text = Text(header_title, header_icon) text = Text(header_title, header_icon)
text.br_half()
for index, word in chunk: for index, word in chunk:
text.mono("%s. %s" % (index + 1, word)) text.mono("%s. %s" % (index + 1, word))
shares_words_check.append(word) shares_words_check.append(word)
@ -503,14 +499,11 @@ class ShamirNumInput(ui.Control):
class MnemonicWordSelect(ui.Layout): class MnemonicWordSelect(ui.Layout):
NUM_OF_CHOICES = 3 NUM_OF_CHOICES = 3
MODE_CHECK = object()
MODE_RECOVERY = object()
def __init__(self, words, share_index, word_index, mode): def __init__(self, words, share_index, word_index):
self.words = words self.words = words
self.share_index = share_index self.share_index = share_index
self.word_index = word_index self.word_index = word_index
self.mode = mode
self.buttons = [] self.buttons = []
for i, word in enumerate(words): for i, word in enumerate(words):
area = ui.grid(i + 2, n_x=1) area = ui.grid(i + 2, n_x=1)
@ -518,15 +511,9 @@ class MnemonicWordSelect(ui.Layout):
btn.on_click = self.select(word) btn.on_click = self.select(word)
self.buttons.append(btn) self.buttons.append(btn)
if share_index is None: if share_index is None:
if self.mode is MnemonicWordSelect.MODE_CHECK: self.text = Text("Check seed")
self.text = Text("Check seed")
else: # self.mode is MnemonicWordSelect.MODE_RECOVERY
self.text = Text("Recovery seed")
else: else:
if self.mode is MnemonicWordSelect.MODE_CHECK: self.text = Text("Check share #%s" % (share_index + 1))
self.text = Text("Check share #%s" % (share_index + 1))
else: # self.mode is MnemonicWordSelect.MODE_RECOVERY
self.text = Text("Recovery share #%s" % (share_index + 1))
self.text.normal("Choose the %s word:" % utils.format_ordinal(word_index + 1)) self.text.normal("Choose the %s word:" % utils.format_ordinal(word_index + 1))
def dispatch(self, event, x, y): def dispatch(self, event, x, y):

@ -1,55 +1,59 @@
from micropython import const from micropython import const
from trezor import ui from trezor import res, ui
from trezor.ui import text from trezor.ui.text import TEXT_HEADER_HEIGHT, TEXT_LINE_HEIGHT
_CHECKLIST_MAX_LINES = const(5) _CHECKLIST_MAX_LINES = const(5)
_CHECKLIST_OFFSET_X = const(24) _CHECKLIST_OFFSET_X = const(24)
_CHECKLIST_OFFSET_X_ICON = const(0)
class Checklist(ui.Control): class Checklist(ui.Control):
def __init__(self, title, icon): def __init__(self, title, icon):
self.title = title self.title = title
self.icon = icon self.icon = icon
self.choices = [] self.items = []
self.words = []
self.active = 0 self.active = 0
self.repaint = False self.repaint = True
def add(self, choice): def add(self, choice):
self.choices.append(choice) self.items.append(choice)
def select(self, active): def select(self, active):
self.active = active self.active = active
def process(self):
w = self.words
w.clear()
for index, choice in enumerate(self.choices):
if index < self.active:
w.append(ui.BOLD)
w.append(ui.GREEN)
elif index == self.active:
w.append(ui.BOLD)
w.append(ui.FG)
else: # index > self.active
w.append(ui.NORMAL)
w.append(ui.GREY)
if isinstance(choice, str):
w.append(choice)
else: # choice is iterable
w.extend(choice)
w.append(text.BR)
self.words = w
self.repaint = True
def on_render(self): def on_render(self):
if self.repaint: if self.repaint:
ui.header(self.title, self.icon) ui.header(self.title, self.icon)
text.render_text( self.render_items()
self.words,
new_lines=False, # we are adding line breaks manually
max_lines=_CHECKLIST_MAX_LINES,
offset_x=_CHECKLIST_OFFSET_X,
)
self.repaint = False self.repaint = False
def render_items(self):
offset_x = _CHECKLIST_OFFSET_X
offset_y = TEXT_HEADER_HEIGHT + TEXT_LINE_HEIGHT
bg = ui.BG
for index, item in enumerate(self.items):
# compute font and color
if index < self.active:
font = ui.BOLD
fg = ui.GREEN
elif index == self.active:
font = ui.BOLD
fg = ui.FG
else: # index > self.active
font = ui.NORMAL
fg = ui.GREY
# render item icon
icon = res.load(ui.ICON_CONFIRM)
ui.display.icon(0, offset_y - 14, icon, fg, bg)
# render item text
if isinstance(item, str):
ui.display.text(offset_x, offset_y, item, font, fg, bg)
offset_y += TEXT_LINE_HEIGHT
else:
for line in item:
ui.display.text(offset_x, offset_y, line, font, fg, bg)
offset_y += TEXT_LINE_HEIGHT

Loading…
Cancel
Save