From 1da77e425ed215b347018d49337e2fd53e5a8fd1 Mon Sep 17 00:00:00 2001
From: Serge Bazanski <q3k@q3k.org>
Date: Sat, 5 Aug 2023 18:50:03 +0200
Subject: [PATCH] py: add captouch scroll demo

---
 python_payload/apps/scroll_demo.py | 74 ++++++++++++++++++++++++++++++
 python_payload/main.py             |  3 ++
 2 files changed, 77 insertions(+)
 create mode 100644 python_payload/apps/scroll_demo.py

diff --git a/python_payload/apps/scroll_demo.py b/python_payload/apps/scroll_demo.py
new file mode 100644
index 0000000000..530dd08b91
--- /dev/null
+++ b/python_payload/apps/scroll_demo.py
@@ -0,0 +1,74 @@
+# python imports
+import random
+import time
+import math
+
+# flow3r imports
+from st3m import Ctx, InputState
+from st3m.application import Application
+from st3m.property import BLUE, WHITE
+from st3m.goose import Optional
+from st3m.utils import xy_from_polar, tau
+from st3m.ui.interactions import CapScrollController
+
+
+class ScrollDemo(Application):
+    PETAL_NO = 8
+
+    def __init__(self, name: str) -> None:
+        super().__init__(name)
+        self.scroll = CapScrollController()
+
+    def draw(self, ctx: Ctx) -> None:
+        ctx.save()
+        ctx.move_to(0, 0)
+        ctx.gray(0)
+        ctx.rectangle(-120, -120, 240, 240)
+        ctx.fill()
+
+        ctx.font = "Material Icons"
+        ctx.font_size = 20
+        ctx.text_baseline = ctx.MIDDLE
+        ctx.text_align = ctx.CENTER
+
+        ctx.rotate((self.PETAL_NO * -tau / 10))
+        ctx.translate(0, -90)
+        ctx.gray(1)
+        ctx.text("\ue5c4\ue5c8")
+        ctx.restore()
+
+        ctx.save()
+        ctx.move_to(0, 0)
+        _, y = self.scroll.position
+        y = -y
+
+        ctx.gray(0.1)
+        ctx.rectangle(-30, -120, 60, 240)
+        ctx.fill()
+
+        nrects = 10
+        for i in range(nrects):
+            ypos = y + i * 240 / nrects
+
+            ypos += 120
+            ypos %= 240
+            ypos -= 120
+
+            if i == 0:
+                ctx.gray(1)
+            elif i == nrects / 2:
+                ctx.gray(0.2)
+            elif i < nrects / 2:
+                ctx.gray(1 - (i / nrects * 2))
+            else:
+                ctx.gray(i / nrects * 2)
+            ctx.rectangle(-20, -5 + ypos, 40, 10)
+            ctx.fill()
+        ctx.restore()
+
+    def think(self, ins: InputState, delta_ms: int) -> None:
+        super().think(ins, delta_ms)
+        self.scroll.update(self.input.captouch.petals[self.PETAL_NO].gesture, delta_ms)
+
+
+app = ScrollDemo("scroll")
diff --git a/python_payload/main.py b/python_payload/main.py
index 95efc93d49..50b807db65 100644
--- a/python_payload/main.py
+++ b/python_payload/main.py
@@ -52,6 +52,7 @@ from apps.harmonic_demo import app as harmonic
 from apps.melodic_demo import app as melodic
 from apps.nick import app as nick
 from apps.cap_touch_demo import app as captouch_demo
+from apps.scroll_demo import app as scroll_demo
 
 
 # Set the view_managers for the apps, otherwise leaving the app (back) will not work
@@ -60,6 +61,7 @@ harmonic._view_manager = vm
 melodic._view_manager = vm
 nick._view_manager = vm
 captouch_demo._view_manager = vm
+scroll_demo._view_manager = vm
 
 # Build menu structure
 
@@ -82,6 +84,7 @@ menu_apps = SimpleMenu(
         MenuItemBack(),
         MenuItemForeground("captouch", captouch_demo),
         MenuItemForeground("worms", worms),
+        MenuItemForeground("cap scroll", scroll_demo),
     ],
     vm,
 )
-- 
GitLab