diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7b9a1a8..e3a6205 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,6 +14,7 @@
### Fixed
- Исправлен вылет диалога выбора файлов при выборе обложки если в папке более сотни изображений
- Исправлено зависание при добавлении или удалении игры в Wayland
+- Исправлено зависание при поиске игр
### Contributors
diff --git a/README.md b/README.md
index 7708dd0..acb8bbc 100644
--- a/README.md
+++ b/README.md
@@ -54,8 +54,6 @@ PortProtonQt использует код и зависимости от след
- [Legendary](https://github.com/derrod/legendary) — инструмент для работы с Epic Games Store, лицензия [GPL-3.0](https://github.com/derrod/legendary/blob/master/LICENSE).
- [Icoextract](https://github.com/jlu5/icoextract) — библиотека для извлечения иконок, лицензия [MIT](https://github.com/jlu5/icoextract/blob/master/LICENSE).
- [HowLongToBeat Python API](https://github.com/ScrappyCocco/HowLongToBeat-PythonAPI) — библиотека для взаимодействия с HowLongToBeat, лицензия [MIT](https://github.com/ScrappyCocco/HowLongToBeat-PythonAPI/blob/master/LICENSE.md).
-- [Those Awesome Guys: Gamepad prompts images](https://thoseawesomeguys.com/prompts/) - Набор подсказок для геймпада и клавиатур, лицензия [CC0](https://creativecommons.org/public-domain/cc0/)
-
Полный текст лицензий см. в файле [LICENSE](LICENSE).
> [!WARNING]
diff --git a/portprotonqt/game_library_manager.py b/portprotonqt/game_library_manager.py
index 9ad61f3..b5ca36f 100644
--- a/portprotonqt/game_library_manager.py
+++ b/portprotonqt/game_library_manager.py
@@ -51,8 +51,9 @@ class GameLibraryManager:
self.sizeSlider: QSlider | None = None
self._update_timer: QTimer | None = None
self._pending_update = False
- self.pending_deletions = deque() # Queue for deferred widget deletion
- self.dirty = False # Flag for when full resort is needed
+ self.pending_deletions = deque()
+ self.is_filtering = False
+ self.dirty = False
def create_games_library_widget(self):
"""Creates the games library widget with search, grid, and slider."""
@@ -201,10 +202,13 @@ class GameLibraryManager:
self._pending_update = False
self._update_game_grid_immediate()
- def update_game_grid(self, games_list: list[tuple] | None = None):
+ def update_game_grid(self, games_list: list[tuple] | None = None, is_filter: bool = False):
"""Schedules a game grid update with debouncing."""
- if games_list is not None:
- self.filtered_games = games_list
+ if not is_filter:
+ if games_list is not None:
+ self.filtered_games = games_list
+ self.dirty = True # Full rebuild only for non-filter
+ self.is_filtering = is_filter
self._pending_update = True
if self._update_timer is not None:
@@ -217,123 +221,157 @@ class GameLibraryManager:
if self.gamesListLayout is None or self.gamesListWidget is None:
return
- games_list = self.filtered_games if self.filtered_games else self.games
search_text = self.main_window.searchEdit.text().strip().lower()
- favorites = read_favorites()
- sort_method = read_sort_method()
- # Batch layout updates (extended scope)
- self.gamesListWidget.setUpdatesEnabled(False)
- if self.gamesListLayout is not None:
- self.gamesListLayout.setEnabled(False) # Disable layout during batch
+ if self.is_filtering:
+ # Filter mode: do not change layout, only hide/show cards
+ self._apply_filter_visibility(search_text)
+ else:
+ # Full update: sorting, removal/addition, reorganization
+ games_list = self.filtered_games if self.filtered_games else self.games
+ favorites = read_favorites()
+ sort_method = read_sort_method()
- try:
- # Optimized sorting: Partition favorites first, then sort subgroups
- def partition_sort_key(game):
- name = game[0]
- is_fav = name in favorites
- fav_order = 0 if is_fav else 1
- if sort_method == "playtime":
- return (fav_order, -game[11] if game[11] else 0, -game[10] if game[10] else 0)
- elif sort_method == "alphabetical":
- return (fav_order, name.lower())
- elif sort_method == "favorites":
- return (fav_order,)
+ # Batch layout updates (extended scope)
+ self.gamesListWidget.setUpdatesEnabled(False)
+ if self.gamesListLayout is not None:
+ self.gamesListLayout.setEnabled(False) # Disable layout during batch
+
+ try:
+ # Optimized sorting: Partition favorites first, then sort subgroups
+ def partition_sort_key(game):
+ name = game[0]
+ is_fav = name in favorites
+ fav_order = 0 if is_fav else 1
+ if sort_method == "playtime":
+ return (fav_order, -game[11] if game[11] else 0, -game[10] if game[10] else 0)
+ elif sort_method == "alphabetical":
+ return (fav_order, name.lower())
+ elif sort_method == "favorites":
+ return (fav_order,)
+ else:
+ return (fav_order, -game[10] if game[10] else 0, -game[11] if game[11] else 0)
+
+ # Quick partition: Sort favorites and non-favorites separately, then merge
+ fav_games = [g for g in games_list if g[0] in favorites]
+ non_fav_games = [g for g in games_list if g[0] not in favorites]
+ sorted_fav = sorted(fav_games, key=partition_sort_key)
+ sorted_non_fav = sorted(non_fav_games, key=partition_sort_key)
+ sorted_games = sorted_fav + sorted_non_fav
+
+ # Build set of current game keys for faster lookup
+ current_game_keys = {(game[0], game[4]) for game in sorted_games}
+
+ # Remove cards that no longer exist (batch)
+ cards_to_remove = []
+ for card_key in list(self.game_card_cache.keys()):
+ if card_key not in current_game_keys:
+ cards_to_remove.append(card_key)
+
+ for card_key in cards_to_remove:
+ card = self.game_card_cache.pop(card_key)
+ if self.gamesListLayout is not None:
+ self.gamesListLayout.removeWidget(card)
+ self.pending_deletions.append(card) # Defer
+ if card_key in self.pending_images:
+ del self.pending_images[card_key]
+
+ # Track current layout order (only if dirty/full update needed)
+ if self.dirty and self.gamesListLayout is not None:
+ current_layout_order = []
+ for i in range(self.gamesListLayout.count()):
+ item = self.gamesListLayout.itemAt(i)
+ if item is not None:
+ widget = item.widget()
+ if widget:
+ for key, card in self.game_card_cache.items():
+ if card == widget:
+ current_layout_order.append(key)
+ break
else:
- return (fav_order, -game[10] if game[10] else 0, -game[11] if game[11] else 0)
+ current_layout_order = None # Skip reorg if not dirty
- # Quick partition: Sort favorites and non-favorites separately, then merge
- fav_games = [g for g in games_list if g[0] in favorites]
- non_fav_games = [g for g in games_list if g[0] not in favorites]
- sorted_fav = sorted(fav_games, key=partition_sort_key)
- sorted_non_fav = sorted(non_fav_games, key=partition_sort_key)
- sorted_games = sorted_fav + sorted_non_fav
+ new_card_order = []
+ cards_to_add = []
- # Build set of current game keys for faster lookup
- current_game_keys = {(game[0], game[4]) for game in sorted_games}
+ for game_data in sorted_games:
+ game_name = game_data[0]
+ exec_line = game_data[4]
+ game_key = (game_name, exec_line)
+ should_be_visible = not search_text or search_text in game_name.lower()
- # Remove cards that no longer exist (batch)
- cards_to_remove = []
- for card_key in list(self.game_card_cache.keys()):
- if card_key not in current_game_keys:
- cards_to_remove.append(card_key)
+ if game_key in self.game_card_cache:
+ card = self.game_card_cache[game_key]
+ if card.isVisible() != should_be_visible:
+ card.setVisible(should_be_visible)
+ new_card_order.append(game_key)
+ else:
+ if self.context_menu_manager is None:
+ continue
- for card_key in cards_to_remove:
- card = self.game_card_cache.pop(card_key)
- if self.gamesListLayout is not None:
- self.gamesListLayout.removeWidget(card)
- self.pending_deletions.append(card) # Defer
- if card_key in self.pending_images:
- del self.pending_images[card_key]
-
- # Track current layout order (only if dirty/full update needed)
- if self.dirty and self.gamesListLayout is not None:
- current_layout_order = []
- for i in range(self.gamesListLayout.count()):
- item = self.gamesListLayout.itemAt(i)
- if item is not None:
- widget = item.widget()
- if widget:
- for key, card in self.game_card_cache.items():
- if card == widget:
- current_layout_order.append(key)
- break
- else:
- current_layout_order = None # Skip reorg if not dirty
-
- new_card_order = []
- cards_to_add = []
-
- for game_data in sorted_games:
- game_name = game_data[0]
- exec_line = game_data[4]
- game_key = (game_name, exec_line)
- should_be_visible = not search_text or search_text in game_name.lower()
-
- if game_key in self.game_card_cache:
- card = self.game_card_cache[game_key]
- if card.isVisible() != should_be_visible:
+ card = self._create_game_card(game_data)
+ self.game_card_cache[game_key] = card
card.setVisible(should_be_visible)
- new_card_order.append(game_key)
- else:
- if self.context_menu_manager is None:
- continue
+ new_card_order.append(game_key)
+ cards_to_add.append((game_key, card))
- card = self._create_game_card(game_data)
- self.game_card_cache[game_key] = card
- card.setVisible(should_be_visible)
- new_card_order.append(game_key)
- cards_to_add.append((game_key, card))
+ # Only reorganize if order changed AND dirty
+ if self.dirty and self.gamesListLayout is not None and (current_layout_order is None or new_card_order != current_layout_order):
+ # Remove all widgets from layout (batch)
+ while self.gamesListLayout.count():
+ self.gamesListLayout.takeAt(0)
- # Only reorganize if order changed AND dirty
- if self.dirty and self.gamesListLayout is not None and (current_layout_order is None or new_card_order != current_layout_order):
- # Remove all widgets from layout (batch)
- while self.gamesListLayout.count():
- self.gamesListLayout.takeAt(0)
+ # Add widgets in new order (batch)
+ for game_key in new_card_order:
+ card = self.game_card_cache[game_key]
+ self.gamesListLayout.addWidget(card)
- # Add widgets in new order (batch)
- for game_key in new_card_order:
- card = self.game_card_cache[game_key]
- self.gamesListLayout.addWidget(card)
+ self.dirty = False # Reset flag
- self.dirty = False # Reset flag
+ # Deferred deletions (run in timer to avoid stack overflow)
+ if self.pending_deletions:
+ QTimer.singleShot(0, lambda: self._flush_deletions())
- # Deferred deletions (run in timer to avoid stack overflow)
- if self.pending_deletions:
- QTimer.singleShot(0, lambda: self._flush_deletions())
+ # Load visible images for new cards only
+ if cards_to_add:
+ self.load_visible_images()
- # Load visible images for new cards only
- if cards_to_add:
- self.load_visible_images()
+ finally:
+ if self.gamesListLayout is not None:
+ self.gamesListLayout.setEnabled(True)
+ self.gamesListWidget.setUpdatesEnabled(True)
+ if self.gamesListLayout is not None:
+ self.gamesListLayout.update()
+ self.gamesListWidget.updateGeometry()
+ self.main_window._last_card_width = self.card_width
- finally:
- if self.gamesListLayout is not None:
- self.gamesListLayout.setEnabled(True)
- self.gamesListWidget.setUpdatesEnabled(True)
- if self.gamesListLayout is not None:
- self.gamesListLayout.update()
+ self.is_filtering = False # Reset flag in any case
+
+ def _apply_filter_visibility(self, search_text: str):
+ """Applies visibility to cards based on search, without changing the layout."""
+ visible_count = 0
+ for game_key, card in self.game_card_cache.items():
+ game_name = card.name # Assume GameCard has 'name' attribute
+ should_be_visible = not search_text or search_text in game_name.lower()
+ if card.isVisible() != should_be_visible:
+ card.setVisible(should_be_visible)
+ if should_be_visible:
+ visible_count += 1
+ # Load image only for newly visible cards
+ if game_key in self.pending_images:
+ cover_path, width, height, callback = self.pending_images.pop(game_key)
+ load_pixmap_async(cover_path, width, height, callback)
+
+ # Force geometry update so FlowLayout accounts for hidden widgets
+ if self.gamesListLayout is not None:
+ self.gamesListLayout.update()
+ if self.gamesListWidget is not None:
self.gamesListWidget.updateGeometry()
- self.main_window._last_card_width = self.card_width
+ self.main_window._last_card_width = self.card_width
+
+ # If search is empty, load images for visible ones
+ if not search_text:
+ self.load_visible_images()
def _create_game_card(self, game_data: tuple) -> GameCard:
"""Creates a new game card with all necessary connections."""
@@ -412,9 +450,4 @@ class GameLibraryManager:
def filter_games_delayed(self):
"""Filters games based on search text and updates the grid."""
- text = self.main_window.searchEdit.text().strip().lower()
- if text == "":
- self.filtered_games = self.games
- else:
- self.filtered_games = [game for game in self.games if text in game[0].lower()]
- self.update_game_grid(self.filtered_games)
+ self.update_game_grid(is_filter=True)
diff --git a/portprotonqt/main_window.py b/portprotonqt/main_window.py
index 47d3f2b..b093ba8 100644
--- a/portprotonqt/main_window.py
+++ b/portprotonqt/main_window.py
@@ -313,12 +313,12 @@ class MainWindow(QMainWindow):
def makeHint(icon_name: str, action_text: str, is_gamepad: bool, action: str | None = None,):
container = QWidget()
layout = QHBoxLayout(container)
- layout.setContentsMargins(0, 0, 0, 0)
+ layout.setContentsMargins(0, 5, 0, 0)
layout.setSpacing(6)
# иконка кнопки
icon_label = QLabel()
- icon_label.setFixedSize(32, 32)
+ icon_label.setFixedSize(26, 26)
icon_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
pixmap = QPixmap()
@@ -331,7 +331,7 @@ class MainWindow(QMainWindow):
if not pixmap.isNull():
icon_label.setPixmap(pixmap.scaled(
- 32, 32,
+ 26, 26,
Qt.AspectRatioMode.KeepAspectRatio,
Qt.TransformationMode.SmoothTransformation
))
@@ -424,7 +424,7 @@ class MainWindow(QMainWindow):
pixmap.load(str(icon_path))
if not pixmap.isNull():
icon_label.setPixmap(pixmap.scaled(
- 32, 32,
+ 26, 26,
Qt.AspectRatioMode.KeepAspectRatio,
Qt.TransformationMode.SmoothTransformation
))
@@ -433,7 +433,7 @@ class MainWindow(QMainWindow):
placeholder = self.theme_manager.get_theme_image("placeholder", self.current_theme_name)
if placeholder:
pixmap.load(str(placeholder))
- icon_label.setPixmap(pixmap.scaled(32, 32, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation))
+ icon_label.setPixmap(pixmap.scaled(26, 26, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation))
else:
container.setVisible(False)
else: # Keyboard hint
@@ -760,11 +760,22 @@ class MainWindow(QMainWindow):
self.searchDebounceTimer = QTimer(self)
self.searchDebounceTimer.setSingleShot(True)
self.searchDebounceTimer.setInterval(300)
- self.searchDebounceTimer.timeout.connect(self.game_library_manager.filter_games_delayed)
+ self.searchDebounceTimer.timeout.connect(self.on_search_changed)
layout.addWidget(self.searchEdit)
return self.container, self.searchEdit
+ def on_search_text_changed(self, text: str):
+ """Search text change handler with debounce."""
+ self.searchDebounceTimer.stop()
+ self.searchDebounceTimer.start()
+
+ @Slot()
+ def on_search_changed(self):
+ """Triggers filtering with delay."""
+ if hasattr(self, 'game_library_manager'):
+ self.game_library_manager.filter_games_delayed()
+
def startSearchDebounce(self, text):
self.searchDebounceTimer.start()
diff --git a/portprotonqt/themes/standart/images/key_backspace.png b/portprotonqt/themes/standart/images/key_backspace.png
deleted file mode 100644
index 425addc..0000000
Binary files a/portprotonqt/themes/standart/images/key_backspace.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/key_backspace.svg b/portprotonqt/themes/standart/images/key_backspace.svg
new file mode 100644
index 0000000..1e09c93
--- /dev/null
+++ b/portprotonqt/themes/standart/images/key_backspace.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/key_context.png b/portprotonqt/themes/standart/images/key_context.png
deleted file mode 100644
index 03014ef..0000000
Binary files a/portprotonqt/themes/standart/images/key_context.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/key_context.svg b/portprotonqt/themes/standart/images/key_context.svg
new file mode 100644
index 0000000..0d56e95
--- /dev/null
+++ b/portprotonqt/themes/standart/images/key_context.svg
@@ -0,0 +1,48 @@
+
+
diff --git a/portprotonqt/themes/standart/images/key_e.png b/portprotonqt/themes/standart/images/key_e.png
deleted file mode 100644
index cd95f3b..0000000
Binary files a/portprotonqt/themes/standart/images/key_e.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/key_e.svg b/portprotonqt/themes/standart/images/key_e.svg
new file mode 100644
index 0000000..b659fad
--- /dev/null
+++ b/portprotonqt/themes/standart/images/key_e.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/key_enter.png b/portprotonqt/themes/standart/images/key_enter.png
deleted file mode 100644
index d9d2911..0000000
Binary files a/portprotonqt/themes/standart/images/key_enter.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/key_enter.svg b/portprotonqt/themes/standart/images/key_enter.svg
new file mode 100644
index 0000000..fef96ad
--- /dev/null
+++ b/portprotonqt/themes/standart/images/key_enter.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/key_f11.png b/portprotonqt/themes/standart/images/key_f11.png
deleted file mode 100644
index 10be86f..0000000
Binary files a/portprotonqt/themes/standart/images/key_f11.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/key_f11.svg b/portprotonqt/themes/standart/images/key_f11.svg
new file mode 100644
index 0000000..083d34b
--- /dev/null
+++ b/portprotonqt/themes/standart/images/key_f11.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/key_left.png b/portprotonqt/themes/standart/images/key_left.png
deleted file mode 100644
index e199d9c..0000000
Binary files a/portprotonqt/themes/standart/images/key_left.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/key_left.svg b/portprotonqt/themes/standart/images/key_left.svg
new file mode 100644
index 0000000..c295c5b
--- /dev/null
+++ b/portprotonqt/themes/standart/images/key_left.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/key_right.png b/portprotonqt/themes/standart/images/key_right.png
deleted file mode 100644
index b8c71f2..0000000
Binary files a/portprotonqt/themes/standart/images/key_right.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/key_right.svg b/portprotonqt/themes/standart/images/key_right.svg
new file mode 100644
index 0000000..c20f1ad
--- /dev/null
+++ b/portprotonqt/themes/standart/images/key_right.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/ps_circle.png b/portprotonqt/themes/standart/images/ps_circle.png
deleted file mode 100644
index f84f7ef..0000000
Binary files a/portprotonqt/themes/standart/images/ps_circle.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/ps_circle.svg b/portprotonqt/themes/standart/images/ps_circle.svg
new file mode 100644
index 0000000..0cea7fc
--- /dev/null
+++ b/portprotonqt/themes/standart/images/ps_circle.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/ps_cross.png b/portprotonqt/themes/standart/images/ps_cross.png
deleted file mode 100644
index de8039c..0000000
Binary files a/portprotonqt/themes/standart/images/ps_cross.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/ps_cross.svg b/portprotonqt/themes/standart/images/ps_cross.svg
new file mode 100644
index 0000000..74270d8
--- /dev/null
+++ b/portprotonqt/themes/standart/images/ps_cross.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/ps_l1.png b/portprotonqt/themes/standart/images/ps_l1.png
deleted file mode 100644
index 709677f..0000000
Binary files a/portprotonqt/themes/standart/images/ps_l1.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/ps_l1.svg b/portprotonqt/themes/standart/images/ps_l1.svg
new file mode 100644
index 0000000..dc0ef17
--- /dev/null
+++ b/portprotonqt/themes/standart/images/ps_l1.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/ps_options.png b/portprotonqt/themes/standart/images/ps_options.png
deleted file mode 100644
index 0a87765..0000000
Binary files a/portprotonqt/themes/standart/images/ps_options.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/ps_options.svg b/portprotonqt/themes/standart/images/ps_options.svg
new file mode 100644
index 0000000..6b6e985
--- /dev/null
+++ b/portprotonqt/themes/standart/images/ps_options.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/ps_r1.png b/portprotonqt/themes/standart/images/ps_r1.png
deleted file mode 100644
index 78a9be3..0000000
Binary files a/portprotonqt/themes/standart/images/ps_r1.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/ps_r1.svg b/portprotonqt/themes/standart/images/ps_r1.svg
new file mode 100644
index 0000000..76d0ad6
--- /dev/null
+++ b/portprotonqt/themes/standart/images/ps_r1.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/ps_share.png b/portprotonqt/themes/standart/images/ps_share.png
deleted file mode 100644
index 428f031..0000000
Binary files a/portprotonqt/themes/standart/images/ps_share.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/ps_share.svg b/portprotonqt/themes/standart/images/ps_share.svg
new file mode 100644
index 0000000..1e8b198
--- /dev/null
+++ b/portprotonqt/themes/standart/images/ps_share.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/ps_triangle.png b/portprotonqt/themes/standart/images/ps_triangle.png
deleted file mode 100644
index c8b579a..0000000
Binary files a/portprotonqt/themes/standart/images/ps_triangle.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/ps_triangle.svg b/portprotonqt/themes/standart/images/ps_triangle.svg
new file mode 100644
index 0000000..c3defdd
--- /dev/null
+++ b/portprotonqt/themes/standart/images/ps_triangle.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/xbox_a.png b/portprotonqt/themes/standart/images/xbox_a.png
deleted file mode 100644
index a058ddc..0000000
Binary files a/portprotonqt/themes/standart/images/xbox_a.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/xbox_a.svg b/portprotonqt/themes/standart/images/xbox_a.svg
new file mode 100644
index 0000000..86798f2
--- /dev/null
+++ b/portprotonqt/themes/standart/images/xbox_a.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/xbox_b.png b/portprotonqt/themes/standart/images/xbox_b.png
deleted file mode 100644
index 0c21c3f..0000000
Binary files a/portprotonqt/themes/standart/images/xbox_b.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/xbox_b.svg b/portprotonqt/themes/standart/images/xbox_b.svg
new file mode 100644
index 0000000..8ba57ed
--- /dev/null
+++ b/portprotonqt/themes/standart/images/xbox_b.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/xbox_lb.png b/portprotonqt/themes/standart/images/xbox_lb.png
deleted file mode 100644
index 70e528c..0000000
Binary files a/portprotonqt/themes/standart/images/xbox_lb.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/xbox_lb.svg b/portprotonqt/themes/standart/images/xbox_lb.svg
new file mode 100644
index 0000000..8c9c172
--- /dev/null
+++ b/portprotonqt/themes/standart/images/xbox_lb.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/xbox_rb.png b/portprotonqt/themes/standart/images/xbox_rb.png
deleted file mode 100644
index a05fd57..0000000
Binary files a/portprotonqt/themes/standart/images/xbox_rb.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/xbox_rb.svg b/portprotonqt/themes/standart/images/xbox_rb.svg
new file mode 100644
index 0000000..622c656
--- /dev/null
+++ b/portprotonqt/themes/standart/images/xbox_rb.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/xbox_start.png b/portprotonqt/themes/standart/images/xbox_start.png
deleted file mode 100644
index 835c2ff..0000000
Binary files a/portprotonqt/themes/standart/images/xbox_start.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/xbox_start.svg b/portprotonqt/themes/standart/images/xbox_start.svg
new file mode 100644
index 0000000..c7d9f13
--- /dev/null
+++ b/portprotonqt/themes/standart/images/xbox_start.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/xbox_view.png b/portprotonqt/themes/standart/images/xbox_view.png
deleted file mode 100644
index 31e644c..0000000
Binary files a/portprotonqt/themes/standart/images/xbox_view.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/xbox_view.svg b/portprotonqt/themes/standart/images/xbox_view.svg
new file mode 100644
index 0000000..ef67aa8
--- /dev/null
+++ b/portprotonqt/themes/standart/images/xbox_view.svg
@@ -0,0 +1 @@
+
diff --git a/portprotonqt/themes/standart/images/xbox_x.png b/portprotonqt/themes/standart/images/xbox_x.png
deleted file mode 100644
index 4761f03..0000000
Binary files a/portprotonqt/themes/standart/images/xbox_x.png and /dev/null differ
diff --git a/portprotonqt/themes/standart/images/xbox_x.svg b/portprotonqt/themes/standart/images/xbox_x.svg
new file mode 100644
index 0000000..5c732c8
--- /dev/null
+++ b/portprotonqt/themes/standart/images/xbox_x.svg
@@ -0,0 +1 @@
+