system/ui: add animation to toggle (#35392)

add animation to toogle
pull/35394/head
Dean Lee 2 weeks ago committed by GitHub
parent ea9ff45ccb
commit 45f90b1a55
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 47
      system/ui/lib/toggle.py

@ -1,45 +1,49 @@
import pyray as rl import pyray as rl
ON_COLOR = rl.GREEN ON_COLOR = rl.Color(0, 255, 0, 255)
OFF_COLOR = rl.Color(0x39, 0x39, 0x39, 255) OFF_COLOR = rl.Color(0x39, 0x39, 0x39, 255)
KNOB_COLOR = rl.WHITE KNOB_COLOR = rl.WHITE
WIDTH, HEIGHT = 160, 80
BG_HEIGHT = 60 BG_HEIGHT = 60
KNOB_HEIGHT = 80 ANIMATION_SPEED = 8.0
WIDTH = 160
class Toggle: class Toggle:
def __init__(self, x, y, initial_state=False): def __init__(self, x, y, initial_state=False):
self._state = initial_state self._state = initial_state
self._rect = rl.Rectangle(x, y, WIDTH, KNOB_HEIGHT) self._rect = rl.Rectangle(x, y, WIDTH, HEIGHT)
self._progress = 1.0 if initial_state else 0.0
self._target = self._progress
def handle_input(self): def handle_input(self):
if rl.is_mouse_button_pressed(rl.MOUSE_LEFT_BUTTON): if rl.is_mouse_button_pressed(rl.MOUSE_LEFT_BUTTON):
mouse_pos = rl.get_mouse_position() if rl.check_collision_point_rec(rl.get_mouse_position(), self._rect):
if rl.check_collision_point_rec(mouse_pos, self._rect):
self._state = not self._state self._state = not self._state
self._target = 1.0 if self._state else 0.0
def get_state(self): def get_state(self):
return self._state return self._state
def update(self):
if abs(self._progress - self._target) > 0.01:
delta = rl.get_frame_time() * ANIMATION_SPEED
self._progress += delta if self._progress < self._target else -delta
self._progress = max(0.0, min(1.0, self._progress))
def render(self): def render(self):
self._draw_background() self. update()
self._draw_knob() # Draw background
bg_rect = rl.Rectangle(self._rect.x + 5, self._rect.y + 10, WIDTH - 10, BG_HEIGHT)
bg_color = self._blend_color(OFF_COLOR, ON_COLOR, self._progress)
rl.draw_rectangle_rounded(bg_rect, 1.0, 10, bg_color)
def _draw_background(self): # Draw knob
bg_rect = rl.Rectangle( knob_x = self._rect.x + HEIGHT / 2 + (WIDTH - HEIGHT) * self._progress
self._rect.x + 5, knob_y = self._rect.y + HEIGHT / 2
self._rect.y + (KNOB_HEIGHT - BG_HEIGHT) / 2, rl.draw_circle(int(knob_x), int(knob_y), HEIGHT / 2, KNOB_COLOR)
self._rect.width - 10,
BG_HEIGHT,
)
rl.draw_rectangle_rounded(bg_rect, 1.0, 10, ON_COLOR if self._state else OFF_COLOR)
def _draw_knob(self): def _blend_color(self, c1, c2, t):
knob_radius = KNOB_HEIGHT / 2 return rl.Color(int(c1.r + (c2.r - c1.r) * t), int(c1.g + (c2.g - c1.g) * t), int(c1.b + (c2.b - c1.b) * t), 255)
knob_x = self._rect.x + knob_radius if not self._state else self._rect.x + self._rect.width - knob_radius
knob_y = self._rect.y + knob_radius
rl.draw_circle(int(knob_x), int(knob_y), knob_radius, KNOB_COLOR)
if __name__ == "__main__": if __name__ == "__main__":
@ -50,4 +54,3 @@ if __name__ == "__main__":
for _ in gui_app.render(): for _ in gui_app.render():
toggle.handle_input() toggle.handle_input()
toggle.render() toggle.render()

Loading…
Cancel
Save