From b35a1b8dfeb012d1f1e37370224df8da3f360782 Mon Sep 17 00:00:00 2001 From: Boris Yumankulov Date: Wed, 11 Jun 2025 07:20:24 +0500 Subject: [PATCH] fix: prevent game card overlap in all\ display filter Signed-off-by: Boris Yumankulov --- portprotonqt/main_window.py | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/portprotonqt/main_window.py b/portprotonqt/main_window.py index 9660140..cb67f3c 100644 --- a/portprotonqt/main_window.py +++ b/portprotonqt/main_window.py @@ -274,9 +274,10 @@ class MainWindow(QMainWindow): seen = set() games = [] for game in portproton_games + steam_games: - name = game[0] - if name not in seen: - seen.add(name) + # Уникальный ключ: имя + exec_line + key = (game[0], game[4]) + if key not in seen: + seen.add(key) games.append(game) self.games_loaded.emit(games) self._load_portproton_games_async( @@ -629,18 +630,19 @@ class MainWindow(QMainWindow): self.gamesListWidget.updateGeometry() return - # Создаем словарь текущих игр для быстрого поиска - current_games = {game_data[0]: game_data for game_data in games_list} + # Создаем словарь текущих игр с уникальным ключом (name + exec_line) + current_games = {(game_data[0], game_data[4]): game_data for game_data in games_list} # Проверяем, изменился ли список игр или размер карточек - current_game_names = set(current_games.keys()) - cached_game_names = set(self.game_card_cache.keys()) + current_game_keys = set(current_games.keys()) + cached_game_keys = set(self.game_card_cache.keys()) card_width_changed = self.card_width != getattr(self, '_last_card_width', None) - if current_game_names == cached_game_names and not card_width_changed: + if current_game_keys == cached_game_keys and not card_width_changed: # Список игр и размер карточек не изменились, обновляем только видимость search_text = self.searchEdit.text().strip().lower() - for game_name, card in self.game_card_cache.items(): + for game_key, card in self.game_card_cache.items(): + game_name = game_key[0] card.setVisible(search_text in game_name.lower() or not search_text) self.loadVisibleImages() return @@ -664,10 +666,11 @@ class MainWindow(QMainWindow): # Добавляем новые карточки и обновляем существующие for game_data in games_list: game_name = game_data[0] + game_key = (game_name, game_data[4]) search_text = self.searchEdit.text().strip().lower() should_be_visible = search_text in game_name.lower() or not search_text - if game_name not in self.game_card_cache: + if game_key not in self.game_card_cache: # Создаем новую карточку card = GameCard( *game_data, @@ -686,24 +689,26 @@ class MainWindow(QMainWindow): card.addToSteamRequested.connect(self.context_menu_manager.add_to_steam) card.removeFromSteamRequested.connect(self.context_menu_manager.remove_from_steam) card.openGameFolderRequested.connect(self.context_menu_manager.open_game_folder) - self.game_card_cache[game_name] = card + self.game_card_cache[game_key] = card self.gamesListLayout.addWidget(card) layout_changed = True else: # Обновляем видимость существующей карточки - card = self.game_card_cache[game_name] + card = self.game_card_cache[game_key] card.setVisible(should_be_visible) # Сохраняем текущий card_width self._last_card_width = self.card_width + # Принудительно обновляем макет + if layout_changed: + self.gamesListLayout.update() + self.gamesListWidget.updateGeometry() + self.gamesListWidget.update() + # Загружаем изображения для видимых карточек self.loadVisibleImages() - # Обновляем геометрию только при необходимости - if layout_changed: - self.gamesListWidget.updateGeometry() - def clearLayout(self, layout): """Удаляет все виджеты из layout.""" while layout.count():