forked from Boria138/PortProtonQt
feat: added setfocus to gamedetail page
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
This commit is contained in:
@@ -1201,7 +1201,6 @@ class InputManager(QObject):
|
|||||||
active = QApplication.activeWindow()
|
active = QApplication.activeWindow()
|
||||||
focused = QApplication.focusWidget()
|
focused = QApplication.focusWidget()
|
||||||
popup = QApplication.activePopupWidget()
|
popup = QApplication.activePopupWidget()
|
||||||
modal_dialog = QApplication.activeModalWidget()
|
|
||||||
if not app or not active:
|
if not app or not active:
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -1301,13 +1300,6 @@ class InputManager(QObject):
|
|||||||
menu.setFocus(Qt.FocusReason.OtherFocusReason)
|
menu.setFocus(Qt.FocusReason.OtherFocusReason)
|
||||||
return
|
return
|
||||||
|
|
||||||
# Game launch on detail page
|
|
||||||
if (button_code in BUTTONS['confirm']) and self._parent.currentDetailPage is not None and modal_dialog is None:
|
|
||||||
if self._parent.current_exec_line:
|
|
||||||
self.trigger_rumble()
|
|
||||||
self._parent.toggleGame(self._parent.current_exec_line, None)
|
|
||||||
return
|
|
||||||
|
|
||||||
# Standard navigation
|
# Standard navigation
|
||||||
if button_code in BUTTONS['confirm']:
|
if button_code in BUTTONS['confirm']:
|
||||||
self._parent.activateFocusedWidget()
|
self._parent.activateFocusedWidget()
|
||||||
@@ -1607,6 +1599,50 @@ class InputManager(QObject):
|
|||||||
self._navigate_game_cards(container, current_index, code, value)
|
self._navigate_game_cards(container, current_index, code, value)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Button navigation on detail pages (horizontal layout)
|
||||||
|
if code in (ecodes.ABS_HAT0X, ecodes.ABS_HAT0Y):
|
||||||
|
focused = QApplication.focusWidget()
|
||||||
|
page = self._parent.stackedWidget.currentWidget()
|
||||||
|
|
||||||
|
# Check if we're on a detail page and focused widget is a button
|
||||||
|
if isinstance(focused, AutoSizeButton):
|
||||||
|
# Find all buttons in the same horizontal layout (same parent, same Y position)
|
||||||
|
parent_widget = focused.parentWidget()
|
||||||
|
if parent_widget:
|
||||||
|
# Find all AutoSizeButtons in the parent that are horizontally aligned
|
||||||
|
buttons = parent_widget.findChildren(AutoSizeButton)
|
||||||
|
# Filter buttons that are approximately on the same horizontal level (similar Y positions)
|
||||||
|
y_tolerance = 20 # pixels tolerance for vertical alignment
|
||||||
|
current_y = focused.geometry().y() + focused.geometry().height() // 2
|
||||||
|
aligned_buttons = []
|
||||||
|
for btn in buttons:
|
||||||
|
btn_center_y = btn.geometry().y() + btn.geometry().height() // 2
|
||||||
|
if abs(btn_center_y - current_y) <= y_tolerance:
|
||||||
|
aligned_buttons.append(btn)
|
||||||
|
|
||||||
|
# Sort buttons by x position for left-to-right navigation
|
||||||
|
if len(aligned_buttons) > 1:
|
||||||
|
aligned_buttons.sort(key=lambda b: b.geometry().x() + b.geometry().width() // 2)
|
||||||
|
|
||||||
|
# Find current button index
|
||||||
|
try:
|
||||||
|
current_index = aligned_buttons.index(focused)
|
||||||
|
except ValueError:
|
||||||
|
current_index = -1
|
||||||
|
|
||||||
|
if current_index >= 0:
|
||||||
|
if code == ecodes.ABS_HAT0X: # Horizontal navigation (left/right)
|
||||||
|
if value < 0 and current_index > 0: # Left
|
||||||
|
aligned_buttons[current_index - 1].setFocus(Qt.FocusReason.OtherFocusReason)
|
||||||
|
return
|
||||||
|
elif value > 0 and current_index < len(aligned_buttons) - 1: # Right
|
||||||
|
aligned_buttons[current_index + 1].setFocus(Qt.FocusReason.OtherFocusReason)
|
||||||
|
return
|
||||||
|
elif code == ecodes.ABS_HAT0Y: # Vertical navigation (up/down)
|
||||||
|
# For buttons on the same row, up/down should go to other controls
|
||||||
|
# So we'll continue to the next section of code for general navigation
|
||||||
|
pass
|
||||||
|
|
||||||
# Vertical navigation in other tabs
|
# Vertical navigation in other tabs
|
||||||
if code == ecodes.ABS_HAT0Y and value != 0:
|
if code == ecodes.ABS_HAT0Y and value != 0:
|
||||||
focused = QApplication.focusWidget()
|
focused = QApplication.focusWidget()
|
||||||
|
|||||||
@@ -2723,6 +2723,7 @@ class MainWindow(QMainWindow):
|
|||||||
|
|
||||||
playButton.setFixedSize(120, 40)
|
playButton.setFixedSize(120, 40)
|
||||||
playButton.setStyleSheet(self.theme.PLAY_BUTTON_STYLE)
|
playButton.setStyleSheet(self.theme.PLAY_BUTTON_STYLE)
|
||||||
|
playButton.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
|
||||||
playButton.clicked.connect(lambda: self.toggleGame(exec_line, playButton))
|
playButton.clicked.connect(lambda: self.toggleGame(exec_line, playButton))
|
||||||
buttons_layout.addWidget(playButton, alignment=Qt.AlignmentFlag.AlignLeft)
|
buttons_layout.addWidget(playButton, alignment=Qt.AlignmentFlag.AlignLeft)
|
||||||
|
|
||||||
@@ -2748,6 +2749,61 @@ class MainWindow(QMainWindow):
|
|||||||
# Анимация
|
# Анимация
|
||||||
self.detail_animations.animate_detail_page(detailPage, load_image_and_restore_effect, cleanup_animation)
|
self.detail_animations.animate_detail_page(detailPage, load_image_and_restore_effect, cleanup_animation)
|
||||||
|
|
||||||
|
# Update page reference
|
||||||
|
self.currentDetailPage = detailPage
|
||||||
|
|
||||||
|
original_load = load_image_and_restore_effect
|
||||||
|
|
||||||
|
def enhanced_load():
|
||||||
|
original_load()
|
||||||
|
QTimer.singleShot(50, try_set_focus)
|
||||||
|
|
||||||
|
def try_set_focus():
|
||||||
|
if not (playButton and not playButton.isHidden()):
|
||||||
|
return
|
||||||
|
|
||||||
|
# Ensure page is active
|
||||||
|
self.stackedWidget.setCurrentWidget(detailPage)
|
||||||
|
detailPage.setFocus(Qt.FocusReason.OtherFocusReason)
|
||||||
|
playButton.setFocus(Qt.FocusReason.OtherFocusReason)
|
||||||
|
playButton.update()
|
||||||
|
detailPage.raise_()
|
||||||
|
self.activateWindow()
|
||||||
|
|
||||||
|
if playButton.hasFocus():
|
||||||
|
logger.debug("Play button successfully received focus")
|
||||||
|
else:
|
||||||
|
logger.debug("Retrying focus...")
|
||||||
|
QTimer.singleShot(20, retry_focus)
|
||||||
|
|
||||||
|
def retry_focus():
|
||||||
|
if not (playButton and not playButton.isHidden() and not playButton.hasFocus()):
|
||||||
|
return
|
||||||
|
|
||||||
|
QApplication.processEvents()
|
||||||
|
self.activateWindow()
|
||||||
|
self.stackedWidget.setCurrentWidget(detailPage)
|
||||||
|
detailPage.raise_()
|
||||||
|
playButton.setFocus(Qt.FocusReason.OtherFocusReason)
|
||||||
|
playButton.update()
|
||||||
|
|
||||||
|
if not playButton.hasFocus():
|
||||||
|
logger.debug("Final retry...")
|
||||||
|
playButton.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
|
||||||
|
playButton.setFocus(Qt.FocusReason.OtherFocusReason)
|
||||||
|
QApplication.processEvents()
|
||||||
|
|
||||||
|
if playButton.hasFocus():
|
||||||
|
logger.debug("Play button received focus after final retry")
|
||||||
|
else:
|
||||||
|
logger.debug("Play button still doesn't have focus")
|
||||||
|
|
||||||
|
self.detail_animations.animate_detail_page(
|
||||||
|
detailPage,
|
||||||
|
enhanced_load,
|
||||||
|
cleanup_animation
|
||||||
|
)
|
||||||
|
|
||||||
def toggleFavoriteInDetailPage(self, game_name, label):
|
def toggleFavoriteInDetailPage(self, game_name, label):
|
||||||
favorites = read_favorites()
|
favorites = read_favorites()
|
||||||
if game_name in favorites:
|
if game_name in favorites:
|
||||||
|
|||||||
@@ -647,6 +647,9 @@ PLAY_BUTTON_STYLE = f"""
|
|||||||
QPushButton:pressed {{
|
QPushButton:pressed {{
|
||||||
background: {color_a};
|
background: {color_a};
|
||||||
}}
|
}}
|
||||||
|
QPushButton:focus {{
|
||||||
|
background: {color_a};
|
||||||
|
}}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# СТИЛЬ КНОПКИ "ОБЗОР..." В ДИАЛОГЕ "ДОБАВИТЬ ИГРУ"
|
# СТИЛЬ КНОПКИ "ОБЗОР..." В ДИАЛОГЕ "ДОБАВИТЬ ИГРУ"
|
||||||
|
|||||||
Reference in New Issue
Block a user