1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-02-04 11:51:50 +00:00

ui/loader: shrink before deactivating

This commit is contained in:
Jan Pochyla 2018-02-05 00:58:16 +01:00
parent d791253e07
commit 6a0f18bef1

View File

@ -1,52 +1,65 @@
import utime import utime
from micropython import const from micropython import const
from trezor import loop from trezor import loop, res, ui
from trezor import ui
from trezor import res _TARGET_MS = const(1000)
_SHRINK_BY = const(2)
class Loader(ui.Widget): class Loader(ui.Widget):
def __init__(self, target_ms=1000, style=ui.LDR_DEFAULT): def __init__(self, style=ui.LDR_DEFAULT):
self.target_ms = target_ms self.target_ms = _TARGET_MS
self.start_ticks_ms = None
self.normal_style = style['normal'] or ui.LDR_DEFAULT['normal'] self.normal_style = style['normal'] or ui.LDR_DEFAULT['normal']
self.active_style = style['active'] or ui.LDR_DEFAULT['active'] self.active_style = style['active'] or ui.LDR_DEFAULT['active']
self.start_ms = None
self.stop_ms = None
def start(self): def start(self):
self.start_ticks_ms = utime.ticks_ms() self.start_ms = utime.ticks_ms()
ui.display.bar(0, 32, 240, 240 - 80, ui.BG) self.stop_ms = None
def stop(self): def stop(self):
ui.display.bar(0, 32, 240, 240 - 80, ui.BG) if self.start_ms is not None and self.stop_ms is None:
if self.start_ticks_ms is not None: diff_ms = utime.ticks_ms() - self.start_ms
ticks_diff = utime.ticks_ms() - self.start_ticks_ms
else: else:
ticks_diff = 0 diff_ms = 0
self.start_ticks_ms = None self.stop_ms = utime.ticks_ms()
return ticks_diff >= self.target_ms return diff_ms >= self.target_ms
def is_active(self): def is_active(self):
return self.start_ticks_ms is not None return self.start_ms is not None
def render(self): def render(self):
progress = min(utime.ticks_ms() - self.start_ticks_ms, self.target_ms) target = self.target_ms
if progress == self.target_ms: start = self.start_ms
stop = self.stop_ms
now = utime.ticks_ms()
if stop is None:
r = min(now - start, target)
else:
r = max(stop - start + (stop - now) * _SHRINK_BY, 0)
if r == 0:
self.start_ms = None
self.stop_ms = None
if r == target:
s = self.active_style s = self.active_style
else: else:
s = self.normal_style s = self.normal_style
if s['icon'] is None: if s['icon'] is None:
ui.display.loader( ui.display.loader(
progress, -24, s['fg-color'], s['bg-color']) r, -24, s['fg-color'], s['bg-color'])
elif s['icon-fg-color'] is None: elif s['icon-fg-color'] is None:
ui.display.loader( ui.display.loader(
progress, -24, s['fg-color'], s['bg-color'], res.load(s['icon'])) r, -24, s['fg-color'], s['bg-color'], res.load(s['icon']))
else: else:
ui.display.loader( ui.display.loader(
progress, -24, s['fg-color'], s['bg-color'], res.load(s['icon']), s['icon-fg-color']) r, -24, s['fg-color'], s['bg-color'], res.load(s['icon']), s['icon-fg-color'])
def __iter__(self): def __iter__(self):
sleep = loop.sleep(1000000 // 60) # 60 fps sleep = loop.sleep(1000000 // 30) # 30 fps
ui.display.bar(0, 32, 240, 240 - 80, ui.BG) # clear
while self.is_active(): while self.is_active():
self.render() self.render()
yield sleep yield sleep
ui.display.bar(0, 32, 240, 240 - 80, ui.BG) # clear