diff options
| author | Daniel Thompson <daniel@redfelineninja.org.uk> | 2020-12-29 20:07:50 (GMT) |
|---|---|---|
| committer | Daniel Thompson <daniel@redfelineninja.org.uk> | 2020-12-29 20:07:50 (GMT) |
| commit | 2641616ff6c2d131418c51036bbb57d6cc7cf997 (patch) | |
| tree | 59dd9bdd6cf1e782cc28b099bf17b7af52c0715d /wasp/widgets.py | |
| parent | 62bca4d288e837b1df70b1a247cdb3c7431da9d9 (diff) | |
widgets: Spinner: Add a simple spinner widget
We are able to add this to the self tests without having to create a
special page. Instead we can modify the existing notifications test
to utilize the spinner.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Diffstat (limited to 'wasp/widgets.py')
| -rw-r--r-- | wasp/widgets.py | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/wasp/widgets.py b/wasp/widgets.py index bfecbe8..bed9be5 100644 --- a/wasp/widgets.py +++ b/wasp/widgets.py @@ -226,6 +226,7 @@ class Checkbox(): draw = wasp.watch.drawable im = self._im if im[2]: + draw.set_font(fonts.sans24) draw.string(im[2], im[0], im[1]+6) self.update() @@ -248,7 +249,7 @@ class Checkbox(): def touch(self, event): """Handle touch events.""" - y = event[2] + 4 + y = event[2] im = self._im if y >= im[1] and y < im[1]+40: self.state = not self.state @@ -329,6 +330,53 @@ class Slider(): v = self._steps - 1 self.value = v +class Spinner(): + """A simple Spinner widget. + + In order to have large enough hit boxes the spinner is a fairly large + widget and requires 60x120 px. + """ + def __init__(self, x, y, mn, mx, field=1): + self._im = (x, y, mn, mx, field) + self.value = mn + + def draw(self): + """Draw the slider.""" + draw = watch.drawable + im = self._im + fg = draw.lighten(wasp.system.theme('slider-default'), 15) + draw.blit(icons.up_arrow, im[0]+30-8, im[1]+20, fg) + draw.blit(icons.down_arrow, im[0]+30-8, im[1]+120-20-9, fg) + self.update() + + def update(self): + """Update the spinner value.""" + draw = watch.drawable + im = self._im + draw.set_font(fonts.sans28) + s = str(self.value) + if len(s) < im[4]: + s = '0' * (im[4] - len(s)) + s + draw.string(s, im[0], im[1]+60-14, width=60) + + def touch(self, event): + x = event[1] + y = event[2] + im = self._im + if x >= im[0] and x < im[0]+60 and y >= im[1] and y < im[1]+120: + if y < im[1] + 60: + self.value += 1 + if self.value > im[3]: + self.value = im[2] + else: + self.value -= 1 + if self.value < im[2]: + self.value = im[3] - 1 + + self.update() + return True + + return False _message_string_x_coord = const(0) _message_string_y_coord = const(60) |
