UI: improve swipes

- UI: only show back and down gesture icons on swipe, not on tap
- UI: double size of back and down swipe gesture starting areas for easier gestures
This commit is contained in:
Thomas Farstrike
2025-11-20 16:36:14 +01:00
parent d368db1611
commit ca99bcaccc
4 changed files with 46 additions and 22 deletions
+9
View File
@@ -1,3 +1,12 @@
0.4.1
=====
- MposKeyboard: fix q, Q, 1 and ~ button unclickable bug
- OSUpdate app: simplify by using ConnectivityManager
- API: add facilities for instrumentation (screengrabs, mouse clicks)
- UI: pass clicks on invisible "gesture swipe start" are to underlying widget
- UI: only show back and down gesture icons on swipe, not on tap
- UI: double size of back and down swipe gesture starting areas for easier gestures
0.4.0
=====
- Add custom MposKeyboard with more than 50% bigger buttons, great for tiny touch screens!
@@ -3,10 +3,10 @@
"publisher": "MicroPythonOS",
"short_description": "Operating System Updater",
"long_description": "Updates the operating system in a safe way, to a secondary partition. After the update, the device is restarted. If the system starts up successfully, it is marked as valid and kept. Otherwise, a rollback to the old, primary partition is performed.",
"icon_url": "https://apps.micropythonos.com/apps/com.micropythonos.osupdate/icons/com.micropythonos.osupdate_0.0.9_64x64.png",
"download_url": "https://apps.micropythonos.com/apps/com.micropythonos.osupdate/mpks/com.micropythonos.osupdate_0.0.9.mpk",
"icon_url": "https://apps.micropythonos.com/apps/com.micropythonos.osupdate/icons/com.micropythonos.osupdate_0.0.10_64x64.png",
"download_url": "https://apps.micropythonos.com/apps/com.micropythonos.osupdate/mpks/com.micropythonos.osupdate_0.0.10.mpk",
"fullname": "com.micropythonos.osupdate",
"version": "0.0.9",
"version": "0.0.10",
"category": "osupdate",
"activities": [
{
@@ -3,10 +3,10 @@
"publisher": "MicroPythonOS",
"short_description": "WiFi Network Configuration",
"long_description": "Scans for wireless networks, shows a list of SSIDs, allows for password entry, and connecting.",
"icon_url": "https://apps.micropythonos.com/apps/com.micropythonos.wifi/icons/com.micropythonos.wifi_0.0.9_64x64.png",
"download_url": "https://apps.micropythonos.com/apps/com.micropythonos.wifi/mpks/com.micropythonos.wifi_0.0.9.mpk",
"icon_url": "https://apps.micropythonos.com/apps/com.micropythonos.wifi/icons/com.micropythonos.wifi_0.0.10_64x64.png",
"download_url": "https://apps.micropythonos.com/apps/com.micropythonos.wifi/mpks/com.micropythonos.wifi_0.0.10.mpk",
"fullname": "com.micropythonos.wifi",
"version": "0.0.9",
"version": "0.0.10",
"category": "networking",
"activities": [
{
@@ -11,13 +11,18 @@ down_start_y = 0
back_start_y = 0
back_start_x = 0
short_movement_threshold = 10
backbutton_visible = False
downbutton_visible = False
def is_short_movement(dx, dy):
return dx < short_movement_threshold and dy < short_movement_threshold
def _back_swipe_cb(event):
if drawer_open:
print("ignoring back gesture because drawer is open")
return
global backbutton, back_start_y, back_start_x
global backbutton, back_start_y, back_start_x, backbutton_visible
event_code = event.get_code()
indev = lv.indev_active()
if not indev:
@@ -26,21 +31,25 @@ def _back_swipe_cb(event):
indev.get_point(point)
x = point.x
y = point.y
dx = abs(x - back_start_x)
dy = abs(y - back_start_y)
#print(f"visual_back_swipe_cb event_code={event_code} and event_name={name} and pos: {x}, {y}")
if event_code == lv.EVENT.PRESSED:
smooth_show(backbutton)
back_start_y = y
back_start_x = x
elif event_code == lv.EVENT.PRESSING:
magnetic_x = round(x / 10)
backbutton.set_pos(magnetic_x,back_start_y)
should_show = not is_short_movement(dx, dy)
if should_show != backbutton_visible:
backbutton_visible = should_show
smooth_show(backbutton) if should_show else smooth_hide(backbutton)
backbutton.set_pos(round(x / 10), back_start_y)
elif event_code == lv.EVENT.RELEASED:
smooth_hide(backbutton)
dx = abs(x - back_start_x)
dy = abs(y - back_start_y)
if backbutton_visible:
backbutton_visible = False
smooth_hide(backbutton)
if x > min(100, get_display_width() / 4):
back_screen()
elif dx < short_movement_threshold and dy < short_movement_threshold:
elif is_short_movement(dx, dy):
# print("Short movement - treating as tap")
obj = lv.indev_search_obj(lv.screen_active(), lv.point_t({'x': x, 'y': y}))
# print(f"Found object: {obj}")
@@ -62,7 +71,7 @@ def _top_swipe_cb(event):
print("ignoring top swipe gesture because drawer is open")
return
global downbutton, down_start_x, down_start_y
global downbutton, down_start_x, down_start_y, downbutton_visible
event_code = event.get_code()
indev = lv.indev_active()
if not indev:
@@ -71,21 +80,27 @@ def _top_swipe_cb(event):
indev.get_point(point)
x = point.x
y = point.y
dx = abs(x - down_start_x)
dy = abs(y - down_start_y)
# print(f"visual_back_swipe_cb event_code={event_code} and event_name={name} and pos: {x}, {y}")
if event_code == lv.EVENT.PRESSED:
smooth_show(downbutton)
down_start_x = x
down_start_y = y
elif event_code == lv.EVENT.PRESSING:
magnetic_y = round(y/ 10)
downbutton.set_pos(down_start_x,magnetic_y)
should_show = not is_short_movement(dx, dy)
if should_show != downbutton_visible:
downbutton_visible = should_show
smooth_show(downbutton) if should_show else smooth_hide(downbutton)
downbutton.set_pos(down_start_x, round(y / 10))
elif event_code == lv.EVENT.RELEASED:
smooth_hide(downbutton)
if downbutton_visible:
downbutton_visible = False
smooth_hide(downbutton)
dx = abs(x - down_start_x)
dy = abs(y - down_start_y)
if y > min(80, get_display_height() / 4):
open_drawer()
elif dx < short_movement_threshold and dy < short_movement_threshold:
elif is_short_movement(dx, dy):
# print("Short movement - treating as tap")
obj = lv.indev_search_obj(lv.screen_active(), lv.point_t({'x': x, 'y': y}))
# print(f"Found object: {obj}")
@@ -105,7 +120,7 @@ def _top_swipe_cb(event):
def handle_back_swipe():
global backbutton
rect = lv.obj(lv.layer_top())
rect.set_size(round(NOTIFICATION_BAR_HEIGHT/2), lv.layer_top().get_height()-NOTIFICATION_BAR_HEIGHT) # narrow because it overlaps buttons
rect.set_size(NOTIFICATION_BAR_HEIGHT, lv.layer_top().get_height()-NOTIFICATION_BAR_HEIGHT) # narrow because it overlaps buttons
rect.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
rect.set_scroll_dir(lv.DIR.NONE)
rect.set_pos(0, NOTIFICATION_BAR_HEIGHT)
@@ -139,7 +154,7 @@ def handle_back_swipe():
def handle_top_swipe():
global downbutton
rect = lv.obj(lv.layer_top())
rect.set_size(lv.pct(100), round(NOTIFICATION_BAR_HEIGHT*2/3))
rect.set_size(lv.pct(100), NOTIFICATION_BAR_HEIGHT)
rect.set_pos(0, 0)
rect.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
style = lv.style_t()