mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-09-01 05:33:49 +08:00
Sound panel blinky
This commit is contained in:
@@ -603,6 +603,7 @@ class PanelManagerView(AetherInteractiveMixin, Widget):
|
||||
self._page_anim_committed = False
|
||||
self._page_anim_prev_tiles: list = []
|
||||
self._page_drag_active = False
|
||||
self._page_drag_eligible = False
|
||||
self._page_drag_offset = 0.0
|
||||
self._page_drag_start_x = 0.0
|
||||
self._page_drag_start_y = 0.0
|
||||
@@ -918,6 +919,7 @@ class PanelManagerView(AetherInteractiveMixin, Widget):
|
||||
super()._handle_mouse_press(mouse_pos)
|
||||
if self._has_pagination:
|
||||
if self._page_clip_rect and not rl.check_collision_point_rec(mouse_pos, self._page_clip_rect):
|
||||
self._page_drag_eligible = False
|
||||
return
|
||||
|
||||
if self._page_animating:
|
||||
@@ -926,15 +928,17 @@ class PanelManagerView(AetherInteractiveMixin, Widget):
|
||||
self._page_drag_start_x = mouse_pos.x
|
||||
self._page_drag_start_y = mouse_pos.y
|
||||
self._page_drag_active = False
|
||||
self._page_drag_eligible = True
|
||||
self._page_drag_offset = 0.0
|
||||
|
||||
def _handle_mouse_event(self, mouse_event: MouseEvent) -> None:
|
||||
super()._handle_mouse_event(mouse_event)
|
||||
if self._has_pagination:
|
||||
if self._has_pagination and getattr(self, "_page_drag_eligible", False):
|
||||
dx = mouse_event.pos.x - self._page_drag_start_x
|
||||
dy = abs(mouse_event.pos.y - self._page_drag_start_y)
|
||||
if dy > abs(dx) * 1.2 and dy > 32:
|
||||
self._page_drag_active = False
|
||||
self._page_drag_eligible = False
|
||||
self._page_drag_offset = 0.0
|
||||
return
|
||||
if (self._current_page == 0 and dx > 0) or \
|
||||
@@ -947,6 +951,7 @@ class PanelManagerView(AetherInteractiveMixin, Widget):
|
||||
self._can_click = False
|
||||
|
||||
def _handle_mouse_release(self, mouse_pos: MousePos) -> None:
|
||||
self._page_drag_eligible = False
|
||||
if self._page_drag_active and self._has_pagination:
|
||||
self._page_drag_active = False
|
||||
offset = self._page_drag_offset
|
||||
@@ -1026,6 +1031,7 @@ class PanelManagerView(AetherInteractiveMixin, Widget):
|
||||
|
||||
def show_event(self) -> None:
|
||||
super().show_event()
|
||||
self._page_drag_eligible = False
|
||||
self._page_drag_active = False
|
||||
self._page_drag_offset = 0.0
|
||||
self._page_animating = False
|
||||
@@ -1034,6 +1040,14 @@ class PanelManagerView(AetherInteractiveMixin, Widget):
|
||||
self._current_page = 0
|
||||
self._on_page_changed()
|
||||
|
||||
def hide_event(self) -> None:
|
||||
super().hide_event()
|
||||
self._page_drag_eligible = False
|
||||
self._page_drag_active = False
|
||||
self._page_drag_offset = 0.0
|
||||
self._page_animating = False
|
||||
self._page_anim_prev_tiles.clear()
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# AdjustorTogglesPanelView — shared adjustor+toggle-grid base
|
||||
|
||||
@@ -59,20 +59,13 @@ class SoundsManagerView(AdjustorTogglesPanelView):
|
||||
|
||||
self._init_adjustors()
|
||||
self._init_toggles()
|
||||
self._forward_touch_valid()
|
||||
|
||||
def _forward_touch_valid(self):
|
||||
self._toggle_grid.set_touch_valid_callback(
|
||||
lambda: self._scroll_panel.is_touch_valid()
|
||||
)
|
||||
|
||||
def _init_toggles(self):
|
||||
if self.PANEL_STYLE.toggle_row_mode:
|
||||
self._toggle_grid = TileGrid(columns=1, padding=SPACING.md, min_tile_height=TOGGLE_MIN_HEIGHT)
|
||||
else:
|
||||
self._toggle_grid = TileGrid(columns=2, padding=12, min_tile_height=130.0)
|
||||
self._child(self._toggle_grid)
|
||||
self._page_grid = self._toggle_grid
|
||||
self.register_page_grid(self._toggle_grid)
|
||||
|
||||
toggle_defs = []
|
||||
for key in self._controller.CUSTOM_ALERTS_KEYS:
|
||||
|
||||
@@ -615,6 +615,40 @@ class TestAethergridContracts(unittest.TestCase):
|
||||
view._activate_target(mod.BACK_BTN)
|
||||
app_mod.gui_app.pop_widget.assert_called_once()
|
||||
|
||||
def test_panel_manager_view_page_drag_eligibility_and_reset(self):
|
||||
mod = _import_aethergrid()
|
||||
view = mod.PanelManagerView()
|
||||
view._page_count = 2
|
||||
view._current_page = 1
|
||||
view._page_clip_rect = mod.rl.Rectangle(1000, 100, 800, 800)
|
||||
view._scroll_rect = mod.rl.Rectangle(0, 0, 1920, 1080)
|
||||
|
||||
# Press outside grid (e.g. at volume adjustor on left: x=200, y=200)
|
||||
view._handle_mouse_press(types.SimpleNamespace(x=200, y=200))
|
||||
self.assertFalse(view._page_drag_eligible)
|
||||
self.assertFalse(view._page_drag_active)
|
||||
|
||||
# Move event while not eligible does not trigger drag offset
|
||||
mouse_event = types.SimpleNamespace(pos=types.SimpleNamespace(x=500, y=200), left_pressed=False, left_down=True, left_released=False, slot=0)
|
||||
view._handle_mouse_event(mouse_event)
|
||||
self.assertFalse(view._page_drag_active)
|
||||
self.assertEqual(view._page_drag_offset, 0.0)
|
||||
|
||||
# Press inside grid (e.g. at x=1200, y=200)
|
||||
view._handle_mouse_press(types.SimpleNamespace(x=1200, y=200))
|
||||
self.assertTrue(view._page_drag_eligible)
|
||||
|
||||
# Move event while eligible calculates drag offset (swipe right towards page 0)
|
||||
drag_event = types.SimpleNamespace(pos=types.SimpleNamespace(x=1250, y=200), left_pressed=False, left_down=True, left_released=False, slot=0)
|
||||
view._handle_mouse_event(drag_event)
|
||||
self.assertTrue(view._page_drag_active)
|
||||
self.assertEqual(view._page_drag_offset, 50.0)
|
||||
|
||||
# Release resets eligibility and active drag
|
||||
view._handle_mouse_release(types.SimpleNamespace(x=1250, y=200))
|
||||
self.assertFalse(view._page_drag_eligible)
|
||||
self.assertFalse(view._page_drag_active)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user