diff --git a/portprotonqt/game_card.py b/portprotonqt/game_card.py index 86da043..bb76a63 100644 --- a/portprotonqt/game_card.py +++ b/portprotonqt/game_card.py @@ -25,6 +25,7 @@ class GameCard(QFrame): addToSteamRequested = Signal(str, str, str) # name, exec_line, cover_path removeFromSteamRequested = Signal(str, str) # name, exec_line openGameFolderRequested = Signal(str, str) # name, exec_line + hoverChanged = Signal(str, bool) def __init__(self, name, description, cover_path, appid, controller_support, exec_line, last_launch, formatted_playtime, protondb_tier, anticheat_status, last_launch_ts, playtime_seconds, game_source, @@ -476,6 +477,7 @@ class GameCard(QFrame): def enterEvent(self, event): self._hovered = True + self.hoverChanged.emit(self.name, True) self.thickness_anim.stop() if self._isPulseAnimationConnected: self.thickness_anim.finished.disconnect(self.startPulseAnimation) @@ -500,22 +502,21 @@ class GameCard(QFrame): def leaveEvent(self, event): self._hovered = False - if not self._focused: # Сохраняем анимацию, если есть фокус + self.hoverChanged.emit(self.name, False) + if not self._focused: if self.gradient_anim: self.gradient_anim.stop() self.gradient_anim = None - self.thickness_anim.stop() - if self._isPulseAnimationConnected: - self.thickness_anim.finished.disconnect(self.startPulseAnimation) - self._isPulseAnimationConnected = False if self.pulse_anim: self.pulse_anim.stop() self.pulse_anim = None - self.thickness_anim.setEasingCurve(QEasingCurve(QEasingCurve.Type.InBack)) - self.thickness_anim.setStartValue(self._borderWidth) - self.thickness_anim.setEndValue(2) - self.thickness_anim.start() - + if self.thickness_anim: + self.thickness_anim.stop() + if self._isPulseAnimationConnected: + self.thickness_anim.finished.disconnect(self.startPulseAnimation) + self._isPulseAnimationConnected = False + self.setBorderWidth(2) + self.update() super().leaveEvent(event) def focusInEvent(self, event): diff --git a/portprotonqt/main_window.py b/portprotonqt/main_window.py index 3f52448..6b6ed82 100644 --- a/portprotonqt/main_window.py +++ b/portprotonqt/main_window.py @@ -65,6 +65,7 @@ class MainWindow(QMainWindow): self.games_load_timer.timeout.connect(self.finalize_game_loading) self.games_loaded.connect(self.on_games_loaded) self.current_add_game_dialog = None + self.current_hovered_card = None # Добавляем таймер для дебаунсинга сохранения настроек self.settingsDebounceTimer = QTimer(self) @@ -241,6 +242,32 @@ class MainWindow(QMainWindow): self.updateGameGrid() self.progress_bar.setVisible(False) + def _on_card_hovered(self, game_name: str, is_hovered: bool): + """Обработчик сигнала hoverChanged от GameCard.""" + card_key = None + # Находим ключ карточки по имени игры + for key, card in self.game_card_cache.items(): + if card.name == game_name: + card_key = key + break + + if not card_key: + return + + card = self.game_card_cache[card_key] + + if is_hovered: + # Если мышь наведена на карточку + if self.current_hovered_card and self.current_hovered_card != card: + # Сбрасываем предыдущую выделенную карточку + self.current_hovered_card._hovered = False + self.current_hovered_card.leaveEvent(None) # Принудительно вызываем leaveEvent + self.current_hovered_card = card + else: + # Если мышь покинула карточку + if self.current_hovered_card == card: + self.current_hovered_card = None + def loadGames(self): display_filter = read_display_filter() favorites = read_favorites() @@ -681,6 +708,7 @@ class MainWindow(QMainWindow): card_width=self.card_width, context_menu_manager=self.context_menu_manager ) + card.hoverChanged.connect(self._on_card_hovered) # Подключаем сигналы контекстного меню card.editShortcutRequested.connect(self.context_menu_manager.edit_game_shortcut) card.deleteGameRequested.connect(self.context_menu_manager.delete_game)