mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-19 04:48:12 +00:00
ui/button: styles, refactoring
This commit is contained in:
parent
c3fc5c310d
commit
248daa8970
@ -15,6 +15,9 @@ BTN_ACTIVE = const(2)
|
|||||||
BTN_DIRTY = const(4)
|
BTN_DIRTY = const(4)
|
||||||
BTN_DISABLED = const(8)
|
BTN_DISABLED = const(8)
|
||||||
|
|
||||||
|
ICON = const(16) # icon size in pixels
|
||||||
|
BORDER = const(4) # border size in pixels
|
||||||
|
|
||||||
|
|
||||||
class Button(Widget):
|
class Button(Widget):
|
||||||
|
|
||||||
@ -25,9 +28,9 @@ class Button(Widget):
|
|||||||
absolute=False):
|
absolute=False):
|
||||||
self.area = area
|
self.area = area
|
||||||
self.content = content
|
self.content = content
|
||||||
self.normal_style = normal_style or ui.BTN_DEFAULT
|
self.normal_style = normal_style or ui.BTN_KEY
|
||||||
self.active_style = active_style or ui.BTN_DEFAULT_ACTIVE
|
self.active_style = active_style or ui.BTN_KEY_ACTIVE
|
||||||
self.disabled_style = disabled_style or ui.BTN_DEFAULT_DISABLED
|
self.disabled_style = disabled_style or ui.BTN_KEY_DISABLED
|
||||||
self.absolute = absolute
|
self.absolute = absolute
|
||||||
self.state = BTN_DIRTY
|
self.state = BTN_DIRTY
|
||||||
|
|
||||||
@ -54,47 +57,66 @@ class Button(Widget):
|
|||||||
else:
|
else:
|
||||||
s = self.normal_style
|
s = self.normal_style
|
||||||
ax, ay, aw, ah = self.area
|
ax, ay, aw, ah = self.area
|
||||||
tx = ax + aw // 2
|
|
||||||
ty = ay + ah // 2 + 8
|
|
||||||
|
|
||||||
display.bar_radius(ax, ay, aw, ah,
|
|
||||||
s['border-color'],
|
|
||||||
ui.BG,
|
|
||||||
s['radius'])
|
|
||||||
display.bar_radius(ax + 4, ay + 4, aw - 8, ah - 8,
|
|
||||||
s['bg-color'],
|
|
||||||
s['border-color'],
|
|
||||||
s['radius'])
|
|
||||||
|
|
||||||
if isinstance(self.content, str):
|
|
||||||
display.text_center(tx, ty, self.content,
|
|
||||||
s['text-style'],
|
|
||||||
s['fg-color'],
|
|
||||||
s['bg-color'])
|
|
||||||
|
|
||||||
else:
|
|
||||||
display.icon(tx - 8, ty - 16, self.content,
|
|
||||||
s['fg-color'],
|
|
||||||
s['bg-color'])
|
|
||||||
|
|
||||||
|
self.render_background(s, ax, ay, aw, ah)
|
||||||
|
self.render_content(s, ax, ay, aw, ah)
|
||||||
self.state = state
|
self.state = state
|
||||||
|
|
||||||
|
def render_background(self, s, ax, ay, aw, ah):
|
||||||
|
radius = s['radius']
|
||||||
|
bg_color = s['bg-color']
|
||||||
|
border_color = s['border-color']
|
||||||
|
if border_color != bg_color:
|
||||||
|
# render border and background on top of it
|
||||||
|
display.bar_radius(ax, ay,
|
||||||
|
aw, ah,
|
||||||
|
border_color,
|
||||||
|
ui.BG,
|
||||||
|
radius)
|
||||||
|
display.bar_radius(ax + BORDER, ay + BORDER,
|
||||||
|
aw - BORDER*2, ah - BORDER*2,
|
||||||
|
bg_color,
|
||||||
|
border_color,
|
||||||
|
radius)
|
||||||
|
else:
|
||||||
|
# render only the background
|
||||||
|
display.bar_radius(ax, ay,
|
||||||
|
aw, ah,
|
||||||
|
bg_color,
|
||||||
|
ui.BG,
|
||||||
|
radius)
|
||||||
|
|
||||||
|
def render_content(self, s, ax, ay, aw, ah):
|
||||||
|
c = self.content
|
||||||
|
tx = ax + aw//2
|
||||||
|
ty = ay + ah//2 + 8
|
||||||
|
if isinstance(c, str):
|
||||||
|
display.text_center(
|
||||||
|
tx, ty, c, s['text-style'], s['fg-color'], s['bg-color'])
|
||||||
|
else:
|
||||||
|
display.icon(
|
||||||
|
tx - ICON//2, ty - ICON, c, s['fg-color'], s['bg-color'])
|
||||||
|
|
||||||
def touch(self, event, pos):
|
def touch(self, event, pos):
|
||||||
if self.state & BTN_DISABLED:
|
state = self.state
|
||||||
|
if state & BTN_DISABLED:
|
||||||
return
|
return
|
||||||
if not self.absolute:
|
if not self.absolute:
|
||||||
pos = rotate(pos)
|
pos = rotate(pos)
|
||||||
|
|
||||||
if event == io.TOUCH_START:
|
if event == io.TOUCH_START:
|
||||||
if contains(self.area, pos):
|
if contains(self.area, pos):
|
||||||
self.state = BTN_STARTED | BTN_DIRTY | BTN_ACTIVE
|
self.state = BTN_STARTED | BTN_DIRTY | BTN_ACTIVE
|
||||||
elif event == io.TOUCH_MOVE and self.state & BTN_STARTED:
|
|
||||||
|
elif event == io.TOUCH_MOVE and state & BTN_STARTED:
|
||||||
if contains(self.area, pos):
|
if contains(self.area, pos):
|
||||||
if not self.state & BTN_ACTIVE:
|
if not state & BTN_ACTIVE:
|
||||||
self.state = BTN_STARTED | BTN_DIRTY | BTN_ACTIVE
|
self.state = BTN_STARTED | BTN_DIRTY | BTN_ACTIVE
|
||||||
else:
|
else:
|
||||||
if self.state & BTN_ACTIVE:
|
if state & BTN_ACTIVE:
|
||||||
self.state = BTN_STARTED | BTN_DIRTY
|
self.state = BTN_STARTED | BTN_DIRTY
|
||||||
elif event == io.TOUCH_END and self.state & BTN_STARTED:
|
|
||||||
|
elif event == io.TOUCH_END and state & BTN_STARTED:
|
||||||
self.state = BTN_DIRTY
|
self.state = BTN_DIRTY
|
||||||
if contains(self.area, pos):
|
if contains(self.area, pos):
|
||||||
return BTN_CLICKED
|
return BTN_CLICKED
|
||||||
|
Loading…
Reference in New Issue
Block a user