diff --git a/src/core/input_manager.py b/src/core/input_manager.py index 9ca9d10..20a7127 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 @@ -440,8 +442,12 @@ def handle_mouse(self, x, y): # Сброс начальной точки поглаживания при выходе за пределы питомца self.last_pet_time = 0 - def toggle_laser_mode(self): - self.laser_mode = not self.laser_mode + def toggle_laser_mode(self, enabled=None): + if enabled is not None: + self.laser_mode = bool(enabled) + else: + self.laser_mode = not self.laser_mode + if self.laser_mode: self.window.animation_manager.play_state("hunting") # Создаем красивый светящийся красный лазерный курсор @@ -470,6 +476,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..29a3dbd 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() @@ -232,7 +235,7 @@ def feed_pet(self, checked=False): def toggle_laser(self, checked): if self.window.input_manager: - is_active = self.window.input_manager.toggle_laser_mode() + is_active = self.window.input_manager.toggle_laser_mode(checked) if is_active: self.show_message("Мини-игра", "Лазерная указка активирована! 🔴") else: diff --git a/tests/test_utils.py b/tests/test_utils.py index 1a72e44..a40a36e 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -201,16 +201,55 @@ def test_laser_mode_transitions(self): db = DataStore(self.db_path) im = InputManager(mock_window, db) + # Мок для подписки на сигнал + signal_mock = MagicMock() + im.laser_mode_changed.connect(signal_mock) + # Переключаем лазер в True im.toggle_laser_mode() self.assertTrue(im.laser_mode) mock_window.animation_manager.play_state.assert_called_with("hunting") mock_window.setCursor.assert_called() + signal_mock.assert_called_with(True) - # Переключаем обратно в False - im.toggle_laser_mode() + # Переключаем обратно в False со значением + im.toggle_laser_mode(False) self.assertFalse(im.laser_mode) mock_window.animation_manager.play_state.assert_called_with("idle") + signal_mock.assert_called_with(False) + + db.close() + + def test_tray_menu_laser_mode_sync(self): + os.environ["QT_QPA_PLATFORM"] = "offscreen" + from PySide6.QtWidgets import QApplication + from src.ui.tray_menu import TrayMenu + + app = QApplication.instance() or QApplication([]) + + config = ConfigManager(self.config_path) + window = PetWindow(config) + + db = DataStore(self.db_path) + im = InputManager(window, db) + window.input_manager = im + + tray = TrayMenu(window) + + # Первоначальное состояние пункта меню + self.assertFalse(tray.laser_action.isChecked()) + + # Изменяем состояние через InputManager + im.toggle_laser_mode(True) + + # Проверяем, что галочка в меню автоматически установилась в True по сигналу + self.assertTrue(tray.laser_action.isChecked()) + + # Отключаем через InputManager + im.toggle_laser_mode(False) + + # Проверяем, что галочка снялась + self.assertFalse(tray.laser_action.isChecked()) db.close()