1
0
Fork 0
mirror of synced 2024-06-02 02:34:40 +12:00

Library: Clean up how changing views works

* Pass python IntEnum objects instead ints for LibraryFilter/Order/View
  We only want to store them as integers to avoid QVariant gibberish

*
This commit is contained in:
loathingKernel 2024-01-28 21:55:17 +02:00
parent 4f4689e82b
commit 7c3d5dc9e8
4 changed files with 65 additions and 60 deletions

View file

@ -12,10 +12,11 @@ from rare.shared import (
ImageManagerSingleton, ImageManagerSingleton,
) )
from rare.shared import RareCore from rare.shared import RareCore
from rare.models.options import options
from rare.widgets.library_layout import LibraryLayout from rare.widgets.library_layout import LibraryLayout
from rare.widgets.sliding_stack import SlidingStackedWidget from rare.widgets.sliding_stack import SlidingStackedWidget
from .game_info import GameInfoTabs from .game_info import GameInfoTabs
from .game_widgets import LibraryWidgetController, LibraryFilter, LibraryOrder from .game_widgets import LibraryWidgetController, LibraryFilter, LibraryOrder, LibraryView
from .game_widgets.icon_game_widget import IconGameWidget from .game_widgets.icon_game_widget import IconGameWidget
from .game_widgets.list_game_widget import ListGameWidget from .game_widgets.list_game_widget import ListGameWidget
from .head_bar import GameListHeadBar from .head_bar import GameListHeadBar
@ -84,9 +85,10 @@ class GamesTab(QStackedWidget):
self.view_stack.addWidget(self.list_view_scroll) self.view_stack.addWidget(self.list_view_scroll)
games_page_layout.addWidget(self.view_stack) games_page_layout.addWidget(self.view_stack)
if not self.settings.value("icon_view", True, bool): library_view = LibraryView(self.settings.value(*options.library_view))
self.view_stack.setCurrentWidget(self.list_view_scroll)
if library_view == LibraryView.VLIST:
self.view_stack.setCurrentWidget(self.list_view_scroll) self.view_stack.setCurrentWidget(self.list_view_scroll)
self.head_bar.view.list()
else: else:
self.view_stack.setCurrentWidget(self.icon_view_scroll) self.view_stack.setCurrentWidget(self.icon_view_scroll)
@ -97,7 +99,7 @@ class GamesTab(QStackedWidget):
self.head_bar.orderChanged.connect(self.order_games) self.head_bar.orderChanged.connect(self.order_games)
self.head_bar.orderChanged.connect(self.scroll_to_top) self.head_bar.orderChanged.connect(self.scroll_to_top)
self.head_bar.refresh_list.clicked.connect(self.library_controller.update_game_views) self.head_bar.refresh_list.clicked.connect(self.library_controller.update_game_views)
self.head_bar.view.toggled.connect(self.toggle_view) self.head_bar.viewChanged.connect(self.change_view)
# signals # signals
self.signals.game.installed.connect(self.update_count_games_label) self.signals.game.installed.connect(self.update_count_games_label)
@ -174,26 +176,25 @@ class GamesTab(QStackedWidget):
def search_games(self, search_text: str = ""): def search_games(self, search_text: str = ""):
self.filter_games(self.head_bar.current_filter(), search_text) self.filter_games(self.head_bar.current_filter(), search_text)
@pyqtSlot(int) @pyqtSlot(object)
@pyqtSlot(int, str) @pyqtSlot(object, str)
def filter_games(self, library_filter: LibraryFilter = LibraryFilter.ALL, search_text: str = ""): def filter_games(self, library_filter: LibraryFilter = LibraryFilter.ALL, search_text: str = ""):
if not search_text and (t := self.head_bar.search_bar.text()): if not search_text and (t := self.head_bar.search_bar.text()):
search_text = t search_text = t
self.library_controller.filter_game_views(library_filter, search_text.lower()) self.library_controller.filter_game_views(library_filter, search_text.lower())
@pyqtSlot(int) @pyqtSlot(object)
@pyqtSlot(int, str) @pyqtSlot(object, str)
def order_games(self, library_order: LibraryOrder = LibraryFilter.ALL, search_text: str = ""): def order_games(self, library_order: LibraryOrder = LibraryFilter.ALL, search_text: str = ""):
if not search_text and (t := self.head_bar.search_bar.text()): if not search_text and (t := self.head_bar.search_bar.text()):
search_text = t search_text = t
self.library_controller.order_game_views(library_order, search_text.lower()) self.library_controller.order_game_views(library_order, search_text.lower())
def toggle_view(self): @pyqtSlot(object)
self.settings.setValue("icon_view", not self.head_bar.view.isChecked()) def change_view(self, library_view: LibraryView = LibraryView.COVER):
if library_view == LibraryView.VLIST:
if not self.head_bar.view.isChecked():
self.view_stack.slideInWidget(self.icon_view_scroll)
else:
self.view_stack.slideInWidget(self.list_view_scroll) self.view_stack.slideInWidget(self.list_view_scroll)
else:
self.view_stack.slideInWidget(self.icon_view_scroll)

