Add cover-grid sorting to Library and Store
Library: Title / Release date / Size / Region / Type / Serial Store: Newest first / Title / Region / Size / In library first
This commit is contained in:
+42
-1
@@ -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.setToolTip("Filter by whether the archive matches a disc installed on the connected PSP")
|
||||||
self.psp_filter.currentIndexChanged.connect(self._apply_filter)
|
self.psp_filter.currentIndexChanged.connect(self._apply_filter)
|
||||||
bar.addWidget(self.psp_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 = QPushButton("Refresh")
|
||||||
refresh_btn.clicked.connect(lambda: self.refresh(force=True))
|
refresh_btn.clicked.connect(lambda: self.refresh(force=True))
|
||||||
bar.addWidget(refresh_btn)
|
bar.addWidget(refresh_btn)
|
||||||
@@ -2046,7 +2051,7 @@ class StorePage(QWidget):
|
|||||||
if not it.get("release_date"):
|
if not it.get("release_date"):
|
||||||
it["release_date"] = dates.get((str(rid), system)) or ""
|
it["release_date"] = dates.get((str(rid), system)) or ""
|
||||||
filtered.append(it)
|
filtered.append(it)
|
||||||
filtered.sort(key=self._store_sort_key)
|
self._sort_store_items(filtered)
|
||||||
self._filtered = filtered
|
self._filtered = filtered
|
||||||
if self.all_check.isChecked():
|
if self.all_check.isChecked():
|
||||||
show = len(filtered)
|
show = len(filtered)
|
||||||
@@ -2054,6 +2059,19 @@ class StorePage(QWidget):
|
|||||||
show = min(self.RECENT_LIMIT, len(filtered))
|
show = min(self.RECENT_LIMIT, len(filtered))
|
||||||
self._populate(filtered, show)
|
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
|
@staticmethod
|
||||||
def _store_sort_key(it):
|
def _store_sort_key(it):
|
||||||
d = it.get("release_date") or ""
|
d = it.get("release_date") or ""
|
||||||
@@ -4366,6 +4384,11 @@ class MainWindow(QMainWindow):
|
|||||||
self.library_view = QComboBox()
|
self.library_view = QComboBox()
|
||||||
self.library_view.addItems(["Cover view", "List view"])
|
self.library_view.addItems(["Cover view", "List view"])
|
||||||
bar.addWidget(self.library_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 = QPushButton("Reload")
|
||||||
reload_btn.clicked.connect(self.load_library)
|
reload_btn.clicked.connect(self.load_library)
|
||||||
bar.addWidget(reload_btn)
|
bar.addWidget(reload_btn)
|
||||||
@@ -4633,12 +4656,30 @@ class MainWindow(QMainWindow):
|
|||||||
if psp_f == "Not on PSP" and it.get("on_psp"):
|
if psp_f == "Not on PSP" and it.get("on_psp"):
|
||||||
continue
|
continue
|
||||||
items.append(it)
|
items.append(it)
|
||||||
|
self._sort_library_items(items)
|
||||||
self._library_filtered = items
|
self._library_filtered = items
|
||||||
self._populate_library_table(items)
|
self._populate_library_table(items)
|
||||||
self.cover_grid.set_items(items)
|
self.cover_grid.set_items(items)
|
||||||
if hasattr(self, "psp_page"):
|
if hasattr(self, "psp_page"):
|
||||||
self.psp_page.set_library_items(self._library_cache)
|
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):
|
def _populate_library_table(self, items):
|
||||||
self.library_table.setUpdatesEnabled(False)
|
self.library_table.setUpdatesEnabled(False)
|
||||||
self.library_table.setSortingEnabled(False)
|
self.library_table.setSortingEnabled(False)
|
||||||
|
|||||||
Reference in New Issue
Block a user