[self.keyboard_rects[not self.parent.keyboard_row]],
self.keyboard_callback,
)
- #self.keypad_rect = pygame.Rect(
- # (
- # self.parent.rect.left + (
- # self.rect.left - self.parent.rect.left
- # ) / 2 - self.rect.width / 6,
- # self.parent.rect.top + 96,
- # ),
- # (self.rect.width / 3, self.rect.height / 2),
- #)
- #surf = pygame.Surface(self.keypad_rect.size)
- #surf.fill("black")
- #self.get_keyboard_keys(surf, self.keypad_rect.size, KEYPAD_KEYS)
- #keypad_rect, keypad_dests = self.get_widget_row_rect_dests(
- # len(parent.widget_row), KEYPAD_KEYS, self.keypad_rect
- #)
- #self.keypad = DraggableButton(
- # self.parent,
- # keypad_rect,
- # surf,
- # keypad_dests,
- # self.keypad_callback,
- #)
def keyboard_callback(self):
self.parent.keyboard_row = int(
self.deactivate,
)
self.keyboard_row = 0
- self.widget_row = [CURSOR_KEYS, KEYPAD_KEYS, ClockWidget]
+ self.widget_row = [CURSOR_KEYS, MousePadWidget, ClockWidget]
half_size = (size[0] / 2, size[1] / 2)
LayoutWidget(self, pygame.Rect((half_size[0] / 2, half_size[1] / 2), half_size))
-from functools import partial
+from dataclasses import dataclass
+from math import inf
import pygame
from pynput.mouse import Button
from ui import Child
from ui.multitouch import MultitouchHandler
-from .touchbutton import TouchButton
+from .key import KeyButton
BUTTONS = (
("↓", (Button.middle,)),
("→", (Button.right,)),
)
+SPEEDS = ((2400, 2400), (600, -600))
class MousePadWidget(Child):
self.rect = rect
button_size = (rect.width / len(BUTTONS), rect.height / 6)
for i, (value, args) in enumerate(BUTTONS):
- TouchButton(
+ KeyButton(
parent,
pygame.Rect(
(
button_size,
),
value,
- partial(click_cb, *args)
+ click_cb,
+ data=args,
)
MousePadArea(
parent,
)
+@dataclass
+class Finger:
+ NO_COORD = (inf, inf)
+
+ old: tuple[float, float]
+ new: tuple[float, float] = NO_COORD
+ lifted: bool = False
+
+
class MousePadArea(Child):
def __init__(self, parent, rect, move_cb):
super().__init__(parent)
self.move_cb = move_cb
self.fingers = {}
+ def update(self):
+ num_fingers = len(self.fingers)
+ if num_fingers == 0:
+ return
+ elif num_fingers == 1:
+ # calculate relative coordinate
+ finger = next(iter(self.fingers.values()))
+ if finger.new != Finger.NO_COORD:
+ self.move_cb(
+ ((n - o) * s for n, o, s in zip(finger.new, finger.old, SPEEDS[0]))
+ )
+ finger.old = finger.new
+ elif num_fingers == 2:
+ avg = (0, 0)
+ num = 0
+ for finger in self.fingers.values():
+ if finger.new == Finger.NO_COORD:
+ continue
+ avg = (
+ avg[0] + finger.new[0] - finger.old[0],
+ avg[1] + finger.new[1] - finger.old[1],
+ )
+ num += 1
+ if num:
+ self.move_cb((a / num * s for a, s in zip(avg, SPEEDS[1])), True)
+ for finger in self.fingers.values():
+ if finger.new != Finger.NO_COORD:
+ finger.old = finger.new
+
+ for key, finger in tuple(self.fingers.items()):
+ if finger.lifted:
+ self.fingers.pop(key)
+
def draw(self):
pygame.draw.rect(self.surf, "yellow", self.rect, 1)
if self.rect.collidepoint(
MultitouchHandler.map_coords(pos, self.surf.get_size())
):
- self.fingers[(event.touch_id, event.finger_id)] = [pos]
+ self.fingers[(event.touch_id, event.finger_id)] = Finger(pos)
def handle_fingermotion(self, event):
- key = (event.touch_id, event.finger_id)
- if key not in self.fingers:
+ finger = self.fingers.get((event.touch_id, event.finger_id))
+ if finger is None or finger.lifted:
return
pos = (event.x, event.y)
- if self.rect.collidepoint(
+ if not self.rect.collidepoint(
MultitouchHandler.map_coords(pos, self.surf.get_size())
):
- self.fingers[key].append(pos)
- else:
- self.fingers.pop(key)
+ pos = finger.old
+ finger.lifted = True
+ elif event.type == pygame.FINGERUP:
+ finger.lifted = True
+ finger.new = pos
- def handle_fingerup(self, event):
- key = (event.touch_id, event.finger_id)
- if key not in self.fingers:
- return
- pos = (event.x, event.y)
- if self.rect.collidepoint(
- MultitouchHandler.map_coords(pos, self.surf.get_size())
- ):
- pass
- self.fingers.pop(key)
+ handle_fingerup = handle_fingermotion