View file

@ -6,7 +6,7 @@ from PyQt5.QtWidgets import QWidget
from rare.lgndr.core import LegendaryCore from rare.lgndr.core import LegendaryCore
from rare.models.game import RareGame from rare.models.game import RareGame
from rare.models.signals import GlobalSignals from rare.models.signals import GlobalSignals
from rare.models.library import LibraryFilter, LibraryOrder from rare.models.library import LibraryFilter, LibraryOrder, LibraryView
from rare.shared import RareCore from rare.shared import RareCore
from .icon_game_widget import IconGameWidget from .icon_game_widget import IconGameWidget
from .list_game_widget import ListGameWidget from .list_game_widget import ListGameWidget

View file

@ -11,18 +11,18 @@ from PyQt5.QtWidgets import (
) )
from rare.shared import RareCore from rare.shared import RareCore
from rare.models.options import options from rare.models.options import options, LibraryFilter, LibraryOrder, LibraryView
from rare.utils.extra_widgets import SelectViewWidget, ButtonLineEdit from rare.utils.extra_widgets import SelectViewWidget, ButtonLineEdit
from rare.utils.misc import icon from rare.utils.misc import icon
from .game_widgets import LibraryFilter, LibraryOrder
class GameListHeadBar(QWidget): class GameListHeadBar(QWidget):
filterChanged: pyqtSignal = pyqtSignal(int) filterChanged = pyqtSignal(object)
orderChanged: pyqtSignal = pyqtSignal(int) orderChanged = pyqtSignal(object)
goto_import: pyqtSignal = pyqtSignal() viewChanged = pyqtSignal(object)
goto_egl_sync: pyqtSignal = pyqtSignal() goto_import = pyqtSignal()
goto_eos_ubisoft: pyqtSignal = pyqtSignal() goto_egl_sync = pyqtSignal()
goto_eos_ubisoft = pyqtSignal()
def __init__(self, parent=None): def __init__(self, parent=None):
super(GameListHeadBar, self).__init__(parent=parent) super(GameListHeadBar, self).__init__(parent=parent)
@ -31,50 +31,54 @@ class GameListHeadBar(QWidget):
self.filter = QComboBox(self) self.filter = QComboBox(self)
filters = { filters = {
int(LibraryFilter.ALL): self.tr("All games"), LibraryFilter.ALL: self.tr("All games"),
int(LibraryFilter.INSTALLED): self.tr("Installed"), LibraryFilter.INSTALLED: self.tr("Installed"),
int(LibraryFilter.OFFLINE): self.tr("Offline"), LibraryFilter.OFFLINE: self.tr("Offline"),
# int(LibraryFilter.HIDDEN): self.tr("Hidden"), # int(LibraryFilter.HIDDEN): self.tr("Hidden"),
} }
for data, text in filters.items(): for data, text in filters.items():
self.filter.addItem(text, data) self.filter.addItem(text, data)
if self.rcore.bit32_games: if self.rcore.bit32_games:
self.filter.addItem(self.tr("32bit games"), int(LibraryFilter.WIN32)) self.filter.addItem(self.tr("32bit games"), LibraryFilter.WIN32)
if self.rcore.mac_games: if self.rcore.mac_games:
self.filter.addItem(self.tr("macOS games"), int(LibraryFilter.MAC)) self.filter.addItem(self.tr("macOS games"), LibraryFilter.MAC)
if self.rcore.origin_games: if self.rcore.origin_games:
self.filter.addItem(self.tr("Exclude Origin"), int(LibraryFilter.INSTALLABLE)) self.filter.addItem(self.tr("Exclude Origin"), LibraryFilter.INSTALLABLE)
self.filter.addItem(self.tr("Include Unreal"), int(LibraryFilter.INCLUDE_UE)) self.filter.addItem(self.tr("Include Unreal"), LibraryFilter.INCLUDE_UE)
try: try:
index = self.filter.findData(self.settings.value(*options.library_filter), Qt.UserRole) _filter = self.settings.value(*options.library_filter)
if index < 0: if (index := self.filter.findData(_filter, Qt.UserRole)) < 0:
raise ValueError raise ValueError
self.filter.setCurrentIndex(index) else:
self.filter.setCurrentIndex(index)
except (TypeError, ValueError): except (TypeError, ValueError):
self.settings.setValue(options.library_filter.key, options.library_filter.default) self.settings.setValue(options.library_filter.key, options.library_filter.default)
self.filter.setCurrentIndex(self.filter.findData(options.library_filter.default)) _filter = LibraryFilter(options.library_filter.default)
self.filter.setCurrentIndex(self.filter.findData(_filter, Qt.UserRole))
self.filter.currentIndexChanged.connect(self.__filter_changed) self.filter.currentIndexChanged.connect(self.__filter_changed)
self.order = QComboBox(parent=self) self.order = QComboBox(parent=self)
sortings = { sortings = {
int(LibraryOrder.TITLE): self.tr("Title"), LibraryOrder.TITLE: self.tr("Title"),
int(LibraryOrder.RECENT): self.tr("Recently played"), LibraryOrder.RECENT: self.tr("Recently played"),
int(LibraryOrder.NEWEST): self.tr("Newest"), LibraryOrder.NEWEST: self.tr("Newest"),
int(LibraryOrder.OLDEST): self.tr("Oldest"), LibraryOrder.OLDEST: self.tr("Oldest"),
} }
for data, text in sortings.items(): for data, text in sortings.items():
self.order.addItem(text, data) self.order.addItem(text, data)
try: try:
index = self.order.findData(self.settings.value(*options.library_order), Qt.UserRole) _order = LibraryOrder(self.settings.value(*options.library_order))
if index < 0: if (index := self.order.findData(_order, Qt.UserRole)) < 0:
raise ValueError raise ValueError
self.order.setCurrentIndex(index) else:
self.order.setCurrentIndex(index)
except (TypeError, ValueError): except (TypeError, ValueError):
self.settings.setValue(options.library_order.key, options.library_order.default) self.settings.setValue(options.library_order.key, options.library_order.default)
self.order.setCurrentIndex(self.order.findData(options.library_order.default, Qt.UserRole)) _order = LibraryOrder(options.library_order.default)
self.order.setCurrentIndex(self.order.findData(_order, Qt.UserRole))
self.order.currentIndexChanged.connect(self.__order_changed) self.order.currentIndexChanged.connect(self.__order_changed)
integrations_menu = QMenu(parent=self) integrations_menu = QMenu(parent=self)
@ -105,8 +109,6 @@ class GameListHeadBar(QWidget):
self.search_bar.setFrame(False) self.search_bar.setFrame(False)
self.search_bar.setMinimumWidth(200) self.search_bar.setMinimumWidth(200)
checked = QSettings().value("icon_view", True, bool)
installed_tooltip = self.tr("Installed games") installed_tooltip = self.tr("Installed games")
self.installed_icon = QLabel(parent=self) self.installed_icon = QLabel(parent=self)
self.installed_icon.setPixmap(icon("ph.floppy-disk-back-fill").pixmap(QSize(16, 16))) self.installed_icon.setPixmap(icon("ph.floppy-disk-back-fill").pixmap(QSize(16, 16)))
@ -123,7 +125,9 @@ class GameListHeadBar(QWidget):
self.available_label = QLabel(parent=self) self.available_label = QLabel(parent=self)
self.available_label.setToolTip(available_tooltip) self.available_label.setToolTip(available_tooltip)
self.view = SelectViewWidget(checked) view = LibraryView(QSettings(self).value(*options.library_view))
self.library_view = SelectViewWidget(view == LibraryView.COVER)
self.library_view.toggled.connect(self.__view_changed)
self.refresh_list = QPushButton(parent=self) self.refresh_list = QPushButton(parent=self)
self.refresh_list.setIcon(icon("fa.refresh")) # Reload icon self.refresh_list.setIcon(icon("fa.refresh")) # Reload icon
@ -143,7 +147,7 @@ class GameListHeadBar(QWidget):
layout.addWidget(self.available_icon) layout.addWidget(self.available_icon)
layout.addWidget(self.available_label) layout.addWidget(self.available_label)
layout.addStretch(2) layout.addStretch(2)
layout.addWidget(self.view) layout.addWidget(self.library_view)
layout.addStretch(2) layout.addStretch(2)
layout.addWidget(self.refresh_list) layout.addWidget(self.refresh_list)
@ -162,7 +166,7 @@ class GameListHeadBar(QWidget):
def __filter_changed(self, index: int): def __filter_changed(self, index: int):
data = self.filter.itemData(index, Qt.UserRole) data = self.filter.itemData(index, Qt.UserRole)
self.filterChanged.emit(data) self.filterChanged.emit(data)
self.settings.setValue(options.library_filter.key, data) self.settings.setValue(options.library_filter.key, int(data))
def current_order(self) -> LibraryOrder: def current_order(self) -> LibraryOrder:
return LibraryOrder(self.order.currentData(Qt.UserRole)) return LibraryOrder(self.order.currentData(Qt.UserRole))
@ -171,4 +175,10 @@ class GameListHeadBar(QWidget):
def __order_changed(self, index: int): def __order_changed(self, index: int):
data = self.order.itemData(index, Qt.UserRole) data = self.order.itemData(index, Qt.UserRole)
self.orderChanged.emit(data) self.orderChanged.emit(data)
self.settings.setValue(options.library_order.key, data) self.settings.setValue(options.library_order.key, int(data))
@pyqtSlot(bool)
def __view_changed(self, icon_view: bool):
view = LibraryView.COVER if icon_view else LibraryView.VLIST
self.viewChanged.emit(view)
self.settings.setValue(options.library_view.key, int(view))

