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:
parent
4f4689e82b
commit
7c3d5dc9e8
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Reference in a new issue