1
0
Fork 0
mirror of synced 2024-05-18 11:32:50 +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,
)
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)

View file

@ -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

View file

@ -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))

View file

@ -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):