diff --git a/rare/components/tabs/games/__init__.py b/rare/components/tabs/games/__init__.py index b7655210..69ca699d 100644 --- a/rare/components/tabs/games/__init__.py +++ b/rare/components/tabs/games/__init__.py @@ -12,10 +12,11 @@ from rare.shared import ( ImageManagerSingleton, ) from rare.shared import RareCore +from rare.models.options import options from rare.widgets.library_layout import LibraryLayout from rare.widgets.sliding_stack import SlidingStackedWidget 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.list_game_widget import ListGameWidget from .head_bar import GameListHeadBar @@ -84,9 +85,10 @@ class GamesTab(QStackedWidget): self.view_stack.addWidget(self.list_view_scroll) 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.head_bar.view.list() else: 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.scroll_to_top) 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 self.signals.game.installed.connect(self.update_count_games_label) @@ -174,26 +176,25 @@ class GamesTab(QStackedWidget): def search_games(self, search_text: str = ""): self.filter_games(self.head_bar.current_filter(), search_text) - @pyqtSlot(int) - @pyqtSlot(int, str) + @pyqtSlot(object) + @pyqtSlot(object, 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()): search_text = t self.library_controller.filter_game_views(library_filter, search_text.lower()) - @pyqtSlot(int) - @pyqtSlot(int, str) + @pyqtSlot(object) + @pyqtSlot(object, 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()): search_text = t self.library_controller.order_game_views(library_order, search_text.lower()) - def toggle_view(self): - self.settings.setValue("icon_view", not self.head_bar.view.isChecked()) - - if not self.head_bar.view.isChecked(): - self.view_stack.slideInWidget(self.icon_view_scroll) - else: + @pyqtSlot(object) + def change_view(self, library_view: LibraryView = LibraryView.COVER): + if library_view == LibraryView.VLIST: self.view_stack.slideInWidget(self.list_view_scroll) + else: + self.view_stack.slideInWidget(self.icon_view_scroll) diff --git a/rare/components/tabs/games/game_widgets/__init__.py b/rare/components/tabs/games/game_widgets/__init__.py index 50b10116..65f0caa2 100644 --- a/rare/components/tabs/games/game_widgets/__init__.py +++ b/rare/components/tabs/games/game_widgets/__init__.py @@ -6,7 +6,7 @@ from PyQt5.QtWidgets import QWidget from rare.lgndr.core import LegendaryCore from rare.models.game import RareGame 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 .icon_game_widget import IconGameWidget from .list_game_widget import ListGameWidget diff --git a/rare/components/tabs/games/head_bar.py b/rare/components/tabs/games/head_bar.py index dc3e13db..4a122e56 100644 --- a/rare/components/tabs/games/head_bar.py +++ b/rare/components/tabs/games/head_bar.py @@ -11,18 +11,18 @@ from PyQt5.QtWidgets import ( ) 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.misc import icon -from .game_widgets import LibraryFilter, LibraryOrder class GameListHeadBar(QWidget): - filterChanged: pyqtSignal = pyqtSignal(int) - orderChanged: pyqtSignal = pyqtSignal(int) - goto_import: pyqtSignal = pyqtSignal() - goto_egl_sync: pyqtSignal = pyqtSignal() - goto_eos_ubisoft: pyqtSignal = pyqtSignal() + filterChanged = pyqtSignal(object) + orderChanged = pyqtSignal(object) + viewChanged = pyqtSignal(object) + goto_import = pyqtSignal() + goto_egl_sync = pyqtSignal() + goto_eos_ubisoft = pyqtSignal() def __init__(self, parent=None): super(GameListHeadBar, self).__init__(parent=parent) @@ -31,50 +31,54 @@ class GameListHeadBar(QWidget): self.filter = QComboBox(self) filters = { - int(LibraryFilter.ALL): self.tr("All games"), - int(LibraryFilter.INSTALLED): self.tr("Installed"), - int(LibraryFilter.OFFLINE): self.tr("Offline"), + LibraryFilter.ALL: self.tr("All games"), + LibraryFilter.INSTALLED: self.tr("Installed"), + LibraryFilter.OFFLINE: self.tr("Offline"), # int(LibraryFilter.HIDDEN): self.tr("Hidden"), } for data, text in filters.items(): self.filter.addItem(text, data) 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: - self.filter.addItem(self.tr("macOS games"), int(LibraryFilter.MAC)) + self.filter.addItem(self.tr("macOS games"), LibraryFilter.MAC) if self.rcore.origin_games: - self.filter.addItem(self.tr("Exclude Origin"), int(LibraryFilter.INSTALLABLE)) - self.filter.addItem(self.tr("Include Unreal"), int(LibraryFilter.INCLUDE_UE)) + self.filter.addItem(self.tr("Exclude Origin"), LibraryFilter.INSTALLABLE) + self.filter.addItem(self.tr("Include Unreal"), LibraryFilter.INCLUDE_UE) try: - index = self.filter.findData(self.settings.value(*options.library_filter), Qt.UserRole) - if index < 0: + _filter = self.settings.value(*options.library_filter) + if (index := self.filter.findData(_filter, Qt.UserRole)) < 0: raise ValueError - self.filter.setCurrentIndex(index) + else: + self.filter.setCurrentIndex(index) except (TypeError, ValueError): 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.order = QComboBox(parent=self) sortings = { - int(LibraryOrder.TITLE): self.tr("Title"), - int(LibraryOrder.RECENT): self.tr("Recently played"), - int(LibraryOrder.NEWEST): self.tr("Newest"), - int(LibraryOrder.OLDEST): self.tr("Oldest"), + LibraryOrder.TITLE: self.tr("Title"), + LibraryOrder.RECENT: self.tr("Recently played"), + LibraryOrder.NEWEST: self.tr("Newest"), + LibraryOrder.OLDEST: self.tr("Oldest"), } for data, text in sortings.items(): self.order.addItem(text, data) try: - index = self.order.findData(self.settings.value(*options.library_order), Qt.UserRole) - if index < 0: + _order = LibraryOrder(self.settings.value(*options.library_order)) + if (index := self.order.findData(_order, Qt.UserRole)) < 0: raise ValueError - self.order.setCurrentIndex(index) + else: + self.order.setCurrentIndex(index) except (TypeError, ValueError): 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) integrations_menu = QMenu(parent=self) @@ -105,8 +109,6 @@ class GameListHeadBar(QWidget): self.search_bar.setFrame(False) self.search_bar.setMinimumWidth(200) - checked = QSettings().value("icon_view", True, bool) - installed_tooltip = self.tr("Installed games") self.installed_icon = QLabel(parent=self) 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.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.setIcon(icon("fa.refresh")) # Reload icon @@ -143,7 +147,7 @@ class GameListHeadBar(QWidget): layout.addWidget(self.available_icon) layout.addWidget(self.available_label) layout.addStretch(2) - layout.addWidget(self.view) + layout.addWidget(self.library_view) layout.addStretch(2) layout.addWidget(self.refresh_list) @@ -162,7 +166,7 @@ class GameListHeadBar(QWidget): def __filter_changed(self, index: int): data = self.filter.itemData(index, Qt.UserRole) 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: return LibraryOrder(self.order.currentData(Qt.UserRole)) @@ -171,4 +175,10 @@ class GameListHeadBar(QWidget): def __order_changed(self, index: int): data = self.order.itemData(index, Qt.UserRole) 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)) diff --git a/rare/utils/extra_widgets.py b/rare/utils/extra_widgets.py index bfdddfa2..dfecc958 100644 --- a/rare/utils/extra_widgets.py +++ b/rare/utils/extra_widgets.py @@ -30,11 +30,10 @@ class WaitingSpinner(QLabel): class SelectViewWidget(QWidget): - toggled = pyqtSignal() + toggled = pyqtSignal(bool) def __init__(self, icon_view: bool, parent=None): super(SelectViewWidget, self).__init__(parent=parent) - self.icon_view = icon_view self.icon_button = QPushButton(self) self.icon_button.setObjectName(f"{type(self).__name__}Button") self.list_button = QPushButton(self) @@ -42,9 +41,9 @@ class SelectViewWidget(QWidget): if icon_view: 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: - 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.icon_button.clicked.connect(self.icon) @@ -57,20 +56,15 @@ class SelectViewWidget(QWidget): self.setLayout(layout) - def isChecked(self): - return self.icon_view - def icon(self): 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.icon_view = False - self.toggled.emit() + self.list_button.setIcon(qta_icon("fa5s.list", "ei.th-list", color="#eee")) + self.toggled.emit(True) 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.icon_view = True - self.toggled.emit() + self.toggled.emit(False) class ImageLabel(QLabel):