View file

@ -30,11 +30,10 @@ class WaitingSpinner(QLabel):
class SelectViewWidget(QWidget): class SelectViewWidget(QWidget):
toggled = pyqtSignal() toggled = pyqtSignal(bool)
def __init__(self, icon_view: bool, parent=None): def __init__(self, icon_view: bool, parent=None):
super(SelectViewWidget, self).__init__(parent=parent) super(SelectViewWidget, self).__init__(parent=parent)
self.icon_view = icon_view
self.icon_button = QPushButton(self) self.icon_button = QPushButton(self)
self.icon_button.setObjectName(f"{type(self).__name__}Button") self.icon_button.setObjectName(f"{type(self).__name__}Button")
self.list_button = QPushButton(self) self.list_button = QPushButton(self)
@ -42,9 +41,9 @@ class SelectViewWidget(QWidget):
if icon_view: if icon_view:
self.icon_button.setIcon(qta_icon("mdi.view-grid-outline", "ei.th-large", color="orange")) self.icon_button.setIcon(qta_icon("mdi.view-grid-outline", "ei.th-large", color="orange"))
self.list_button.setIcon(qta_icon("fa5s.list", "ei.th-list")) self.list_button.setIcon(qta_icon("fa5s.list", "ei.th-list", color="#eee"))
else: else:
self.icon_button.setIcon(qta_icon("mdi.view-grid-outline", "ei.th-large")) self.icon_button.setIcon(qta_icon("mdi.view-grid-outline", "ei.th-large", color="#eee"))
self.list_button.setIcon(qta_icon("fa5s.list", "ei.th-list", color="orange")) self.list_button.setIcon(qta_icon("fa5s.list", "ei.th-list", color="orange"))
self.icon_button.clicked.connect(self.icon) self.icon_button.clicked.connect(self.icon)
@ -57,20 +56,15 @@ class SelectViewWidget(QWidget):
self.setLayout(layout) self.setLayout(layout)
def isChecked(self):
return self.icon_view
def icon(self): def icon(self):
self.icon_button.setIcon(qta_icon("mdi.view-grid-outline", "ei.th-large", color="orange")) self.icon_button.setIcon(qta_icon("mdi.view-grid-outline", "ei.th-large", color="orange"))
self.list_button.setIcon(qta_icon("fa5s.list", "ei.th-list")) self.list_button.setIcon(qta_icon("fa5s.list", "ei.th-list", color="#eee"))
self.icon_view = False self.toggled.emit(True)
self.toggled.emit()
def list(self): def list(self):
self.icon_button.setIcon(qta_icon("mdi.view-grid-outline", "ei.th-large")) self.icon_button.setIcon(qta_icon("mdi.view-grid-outline", "ei.th-large", color="#eee"))
self.list_button.setIcon(qta_icon("fa5s.list", "ei.th-list", color="orange")) self.list_button.setIcon(qta_icon("fa5s.list", "ei.th-list", color="orange"))
self.icon_view = True self.toggled.emit(False)
self.toggled.emit()
class ImageLabel(QLabel): class ImageLabel(QLabel):