fix: prevent game card overlap in all\ display filter
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
This commit is contained in:
@ -274,9 +274,10 @@ class MainWindow(QMainWindow):
|
|||||||
seen = set()
|
seen = set()
|
||||||
games = []
|
games = []
|
||||||
for game in portproton_games + steam_games:
|
for game in portproton_games + steam_games:
|
||||||
name = game[0]
|
# Уникальный ключ: имя + exec_line
|
||||||
if name not in seen:
|
key = (game[0], game[4])
|
||||||
seen.add(name)
|
if key not in seen:
|
||||||
|
seen.add(key)
|
||||||
games.append(game)
|
games.append(game)
|
||||||
self.games_loaded.emit(games)
|
self.games_loaded.emit(games)
|
||||||
self._load_portproton_games_async(
|
self._load_portproton_games_async(
|
||||||
@ -629,18 +630,19 @@ class MainWindow(QMainWindow):
|
|||||||
self.gamesListWidget.updateGeometry()
|
self.gamesListWidget.updateGeometry()
|
||||||
return
|
return
|
||||||
|
|
||||||
# Создаем словарь текущих игр для быстрого поиска
|
# Создаем словарь текущих игр с уникальным ключом (name + exec_line)
|
||||||
current_games = {game_data[0]: game_data for game_data in games_list}
|
current_games = {(game_data[0], game_data[4]): game_data for game_data in games_list}
|
||||||
|
|
||||||
# Проверяем, изменился ли список игр или размер карточек
|
# Проверяем, изменился ли список игр или размер карточек
|
||||||
current_game_names = set(current_games.keys())
|
current_game_keys = set(current_games.keys())
|
||||||
cached_game_names = set(self.game_card_cache.keys())
|
cached_game_keys = set(self.game_card_cache.keys())
|
||||||
card_width_changed = self.card_width != getattr(self, '_last_card_width', None)
|
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()
|
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)
|
card.setVisible(search_text in game_name.lower() or not search_text)
|
||||||
self.loadVisibleImages()
|
self.loadVisibleImages()
|
||||||
return
|
return
|
||||||
@ -664,10 +666,11 @@ class MainWindow(QMainWindow):
|
|||||||
# Добавляем новые карточки и обновляем существующие
|
# Добавляем новые карточки и обновляем существующие
|
||||||
for game_data in games_list:
|
for game_data in games_list:
|
||||||
game_name = game_data[0]
|
game_name = game_data[0]
|
||||||
|
game_key = (game_name, game_data[4])
|
||||||
search_text = self.searchEdit.text().strip().lower()
|
search_text = self.searchEdit.text().strip().lower()
|
||||||
should_be_visible = search_text in game_name.lower() or not search_text
|
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(
|
card = GameCard(
|
||||||
*game_data,
|
*game_data,
|
||||||
@ -686,24 +689,26 @@ class MainWindow(QMainWindow):
|
|||||||
card.addToSteamRequested.connect(self.context_menu_manager.add_to_steam)
|
card.addToSteamRequested.connect(self.context_menu_manager.add_to_steam)
|
||||||
card.removeFromSteamRequested.connect(self.context_menu_manager.remove_from_steam)
|
card.removeFromSteamRequested.connect(self.context_menu_manager.remove_from_steam)
|
||||||
card.openGameFolderRequested.connect(self.context_menu_manager.open_game_folder)
|
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)
|
self.gamesListLayout.addWidget(card)
|
||||||
layout_changed = True
|
layout_changed = True
|
||||||
else:
|
else:
|
||||||
# Обновляем видимость существующей карточки
|
# Обновляем видимость существующей карточки
|
||||||
card = self.game_card_cache[game_name]
|
card = self.game_card_cache[game_key]
|
||||||
card.setVisible(should_be_visible)
|
card.setVisible(should_be_visible)
|
||||||
|
|
||||||
# Сохраняем текущий card_width
|
# Сохраняем текущий card_width
|
||||||
self._last_card_width = self.card_width
|
self._last_card_width = self.card_width
|
||||||
|
|
||||||
|
# Принудительно обновляем макет
|
||||||
|
if layout_changed:
|
||||||
|
self.gamesListLayout.update()
|
||||||
|
self.gamesListWidget.updateGeometry()
|
||||||
|
self.gamesListWidget.update()
|
||||||
|
|
||||||
# Загружаем изображения для видимых карточек
|
# Загружаем изображения для видимых карточек
|
||||||
self.loadVisibleImages()
|
self.loadVisibleImages()
|
||||||
|
|
||||||
# Обновляем геометрию только при необходимости
|
|
||||||
if layout_changed:
|
|
||||||
self.gamesListWidget.updateGeometry()
|
|
||||||
|
|
||||||
def clearLayout(self, layout):
|
def clearLayout(self, layout):
|
||||||
"""Удаляет все виджеты из layout."""
|
"""Удаляет все виджеты из layout."""
|
||||||
while layout.count():
|
while layout.count():
|
||||||
|
Reference in New Issue
Block a user