summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Thompson <daniel@redfelineninja.org.uk>2021-06-20 09:28:27 (GMT)
committerDaniel Thompson <daniel@redfelineninja.org.uk>2021-06-20 09:28:27 (GMT)
commit1a4b678b2b815884cb712244d8a1b5e50a5cbd86 (patch)
tree87391a65edd67a3d43478d3a448f734967ebd955
parent2a1ac322799ce0ae549110ec96dbb2caa28cf6d0 (diff)
apps: FacesApp: Add a watch face chooser
This app is enabled by default and allows users to select a watch face based on a fullscreen preview of how the app will draw the screen. Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
-rw-r--r--docs/apps.rst2
-rw-r--r--res/FacesApp.pngbin0 -> 5994 bytes
-rw-r--r--wasp/apps/faces.py69
-rw-r--r--wasp/apps/software.py5
-rw-r--r--wasp/boards/manifest_240x240.py1
-rw-r--r--wasp/boards/simulator/test_qa.py2
-rw-r--r--wasp/wasp.py5
7 files changed, 78 insertions, 6 deletions
diff --git a/docs/apps.rst b/docs/apps.rst
index 350c5d5..39205ae 100644
--- a/docs/apps.rst
+++ b/docs/apps.rst
@@ -9,6 +9,8 @@ Application Library
Watch faces
-----------
+.. automodule:: apps.faces
+
.. automodule:: apps.clock
.. automodule:: apps.chrono
diff --git a/res/FacesApp.png b/res/FacesApp.png
new file mode 100644
index 0000000..229e85d
--- /dev/null
+++ b/res/FacesApp.png
Binary files differ
diff --git a/wasp/apps/faces.py b/wasp/apps/faces.py
new file mode 100644
index 0000000..7e3ed3e
--- /dev/null
+++ b/wasp/apps/faces.py
@@ -0,0 +1,69 @@
+# SPDX-License-Identifier: LGPL-3.0-or-later
+# Copyright (C) 2020 Daniel Thompson
+"""Watch Face Chooser
+~~~~~~~~~~~~~~~~~~~~~
+
+A tool to select a suitable watch face.
+
+.. figure:: res/FacesApp.png
+ :width: 179
+
+The app is intended to be enabled by default and has, therefore, been carefully
+structured to minimize memory usage when the app is not active.
+"""
+
+import wasp
+import icons
+
+class FacesApp():
+ """Choose a default watch face."""
+ NAME = 'Faces'
+ ICON = icons.clock
+
+ def foreground(self):
+ """Activate the application."""
+ choices = []
+ choices.append(('clock', 'Clock'))
+ choices.append(('chrono', 'Chrono'))
+ choices.append(('dual_clock', 'DualClock'))
+ choices.append(('fibonacci_clock', 'FibonacciClock'))
+ choices.append(('word_clock', 'WordClock'))
+
+ self.choices = choices
+ self.choice = 0
+ self.si = wasp.widgets.ScrollIndicator()
+
+ self._update()
+ wasp.system.request_event(wasp.EventMask.SWIPE_UPDOWN)
+
+ def background(self):
+ del self.choices
+ del self.choice
+ del self.si
+
+ # When the watch face redraws then the change to the scrolling indicator
+ # is a little subtle. Let's provide some haptic feedback too so the user
+ # knows something has happened.
+ wasp.watch.vibrator.pulse()
+
+ def swipe(self, event):
+ """Notify the application of a touchscreen swipe event."""
+ choice = self.choice
+ if event[0] == wasp.EventType.DOWN:
+ choice = choice - 1 if choice > 0 else len(self.choices)-1
+ if event[0] == wasp.EventType.UP:
+ choice = choice + 1 if choice < len(self.choices)-1 else 0
+ self.choice = choice
+
+ mute = wasp.watch.display.mute
+ mute(True)
+ self._update()
+ mute(False)
+
+ def _update(self):
+ """Draw the display from scratch."""
+ wasp.watch.drawable.fill()
+ (module, label) = self.choices[self.choice]
+ wasp.system.register('apps.{}.{}App'.format(module, label), watch_face=True)
+ wasp.system.quick_ring[0].preview()
+ self.si.draw()
diff --git a/wasp/apps/software.py b/wasp/apps/software.py
index dcc412e..cac4595 100644
--- a/wasp/apps/software.py
+++ b/wasp/apps/software.py
@@ -39,9 +39,7 @@ class SoftwareApp():
db = []
db.append(('alarm', factory('Alarm')))
db.append(('calc', factory('Calculator')))
- db.append(('chrono', factory('Chrono')))
- db.append(('dual_clock', factory('Dual Clock')))
- db.append(('fibonacci_clock', factory('Fibonacci Clock')))
+ db.append(('faces', factory('Faces')))
db.append(('gameoflife', factory('Game Of Life')))
db.append(('musicplayer', factory('Music Player')))
db.append(('play2048', factory('Play 2048')))
@@ -50,7 +48,6 @@ class SoftwareApp():
db.append(('testapp', factory('Test')))
db.append(('timer', factory('Timer')))
db.append(('weather', factory('Weather')))
- db.append(('word_clock', factory('Word Clock')))
# Get the initial state for the checkboxes
for _, checkbox in db:
diff --git a/wasp/boards/manifest_240x240.py b/wasp/boards/manifest_240x240.py
index 2f59436..b8e7fc9 100644
--- a/wasp/boards/manifest_240x240.py
+++ b/wasp/boards/manifest_240x240.py
@@ -8,6 +8,7 @@ manifest = (
'apps/clock.py',
'apps/chrono.py',
'apps/dual_clock.py',
+ 'apps/faces.py',
'apps/fibonacci_clock.py',
'apps/flashlight.py',
'apps/gameoflife.py',
diff --git a/wasp/boards/simulator/test_qa.py b/wasp/boards/simulator/test_qa.py
index dd19af6..7f38995 100644
--- a/wasp/boards/simulator/test_qa.py
+++ b/wasp/boards/simulator/test_qa.py
@@ -3,7 +3,7 @@ import wasp
import importlib
import os
-EXCLUDE = ('Notifications', 'Template', 'Demo')
+EXCLUDE = ('Notifications', 'Template', 'Demo', 'Faces')
def test_README(constructor):
if constructor.NAME in EXCLUDE:
diff --git a/wasp/wasp.py b/wasp/wasp.py
index eaf3737..442d677 100644
--- a/wasp/wasp.py
+++ b/wasp/wasp.py
@@ -23,6 +23,7 @@ import watch
import widgets
from apps.clock import ClockApp
+from apps.faces import FacesApp
from apps.heart import HeartApp
from apps.launcher import LauncherApp
from apps.pager import PagerApp, CrashApp, NotificationApp
@@ -153,8 +154,10 @@ class Manager():
(StepCounterApp, True),
(StopwatchApp, True),
(HeartApp, True),
+ (FacesApp, False),
+ (SettingsApp, False),
(SoftwareApp, False),
- (SettingsApp, False) ):
+ ):
try:
a = app()