diff --git a/rare/components/tabs/settings/rare.py b/rare/components/tabs/settings/rare.py index 22b93fd8..ba47c0f9 100644 --- a/rare/components/tabs/settings/rare.py +++ b/rare/components/tabs/settings/rare.py @@ -5,11 +5,11 @@ import locale import sys from logging import getLogger -from PyQt5.QtCore import QSettings, Qt +from PyQt5.QtCore import QSettings, Qt, pyqtSlot from PyQt5.QtWidgets import QWidget, QMessageBox from rare.components.tabs.settings.widgets.rpc import RPCSettings -from rare.models.options import options +from rare.models.options import options, LibraryView from rare.shared import LegendaryCoreSingleton from rare.ui.components.tabs.settings.rare import Ui_RareSettings from rare.utils.misc import ( @@ -33,34 +33,49 @@ class RareSettings(QWidget, Ui_RareSettings): self.settings = QSettings(self) # Select lang - language = self.settings.value(*options.language) self.lang_select.addItem(self.tr("System default"), options.language.default) for lang_code, title in get_translations(): self.lang_select.addItem(title, lang_code) + language = self.settings.value(*options.language) if (index := self.lang_select.findData(language, Qt.UserRole)) > 0: self.lang_select.setCurrentIndex(index) else: self.lang_select.setCurrentIndex(0) self.lang_select.currentIndexChanged.connect(self.on_lang_changed) - self.color_select.addItems(get_color_schemes()) - if (color := self.settings.value("color_scheme")) in get_color_schemes(): - self.color_select.setCurrentIndex(self.color_select.findText(color)) + self.color_select.addItem(self.tr("None"), "") + for item in get_color_schemes(): + self.color_select.addItem(item, item) + color = self.settings.value(*options.color_scheme) + if (index := self.color_select.findData(color, Qt.UserRole)) > 0: + self.color_select.setCurrentIndex(index) self.color_select.setDisabled(False) self.style_select.setDisabled(True) else: self.color_select.setCurrentIndex(0) self.color_select.currentIndexChanged.connect(self.on_color_select_changed) - self.style_select.addItems(get_style_sheets()) - if (style := self.settings.value("style_sheet")) in get_style_sheets(): - self.style_select.setCurrentIndex(self.style_select.findText(style)) + self.style_select.addItem(self.tr("None"), "") + for item in get_style_sheets(): + self.style_select.addItem(item, item) + style = self.settings.value(*options.style_sheet) + if (index := self.style_select.findData(style, Qt.UserRole)) > 0: + self.style_select.setCurrentIndex(index) self.style_select.setDisabled(False) self.color_select.setDisabled(True) else: self.style_select.setCurrentIndex(0) self.style_select.currentIndexChanged.connect(self.on_style_select_changed) + self.view_combo.addItem(self.tr("Game covers"), LibraryView.COVER) + self.view_combo.addItem(self.tr("Vertical list"), LibraryView.VLIST) + view = LibraryView(self.settings.value(*options.library_view)) + if (index := self.view_combo.findData(view)) > -1: + self.view_combo.setCurrentIndex(index) + else: + self.view_combo.setCurrentIndex(0) + self.view_combo.currentIndexChanged.connect(self.on_view_combo_changed) + self.rpc = RPCSettings(self) self.right_layout.insertWidget(1, self.rpc, alignment=Qt.AlignTop) @@ -178,27 +193,32 @@ class RareSettings(QWidget, Ui_RareSettings): self.tr("Permission error, cannot remove {}").format(self.start_menu_link), ) - def on_color_select_changed(self, scheme): + @pyqtSlot(int) + def on_color_select_changed(self, index: int): + scheme = self.color_select.itemData(index, Qt.UserRole) if scheme: self.style_select.setCurrentIndex(0) self.style_select.setDisabled(True) - self.settings.setValue("color_scheme", self.color_select.currentText()) - set_color_pallete(self.color_select.currentText()) else: - self.settings.setValue("color_scheme", "") self.style_select.setDisabled(False) - set_color_pallete("") + self.settings.setValue("color_scheme", scheme) + set_color_pallete(scheme) - def on_style_select_changed(self, style): + @pyqtSlot(int) + def on_style_select_changed(self, index: int): + style = self.style_select.itemData(index, Qt.UserRole) if style: self.color_select.setCurrentIndex(0) self.color_select.setDisabled(True) - self.settings.setValue("style_sheet", self.style_select.currentText()) - set_style_sheet(self.style_select.currentText()) else: - self.settings.setValue("style_sheet", "") self.color_select.setDisabled(False) - set_style_sheet("") + self.settings.setValue("style_sheet", style) + set_style_sheet(style) + + @pyqtSlot(int) + def on_view_combo_changed(self, index: int): + view = LibraryView(self.view_combo.itemData(index, Qt.UserRole)) + self.settings.setValue(options.library_view.key, int(view)) @staticmethod def open_directory(): diff --git a/rare/models/library.py b/rare/models/library.py index 9318a2fe..c1fef2ac 100644 --- a/rare/models/library.py +++ b/rare/models/library.py @@ -1,6 +1,11 @@ from enum import IntEnum +class LibraryView(IntEnum): + COVER = 1 + VLIST = 2 + + class LibraryFilter(IntEnum): ALL = 1 INSTALLED = 2 diff --git a/rare/models/options.py b/rare/models/options.py index 42f0529d..66249780 100644 --- a/rare/models/options.py +++ b/rare/models/options.py @@ -2,7 +2,7 @@ import locale import platform as pf from argparse import Namespace from typing import Any, Type -from .library import LibraryFilter, LibraryOrder +from .library import LibraryFilter, LibraryOrder, LibraryView class Value(Namespace): @@ -35,13 +35,15 @@ class Defaults(Namespace): notification = Value(key="notification", default=True, dtype=bool) log_games = Value(key="show_console", default=False, dtype=bool) + color_scheme = Value(key="color_scheme", default="", dtype=str) + style_sheet = Value(key="style_sheet", default="RareStyle", dtype=str) + + library_view = Value(key="library_view", default=int(LibraryView.COVER), dtype=int) library_filter = Value( key="library_filter", default=int(LibraryFilter.MAC if pf.system() == "Darwin" else LibraryFilter.ALL), dtype=int ) - library_order = Value( - key="library_order", default=int(LibraryOrder.TITLE), dtype=int - ) + library_order = Value(key="library_order", default=int(LibraryOrder.TITLE), dtype=int) rpc_enable = Value(key="rpc_enable", default=0, dtype=int) rpc_name = Value(key="rpc_game", default=True, dtype=bool) @@ -51,4 +53,4 @@ class Defaults(Namespace): options = Defaults() -__all__ = ['options'] +__all__ = ['options', 'LibraryFilter', 'LibraryOrder', 'LibraryView'] diff --git a/rare/ui/components/tabs/settings/rare.py b/rare/ui/components/tabs/settings/rare.py index fc1abaff..c7815ae1 100644 --- a/rare/ui/components/tabs/settings/rare.py +++ b/rare/ui/components/tabs/settings/rare.py @@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_RareSettings(object): def setupUi(self, RareSettings): RareSettings.setObjectName("RareSettings") - RareSettings.resize(623, 428) + RareSettings.resize(629, 447) RareSettings.setWindowTitle("RareSettings") self.rare_layout = QtWidgets.QHBoxLayout(RareSettings) self.rare_layout.setObjectName("rare_layout") @@ -28,42 +28,26 @@ class Ui_RareSettings(object): self.interface_group.setSizePolicy(sizePolicy) self.interface_group.setObjectName("interface_group") self.interface_layout = QtWidgets.QFormLayout(self.interface_group) + self.interface_layout.setFieldGrowthPolicy(QtWidgets.QFormLayout.FieldsStayAtSizeHint) self.interface_layout.setLabelAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.interface_layout.setObjectName("interface_layout") self.lang_label = QtWidgets.QLabel(self.interface_group) self.lang_label.setObjectName("lang_label") self.interface_layout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.lang_label) self.lang_select = QtWidgets.QComboBox(self.interface_group) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.lang_select.sizePolicy().hasHeightForWidth()) - self.lang_select.setSizePolicy(sizePolicy) self.lang_select.setObjectName("lang_select") self.interface_layout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lang_select) self.color_label = QtWidgets.QLabel(self.interface_group) self.color_label.setObjectName("color_label") self.interface_layout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.color_label) self.color_select = QtWidgets.QComboBox(self.interface_group) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.color_select.sizePolicy().hasHeightForWidth()) - self.color_select.setSizePolicy(sizePolicy) self.color_select.setObjectName("color_select") - self.color_select.addItem("") self.interface_layout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.color_select) self.style_label = QtWidgets.QLabel(self.interface_group) self.style_label.setObjectName("style_label") self.interface_layout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.style_label) self.style_select = QtWidgets.QComboBox(self.interface_group) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.style_select.sizePolicy().hasHeightForWidth()) - self.style_select.setSizePolicy(sizePolicy) self.style_select.setObjectName("style_select") - self.style_select.addItem("") self.interface_layout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.style_select) self.interface_info = QtWidgets.QLabel(self.interface_group) font = QtGui.QFont() @@ -71,7 +55,13 @@ class Ui_RareSettings(object): self.interface_info.setFont(font) self.interface_info.setWordWrap(True) self.interface_info.setObjectName("interface_info") - self.interface_layout.setWidget(3, QtWidgets.QFormLayout.SpanningRole, self.interface_info) + self.interface_layout.setWidget(4, QtWidgets.QFormLayout.SpanningRole, self.interface_info) + self.view_label = QtWidgets.QLabel(self.interface_group) + self.view_label.setObjectName("view_label") + self.interface_layout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.view_label) + self.view_combo = QtWidgets.QComboBox(self.interface_group) + self.view_combo.setObjectName("view_combo") + self.interface_layout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.view_combo) self.left_layout.addWidget(self.interface_group) self.settings_group = QtWidgets.QGroupBox(RareSettings) self.settings_group.setObjectName("settings_group") @@ -149,10 +139,9 @@ class Ui_RareSettings(object): self.interface_group.setTitle(_translate("RareSettings", "Interface")) self.lang_label.setText(_translate("RareSettings", "Language")) self.color_label.setText(_translate("RareSettings", "Color scheme")) - self.color_select.setItemText(0, _translate("RareSettings", "None")) self.style_label.setText(_translate("RareSettings", "Style sheet")) - self.style_select.setItemText(0, _translate("RareSettings", "None")) self.interface_info.setText(_translate("RareSettings", "Restart Rare to apply changes.")) + self.view_label.setText(_translate("RareSettings", "Library view")) self.settings_group.setTitle(_translate("RareSettings", "Behavior")) self.save_size.setText(_translate("RareSettings", "Restore window size on application startup")) self.notification.setText(_translate("RareSettings", "Show notifications when downloads complete")) diff --git a/rare/ui/components/tabs/settings/rare.ui b/rare/ui/components/tabs/settings/rare.ui index 2178d31d..856ac845 100644 --- a/rare/ui/components/tabs/settings/rare.ui +++ b/rare/ui/components/tabs/settings/rare.ui @@ -6,8 +6,8 @@ 0 0 - 623 - 428 + 629 + 447 @@ -28,6 +28,9 @@ Interface + + QFormLayout::FieldsStayAtSizeHint + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -39,14 +42,7 @@ - - - - 0 - 0 - - - + @@ -56,19 +52,7 @@ - - - - 0 - 0 - - - - - None - - - + @@ -78,21 +62,9 @@ - - - - 0 - 0 - - - - - None - - - + - + @@ -107,6 +79,16 @@ + + + + Library view + + + + + + diff --git a/rare/widgets/rare_app.py b/rare/widgets/rare_app.py index 51dad2da..ed7b6d57 100644 --- a/rare/widgets/rare_app.py +++ b/rare/widgets/rare_app.py @@ -23,6 +23,7 @@ from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QApplication, QMessageBox import rare.resources.resources +from rare.models.options import options from rare.utils import paths from rare.utils.misc import set_color_pallete, set_style_sheet, get_static_style @@ -123,17 +124,17 @@ class RareApp(QApplication): # lk: store the default qt style name from the system on startup as a property for later reference self.setProperty("rareDefaultQtStyle", self.style().objectName()) if ( - self.settings.value("color_scheme", None) is None - and self.settings.value("style_sheet", None) is None + self.settings.value(options.style_sheet.key, None) is None + and self.settings.value(options.color_scheme.key, None) is None ): - self.settings.setValue("color_scheme", "") - self.settings.setValue("style_sheet", "RareStyle") + self.settings.setValue(options.color_scheme.key, options.color_scheme.default) + self.settings.setValue(options.style_sheet.key, options.style_sheet.default) - if color_scheme := self.settings.value("color_scheme", False): - self.settings.setValue("style_sheet", "") + if color_scheme := self.settings.value(options.color_scheme.key, False): + self.settings.setValue(options.style_sheet.key, "") set_color_pallete(color_scheme) - elif style_sheet := self.settings.value("style_sheet", False): - self.settings.setValue("color_scheme", "") + elif style_sheet := self.settings.value(options.style_sheet.key, False): + self.settings.setValue(options.color_scheme.key, "") set_style_sheet(style_sheet) else: self.setStyleSheet(get_static_style())