feat(input_manager): rework gamepad buttons maping
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
This commit is contained in:
@ -34,19 +34,18 @@ class MainWindowProtocol(Protocol):
|
||||
current_exec_line: str | None
|
||||
current_add_game_dialog: QDialog | None
|
||||
|
||||
# Mapping of actions to evdev button codes, includes PlayStation, Xbox controllers
|
||||
# Mapping of actions to evdev button codes, includes Xbox and Playstation controllers
|
||||
# https://github.com/torvalds/linux/blob/master/drivers/hid/hid-playstation.c
|
||||
# https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c
|
||||
BUTTONS = {
|
||||
'confirm': {ecodes.BTN_A, ecodes.BTN_SOUTH},
|
||||
'back': {ecodes.BTN_B, ecodes.BTN_EAST},
|
||||
'add_game': {ecodes.BTN_Y, ecodes.BTN_NORTH},
|
||||
'prev_tab': {ecodes.BTN_TL},
|
||||
'next_tab': {ecodes.BTN_TR},
|
||||
'confirm_stick': {ecodes.BTN_THUMBL, ecodes.BTN_THUMBR},
|
||||
'context_menu': {ecodes.BTN_START},
|
||||
'menu': {ecodes.BTN_SELECT},
|
||||
'guide': {ecodes.BTN_MODE, ecodes.KEY_HOMEPAGE},
|
||||
'confirm': {ecodes.BTN_A, ecodes.BTN_SOUTH}, # A / Cross
|
||||
'back': {ecodes.BTN_B, ecodes.BTN_EAST}, # B / Circle
|
||||
'add_game': {ecodes.BTN_Y, ecodes.BTN_NORTH}, # Y / Triangle
|
||||
'prev_tab': {ecodes.BTN_TL}, # LB / L1
|
||||
'next_tab': {ecodes.BTN_TR}, # RB / R1
|
||||
'context_menu': {ecodes.BTN_START}, # Start / Options
|
||||
'menu': {ecodes.BTN_SELECT}, # Select / Share
|
||||
'guide': {ecodes.BTN_MODE}, # Xbox / PS Home
|
||||
}
|
||||
|
||||
class InputManager(QObject):
|
||||
@ -149,19 +148,19 @@ class InputManager(QObject):
|
||||
|
||||
# Handle QMenu (context menu)
|
||||
if isinstance(popup, QMenu):
|
||||
if button_code in BUTTONS['confirm'] or button_code in BUTTONS['confirm_stick']:
|
||||
if button_code in BUTTONS['confirm']:
|
||||
if popup.activeAction():
|
||||
popup.activeAction().trigger()
|
||||
popup.close()
|
||||
return
|
||||
elif button_code in BUTTONS['back'] or button_code in BUTTONS['menu']:
|
||||
elif button_code in BUTTONS['back']:
|
||||
popup.close()
|
||||
return
|
||||
return
|
||||
|
||||
# Handle QComboBox
|
||||
if isinstance(focused, QComboBox):
|
||||
if button_code in BUTTONS['confirm'] or button_code in BUTTONS['confirm_stick']:
|
||||
if button_code in BUTTONS['confirm']:
|
||||
focused.showPopup()
|
||||
return
|
||||
|
||||
@ -175,7 +174,7 @@ class InputManager(QObject):
|
||||
break
|
||||
parent = parent.parentWidget()
|
||||
|
||||
if button_code in BUTTONS['confirm'] or button_code in BUTTONS['confirm_stick']:
|
||||
if button_code in BUTTONS['confirm']:
|
||||
idx = focused.currentIndex()
|
||||
if idx.isValid():
|
||||
if combo:
|
||||
@ -221,18 +220,17 @@ class InputManager(QObject):
|
||||
return
|
||||
|
||||
# Game launch on detail page
|
||||
if (button_code in BUTTONS['confirm'] or button_code in BUTTONS['confirm_stick']) and self._parent.currentDetailPage is not None and self._parent.current_add_game_dialog is None:
|
||||
if (button_code in BUTTONS['confirm']) and self._parent.currentDetailPage is not None and self._parent.current_add_game_dialog is None:
|
||||
if self._parent.current_exec_line:
|
||||
self._parent.toggleGame(self._parent.current_exec_line, None)
|
||||
return
|
||||
|
||||
# Standard navigation
|
||||
if button_code in BUTTONS['confirm'] or button_code in BUTTONS['confirm_stick']:
|
||||
if button_code in BUTTONS['confirm']:
|
||||
self._parent.activateFocusedWidget()
|
||||
elif button_code in BUTTONS['back'] or button_code in BUTTONS['menu']:
|
||||
elif button_code in BUTTONS['back']:
|
||||
self._parent.goBackDetailPage(getattr(self._parent, 'currentDetailPage', None))
|
||||
elif button_code in BUTTONS['add_game']:
|
||||
# Only open AddGameDialog if in library tab (index 0)
|
||||
if self._parent.stackedWidget.currentIndex() == 0:
|
||||
self._parent.openAddGameDialog()
|
||||
elif button_code in BUTTONS['prev_tab']:
|
||||
@ -791,9 +789,7 @@ class InputManager(QObject):
|
||||
continue
|
||||
now = time.time()
|
||||
if event.type == ecodes.EV_KEY and event.value == 1:
|
||||
# Обработка кнопки Select для переключения полноэкранного режима
|
||||
if event.code in BUTTONS['menu']:
|
||||
# Переключаем полноэкранный режим
|
||||
self.toggle_fullscreen.emit(not self._is_fullscreen)
|
||||
else:
|
||||
self.button_pressed.emit(event.code)
|
||||
|
Reference in New Issue
Block a user