diff --git a/app/gui.py b/app/gui.py index 86dd8c2..cedf434 100644 --- a/app/gui.py +++ b/app/gui.py @@ -1789,6 +1789,11 @@ class StorePage(QWidget): self.psp_filter.setToolTip("Filter by whether the archive matches a disc installed on the connected PSP") self.psp_filter.currentIndexChanged.connect(self._apply_filter) bar.addWidget(self.psp_filter) + self.store_sort = QComboBox() + self.store_sort.addItems(["Newest first", "Title (A–Z)", "Region (A–Z)", "Size (largest)", "In library first"]) + self.store_sort.setToolTip("Sort the cover grid") + self.store_sort.currentTextChanged.connect(self._apply_filter) + bar.addWidget(self.store_sort) refresh_btn = QPushButton("Refresh") refresh_btn.clicked.connect(lambda: self.refresh(force=True)) bar.addWidget(refresh_btn) @@ -2046,7 +2051,7 @@ class StorePage(QWidget): if not it.get("release_date"): it["release_date"] = dates.get((str(rid), system)) or "" filtered.append(it) - filtered.sort(key=self._store_sort_key) + self._sort_store_items(filtered) self._filtered = filtered if self.all_check.isChecked(): show = len(filtered) @@ -2054,6 +2059,19 @@ class StorePage(QWidget): show = min(self.RECENT_LIMIT, len(filtered)) self._populate(filtered, show) + def _sort_store_items(self, items): + mode = self.store_sort.currentText() + if mode == "Title (A–Z)": + items.sort(key=lambda it: store.display_name(it["name"]).lower()) + elif mode == "Region (A–Z)": + items.sort(key=lambda it: (store.region(it["name"]) or "").lower()) + elif mode == "Size (largest)": + items.sort(key=lambda it: it.get("size") or 0, reverse=True) + elif mode == "In library first": + items.sort(key=lambda it: (not it.get("in_library"), store.display_name(it["name"]).lower())) + else: # Newest first + items.sort(key=self._store_sort_key) + @staticmethod def _store_sort_key(it): d = it.get("release_date") or "" @@ -4366,6 +4384,11 @@ class MainWindow(QMainWindow): self.library_view = QComboBox() self.library_view.addItems(["Cover view", "List view"]) bar.addWidget(self.library_view) + self.library_sort = QComboBox() + self.library_sort.addItems(["Title", "Release date", "Size", "Region", "Type", "Serial"]) + self.library_sort.setToolTip("Sort the cover grid") + self.library_sort.currentTextChanged.connect(self._apply_library_filter) + bar.addWidget(self.library_sort) reload_btn = QPushButton("Reload") reload_btn.clicked.connect(self.load_library) bar.addWidget(reload_btn) @@ -4633,12 +4656,30 @@ class MainWindow(QMainWindow): if psp_f == "Not on PSP" and it.get("on_psp"): continue items.append(it) + self._sort_library_items(items) self._library_filtered = items self._populate_library_table(items) self.cover_grid.set_items(items) if hasattr(self, "psp_page"): self.psp_page.set_library_items(self._library_cache) + def _sort_library_items(self, items): + mode = self.library_sort.currentText() + title = lambda it: (it.get("title_override") or it.get("canonical") or it["name"] or "").lower() + if mode == "Release date": + items.sort(key=lambda it: it.get("release_date") or "", reverse=True) + elif mode == "Size": + items.sort(key=lambda it: it.get("size") or 0, reverse=True) + elif mode == "Region": + items.sort(key=lambda it: (it.get("region") or "").lower()) + elif mode == "Type": + order = {"games": 0, "videos": 1, "ps1": 2, "theme": 3, "dlc": 4} + items.sort(key=lambda it: (order.get(it.get("system"), 9), title(it))) + elif mode == "Serial": + items.sort(key=lambda it: (it.get("serial") or "").lower()) + else: # Title + items.sort(key=title) + def _populate_library_table(self, items): self.library_table.setUpdatesEnabled(False) self.library_table.setSortingEnabled(False)