widgets: Refactor the stopwatch as a widget
This is purely a refactoring for the purposes of code reuse. No change of behaviour is expected. Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
This commit is contained in:
parent
29d619aebc
commit
9099c2398e
3 changed files with 69 additions and 50 deletions
|
@ -21,8 +21,8 @@ class StopwatchApp():
|
||||||
ICON = icons.app
|
ICON = icons.app
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
self._timer = wasp.widgets.Stopwatch(120-36)
|
||||||
self._reset()
|
self._reset()
|
||||||
self._count = 0
|
|
||||||
|
|
||||||
def foreground(self):
|
def foreground(self):
|
||||||
"""Activate the application."""
|
"""Activate the application."""
|
||||||
|
@ -53,34 +53,27 @@ class StopwatchApp():
|
||||||
if not state:
|
if not state:
|
||||||
return
|
return
|
||||||
|
|
||||||
if self._started_at:
|
if self._timer.started:
|
||||||
self._update()
|
self._timer.stop()
|
||||||
self._started_at = 0
|
|
||||||
else:
|
else:
|
||||||
uptime = wasp.watch.rtc.get_uptime_ms()
|
self._timer.start()
|
||||||
uptime //= 10
|
|
||||||
self._started_at = uptime - self._count
|
|
||||||
self._update()
|
|
||||||
|
|
||||||
def touch(self, event):
|
def touch(self, event):
|
||||||
if self._started_at:
|
if self._timer.started:
|
||||||
self._update()
|
self._splits.insert(0, self._timer.count)
|
||||||
self._splits.insert(0, self._count)
|
|
||||||
del self._splits[4:]
|
del self._splits[4:]
|
||||||
self._nsplits += 1
|
self._nsplits += 1
|
||||||
else:
|
else:
|
||||||
self._reset()
|
self._reset()
|
||||||
self._update()
|
|
||||||
|
|
||||||
|
self._update()
|
||||||
self._draw_splits()
|
self._draw_splits()
|
||||||
|
|
||||||
def tick(self, ticks):
|
def tick(self, ticks):
|
||||||
self._update()
|
self._update()
|
||||||
|
|
||||||
def _reset(self):
|
def _reset(self):
|
||||||
self._started_at = 0
|
self._timer.reset()
|
||||||
self._count = 0
|
|
||||||
self._last_count = -1
|
|
||||||
self._splits = []
|
self._splits = []
|
||||||
self._nsplits = 0
|
self._nsplits = 0
|
||||||
|
|
||||||
|
@ -114,41 +107,10 @@ class StopwatchApp():
|
||||||
draw = wasp.watch.drawable
|
draw = wasp.watch.drawable
|
||||||
draw.fill()
|
draw.fill()
|
||||||
|
|
||||||
self._last_count = -1
|
|
||||||
self._update()
|
|
||||||
wasp.system.bar.draw()
|
wasp.system.bar.draw()
|
||||||
|
self._timer.draw()
|
||||||
self._draw_splits()
|
self._draw_splits()
|
||||||
|
|
||||||
def _update(self):
|
def _update(self):
|
||||||
# Before we do anything else let's make sure _count is
|
|
||||||
# up to date
|
|
||||||
if self._started_at:
|
|
||||||
uptime = wasp.watch.rtc.get_uptime_ms()
|
|
||||||
uptime //= 10
|
|
||||||
self._count = uptime - self._started_at
|
|
||||||
if self._count > 999*60*100:
|
|
||||||
self._reset()
|
|
||||||
|
|
||||||
# Update the statusbar
|
|
||||||
wasp.system.bar.update()
|
wasp.system.bar.update()
|
||||||
|
self._timer.update()
|
||||||
if self._last_count != self._count:
|
|
||||||
centisecs = self._count
|
|
||||||
secs = centisecs // 100
|
|
||||||
centisecs %= 100
|
|
||||||
minutes = secs // 60
|
|
||||||
secs %= 60
|
|
||||||
|
|
||||||
t1 = '{}:{:02}'.format(minutes, secs)
|
|
||||||
t2 = '{:02}'.format(centisecs)
|
|
||||||
|
|
||||||
draw = wasp.watch.drawable
|
|
||||||
draw.set_font(fonts.sans36)
|
|
||||||
draw.set_color(draw.lighten(wasp.system.theme('ui'), wasp.system.theme('contrast')))
|
|
||||||
w = fonts.width(fonts.sans36, t1)
|
|
||||||
draw.string(t1, 180-w, 120-36)
|
|
||||||
draw.fill(0, 0, 120-36, 180-w, 36)
|
|
||||||
|
|
||||||
draw.set_font(fonts.sans24)
|
|
||||||
draw.string(t2, 180, 120-36+18, width=46)
|
|
||||||
self._last_count = self._count
|
|
||||||
|
|
|
@ -80,7 +80,7 @@ def test_stopwatch(system):
|
||||||
|
|
||||||
wasp.watch.button.value(0)
|
wasp.watch.button.value(0)
|
||||||
system.step()
|
system.step()
|
||||||
assert(system.app._started_at > 0)
|
assert(system.app._timer._started_at > 0)
|
||||||
wasp.watch.button.value(1)
|
wasp.watch.button.value(1)
|
||||||
|
|
||||||
system.step()
|
system.step()
|
||||||
|
@ -89,7 +89,7 @@ def test_stopwatch(system):
|
||||||
|
|
||||||
wasp.watch.button.value(0)
|
wasp.watch.button.value(0)
|
||||||
system.step()
|
system.step()
|
||||||
assert(system.app._started_at == 0)
|
assert(system.app._timer._started_at == 0)
|
||||||
wasp.watch.button.value(1)
|
wasp.watch.button.value(1)
|
||||||
|
|
||||||
system.step()
|
system.step()
|
||||||
|
|
|
@ -452,6 +452,63 @@ class Spinner():
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
class Stopwatch:
|
||||||
|
"""A stopwatch widget"""
|
||||||
|
def __init__(self, y):
|
||||||
|
self._y = y
|
||||||
|
self.reset()
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
uptime = wasp.watch.rtc.get_uptime_ms() // 10
|
||||||
|
self._started_at = uptime - self.count
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
self._started_at = 0
|
||||||
|
|
||||||
|
@property
|
||||||
|
def started(self):
|
||||||
|
return bool(self._started_at)
|
||||||
|
|
||||||
|
def reset(self):
|
||||||
|
self.count = 0
|
||||||
|
self._started_at = 0
|
||||||
|
self._last_count = -1
|
||||||
|
|
||||||
|
def draw(self):
|
||||||
|
self._last_count = -1
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
# Before we do anything else let's make sure count is
|
||||||
|
# up to date
|
||||||
|
if self._started_at:
|
||||||
|
uptime = wasp.watch.rtc.get_uptime_ms() // 10
|
||||||
|
self.count = uptime - self._started_at
|
||||||
|
if self.count > 999*60*100:
|
||||||
|
self.reset()
|
||||||
|
|
||||||
|
if self._last_count != self.count:
|
||||||
|
centisecs = self.count
|
||||||
|
secs = centisecs // 100
|
||||||
|
centisecs %= 100
|
||||||
|
minutes = secs // 60
|
||||||
|
secs %= 60
|
||||||
|
|
||||||
|
t1 = '{}:{:02}'.format(minutes, secs)
|
||||||
|
t2 = '{:02}'.format(centisecs)
|
||||||
|
|
||||||
|
y = self._y
|
||||||
|
draw = wasp.watch.drawable
|
||||||
|
draw.set_font(fonts.sans36)
|
||||||
|
draw.set_color(draw.lighten(wasp.system.theme('ui'), wasp.system.theme('contrast')))
|
||||||
|
w = fonts.width(fonts.sans36, t1)
|
||||||
|
draw.string(t1, 180-w, y)
|
||||||
|
draw.fill(0, 0, y, 180-w, 36)
|
||||||
|
draw.set_font(fonts.sans24)
|
||||||
|
draw.string(t2, 180, y+18, width=46)
|
||||||
|
|
||||||
|
self._last_count = self.count
|
||||||
|
|
||||||
class ConfirmationView:
|
class ConfirmationView:
|
||||||
"""Confirmation widget allowing user confirmation of a setting."""
|
"""Confirmation widget allowing user confirmation of a setting."""
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue