Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/core/input_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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):
Expand Down
11 changes: 7 additions & 4 deletions src/ui/tray_menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down
30 changes: 30 additions & 0 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down