From 7d8f6cda4ebc2952a8681972596d507718263742 Mon Sep 17 00:00:00 2001 From: mx57 <38256814+mx57@users.noreply.github.com> Date: Thu, 27 Aug 2026 05:26:22 +0000 Subject: [PATCH] Fix laser pointer state synchronization in TrayMenu via PySide6 Signal --- src/core/input_manager.py | 4 ++++ src/ui/tray_menu.py | 11 +++++++---- tests/test_utils.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/core/input_manager.py b/src/core/input_manager.py index 9ca9d10..4732cb2 100644 --- a/src/core/input_manager.py +++ b/src/core/input_manager.py @@ -44,6 +44,8 @@ def stop(self): self.keyboard_listener.stop() class InputManager(QObject): + laser_mode_changed = Signal(bool) + def __init__(self, pet_window, data_store=None): super().__init__() self.window = pet_window @@ -470,6 +472,8 @@ def toggle_laser_mode(self): else: self.window.setCursor(Qt.ArrowCursor) self.window.animation_manager.play_state("idle") + + self.laser_mode_changed.emit(self.laser_mode) return self.laser_mode def reset_all_data(self): diff --git a/src/ui/tray_menu.py b/src/ui/tray_menu.py index b3d0392..92389fc 100644 --- a/src/ui/tray_menu.py +++ b/src/ui/tray_menu.py @@ -59,10 +59,13 @@ def setup_menu(self): self.menu.addSeparator() # Лазерная указка - laser_action = QAction("Лазерная указка 🔴", self) - laser_action.setCheckable(True) - laser_action.triggered.connect(self.toggle_laser) - self.menu.addAction(laser_action) + self.laser_action = QAction("Лазерная указка 🔴", self) + self.laser_action.setCheckable(True) + self.laser_action.triggered.connect(self.toggle_laser) + self.menu.addAction(self.laser_action) + + if self.window.input_manager: + self.window.input_manager.laser_mode_changed.connect(self.laser_action.setChecked) self.menu.addSeparator() diff --git a/tests/test_utils.py b/tests/test_utils.py index 1a72e44..dc576dc 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -214,6 +214,36 @@ def test_laser_mode_transitions(self): db.close() + def test_laser_mode_signal_sync(self): + from src.ui.tray_menu import TrayMenu + from PySide6.QtWidgets import QApplication + + os.environ["QT_QPA_PLATFORM"] = "offscreen" + app = QApplication.instance() or QApplication([]) + + config = ConfigManager(self.config_path) + window = PetWindow(config) + im = InputManager(window) + window.input_manager = im + + tray = TrayMenu(window) + + # Изначально не активен + self.assertFalse(im.laser_mode) + self.assertFalse(tray.laser_action.isChecked()) + + # Переключаем режим лазерной указки через InputManager + im.toggle_laser_mode() + self.assertTrue(im.laser_mode) + self.assertTrue(tray.laser_action.isChecked()) + + # Повторное переключение + im.toggle_laser_mode() + self.assertFalse(im.laser_mode) + self.assertFalse(tray.laser_action.isChecked()) + + window.close() + def test_force_state_delays_idle(self): mock_window = MagicMock() mock_window.animation_manager.current_state = "idle"