From 598c153375245dabe629f7bb29c3909ea37c0b3f Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Wed, 21 Apr 2021 23:54:24 +0300 Subject: [PATCH 01/34] Convert about.ui to python --- rare/components/tabs/settings/about.py | 53 +++----- rare/components/tabs/settings/about_ui.py | 141 ++++++++++++++++++++++ 2 files changed, 159 insertions(+), 35 deletions(-) create mode 100644 rare/components/tabs/settings/about_ui.py diff --git a/rare/components/tabs/settings/about.py b/rare/components/tabs/settings/about.py index 67d33993..c00775f1 100644 --- a/rare/components/tabs/settings/about.py +++ b/rare/components/tabs/settings/about.py @@ -1,9 +1,10 @@ import webbrowser -from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QPushButton +from PyQt5.QtWidgets import QWidget from rare import __version__ from rare.utils.utils import get_latest_version +from .about_ui import Ui_About def versiontuple(v): @@ -13,45 +14,27 @@ def versiontuple(v): return tuple((9, 9, 9)) # It is a beta version and newer -class About(QWidget): +class About(QWidget, Ui_About): def __init__(self): super(About, self).__init__() - self.layout = QVBoxLayout() + self.setupUi(self) - self.title = QLabel("

About

") - self.layout.addWidget(self.title) + self.version.setText(__version__) + + self.update_lbl.setVisible(False) + self.update.setVisible(False) + self.open_browser.setVisible(False) - self.version = QLabel("Version: " + __version__) - self.layout.addWidget(self.version) latest_tag = get_latest_version() self.update_available = versiontuple(latest_tag) > versiontuple(__version__) + + self.update.setText("{} -> {}".format(__version__, latest_tag)) + + self.open_browser.clicked.connect( + lambda: webbrowser.open("https://github.com/Dummerle/Rare/releases/latest")) + if self.update_available: print(f"Update available: {__version__} -> {latest_tag}") - self.update_available = QLabel(self.tr("Update available: {} -> {}").format(__version__, latest_tag)) - self.layout.addWidget(self.update_available) - self.open_browser = QPushButton(self.tr("Download latest release")) - self.layout.addWidget(self.open_browser) - self.open_browser.clicked.connect( - lambda: webbrowser.open("https://github.com/Dummerle/Rare/releases/latest")) - - self.dev = QLabel(self.tr("Developer:") + "Dummerle") - self.dev.setToolTip("Github") - self.dev.setOpenExternalLinks(True) - self.dev.setWordWrap(True) - self.layout.addWidget(self.dev) - self.lgd_dev = QLabel(self.tr("Legendary developer:") + "derrod") - self.lgd_dev.setOpenExternalLinks(True) - self.lgd_dev.setToolTip("Github") - self.layout.addWidget(self.lgd_dev) - self.license = QLabel("License: GNU General Public License v3.0") - self.layout.addWidget(self.license) - self.info_text = QLabel( - self.tr("This is a beta version, so you can get bugs. If you get a bug, please report it by creating a " - "Issue on Github. You can also contact me " - "on Discord (Dummerle#7419). Or you can join the Discord server")) - self.info_text.setWordWrap(True) - self.info_text.setOpenExternalLinks(True) - self.layout.addWidget(self.info_text) - - self.layout.addStretch() - self.setLayout(self.layout) + self.update_lbl.setVisible(True) + self.update.setVisible(True) + self.open_browser.setVisible(True) diff --git a/rare/components/tabs/settings/about_ui.py b/rare/components/tabs/settings/about_ui.py new file mode 100644 index 00000000..351b103f --- /dev/null +++ b/rare/components/tabs/settings/about_ui.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'about.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_About(object): + def setupUi(self, About): + About.setObjectName("About") + About.resize(499, 396) + self.gridLayout = QtWidgets.QGridLayout(About) + self.gridLayout.setObjectName("gridLayout") + self.title = QtWidgets.QLabel(About) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.title.sizePolicy().hasHeightForWidth()) + self.title.setSizePolicy(sizePolicy) + self.title.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.title.setObjectName("title") + self.gridLayout.addWidget(self.title, 0, 0, 1, 3) + self.version_lbl = QtWidgets.QLabel(About) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.version_lbl.sizePolicy().hasHeightForWidth()) + self.version_lbl.setSizePolicy(sizePolicy) + self.version_lbl.setObjectName("version_lbl") + self.gridLayout.addWidget(self.version_lbl, 1, 0, 1, 1) + self.license = QtWidgets.QLabel(About) + self.license.setObjectName("license") + self.gridLayout.addWidget(self.license, 7, 1, 1, 3) + self.license_lbl = QtWidgets.QLabel(About) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.license_lbl.sizePolicy().hasHeightForWidth()) + self.license_lbl.setSizePolicy(sizePolicy) + self.license_lbl.setObjectName("license_lbl") + self.gridLayout.addWidget(self.license_lbl, 7, 0, 1, 1) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.gridLayout.addItem(spacerItem, 14, 0, 1, 4) + self.dev_lbl = QtWidgets.QLabel(About) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.dev_lbl.sizePolicy().hasHeightForWidth()) + self.dev_lbl.setSizePolicy(sizePolicy) + self.dev_lbl.setObjectName("dev_lbl") + self.gridLayout.addWidget(self.dev_lbl, 5, 0, 1, 1) + self.lgd_dev_lbl = QtWidgets.QLabel(About) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lgd_dev_lbl.sizePolicy().hasHeightForWidth()) + self.lgd_dev_lbl.setSizePolicy(sizePolicy) + self.lgd_dev_lbl.setObjectName("lgd_dev_lbl") + self.gridLayout.addWidget(self.lgd_dev_lbl, 6, 0, 1, 1) + self.update_lbl = QtWidgets.QLabel(About) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.update_lbl.sizePolicy().hasHeightForWidth()) + self.update_lbl.setSizePolicy(sizePolicy) + self.update_lbl.setObjectName("update_lbl") + self.gridLayout.addWidget(self.update_lbl, 2, 0, 1, 1) + self.lgd_dev = QtWidgets.QLabel(About) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lgd_dev.sizePolicy().hasHeightForWidth()) + self.lgd_dev.setSizePolicy(sizePolicy) + self.lgd_dev.setOpenExternalLinks(True) + self.lgd_dev.setObjectName("lgd_dev") + self.gridLayout.addWidget(self.lgd_dev, 6, 1, 1, 3) + self.dev = QtWidgets.QLabel(About) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.dev.sizePolicy().hasHeightForWidth()) + self.dev.setSizePolicy(sizePolicy) + self.dev.setOpenExternalLinks(True) + self.dev.setObjectName("dev") + self.gridLayout.addWidget(self.dev, 5, 1, 1, 3) + self.update = QtWidgets.QLabel(About) + self.update.setObjectName("update") + self.gridLayout.addWidget(self.update, 2, 1, 1, 3) + self.version = QtWidgets.QLabel(About) + self.version.setObjectName("version") + self.gridLayout.addWidget(self.version, 1, 1, 1, 3) + self.open_browser = QtWidgets.QPushButton(About) + self.open_browser.setObjectName("open_browser") + self.gridLayout.addWidget(self.open_browser, 4, 0, 1, 4) + self.info_text = QtWidgets.QLabel(About) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.info_text.sizePolicy().hasHeightForWidth()) + self.info_text.setSizePolicy(sizePolicy) + self.info_text.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) + self.info_text.setWordWrap(True) + self.info_text.setOpenExternalLinks(True) + self.info_text.setObjectName("info_text") + self.gridLayout.addWidget(self.info_text, 8, 0, 1, 4) + + self.retranslateUi(About) + QtCore.QMetaObject.connectSlotsByName(About) + + def retranslateUi(self, About): + _translate = QtCore.QCoreApplication.translate + About.setWindowTitle(_translate("About", "Form")) + self.title.setText(_translate("About", "

About

")) + self.version_lbl.setText(_translate("About", "Version: ")) + self.license.setText(_translate("About", "GNU General Public License v3.0")) + self.license_lbl.setText(_translate("About", "License:")) + self.dev_lbl.setText(_translate("About", "Rare Developer:")) + self.lgd_dev_lbl.setText(_translate("About", "Legendary Developer:")) + self.update_lbl.setText(_translate("About", "Update available: ")) + self.lgd_dev.setText(_translate("About", "derrod")) + self.dev.setText(_translate("About", "Dummerle")) + self.update.setText(_translate("About", "update")) + self.version.setText(_translate("About", "version")) + self.open_browser.setText(_translate("About", "Download latest release")) + self.info_text.setText(_translate("About", "This is a beta version, so you can get bugs. If you get a bug, please report it by creating an Issue on Github. You can also contact me on Discord (Dummerle#7419). Or you can join the Discord server")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + About = QtWidgets.QWidget() + ui = Ui_About() + ui.setupUi(About) + About.show() + sys.exit(app.exec_()) From 253afa6d9d4557d1ac378f5b6dbfa9c324584b86 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Wed, 21 Apr 2021 23:55:42 +0300 Subject: [PATCH 02/34] Move QtDesigner ui files to resources --- .../ui/components/tabs/settings/about.ui | 197 ++++++++++++++++++ resources/ui/components/tabs/settings/rare.ui | 61 ++++++ .../components/tabs/settings/rpc_settings.ui | 20 ++ 3 files changed, 278 insertions(+) create mode 100644 resources/ui/components/tabs/settings/about.ui create mode 100644 resources/ui/components/tabs/settings/rare.ui create mode 100644 resources/ui/components/tabs/settings/rpc_settings.ui diff --git a/resources/ui/components/tabs/settings/about.ui b/resources/ui/components/tabs/settings/about.ui new file mode 100644 index 00000000..92c19af9 --- /dev/null +++ b/resources/ui/components/tabs/settings/about.ui @@ -0,0 +1,197 @@ + + + About + + + + 0 + 0 + 499 + 396 + + + + Form + + + + + + + 0 + 0 + + + + <h2>About</h2> + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + Version: + + + + + + + GNU General Public License v3.0 + + + + + + + + 0 + 0 + + + + License: + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + Rare Developer: + + + + + + + + 0 + 0 + + + + Legendary Developer: + + + + + + + + 0 + 0 + + + + Update available: + + + + + + + + 0 + 0 + + + + <a href='https://github.com/derrod/'>derrod</a> + + + true + + + + + + + + 0 + 0 + + + + <a href='https://github.com/Dummerle'>Dummerle</a> + + + true + + + + + + + update + + + + + + + version + + + + + + + Download latest release + + + + + + + + 0 + 0 + + + + This is a beta version, so you can get bugs. If you get a bug, please report it by creating an Issue on <a href='https://github.com/Dummerle/Rare/issues'>Github</a>. You can also contact me on Discord (Dummerle#7419). Or you can join the <a href='https://discord.gg/YvmABK9YSk'>Discord server</a> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + true + + + + + + + + diff --git a/resources/ui/components/tabs/settings/rare.ui b/resources/ui/components/tabs/settings/rare.ui new file mode 100644 index 00000000..21c96558 --- /dev/null +++ b/resources/ui/components/tabs/settings/rare.ui @@ -0,0 +1,61 @@ + + + rare + + + + 0 + 0 + 633 + 480 + + + + Form + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + diff --git a/resources/ui/components/tabs/settings/rpc_settings.ui b/resources/ui/components/tabs/settings/rpc_settings.ui new file mode 100644 index 00000000..8a50fc2e --- /dev/null +++ b/resources/ui/components/tabs/settings/rpc_settings.ui @@ -0,0 +1,20 @@ + + + Form + + + + 0 + 0 + 559 + 398 + + + + Form + + + + + + From 2ff965ac96d6e4aa407fc0f5d1c898d76abf80a8 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Thu, 22 Apr 2021 00:04:14 +0300 Subject: [PATCH 03/34] Add missing tooltip --- rare/components/tabs/settings/about_ui.py | 4 +++- resources/ui/components/tabs/settings/about.ui | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/rare/components/tabs/settings/about_ui.py b/rare/components/tabs/settings/about_ui.py index 351b103f..7c4d28f5 100644 --- a/rare/components/tabs/settings/about_ui.py +++ b/rare/components/tabs/settings/about_ui.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'about.ui' +# Form implementation generated from reading ui file 'resources/ui/components/tabs/settings/about.ui' # # Created by: PyQt5 UI code generator 5.15.4 # @@ -123,7 +123,9 @@ class Ui_About(object): self.dev_lbl.setText(_translate("About", "Rare Developer:")) self.lgd_dev_lbl.setText(_translate("About", "Legendary Developer:")) self.update_lbl.setText(_translate("About", "Update available: ")) + self.lgd_dev.setToolTip(_translate("About", "Github")) self.lgd_dev.setText(_translate("About", "derrod")) + self.dev.setToolTip(_translate("About", "Github")) self.dev.setText(_translate("About", "Dummerle")) self.update.setText(_translate("About", "update")) self.version.setText(_translate("About", "version")) diff --git a/resources/ui/components/tabs/settings/about.ui b/resources/ui/components/tabs/settings/about.ui index 92c19af9..9aba2f24 100644 --- a/resources/ui/components/tabs/settings/about.ui +++ b/resources/ui/components/tabs/settings/about.ui @@ -123,6 +123,9 @@ 0 + + Github + <a href='https://github.com/derrod/'>derrod</a> @@ -139,6 +142,9 @@ 0 + + Github + <a href='https://github.com/Dummerle'>Dummerle</a> From b42e5d2384dcb2d7279ca443638ab45e09e90893 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Thu, 22 Apr 2021 00:38:44 +0300 Subject: [PATCH 04/34] Convert rare.ui to python --- rare/components/tabs/settings/rare.py | 33 ++++----- rare/components/tabs/settings/rare_ui.py | 68 +++++++++++++++++++ resources/ui/components/tabs/settings/rare.ui | 4 +- 3 files changed, 85 insertions(+), 20 deletions(-) create mode 100644 rare/components/tabs/settings/rare_ui.py diff --git a/rare/components/tabs/settings/rare.py b/rare/components/tabs/settings/rare.py index 31184b90..ebcb0b0c 100644 --- a/rare/components/tabs/settings/rare.py +++ b/rare/components/tabs/settings/rare.py @@ -4,13 +4,14 @@ import subprocess import sys from logging import getLogger -from PyQt5.QtCore import QSettings, Qt -from PyQt5.QtWidgets import QVBoxLayout, QFileDialog, QComboBox, QPushButton, QCheckBox, QGroupBox, QScrollArea +from PyQt5.QtCore import QSettings +from PyQt5.QtWidgets import QFileDialog, QComboBox, QPushButton, QCheckBox, QWidget, QSpacerItem, QSizePolicy from rare.components.tabs.settings.rpc_settings import RPCSettings from rare.components.tabs.settings.settings_widget import SettingsWidget from rare.utils.extra_widgets import PathEdit from rare.utils.utils import get_lang, get_possible_langs +from .rare_ui import Ui_RareSettings logger = getLogger("RareSettings") @@ -21,13 +22,11 @@ languages = [ ] -class RareSettings(QScrollArea): +class RareSettings(QWidget, Ui_RareSettings): def __init__(self): super(RareSettings, self).__init__() - self.widget = QGroupBox(self.tr("Rare settings")) - self.widget.setObjectName("group") - self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) - self.setWidgetResizable(True) + self.setupUi(self) + # (option_name, group_text, checkbox_text, default self.checkboxes = [ ("sys_tray", self.tr("Hide to System Tray Icon"), self.tr("Exit to System Tray Icon"), True), @@ -41,7 +40,6 @@ class RareSettings(QScrollArea): ("save_size", self.tr("Save size of window after restart"), self.tr("Save size"), False) ] - self.layout = QVBoxLayout() self.settings = QSettings() img_dir = self.settings.value("img_dir", os.path.expanduser("~/.cache/rare/images/"), type=str) language = self.settings.value("language", get_lang(), type=str) @@ -51,7 +49,7 @@ class RareSettings(QScrollArea): self.save_path_button = QPushButton(self.tr("Save")) self.save_path_button.clicked.connect(self.save_path) self.img_dir = SettingsWidget(self.tr("Image Directory"), self.select_path, self.save_path_button) - self.layout.addWidget(self.img_dir) + self.layout().replaceWidget(self.img_dir_ph, self.img_dir) # Select lang self.select_lang = QComboBox() @@ -63,23 +61,22 @@ class RareSettings(QScrollArea): self.select_lang.setCurrentIndex(0) self.lang_widget = SettingsWidget(self.tr("Language"), self.select_lang) self.select_lang.currentIndexChanged.connect(self.update_lang) - self.layout.addWidget(self.lang_widget) + self.layout().replaceWidget(self.lang_widget_ph, self.lang_widget) self.rpc = RPCSettings() - self.layout.addWidget(self.rpc) + self.layout().replaceWidget(self.rpc_ph, self.rpc) + self.settings_widget = SettingsWidget("Behaviour", None) for option, head_text, text, default in self.checkboxes: checkbox = SettingsCheckbox(option, text, default) - settings_widget = SettingsWidget(head_text, checkbox) - self.layout.addWidget(settings_widget) + checkbox.setToolTip(head_text) + self.settings_widget.layout.addWidget(checkbox) + self.settings_widget.layout.addItem(QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding)) + self.layout().replaceWidget(self.settings_widget_ph, self.settings_widget) self.open_log_dir = QPushButton(self.tr("Open Log directory")) - self.layout.addWidget(self.open_log_dir) self.open_log_dir.clicked.connect(self.open_dir) - - self.layout.addStretch() - self.widget.setLayout(self.layout) - self.setWidget(self.widget) + self.layout().addWidget(self.open_log_dir) def open_dir(self): logdir = os.path.expanduser("~/.cache/rare/logs") diff --git a/rare/components/tabs/settings/rare_ui.py b/rare/components/tabs/settings/rare_ui.py new file mode 100644 index 00000000..584d8d70 --- /dev/null +++ b/rare/components/tabs/settings/rare_ui.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'resources/ui/components/tabs/settings/rare.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_RareSettings(object): + def setupUi(self, RareSettings): + RareSettings.setObjectName("RareSettings") + RareSettings.resize(633, 480) + self.gridLayout = QtWidgets.QGridLayout(RareSettings) + self.gridLayout.setObjectName("gridLayout") + self.img_dir_ph = QtWidgets.QWidget(RareSettings) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.img_dir_ph.sizePolicy().hasHeightForWidth()) + self.img_dir_ph.setSizePolicy(sizePolicy) + self.img_dir_ph.setObjectName("img_dir_ph") + self.gridLayout.addWidget(self.img_dir_ph, 0, 0, 1, 1) + self.settings_widget_ph = QtWidgets.QWidget(RareSettings) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.settings_widget_ph.sizePolicy().hasHeightForWidth()) + self.settings_widget_ph.setSizePolicy(sizePolicy) + self.settings_widget_ph.setObjectName("settings_widget_ph") + self.gridLayout.addWidget(self.settings_widget_ph, 1, 0, 1, 1) + self.rpc_ph = QtWidgets.QWidget(RareSettings) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.rpc_ph.sizePolicy().hasHeightForWidth()) + self.rpc_ph.setSizePolicy(sizePolicy) + self.rpc_ph.setObjectName("rpc_ph") + self.gridLayout.addWidget(self.rpc_ph, 1, 1, 1, 1) + self.lang_widget_ph = QtWidgets.QWidget(RareSettings) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lang_widget_ph.sizePolicy().hasHeightForWidth()) + self.lang_widget_ph.setSizePolicy(sizePolicy) + self.lang_widget_ph.setObjectName("lang_widget_ph") + self.gridLayout.addWidget(self.lang_widget_ph, 0, 1, 1, 1) + + self.retranslateUi(RareSettings) + QtCore.QMetaObject.connectSlotsByName(RareSettings) + + def retranslateUi(self, RareSettings): + _translate = QtCore.QCoreApplication.translate + RareSettings.setWindowTitle(_translate("RareSettings", "Form")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + RareSettings = QtWidgets.QWidget() + ui = Ui_RareSettings() + ui.setupUi(RareSettings) + RareSettings.show() + sys.exit(app.exec_()) diff --git a/resources/ui/components/tabs/settings/rare.ui b/resources/ui/components/tabs/settings/rare.ui index 21c96558..9dc922f6 100644 --- a/resources/ui/components/tabs/settings/rare.ui +++ b/resources/ui/components/tabs/settings/rare.ui @@ -1,7 +1,7 @@ - rare - + RareSettings + 0 From 36f045eec64b059b7342c126319a5cba02cce06d Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Tue, 27 Apr 2021 18:29:48 +0300 Subject: [PATCH 05/34] Update About tab --- rare/components/tabs/settings/about.py | 4 +- rare/components/tabs/settings/about_ui.py | 151 ++++++++-------------- 2 files changed, 55 insertions(+), 100 deletions(-) diff --git a/rare/components/tabs/settings/about.py b/rare/components/tabs/settings/about.py index c00775f1..d9f52999 100644 --- a/rare/components/tabs/settings/about.py +++ b/rare/components/tabs/settings/about.py @@ -21,7 +21,7 @@ class About(QWidget, Ui_About): self.version.setText(__version__) - self.update_lbl.setVisible(False) + self.lbl_update.setVisible(False) self.update.setVisible(False) self.open_browser.setVisible(False) @@ -35,6 +35,6 @@ class About(QWidget, Ui_About): if self.update_available: print(f"Update available: {__version__} -> {latest_tag}") - self.update_lbl.setVisible(True) + self.lbl_update.setVisible(True) self.update.setVisible(True) self.open_browser.setVisible(True) diff --git a/rare/components/tabs/settings/about_ui.py b/rare/components/tabs/settings/about_ui.py index 7c4d28f5..3da76f71 100644 --- a/rare/components/tabs/settings/about_ui.py +++ b/rare/components/tabs/settings/about_ui.py @@ -17,120 +17,75 @@ class Ui_About(object): About.resize(499, 396) self.gridLayout = QtWidgets.QGridLayout(About) self.gridLayout.setObjectName("gridLayout") - self.title = QtWidgets.QLabel(About) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.title.sizePolicy().hasHeightForWidth()) - self.title.setSizePolicy(sizePolicy) - self.title.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) - self.title.setObjectName("title") - self.gridLayout.addWidget(self.title, 0, 0, 1, 3) - self.version_lbl = QtWidgets.QLabel(About) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.version_lbl.sizePolicy().hasHeightForWidth()) - self.version_lbl.setSizePolicy(sizePolicy) - self.version_lbl.setObjectName("version_lbl") - self.gridLayout.addWidget(self.version_lbl, 1, 0, 1, 1) - self.license = QtWidgets.QLabel(About) - self.license.setObjectName("license") - self.gridLayout.addWidget(self.license, 7, 1, 1, 3) - self.license_lbl = QtWidgets.QLabel(About) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.license_lbl.sizePolicy().hasHeightForWidth()) - self.license_lbl.setSizePolicy(sizePolicy) - self.license_lbl.setObjectName("license_lbl") - self.gridLayout.addWidget(self.license_lbl, 7, 0, 1, 1) - spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.gridLayout.addItem(spacerItem, 14, 0, 1, 4) - self.dev_lbl = QtWidgets.QLabel(About) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.dev_lbl.sizePolicy().hasHeightForWidth()) - self.dev_lbl.setSizePolicy(sizePolicy) - self.dev_lbl.setObjectName("dev_lbl") - self.gridLayout.addWidget(self.dev_lbl, 5, 0, 1, 1) - self.lgd_dev_lbl = QtWidgets.QLabel(About) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.lgd_dev_lbl.sizePolicy().hasHeightForWidth()) - self.lgd_dev_lbl.setSizePolicy(sizePolicy) - self.lgd_dev_lbl.setObjectName("lgd_dev_lbl") - self.gridLayout.addWidget(self.lgd_dev_lbl, 6, 0, 1, 1) - self.update_lbl = QtWidgets.QLabel(About) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.update_lbl.sizePolicy().hasHeightForWidth()) - self.update_lbl.setSizePolicy(sizePolicy) - self.update_lbl.setObjectName("update_lbl") - self.gridLayout.addWidget(self.update_lbl, 2, 0, 1, 1) - self.lgd_dev = QtWidgets.QLabel(About) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.lgd_dev.sizePolicy().hasHeightForWidth()) - self.lgd_dev.setSizePolicy(sizePolicy) - self.lgd_dev.setOpenExternalLinks(True) - self.lgd_dev.setObjectName("lgd_dev") - self.gridLayout.addWidget(self.lgd_dev, 6, 1, 1, 3) - self.dev = QtWidgets.QLabel(About) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.dev.sizePolicy().hasHeightForWidth()) - self.dev.setSizePolicy(sizePolicy) - self.dev.setOpenExternalLinks(True) - self.dev.setObjectName("dev") - self.gridLayout.addWidget(self.dev, 5, 1, 1, 3) - self.update = QtWidgets.QLabel(About) - self.update.setObjectName("update") - self.gridLayout.addWidget(self.update, 2, 1, 1, 3) - self.version = QtWidgets.QLabel(About) - self.version.setObjectName("version") - self.gridLayout.addWidget(self.version, 1, 1, 1, 3) self.open_browser = QtWidgets.QPushButton(About) self.open_browser.setObjectName("open_browser") - self.gridLayout.addWidget(self.open_browser, 4, 0, 1, 4) + self.gridLayout.addWidget(self.open_browser, 4, 1, 1, 1) + self.lbl_version = QtWidgets.QLabel(About) + self.lbl_version.setObjectName("lbl_version") + self.gridLayout.addWidget(self.lbl_version, 2, 0, 1, 1, QtCore.Qt.AlignRight) + self.lbl_license = QtWidgets.QLabel(About) + self.lbl_license.setObjectName("lbl_license") + self.gridLayout.addWidget(self.lbl_license, 7, 0, 1, 1, QtCore.Qt.AlignRight) + self.lbl_lgd_dev = QtWidgets.QLabel(About) + self.lbl_lgd_dev.setObjectName("lbl_lgd_dev") + self.gridLayout.addWidget(self.lbl_lgd_dev, 6, 0, 1, 1) + self.dev = QtWidgets.QLabel(About) + self.dev.setOpenExternalLinks(True) + self.dev.setObjectName("dev") + self.gridLayout.addWidget(self.dev, 5, 1, 1, 1) + self.lbl_update = QtWidgets.QLabel(About) + self.lbl_update.setObjectName("lbl_update") + self.gridLayout.addWidget(self.lbl_update, 3, 0, 1, 1, QtCore.Qt.AlignRight) + self.version = QtWidgets.QLabel(About) + self.version.setObjectName("version") + self.gridLayout.addWidget(self.version, 2, 1, 1, 1) + self.lbl_dev = QtWidgets.QLabel(About) + self.lbl_dev.setObjectName("lbl_dev") + self.gridLayout.addWidget(self.lbl_dev, 5, 0, 1, 1, QtCore.Qt.AlignRight) + self.license = QtWidgets.QLabel(About) + self.license.setObjectName("license") + self.gridLayout.addWidget(self.license, 7, 1, 1, 1) + self.update = QtWidgets.QLabel(About) + self.update.setObjectName("update") + self.gridLayout.addWidget(self.update, 3, 1, 1, 1) + self.lgd_dev = QtWidgets.QLabel(About) + self.lgd_dev.setOpenExternalLinks(True) + self.lgd_dev.setObjectName("lgd_dev") + self.gridLayout.addWidget(self.lgd_dev, 6, 1, 1, 1) self.info_text = QtWidgets.QLabel(About) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.info_text.sizePolicy().hasHeightForWidth()) - self.info_text.setSizePolicy(sizePolicy) - self.info_text.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) self.info_text.setWordWrap(True) self.info_text.setOpenExternalLinks(True) self.info_text.setObjectName("info_text") - self.gridLayout.addWidget(self.info_text, 8, 0, 1, 4) + self.gridLayout.addWidget(self.info_text, 14, 0, 1, 3) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.gridLayout.addItem(spacerItem, 15, 0, 1, 3) + self.title = QtWidgets.QLabel(About) + self.title.setObjectName("title") + self.gridLayout.addWidget(self.title, 1, 0, 1, 3) + spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.gridLayout.addItem(spacerItem1, 2, 2, 6, 1) self.retranslateUi(About) QtCore.QMetaObject.connectSlotsByName(About) def retranslateUi(self, About): _translate = QtCore.QCoreApplication.translate - About.setWindowTitle(_translate("About", "Form")) - self.title.setText(_translate("About", "

About

")) - self.version_lbl.setText(_translate("About", "Version: ")) - self.license.setText(_translate("About", "GNU General Public License v3.0")) - self.license_lbl.setText(_translate("About", "License:")) - self.dev_lbl.setText(_translate("About", "Rare Developer:")) - self.lgd_dev_lbl.setText(_translate("About", "Legendary Developer:")) - self.update_lbl.setText(_translate("About", "Update available: ")) - self.lgd_dev.setToolTip(_translate("About", "Github")) - self.lgd_dev.setText(_translate("About", "derrod")) + About.setWindowTitle(_translate("About", "About")) + self.open_browser.setText(_translate("About", "Download latest release")) + self.lbl_version.setText(_translate("About", "Version:")) + self.lbl_license.setText(_translate("About", "License:")) + self.lbl_lgd_dev.setText(_translate("About", "Legendary Developer:")) self.dev.setToolTip(_translate("About", "Github")) self.dev.setText(_translate("About", "Dummerle")) - self.update.setText(_translate("About", "update")) + self.lbl_update.setText(_translate("About", "Update available:")) self.version.setText(_translate("About", "version")) - self.open_browser.setText(_translate("About", "Download latest release")) + self.lbl_dev.setText(_translate("About", "Rare Developer:")) + self.license.setText(_translate("About", "GNU General Public License v3.0")) + self.update.setText(_translate("About", "update")) + self.lgd_dev.setToolTip(_translate("About", "Github")) + self.lgd_dev.setText(_translate("About", "derrod")) self.info_text.setText(_translate("About", "This is a beta version, so you can get bugs. If you get a bug, please report it by creating an Issue on Github. You can also contact me on Discord (Dummerle#7419). Or you can join the Discord server")) + self.title.setText(_translate("About", "

About

")) if __name__ == "__main__": From a00ff074a0bcb83edc8d36d7f4f598c2c740d517 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Tue, 27 Apr 2021 18:30:23 +0300 Subject: [PATCH 06/34] Update About UI file --- .../ui/components/tabs/settings/about.ui | 245 +++++++----------- 1 file changed, 99 insertions(+), 146 deletions(-) diff --git a/resources/ui/components/tabs/settings/about.ui b/resources/ui/components/tabs/settings/about.ui index 9aba2f24..f2eb5471 100644 --- a/resources/ui/components/tabs/settings/about.ui +++ b/resources/ui/components/tabs/settings/about.ui @@ -11,59 +11,112 @@
- Form + About - - - - - 0 - 0 - - + + - <h2>About</h2> - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Download latest release - - - - - 0 - 0 - - + + - Version: + Version: - + + + + License: + + + + + + + Legendary Developer: + + + + + + + Github + + + <a href='https://github.com/Dummerle'>Dummerle</a> + + + true + + + + + + + Update available: + + + + + + + version + + + + + + + Rare Developer: + + + + GNU General Public License v3.0 - - - - - 0 - 0 - - + + - License: + update - + + + + Github + + + <a href='https://github.com/derrod/'>derrod</a> + + + true + + + + + + + This is a beta version, so you can get bugs. If you get a bug, please report it by creating an Issue on <a href='https://github.com/Dummerle/Rare/issues'>Github</a>. You can also contact me on Discord (Dummerle#7419). Or you can join the <a href='https://discord.gg/YvmABK9YSk'>Discord server</a> + + + true + + + true + + + + Qt::Vertical @@ -76,125 +129,25 @@ - - - - - 0 - 0 - - + + - Rare Developer: + <h2>About</h2> - - - - - 0 - 0 - + + + + Qt::Horizontal - - Legendary Developer: + + + 40 + 20 + - - - - - - - 0 - 0 - - - - Update available: - - - - - - - - 0 - 0 - - - - Github - - - <a href='https://github.com/derrod/'>derrod</a> - - - true - - - - - - - - 0 - 0 - - - - Github - - - <a href='https://github.com/Dummerle'>Dummerle</a> - - - true - - - - - - - update - - - - - - - version - - - - - - - Download latest release - - - - - - - - 0 - 0 - - - - This is a beta version, so you can get bugs. If you get a bug, please report it by creating an Issue on <a href='https://github.com/Dummerle/Rare/issues'>Github</a>. You can also contact me on Discord (Dummerle#7419). Or you can join the <a href='https://discord.gg/YvmABK9YSk'>Discord server</a> - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - true - - - true - - +
From b138766f1dfdfeba31ca71645ccf1e9ed6d3d903 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Tue, 27 Apr 2021 18:40:10 +0300 Subject: [PATCH 07/34] Updated the settings UI to use widgets generated through Qt Designer Since many lines were changed due to components being reused, the more important are listed below per file. Static strings were moved to the UI files for translation purposes and some messages have been re-worded. `extra_widgets.py`: PathEdit now contains the save button and the dialog can also filter by name, all forms using it have been updated `rare.py`: Updated the look and fixed a bug where the Image Directory wouldn't change if `img_dir` wasn't specified in the settings file `legendary.py`: Update the look, changed the Max Workers option into a SpinBox `linux.py`: Update the look, changed Wine Executable option in to a PathEdit that filters for `wine` and `wine64`. `game_settings.py`: Updated to reflect the changes in `linux.py` settings widget. Added the system `compatibilitytools.d` to be search for potential proton versions --- .../tabs/games/game_info/game_settings.py | 30 +++-- rare/components/tabs/settings/legendary.py | 70 ++++------- rare/components/tabs/settings/legendary_ui.py | 85 +++++++++++++ rare/components/tabs/settings/linux.py | 58 +++++---- rare/components/tabs/settings/linux_ui.py | 72 +++++++++++ rare/components/tabs/settings/rare.py | 91 +++++++------- rare/components/tabs/settings/rare_ui.py | 116 ++++++++++++++---- rare/components/tabs/settings/rpc_settings.py | 37 +++--- .../tabs/settings/rpc_settings_ui.py | 68 ++++++++++ rare/utils/extra_widgets.py | 18 +-- rare/utils/pathedit_ui.py | 51 ++++++++ 11 files changed, 513 insertions(+), 183 deletions(-) create mode 100644 rare/components/tabs/settings/legendary_ui.py create mode 100644 rare/components/tabs/settings/linux_ui.py create mode 100644 rare/components/tabs/settings/rpc_settings_ui.py create mode 100644 rare/utils/pathedit_ui.py diff --git a/rare/components/tabs/games/game_info/game_settings.py b/rare/components/tabs/games/game_info/game_settings.py index 062ff766..c0cd5382 100644 --- a/rare/components/tabs/games/game_info/game_settings.py +++ b/rare/components/tabs/games/game_info/game_settings.py @@ -69,10 +69,16 @@ class GameSettings(QScrollArea): self.possible_proton_wrappers = [] try: - for i in os.listdir(os.path.expanduser("~/.steam/steam/steamapps/common")): - if i.startswith("Proton"): - wrapper = '"' + os.path.join(os.path.expanduser("~/.steam/steam/steamapps/common"), i, - "proton") + '" run' + compatibilitytools_dirs = [ + os.path.expanduser("~/.steam/steam/steamapps/common"), + "/usr/share/steam/compatibilitytools.d" + ] + for c in compatibilitytools_dirs: + for i in os.listdir(c): + proton = os.path.join(c, i, "proton") + vdf = os.path.join(c, i, "compatibilitytool.vdf") + if os.path.exists(proton) and os.path.exists(vdf): + wrapper = '"' + proton + '" run' self.possible_proton_wrappers.append(wrapper) except FileNotFoundError as e: print("Unable to find any Proton version") @@ -81,14 +87,14 @@ class GameSettings(QScrollArea): self.select_proton.addItems(["Don't use Proton"] + self.possible_proton_wrappers) self.select_proton.currentIndexChanged.connect(self.change_proton) self.select_proton_widget = SettingsWidget(self.tr("Proton Wrapper"), self.select_proton) - self.linux_settings.layout.addWidget(self.select_proton_widget) + self.linux_settings.layout_proton.addWidget(self.select_proton_widget) self.proton_prefix = PathEdit("x", QFileDialog.DirectoryOnly) self.proton_prefix_accept_button = QPushButton(self.tr("Save")) self.proton_prefix_accept_button.clicked.connect(self.update_prefix) self.proton_prefix_widget = SettingsWidget(self.tr("Proton prefix"), self.proton_prefix, self.proton_prefix_accept_button) - self.linux_settings.layout.addWidget(self.proton_prefix_widget) + self.linux_settings.layout_proton.addWidget(self.proton_prefix_widget) # startparams, skip_update_check @@ -98,7 +104,7 @@ class GameSettings(QScrollArea): def save_line_edit(self, option, value): if value != "": - if not self.game.app_name in self.core.lgd.config.sections(): + if not (self.game.app_name in self.core.lgd.config.sections()): self.core.lgd.config.add_section(self.game.app_name) self.core.lgd.config.set(self.game.app_name, option, value) else: @@ -215,7 +221,7 @@ class GameSettings(QScrollArea): self.title.setText(f"

{self.game.app_title}

") if os.name != "nt": self.linux_settings.update_game(app_name) - self.linux_settings.dxvk_widget.update_settings(app_name) + self.linux_settings.dxvk.update_settings(app_name) proton = self.core.lgd.config.get(f"{app_name}", "wrapper", fallback="").replace('"', "") if proton != "": self.proton_prefix_widget.setVisible(True) @@ -247,7 +253,7 @@ class LinuxAppSettings(LinuxSettings): def update_game(self, app_name): self.name = app_name - self.select_path.text_edit.setText(self.core.lgd.config.get(self.name, "wine_prefix", fallback="")) - self.select_wine_exec.setText(self.core.lgd.config.get(self.name, "wine_executable", fallback="")) - self.dxvk_widget.name = app_name - self.dxvk_widget.more_settings_widget.name = app_name + self.wine_prefix.text_edit.setText(self.core.lgd.config.get(self.name, "wine_prefix", fallback="")) + self.wine_exec.text_edit.setText(self.core.lgd.config.get(self.name, "wine_executable", fallback="")) + self.dxvk.name = app_name + self.dxvk.more_settings_widget.name = app_name diff --git a/rare/components/tabs/settings/legendary.py b/rare/components/tabs/settings/legendary.py index 83053709..419f31ed 100644 --- a/rare/components/tabs/settings/legendary.py +++ b/rare/components/tabs/settings/legendary.py @@ -1,71 +1,51 @@ from logging import getLogger -from PyQt5.QtCore import Qt -from PyQt5.QtGui import QIntValidator -from PyQt5.QtWidgets import QVBoxLayout, QFileDialog, QPushButton, QLineEdit, QGroupBox, QMessageBox, \ - QScrollArea +from PyQt5.QtWidgets import QFileDialog, QMessageBox, QWidget from custom_legendary.core import LegendaryCore -from rare.components.tabs.settings.settings_widget import SettingsWidget from rare.utils.extra_widgets import PathEdit from rare.utils.utils import get_size +from .legendary_ui import Ui_LegendarySettings logger = getLogger("LegendarySettings") -class LegendarySettings(QScrollArea): +class LegendarySettings(QWidget, Ui_LegendarySettings): def __init__(self, core: LegendaryCore): super(LegendarySettings, self).__init__() - self.widget = QGroupBox(self.tr("Legendary settings")) - self.setWidgetResizable(True) - self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) - self.layout = QVBoxLayout() + self.setupUi(self) + self.core = core - self.widget.setObjectName("group") # Default installation directory - self.select_path = PathEdit(core.get_default_install_dir(), type_of_file=QFileDialog.DirectoryOnly, + self.install_dir = PathEdit(core.get_default_install_dir(), type_of_file=QFileDialog.DirectoryOnly, infotext="Default") - self.select_path.text_edit.textChanged.connect(lambda t: self.save_path_button.setDisabled(False)) - self.save_path_button = QPushButton("Save") - self.save_path_button.clicked.connect(self.save_path) - self.install_dir_widget = SettingsWidget(self.tr("Default installation directory"), self.select_path, - self.save_path_button) - self.layout.addWidget(self.install_dir_widget) + self.install_dir.text_edit.textChanged.connect( + lambda t: self.install_dir.save_path_button.setDisabled(False) + ) + self.install_dir.save_path_button.clicked.connect(self.save_path) + self.install_dir.save_path_button.setDisabled(True) + self.layout_install_dir.addWidget(self.install_dir) # Max Workers - self.max_worker_select = QLineEdit(self.core.lgd.config["Legendary"].get("max_workers")) - self.max_worker_select.setValidator(QIntValidator()) - self.max_worker_select.setPlaceholderText("Default") - self.max_worker_select.textChanged.connect(self.max_worker_save) - self.max_worker_widget = SettingsWidget(self.tr("Max workers for Download (Less: slower download)(0: Default)"), - self.max_worker_select) - self.layout.addWidget(self.max_worker_widget) + max_workers = self.core.lgd.config["Legendary"].get("max_workers", fallback=0) + self.max_worker_select.setValue(int(max_workers)) + self.max_worker_select.valueChanged.connect(self.max_worker_save) - # cleanup - self.clean_layout = QVBoxLayout() - self.cleanup_widget = QGroupBox(self.tr("Cleanup")) - self.clean_button = QPushButton(self.tr("Remove everything")) - self.clean_button.clicked.connect(lambda: self.cleanup(False)) - self.clean_layout.addWidget(self.clean_button) - - self.clean_button_without_manifests = QPushButton(self.tr("Clean, but keep manifests")) - self.clean_button_without_manifests.clicked.connect(lambda: self.cleanup(True)) - self.clean_layout.addWidget(self.clean_button_without_manifests) - - self.cleanup_widget.setLayout(self.clean_layout) - self.layout.addWidget(self.cleanup_widget) - - self.layout.addStretch(1) - self.widget.setLayout(self.layout) - self.setWidget(self.widget) + # Cleanup + self.clean_button.clicked.connect( + lambda: self.cleanup(False) + ) + self.clean_button_without_manifests.clicked.connect( + lambda: self.cleanup(True) + ) def save_path(self): - self.core.lgd.config["Legendary"]["install_dir"] = self.select_path.text() - if self.select_path.text() == "" and "install_dir" in self.core.lgd.config["Legendary"].keys(): + self.core.lgd.config["Legendary"]["install_dir"] = self.install_dir.text() + if self.install_dir.text() == "" and "install_dir" in self.core.lgd.config["Legendary"].keys(): self.core.lgd.config["Legendary"].pop("install_dir") else: - logger.info("Set config install_dir to " + self.select_path.text()) + logger.info("Set config install_dir to " + self.install_dir.text()) self.core.lgd.save_config() def max_worker_save(self, num_workers: str): diff --git a/rare/components/tabs/settings/legendary_ui.py b/rare/components/tabs/settings/legendary_ui.py new file mode 100644 index 00000000..dcf8f247 --- /dev/null +++ b/rare/components/tabs/settings/legendary_ui.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'resources/ui/components/tabs/settings/legendary.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_LegendarySettings(object): + def setupUi(self, LegendarySettings): + LegendarySettings.setObjectName("LegendarySettings") + LegendarySettings.resize(647, 476) + self.layout_legendary = QtWidgets.QGridLayout(LegendarySettings) + self.layout_legendary.setObjectName("layout_legendary") + self.gb_install_dir = QtWidgets.QGroupBox(LegendarySettings) + self.gb_install_dir.setObjectName("gb_install_dir") + self.layout_install_dir = QtWidgets.QVBoxLayout(self.gb_install_dir) + self.layout_install_dir.setObjectName("layout_install_dir") + self.layout_legendary.addWidget(self.gb_install_dir, 0, 0, 1, 1) + self.gb_downloads = QtWidgets.QGroupBox(LegendarySettings) + self.gb_downloads.setObjectName("gb_downloads") + self.layout_downloads = QtWidgets.QGridLayout(self.gb_downloads) + self.layout_downloads.setObjectName("layout_downloads") + self.lbl_max_workers = QtWidgets.QLabel(self.gb_downloads) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lbl_max_workers.sizePolicy().hasHeightForWidth()) + self.lbl_max_workers.setSizePolicy(sizePolicy) + self.lbl_max_workers.setObjectName("lbl_max_workers") + self.layout_downloads.addWidget(self.lbl_max_workers, 0, 0, 1, 1) + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.layout_downloads.addItem(spacerItem, 0, 3, 1, 1) + self.max_worker_select = QtWidgets.QSpinBox(self.gb_downloads) + self.max_worker_select.setObjectName("max_worker_select") + self.layout_downloads.addWidget(self.max_worker_select, 0, 1, 1, 1) + self.lbl_max_workers_info = QtWidgets.QLabel(self.gb_downloads) + font = QtGui.QFont() + font.setItalic(True) + self.lbl_max_workers_info.setFont(font) + self.lbl_max_workers_info.setObjectName("lbl_max_workers_info") + self.layout_downloads.addWidget(self.lbl_max_workers_info, 0, 2, 1, 1) + self.layout_legendary.addWidget(self.gb_downloads, 1, 0, 1, 1) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.layout_legendary.addItem(spacerItem1, 2, 0, 1, 2) + self.gb_clean = QtWidgets.QGroupBox(LegendarySettings) + self.gb_clean.setObjectName("gb_clean") + self.layout_clean = QtWidgets.QVBoxLayout(self.gb_clean) + self.layout_clean.setObjectName("layout_clean") + self.clean_button_without_manifests = QtWidgets.QPushButton(self.gb_clean) + self.clean_button_without_manifests.setObjectName("clean_button_without_manifests") + self.layout_clean.addWidget(self.clean_button_without_manifests) + self.clean_button = QtWidgets.QPushButton(self.gb_clean) + self.clean_button.setObjectName("clean_button") + self.layout_clean.addWidget(self.clean_button) + self.layout_legendary.addWidget(self.gb_clean, 0, 1, 1, 1) + + self.retranslateUi(LegendarySettings) + QtCore.QMetaObject.connectSlotsByName(LegendarySettings) + + def retranslateUi(self, LegendarySettings): + _translate = QtCore.QCoreApplication.translate + LegendarySettings.setWindowTitle(_translate("LegendarySettings", "LegendarySettings")) + self.gb_install_dir.setTitle(_translate("LegendarySettings", "Default Installation Directory")) + self.gb_downloads.setTitle(_translate("LegendarySettings", "Download Settings")) + self.lbl_max_workers.setText(_translate("LegendarySettings", "Max Workers:")) + self.lbl_max_workers_info.setText(_translate("LegendarySettings", "Less is slower (0: Default)")) + self.gb_clean.setTitle(_translate("LegendarySettings", "Cleanup")) + self.clean_button_without_manifests.setText(_translate("LegendarySettings", "Clean, but keep manifests")) + self.clean_button.setText(_translate("LegendarySettings", "Remove everything")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + LegendarySettings = QtWidgets.QWidget() + ui = Ui_LegendarySettings() + ui.setupUi(LegendarySettings) + LegendarySettings.show() + sys.exit(app.exec_()) diff --git a/rare/components/tabs/settings/linux.py b/rare/components/tabs/settings/linux.py index 01ea32f3..c08a9d5f 100644 --- a/rare/components/tabs/settings/linux.py +++ b/rare/components/tabs/settings/linux.py @@ -1,51 +1,56 @@ from logging import getLogger -from PyQt5.QtWidgets import QVBoxLayout, QPushButton, QFileDialog, QLineEdit, QGroupBox +from PyQt5.QtWidgets import QFileDialog, QWidget from custom_legendary.core import LegendaryCore from rare.components.tabs.settings.dxvk import DxvkWidget -from rare.components.tabs.settings.settings_widget import SettingsWidget from rare.utils.extra_widgets import PathEdit +from .linux_ui import Ui_LinuxSettings logger = getLogger("LinuxSettings") -class LinuxSettings(QGroupBox): +class LinuxSettings(QWidget, Ui_LinuxSettings): def __init__(self, core: LegendaryCore, name="default"): super(LinuxSettings, self).__init__() - self.layout = QVBoxLayout() + self.setupUi(self) + self.name = name self.core = core - self.setTitle(self.tr("Linux settings")) - self.setObjectName("group") + # Wineprefix - self.select_path = PathEdit(self.core.lgd.config.get(self.name, "wine_prefix", fallback=""), + self.wine_prefix = PathEdit(self.core.lgd.config.get(self.name, "wine_prefix", fallback=""), type_of_file=QFileDialog.DirectoryOnly, infotext="Default") - self.select_path.text_edit.textChanged.connect(lambda t: self.save_path_button.setDisabled(False)) - self.save_path_button = QPushButton("Save") - self.save_path_button.clicked.connect(lambda: self.save_setting(self.select_path, "wine_prefix")) - self.install_dir_widget = SettingsWidget(self.tr("Default Wine Prefix"), self.select_path, - self.save_path_button) - self.layout.addWidget(self.install_dir_widget) + self.wine_prefix.text_edit.textChanged.connect( + lambda t: self.wine_prefix.save_path_button.setDisabled(False) + ) + self.wine_prefix.save_path_button.clicked.connect( + lambda: self.save_setting(self.wine_prefix, "wine_prefix") + ) + self.wine_prefix.save_path_button.setDisabled(True) + self.layout_prefix.addWidget(self.wine_prefix) # Wine executable - self.select_wine_exec = QLineEdit(self.core.lgd.config.get(self.name, "wine_executable", fallback="")) - self.save_wine_exec = QPushButton("Save") - self.save_wine_exec.clicked.connect(lambda: self.save_setting(self.select_wine_exec, "wine_executable")) - self.install_dir_widget = SettingsWidget(self.tr("Default Wine executable"), self.select_wine_exec, - self.save_wine_exec) - self.layout.addWidget(self.install_dir_widget) + self.wine_exec = PathEdit(self.core.lgd.config.get(self.name, "wine_executable", fallback=""), + type_of_file=QFileDialog.ExistingFile, + name_filter="Wine executable (wine wine64)", + infotext="Default") + self.wine_exec.text_edit.textChanged.connect( + lambda t: self.wine_exec.save_path_button.setDisabled(False) + ) + self.wine_exec.save_path_button.clicked.connect( + lambda: self.save_setting(self.wine_exec, "wine_executable") + ) + self.wine_exec.save_path_button.setDisabled(True) + self.layout_exec.addWidget(self.wine_exec) # dxvk - self.dxvk_widget = DxvkWidget(core) - self.layout.addWidget(self.dxvk_widget) - if name == "default": - self.layout.addStretch(1) - self.setLayout(self.layout) + self.dxvk = DxvkWidget(core) + self.layout_dxvk.addWidget(self.dxvk) - def save_setting(self, widget: QLineEdit, setting_name: str): - if not self.name in self.core.lgd.config.sections(): + def save_setting(self, widget: PathEdit, setting_name: str): + if self.name not in self.core.lgd.config.sections(): self.core.lgd.config.add_section(self.name) self.core.lgd.config.set(self.name, setting_name, widget.text()) @@ -55,4 +60,5 @@ class LinuxSettings(QGroupBox): logger.info("Set config of wine_prefix to " + widget.text()) if self.core.lgd.config[self.name] == {}: self.core.lgd.config.remove_section(self.name) + widget.save_path_button.setDisabled(True) self.core.lgd.save_config() diff --git a/rare/components/tabs/settings/linux_ui.py b/rare/components/tabs/settings/linux_ui.py new file mode 100644 index 00000000..a5de9bf6 --- /dev/null +++ b/rare/components/tabs/settings/linux_ui.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'resources/ui/components/tabs/settings/linux.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_LinuxSettings(object): + def setupUi(self, LinuxSettings): + LinuxSettings.setObjectName("LinuxSettings") + LinuxSettings.resize(569, 454) + self.layout_linux = QtWidgets.QGridLayout(LinuxSettings) + self.layout_linux.setObjectName("layout_linux") + self.layout_dxvk = QtWidgets.QVBoxLayout() + self.layout_dxvk.setObjectName("layout_dxvk") + self.layout_linux.addLayout(self.layout_dxvk, 2, 0, 1, 1) + self.gb_wine = QtWidgets.QGroupBox(LinuxSettings) + self.gb_wine.setObjectName("gb_wine") + self.layout_wine = QtWidgets.QGridLayout(self.gb_wine) + self.layout_wine.setObjectName("layout_wine") + self.lbl_exec = QtWidgets.QLabel(self.gb_wine) + self.lbl_exec.setObjectName("lbl_exec") + self.layout_wine.addWidget(self.lbl_exec, 1, 0, 1, 1, QtCore.Qt.AlignRight) + self.lbl_prefix = QtWidgets.QLabel(self.gb_wine) + self.lbl_prefix.setObjectName("lbl_prefix") + self.layout_wine.addWidget(self.lbl_prefix, 0, 0, 1, 1, QtCore.Qt.AlignRight) + self.frame_prefix = QtWidgets.QFrame(self.gb_wine) + self.frame_prefix.setFrameShape(QtWidgets.QFrame.StyledPanel) + self.frame_prefix.setFrameShadow(QtWidgets.QFrame.Sunken) + self.frame_prefix.setObjectName("frame_prefix") + self.layout_prefix = QtWidgets.QVBoxLayout(self.frame_prefix) + self.layout_prefix.setObjectName("layout_prefix") + self.layout_wine.addWidget(self.frame_prefix, 0, 1, 1, 1) + self.frame_exec = QtWidgets.QFrame(self.gb_wine) + self.frame_exec.setFrameShape(QtWidgets.QFrame.StyledPanel) + self.frame_exec.setFrameShadow(QtWidgets.QFrame.Sunken) + self.frame_exec.setObjectName("frame_exec") + self.layout_exec = QtWidgets.QVBoxLayout(self.frame_exec) + self.layout_exec.setObjectName("layout_exec") + self.layout_wine.addWidget(self.frame_exec, 1, 1, 1, 1) + self.layout_linux.addWidget(self.gb_wine, 0, 0, 1, 1) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.layout_linux.addItem(spacerItem, 4, 0, 1, 1) + self.layout_proton = QtWidgets.QVBoxLayout() + self.layout_proton.setObjectName("layout_proton") + self.layout_linux.addLayout(self.layout_proton, 1, 0, 1, 1) + + self.retranslateUi(LinuxSettings) + QtCore.QMetaObject.connectSlotsByName(LinuxSettings) + + def retranslateUi(self, LinuxSettings): + _translate = QtCore.QCoreApplication.translate + LinuxSettings.setWindowTitle(_translate("LinuxSettings", "LinuxSettings")) + self.gb_wine.setTitle(_translate("LinuxSettings", "Default Wine Settings")) + self.lbl_exec.setText(_translate("LinuxSettings", "Wine executable:")) + self.lbl_prefix.setText(_translate("LinuxSettings", "Wine prefix:")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + LinuxSettings = QtWidgets.QWidget() + ui = Ui_LinuxSettings() + ui.setupUi(LinuxSettings) + LinuxSettings.show() + sys.exit(app.exec_()) diff --git a/rare/components/tabs/settings/rare.py b/rare/components/tabs/settings/rare.py index ebcb0b0c..f7290af9 100644 --- a/rare/components/tabs/settings/rare.py +++ b/rare/components/tabs/settings/rare.py @@ -5,10 +5,9 @@ import sys from logging import getLogger from PyQt5.QtCore import QSettings -from PyQt5.QtWidgets import QFileDialog, QComboBox, QPushButton, QCheckBox, QWidget, QSpacerItem, QSizePolicy +from PyQt5.QtWidgets import QFileDialog, QWidget from rare.components.tabs.settings.rpc_settings import RPCSettings -from rare.components.tabs.settings.settings_widget import SettingsWidget from rare.utils.extra_widgets import PathEdit from rare.utils.utils import get_lang, get_possible_langs from .rare_ui import Ui_RareSettings @@ -27,52 +26,59 @@ class RareSettings(QWidget, Ui_RareSettings): super(RareSettings, self).__init__() self.setupUi(self) - # (option_name, group_text, checkbox_text, default + # (widget_name, option_name, default) self.checkboxes = [ - ("sys_tray", self.tr("Hide to System Tray Icon"), self.tr("Exit to System Tray Icon"), True), - ("auto_update", self.tr("Automatically update Games on startup"), self.tr("Auto updates"), - False), - ("confirm_start", self.tr("Confirm launch of game"), self.tr("Confirm launch of game"), - False), - ("auto_sync_cloud", self.tr("Auto sync with cloud"), self.tr("Sync with cloud"), True), - ("notification", self.tr("Show Notifications after Downloads"), self.tr("Show notification"), - True), - ("save_size", self.tr("Save size of window after restart"), self.tr("Save size"), False) - ] + (self.sys_tray, "sys_tray", True), + (self.auto_update, "auto_update", False), + (self.confirm_start, "confirm_start", False), + (self.auto_sync_cloud, "auto_sync_cloud", True), + (self.notification, "notification", True), + (self.save_size, "save_size", False) + ] self.settings = QSettings() - img_dir = self.settings.value("img_dir", os.path.expanduser("~/.cache/rare/images/"), type=str) + self.img_dir_path = self.settings.value("img_dir", os.path.expanduser("~/.cache/rare/images/"), type=str) language = self.settings.value("language", get_lang(), type=str) - # select Image dir - self.select_path = PathEdit(img_dir, type_of_file=QFileDialog.DirectoryOnly) - self.select_path.text_edit.textChanged.connect(lambda t: self.save_path_button.setDisabled(False)) - self.save_path_button = QPushButton(self.tr("Save")) - self.save_path_button.clicked.connect(self.save_path) - self.img_dir = SettingsWidget(self.tr("Image Directory"), self.select_path, self.save_path_button) - self.layout().replaceWidget(self.img_dir_ph, self.img_dir) + + # Select Image directory + self.img_dir = PathEdit(self.img_dir_path, type_of_file=QFileDialog.DirectoryOnly) + self.img_dir.text_edit.textChanged.connect(lambda t: self.img_dir.save_path_button.setDisabled(False)) + self.img_dir.save_path_button.clicked.connect(self.save_path) + self.img_dir.save_path_button.setDisabled(True) + self.layout_img_dir.addWidget(self.img_dir) # Select lang - self.select_lang = QComboBox() self.select_lang.addItems([i[1] for i in languages]) if language in get_possible_langs(): index = [lang[0] for lang in languages].index(language) self.select_lang.setCurrentIndex(index) else: self.select_lang.setCurrentIndex(0) - self.lang_widget = SettingsWidget(self.tr("Language"), self.select_lang) + self.info_lang.setVisible(False) self.select_lang.currentIndexChanged.connect(self.update_lang) - self.layout().replaceWidget(self.lang_widget_ph, self.lang_widget) self.rpc = RPCSettings() - self.layout().replaceWidget(self.rpc_ph, self.rpc) + self.layout_rpc.addWidget(self.rpc) - self.settings_widget = SettingsWidget("Behaviour", None) - for option, head_text, text, default in self.checkboxes: - checkbox = SettingsCheckbox(option, text, default) - checkbox.setToolTip(head_text) - self.settings_widget.layout.addWidget(checkbox) - self.settings_widget.layout.addItem(QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding)) - self.layout().replaceWidget(self.settings_widget_ph, self.settings_widget) + self.init_checkboxes(self.checkboxes) + self.sys_tray.stateChanged.connect( + lambda: self.settings.setValue("sys_tray", self.sys_tray.isChecked()) + ) + self.auto_update.stateChanged.connect( + lambda: self.settings.setValue("auto_update", self.auto_update.isChecked()) + ) + self.confirm_start.stateChanged.connect( + lambda: self.settings.setValue("confirm_start", self.confirm_start.isChecked()) + ) + self.auto_sync_cloud.stateChanged.connect( + lambda: self.settings.setValue("auto_sync_cloud", self.auto_sync_cloud.isChecked()) + ) + self.notification.stateChanged.connect( + lambda: self.settings.setValue("notification", self.notification.isChecked()) + ) + self.save_size.stateChanged.connect( + lambda: self.settings.setValue("save_size", self.save_size.isChecked()) + ) self.open_log_dir = QPushButton(self.tr("Open Log directory")) self.open_log_dir.clicked.connect(self.open_dir) @@ -91,16 +97,16 @@ class RareSettings(QWidget, Ui_RareSettings): self.settings.remove("window_size") def save_path(self): - self.save_path_button.setDisabled(True) + self.img_dir.save_path_button.setDisabled(True) self.update_path() def update_lang(self, i: int): self.settings.setValue("language", languages[i][0]) - self.lang_widget.info_text.setText(self.tr("Restart Application to activate changes")) + self.info_lang.setVisible(True) def update_path(self): - old_path = self.settings.value("img_dir", type=str) - new_path = self.select_path.text() + old_path = self.img_dir_path + new_path = self.img_dir.text() if old_path != new_path: if not os.path.exists(new_path): @@ -112,13 +118,10 @@ class RareSettings(QWidget, Ui_RareSettings): for i in os.listdir(old_path): shutil.move(os.path.join(old_path, i), os.path.join(new_path, i)) os.rmdir(old_path) + self.img_dir_path = new_path self.settings.setValue("img_dir", new_path) - -class SettingsCheckbox(QCheckBox): - def __init__(self, option, text, default): - super(SettingsCheckbox, self).__init__(text) - self.option = option - self.settings = QSettings() - self.setChecked(self.settings.value(option, default, bool)) - self.stateChanged.connect(lambda: self.settings.setValue(option, self.isChecked())) + def init_checkboxes(self, checkboxes): + for cb in checkboxes: + widget, option, default = cb + widget.setChecked(self.settings.value(option, default, bool)) diff --git a/rare/components/tabs/settings/rare_ui.py b/rare/components/tabs/settings/rare_ui.py index 584d8d70..f817c991 100644 --- a/rare/components/tabs/settings/rare_ui.py +++ b/rare/components/tabs/settings/rare_ui.py @@ -14,48 +14,110 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_RareSettings(object): def setupUi(self, RareSettings): RareSettings.setObjectName("RareSettings") - RareSettings.resize(633, 480) - self.gridLayout = QtWidgets.QGridLayout(RareSettings) + self.layout_rare = QtWidgets.QGridLayout(RareSettings) + self.layout_rare.setObjectName("layout_rare") + self.layout_rpc = QtWidgets.QVBoxLayout() + self.layout_rpc.setObjectName("layout_rpc") + self.layout_rare.addLayout(self.layout_rpc, 1, 1, 1, 1) + self.gb_lang = QtWidgets.QGroupBox(RareSettings) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.gb_lang.sizePolicy().hasHeightForWidth()) + self.gb_lang.setSizePolicy(sizePolicy) + self.gb_lang.setObjectName("gb_lang") + self.layout_lang = QtWidgets.QVBoxLayout(self.gb_lang) + self.layout_lang.setObjectName("layout_lang") + self.select_lang = QtWidgets.QComboBox(self.gb_lang) + self.select_lang.setObjectName("select_lang") + self.layout_lang.addWidget(self.select_lang, 0, QtCore.Qt.AlignTop) + self.info_lang = QtWidgets.QLabel(self.gb_lang) + font = QtGui.QFont() + font.setItalic(True) + self.info_lang.setFont(font) + self.info_lang.setWordWrap(True) + self.info_lang.setObjectName("info_lang") + self.layout_lang.addWidget(self.info_lang, 0, QtCore.Qt.AlignTop) + self.layout_rare.addWidget(self.gb_lang, 0, 1, 1, 1) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.layout_rare.addItem(spacerItem, 2, 0, 1, 2) + self.gb_img_dir = QtWidgets.QGroupBox(RareSettings) + self.gb_img_dir.setObjectName("gb_img_dir") + self.layout_img_dir = QtWidgets.QVBoxLayout(self.gb_img_dir) + self.layout_img_dir.setObjectName("layout_img_dir") + self.layout_rare.addWidget(self.gb_img_dir, 0, 0, 1, 1) + self.gb_settings = QtWidgets.QGroupBox(RareSettings) + self.gb_settings.setObjectName("gb_settings") + self.gridLayout = QtWidgets.QGridLayout(self.gb_settings) self.gridLayout.setObjectName("gridLayout") - self.img_dir_ph = QtWidgets.QWidget(RareSettings) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) + self.auto_update = QtWidgets.QCheckBox(self.gb_settings) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.img_dir_ph.sizePolicy().hasHeightForWidth()) - self.img_dir_ph.setSizePolicy(sizePolicy) - self.img_dir_ph.setObjectName("img_dir_ph") - self.gridLayout.addWidget(self.img_dir_ph, 0, 0, 1, 1) - self.settings_widget_ph = QtWidgets.QWidget(RareSettings) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) + sizePolicy.setHeightForWidth(self.auto_update.sizePolicy().hasHeightForWidth()) + self.auto_update.setSizePolicy(sizePolicy) + self.auto_update.setObjectName("auto_update") + self.gridLayout.addWidget(self.auto_update, 1, 0, 1, 1) + self.confirm_start = QtWidgets.QCheckBox(self.gb_settings) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.settings_widget_ph.sizePolicy().hasHeightForWidth()) - self.settings_widget_ph.setSizePolicy(sizePolicy) - self.settings_widget_ph.setObjectName("settings_widget_ph") - self.gridLayout.addWidget(self.settings_widget_ph, 1, 0, 1, 1) - self.rpc_ph = QtWidgets.QWidget(RareSettings) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) + sizePolicy.setHeightForWidth(self.confirm_start.sizePolicy().hasHeightForWidth()) + self.confirm_start.setSizePolicy(sizePolicy) + self.confirm_start.setObjectName("confirm_start") + self.gridLayout.addWidget(self.confirm_start, 2, 0, 1, 1) + self.sys_tray = QtWidgets.QCheckBox(self.gb_settings) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.rpc_ph.sizePolicy().hasHeightForWidth()) - self.rpc_ph.setSizePolicy(sizePolicy) - self.rpc_ph.setObjectName("rpc_ph") - self.gridLayout.addWidget(self.rpc_ph, 1, 1, 1, 1) - self.lang_widget_ph = QtWidgets.QWidget(RareSettings) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) + sizePolicy.setHeightForWidth(self.sys_tray.sizePolicy().hasHeightForWidth()) + self.sys_tray.setSizePolicy(sizePolicy) + self.sys_tray.setObjectName("sys_tray") + self.gridLayout.addWidget(self.sys_tray, 0, 0, 1, 1) + self.notification = QtWidgets.QCheckBox(self.gb_settings) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.lang_widget_ph.sizePolicy().hasHeightForWidth()) - self.lang_widget_ph.setSizePolicy(sizePolicy) - self.lang_widget_ph.setObjectName("lang_widget_ph") - self.gridLayout.addWidget(self.lang_widget_ph, 0, 1, 1, 1) + sizePolicy.setHeightForWidth(self.notification.sizePolicy().hasHeightForWidth()) + self.notification.setSizePolicy(sizePolicy) + self.notification.setObjectName("notification") + self.gridLayout.addWidget(self.notification, 0, 1, 1, 1) + self.auto_sync_cloud = QtWidgets.QCheckBox(self.gb_settings) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.auto_sync_cloud.sizePolicy().hasHeightForWidth()) + self.auto_sync_cloud.setSizePolicy(sizePolicy) + self.auto_sync_cloud.setObjectName("auto_sync_cloud") + self.gridLayout.addWidget(self.auto_sync_cloud, 3, 0, 1, 1) + self.save_size = QtWidgets.QCheckBox(self.gb_settings) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.save_size.sizePolicy().hasHeightForWidth()) + self.save_size.setSizePolicy(sizePolicy) + self.save_size.setObjectName("save_size") + self.gridLayout.addWidget(self.save_size, 1, 1, 1, 1) + spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.gridLayout.addItem(spacerItem1, 0, 2, 4, 1) + self.layout_rare.addWidget(self.gb_settings, 1, 0, 1, 1) self.retranslateUi(RareSettings) QtCore.QMetaObject.connectSlotsByName(RareSettings) def retranslateUi(self, RareSettings): _translate = QtCore.QCoreApplication.translate - RareSettings.setWindowTitle(_translate("RareSettings", "Form")) + RareSettings.setWindowTitle(_translate("RareSettings", "RareSettings")) + self.gb_lang.setTitle(_translate("RareSettings", "Language")) + self.info_lang.setText(_translate("RareSettings", "Restart Rare to apply the new settings.")) + self.gb_img_dir.setTitle(_translate("RareSettings", "Image Cache DIrectory")) + self.gb_settings.setTitle(_translate("RareSettings", "Behaviour")) + self.auto_update.setText(_translate("RareSettings", "Update games on application startup")) + self.confirm_start.setText(_translate("RareSettings", "Confirm game launch")) + self.sys_tray.setText(_translate("RareSettings", "Exit to System tray")) + self.notification.setText(_translate("RareSettings", "Show notification on download completion")) + self.auto_sync_cloud.setText(_translate("RareSettings", "Automatically sync with cloud")) + self.save_size.setText(_translate("RareSettings", "Restore window size on application startup")) if __name__ == "__main__": diff --git a/rare/components/tabs/settings/rpc_settings.py b/rare/components/tabs/settings/rpc_settings.py index 35acb13d..0995f695 100644 --- a/rare/components/tabs/settings/rpc_settings.py +++ b/rare/components/tabs/settings/rpc_settings.py @@ -1,40 +1,35 @@ from PyQt5.QtCore import QSettings, pyqtSignal -from PyQt5.QtWidgets import QGroupBox, QCheckBox, QVBoxLayout, QComboBox +from PyQt5.QtWidgets import QGroupBox + +from .rpc_settings_ui import Ui_RPCSettings -class RPCSettings(QGroupBox): +class RPCSettings(QGroupBox, Ui_RPCSettings): update_settings = pyqtSignal() def __init__(self): super(RPCSettings, self).__init__() - self.setTitle(self.tr("Discord RPC")) - self.setObjectName("settings_widget") - self.settings = QSettings() - self.layout = QVBoxLayout() + self.setupUi(self) + + self.settings = QSettings() - self.enable = QComboBox() - self.enable_states = [self.tr("Show when playing"), self.tr("Show always"), self.tr("Show never")] - self.enable.addItems(self.enable_states) self.enable.setCurrentIndex(self.settings.value("rpc_enable", 0, int)) - self.layout.addWidget(self.enable) self.enable.currentIndexChanged.connect(self.changed) - self.show_game = QCheckBox(self.tr("Show Game")) self.show_game.setChecked((self.settings.value("rpc_name", True, bool))) - self.layout.addWidget(self.show_game) - self.show_game.stateChanged.connect(lambda: self.settings.setValue("rpc_game", self.show_game.isChecked())) + self.show_game.stateChanged.connect( + lambda: self.settings.setValue("rpc_game", self.show_game.isChecked()) + ) - self.show_os = QCheckBox(self.tr("Show OS")) - self.layout.addWidget(self.show_os) self.show_os.setChecked((self.settings.value("rpc_os", True, bool))) - self.show_os.stateChanged.connect(lambda: self.settings.setValue("rpc_os", self.show_os.isChecked())) + self.show_os.stateChanged.connect( + lambda: self.settings.setValue("rpc_os", self.show_os.isChecked()) + ) - self.show_time = QCheckBox(self.tr("Show Time playing")) - self.layout.addWidget(self.show_time) self.show_time.setChecked((self.settings.value("rpc_time", True, bool))) - self.show_time.stateChanged.connect(lambda: self.settings.setValue("rpc_time", self.show_time.isChecked())) - - self.setLayout(self.layout) + self.show_time.stateChanged.connect( + lambda: self.settings.setValue("rpc_time", self.show_time.isChecked()) + ) def changed(self, i): self.settings.setValue("rpc_enable", i) diff --git a/rare/components/tabs/settings/rpc_settings_ui.py b/rare/components/tabs/settings/rpc_settings_ui.py new file mode 100644 index 00000000..5a866dd8 --- /dev/null +++ b/rare/components/tabs/settings/rpc_settings_ui.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'resources/ui/components/tabs/settings/rpc_settings.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_RPCSettings(object): + def setupUi(self, RPCSettings): + RPCSettings.setObjectName("RPCSettings") + RPCSettings.resize(487, 318) + RPCSettings.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) + self.gridLayout = QtWidgets.QGridLayout(RPCSettings) + self.gridLayout.setObjectName("gridLayout") + self.enable = QtWidgets.QComboBox(RPCSettings) + self.enable.setObjectName("enable") + self.enable.addItem("") + self.enable.addItem("") + self.enable.addItem("") + self.gridLayout.addWidget(self.enable, 0, 1, 1, 1) + self.label = QtWidgets.QLabel(RPCSettings) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) + self.label.setSizePolicy(sizePolicy) + self.label.setObjectName("label") + self.gridLayout.addWidget(self.label, 0, 0, 1, 1) + self.show_game = QtWidgets.QCheckBox(RPCSettings) + self.show_game.setObjectName("show_game") + self.gridLayout.addWidget(self.show_game, 1, 0, 1, 2) + self.show_os = QtWidgets.QCheckBox(RPCSettings) + self.show_os.setObjectName("show_os") + self.gridLayout.addWidget(self.show_os, 2, 0, 1, 2) + self.show_time = QtWidgets.QCheckBox(RPCSettings) + self.show_time.setObjectName("show_time") + self.gridLayout.addWidget(self.show_time, 3, 0, 1, 2) + + self.retranslateUi(RPCSettings) + QtCore.QMetaObject.connectSlotsByName(RPCSettings) + + def retranslateUi(self, RPCSettings): + _translate = QtCore.QCoreApplication.translate + RPCSettings.setWindowTitle(_translate("RPCSettings", "Discord RPC")) + RPCSettings.setTitle(_translate("RPCSettings", "Discord RPC")) + self.enable.setItemText(0, _translate("RPCSettings", "When Playing")) + self.enable.setItemText(1, _translate("RPCSettings", "Always")) + self.enable.setItemText(2, _translate("RPCSettings", "Never")) + self.label.setText(_translate("RPCSettings", "Show:")) + self.show_game.setText(_translate("RPCSettings", "Show Game")) + self.show_os.setText(_translate("RPCSettings", "Show OS")) + self.show_time.setText(_translate("RPCSettings", "Show Time playing")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + RPCSettings = QtWidgets.QGroupBox() + ui = Ui_RPCSettings() + ui.setupUi(RPCSettings) + RPCSettings.show() + sys.exit(app.exec_()) diff --git a/rare/utils/extra_widgets.py b/rare/utils/extra_widgets.py index eb8d70ba..912810fc 100644 --- a/rare/utils/extra_widgets.py +++ b/rare/utils/extra_widgets.py @@ -8,6 +8,8 @@ from qtawesome import icon from rare import style_path +from .pathedit_ui import Ui_PathEdit + class FlowLayout(QLayout): def __init__(self, parent=None, margin=-1, hspacing=-1, vspacing=-1): @@ -120,21 +122,19 @@ class ClickableLabel(QLabel): super(ClickableLabel, self).__init__() -class PathEdit(QWidget): +class PathEdit(QWidget, Ui_PathEdit): def __init__(self, text: str = "", type_of_file: QFileDialog.FileType = QFileDialog.AnyFile, - infotext: str = "", filter: str = None): + filter: str = None, name_filter: str = None, infotext: str = ""): super(PathEdit, self).__init__() + self.setupUi(self) + self.filter = filter + self.name_filter = name_filter self.type_of_file = type_of_file self.info_text = infotext - self.layout = QHBoxLayout() - self.text_edit = QLineEdit(text) - self.path_select = QPushButton(self.tr("Select Path")) + self.text_edit.setText(text) self.path_select.clicked.connect(self.set_path) - self.layout.addWidget(self.text_edit) - self.layout.addWidget(self.path_select) - self.setLayout(self.layout) def setPlaceholderText(self, text: str): self.text_edit.setPlaceholderText(text) @@ -147,6 +147,8 @@ class PathEdit(QWidget): dlg.setFileMode(self.type_of_file) if self.filter: dlg.setFilter([self.filter]) + if self.name_filter: + dlg.setNameFilter(self.name_filter) if dlg.exec_(): names = dlg.selectedFiles() self.text_edit.setText(names[0]) diff --git a/rare/utils/pathedit_ui.py b/rare/utils/pathedit_ui.py new file mode 100644 index 00000000..03326695 --- /dev/null +++ b/rare/utils/pathedit_ui.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'resources/ui/utils/pathedit.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_PathEdit(object): + def setupUi(self, PathEdit): + PathEdit.setObjectName("PathEdit") + PathEdit.resize(407, 182) + self.gridLayout = QtWidgets.QGridLayout(PathEdit) + self.gridLayout.setContentsMargins(0, 0, 0, 0) + self.gridLayout.setObjectName("gridLayout") + self.path_select = QtWidgets.QToolButton(PathEdit) + self.path_select.setObjectName("path_select") + self.gridLayout.addWidget(self.path_select, 1, 2, 1, 1) + self.text_edit = QtWidgets.QLineEdit(PathEdit) + self.text_edit.setObjectName("text_edit") + self.gridLayout.addWidget(self.text_edit, 1, 0, 1, 2) + spacerItem = QtWidgets.QSpacerItem(40, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.gridLayout.addItem(spacerItem, 2, 0, 1, 1) + self.save_path_button = QtWidgets.QPushButton(PathEdit) + self.save_path_button.setEnabled(True) + self.save_path_button.setObjectName("save_path_button") + self.gridLayout.addWidget(self.save_path_button, 2, 1, 1, 2) + + self.retranslateUi(PathEdit) + QtCore.QMetaObject.connectSlotsByName(PathEdit) + + def retranslateUi(self, PathEdit): + _translate = QtCore.QCoreApplication.translate + PathEdit.setWindowTitle(_translate("PathEdit", "PathEdit")) + self.path_select.setText(_translate("PathEdit", "...")) + self.save_path_button.setText(_translate("PathEdit", "Save")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + PathEdit = QtWidgets.QWidget() + ui = Ui_PathEdit() + ui.setupUi(PathEdit) + PathEdit.show() + sys.exit(app.exec_()) From 965631d0f95be0f33924e3109999df5a6d26d772 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Tue, 27 Apr 2021 18:56:39 +0300 Subject: [PATCH 08/34] Add the UI files for the updates --- .../ui/components/tabs/settings/legendary.ui | 115 +++++++++++ .../ui/components/tabs/settings/linux.ui | 85 ++++++++ resources/ui/components/tabs/settings/rare.ui | 187 ++++++++++++++---- .../components/tabs/settings/rpc_settings.ui | 69 ++++++- resources/ui/utils/pathedit.ui | 66 +++++++ 5 files changed, 477 insertions(+), 45 deletions(-) create mode 100644 resources/ui/components/tabs/settings/legendary.ui create mode 100644 resources/ui/components/tabs/settings/linux.ui create mode 100644 resources/ui/utils/pathedit.ui diff --git a/resources/ui/components/tabs/settings/legendary.ui b/resources/ui/components/tabs/settings/legendary.ui new file mode 100644 index 00000000..368c24f1 --- /dev/null +++ b/resources/ui/components/tabs/settings/legendary.ui @@ -0,0 +1,115 @@ + + + LegendarySettings + + + + 0 + 0 + 647 + 476 + + + + LegendarySettings + + + + + + Default Installation Directory + + + + + + + + Download Settings + + + + + + + 0 + 0 + + + + Max Workers: + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + true + + + + Less is slower (0: Default) + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Cleanup + + + + + + Clean, but keep manifests + + + + + + + Remove everything + + + + + + + + + + + diff --git a/resources/ui/components/tabs/settings/linux.ui b/resources/ui/components/tabs/settings/linux.ui new file mode 100644 index 00000000..e0df7553 --- /dev/null +++ b/resources/ui/components/tabs/settings/linux.ui @@ -0,0 +1,85 @@ + + + LinuxSettings + + + + 0 + 0 + 569 + 454 + + + + LinuxSettings + + + + + + + + + Default Wine Settings + + + + + + Wine executable: + + + + + + + Wine prefix: + + + + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + diff --git a/resources/ui/components/tabs/settings/rare.ui b/resources/ui/components/tabs/settings/rare.ui index 9dc922f6..eae33424 100644 --- a/resources/ui/components/tabs/settings/rare.ui +++ b/resources/ui/components/tabs/settings/rare.ui @@ -2,56 +2,165 @@ RareSettings - - - 0 - 0 - 633 - 480 - - - Form + RareSettings - - - + + + + + + - + 0 0 + + Language + + + + + + + + + + true + + + + Restart Rare to apply the new settings. + + + true + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Image Cache DIrectory + + - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - + + + Behaviour + + + + + + 0 + 0 + + + + Update games on application startup + + + + + + + + 0 + 0 + + + + Confirm game launch + + + + + + + + 0 + 0 + + + + Exit to System tray + + + + + + + + 0 + 0 + + + + Show notification on download completion + + + + + + + + 0 + 0 + + + + Automatically sync with cloud + + + + + + + + 0 + 0 + + + + Restore window size on application startup + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + diff --git a/resources/ui/components/tabs/settings/rpc_settings.ui b/resources/ui/components/tabs/settings/rpc_settings.ui index 8a50fc2e..4a92cf7e 100644 --- a/resources/ui/components/tabs/settings/rpc_settings.ui +++ b/resources/ui/components/tabs/settings/rpc_settings.ui @@ -1,19 +1,76 @@ - Form - + RPCSettings + 0 0 - 559 - 398 + 167 + 144 - Form + Discord RPC - + + Discord RPC + + + + + + + When Playing + + + + + Always + + + + + Never + + + + + + + + + 0 + 0 + + + + Show: + + + + + + + Show Game + + + + + + + Show OS + + + + + + + Show Time playing + + + + diff --git a/resources/ui/utils/pathedit.ui b/resources/ui/utils/pathedit.ui new file mode 100644 index 00000000..53bf6935 --- /dev/null +++ b/resources/ui/utils/pathedit.ui @@ -0,0 +1,66 @@ + + + PathEdit + + + + 0 + 0 + 407 + 182 + + + + PathEdit + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + ... + + + + + + + Qt::Horizontal + + + + 40 + 0 + + + + + + + + true + + + Save + + + + + + + + + + + From 3c595d6ec76de6a2d8751d0ab4a7dcfdf96d54dd Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Tue, 27 Apr 2021 21:07:48 +0300 Subject: [PATCH 09/34] Fix wrong indentation --- rare/components/tabs/games/game_info/game_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rare/components/tabs/games/game_info/game_settings.py b/rare/components/tabs/games/game_info/game_settings.py index c0cd5382..f523404f 100644 --- a/rare/components/tabs/games/game_info/game_settings.py +++ b/rare/components/tabs/games/game_info/game_settings.py @@ -79,7 +79,7 @@ class GameSettings(QScrollArea): vdf = os.path.join(c, i, "compatibilitytool.vdf") if os.path.exists(proton) and os.path.exists(vdf): wrapper = '"' + proton + '" run' - self.possible_proton_wrappers.append(wrapper) + self.possible_proton_wrappers.append(wrapper) except FileNotFoundError as e: print("Unable to find any Proton version") From a39e9a6647dbf4bdac302b5cb990db58703bee8d Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Thu, 29 Apr 2021 00:31:25 +0300 Subject: [PATCH 10/34] Fix proton wrapper widget to properly use the new PathEdit Also move proton wrapper finder into its own function --- .../tabs/games/game_info/game_settings.py | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/rare/components/tabs/games/game_info/game_settings.py b/rare/components/tabs/games/game_info/game_settings.py index f523404f..735f32ce 100644 --- a/rare/components/tabs/games/game_info/game_settings.py +++ b/rare/components/tabs/games/game_info/game_settings.py @@ -11,6 +11,25 @@ from rare.components.tabs.settings.settings_widget import SettingsWidget from rare.utils.extra_widgets import PathEdit +def find_proton_wrappers(): + possible_proton_wrappers = [] + try: + compatibilitytools_dirs = [ + os.path.expanduser("~/.steam/steam/steamapps/common"), + "/usr/share/steam/compatibilitytools.d" + ] + for c in compatibilitytools_dirs: + for i in os.listdir(c): + proton = os.path.join(c, i, "proton") + vdf = os.path.join(c, i, "compatibilitytool.vdf") + if os.path.exists(proton) and os.path.exists(vdf): + wrapper = '"' + proton + '" run' + possible_proton_wrappers.append(wrapper) + except FileNotFoundError as e: + print("Unable to find any Proton version") + return possible_proton_wrappers + + class GameSettings(QScrollArea): game: Game igame: InstalledGame @@ -67,21 +86,7 @@ class GameSettings(QScrollArea): self.linux_settings = LinuxAppSettings(core) self.layout.addWidget(self.linux_settings) - self.possible_proton_wrappers = [] - try: - compatibilitytools_dirs = [ - os.path.expanduser("~/.steam/steam/steamapps/common"), - "/usr/share/steam/compatibilitytools.d" - ] - for c in compatibilitytools_dirs: - for i in os.listdir(c): - proton = os.path.join(c, i, "proton") - vdf = os.path.join(c, i, "compatibilitytool.vdf") - if os.path.exists(proton) and os.path.exists(vdf): - wrapper = '"' + proton + '" run' - self.possible_proton_wrappers.append(wrapper) - except FileNotFoundError as e: - print("Unable to find any Proton version") + self.possible_proton_wrappers = find_proton_wrappers() self.select_proton = QComboBox() self.select_proton.addItems(["Don't use Proton"] + self.possible_proton_wrappers) @@ -90,10 +95,8 @@ class GameSettings(QScrollArea): self.linux_settings.layout_proton.addWidget(self.select_proton_widget) self.proton_prefix = PathEdit("x", QFileDialog.DirectoryOnly) - self.proton_prefix_accept_button = QPushButton(self.tr("Save")) - self.proton_prefix_accept_button.clicked.connect(self.update_prefix) - self.proton_prefix_widget = SettingsWidget(self.tr("Proton prefix"), self.proton_prefix, - self.proton_prefix_accept_button) + self.proton_prefix.save_path_button.clicked.connect(self.update_prefix) + self.proton_prefix_widget = SettingsWidget(self.tr("Proton prefix"), self.proton_prefix) self.linux_settings.layout_proton.addWidget(self.proton_prefix_widget) # startparams, skip_update_check @@ -166,10 +169,10 @@ class GameSettings(QScrollArea): self.proton_prefix.text_edit.setText(os.path.expanduser("~/.proton")) # Dont use Wine - self.linux_settings.select_wine_exec.setText("") - self.linux_settings.save_setting(self.linux_settings.select_wine_exec, "wine_exec") - self.linux_settings.select_path.text_edit.setText("") - self.linux_settings.save_setting(self.linux_settings.select_path, "wine_prefix") + self.linux_settings.wine_exec.text_edit.setText("") + self.linux_settings.save_setting(self.linux_settings.wine_exec, "wine_exec") + self.linux_settings.wine_prefix.text_edit.setText("") + self.linux_settings.save_setting(self.linux_settings.wine_prefix, "wine_prefix") self.core.lgd.save_config() From 4c0cc0caf985cfc792c122e97b0f2ef5819e08c6 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Thu, 29 Apr 2021 00:35:09 +0300 Subject: [PATCH 11/34] Follow style on import lines --- rare/components/tabs/settings/about.py | 2 +- rare/components/tabs/settings/legendary.py | 5 +++-- rare/components/tabs/settings/rare.py | 2 +- rare/components/tabs/settings/rpc_settings.py | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/rare/components/tabs/settings/about.py b/rare/components/tabs/settings/about.py index d9f52999..27cb92a3 100644 --- a/rare/components/tabs/settings/about.py +++ b/rare/components/tabs/settings/about.py @@ -3,8 +3,8 @@ import webbrowser from PyQt5.QtWidgets import QWidget from rare import __version__ +from rare.components.tabs.settings.about_ui import Ui_About from rare.utils.utils import get_latest_version -from .about_ui import Ui_About def versiontuple(v): diff --git a/rare/components/tabs/settings/legendary.py b/rare/components/tabs/settings/legendary.py index 419f31ed..c23b98b7 100644 --- a/rare/components/tabs/settings/legendary.py +++ b/rare/components/tabs/settings/legendary.py @@ -3,9 +3,9 @@ from logging import getLogger from PyQt5.QtWidgets import QFileDialog, QMessageBox, QWidget from custom_legendary.core import LegendaryCore +from rare.components.tabs.settings.legendary_ui import Ui_LegendarySettings from rare.utils.extra_widgets import PathEdit from rare.utils.utils import get_size -from .legendary_ui import Ui_LegendarySettings logger = getLogger("LegendarySettings") @@ -18,7 +18,8 @@ class LegendarySettings(QWidget, Ui_LegendarySettings): self.core = core # Default installation directory - self.install_dir = PathEdit(core.get_default_install_dir(), type_of_file=QFileDialog.DirectoryOnly, + self.install_dir = PathEdit(core.get_default_install_dir(), + type_of_file=QFileDialog.DirectoryOnly, infotext="Default") self.install_dir.text_edit.textChanged.connect( lambda t: self.install_dir.save_path_button.setDisabled(False) diff --git a/rare/components/tabs/settings/rare.py b/rare/components/tabs/settings/rare.py index f7290af9..8a1b9f13 100644 --- a/rare/components/tabs/settings/rare.py +++ b/rare/components/tabs/settings/rare.py @@ -7,10 +7,10 @@ from logging import getLogger from PyQt5.QtCore import QSettings from PyQt5.QtWidgets import QFileDialog, QWidget +from rare.components.tabs.settings.rare_ui import Ui_RareSettings from rare.components.tabs.settings.rpc_settings import RPCSettings from rare.utils.extra_widgets import PathEdit from rare.utils.utils import get_lang, get_possible_langs -from .rare_ui import Ui_RareSettings logger = getLogger("RareSettings") diff --git a/rare/components/tabs/settings/rpc_settings.py b/rare/components/tabs/settings/rpc_settings.py index 0995f695..e2e73ebc 100644 --- a/rare/components/tabs/settings/rpc_settings.py +++ b/rare/components/tabs/settings/rpc_settings.py @@ -1,7 +1,7 @@ from PyQt5.QtCore import QSettings, pyqtSignal from PyQt5.QtWidgets import QGroupBox -from .rpc_settings_ui import Ui_RPCSettings +from rare.components.tabs.settings.rpc_settings_ui import Ui_RPCSettings class RPCSettings(QGroupBox, Ui_RPCSettings): From d05f02d5f47f646fa4bb541c63a59a32e3322774 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Thu, 29 Apr 2021 00:36:59 +0300 Subject: [PATCH 12/34] Add UI for DXVK It is used only in global settings for now. The old `DxvkWidget` was left in the code intact for use in the per game settings. Due to how interconnected the code is, it will require a more in-depth redesign and it is outside the scope of the current PR. --- rare/components/tabs/settings/dxvk.py | 80 ++++++++++ rare/components/tabs/settings/dxvk_ui.py | 98 +++++++++++++ rare/components/tabs/settings/linux.py | 14 +- rare/components/tabs/settings/linux_ui.py | 2 +- resources/ui/components/tabs/settings/dxvk.ui | 138 ++++++++++++++++++ .../ui/components/tabs/settings/linux.ui | 2 +- 6 files changed, 327 insertions(+), 7 deletions(-) create mode 100644 rare/components/tabs/settings/dxvk_ui.py create mode 100644 resources/ui/components/tabs/settings/dxvk.ui diff --git a/rare/components/tabs/settings/dxvk.py b/rare/components/tabs/settings/dxvk.py index 9aae6b8e..356e70c8 100644 --- a/rare/components/tabs/settings/dxvk.py +++ b/rare/components/tabs/settings/dxvk.py @@ -3,11 +3,91 @@ from logging import getLogger from PyQt5.QtCore import pyqtSignal from PyQt5.QtWidgets import QWidget, QCheckBox, QVBoxLayout, QWidgetAction, QMenu, QToolButton, QHBoxLayout, QGroupBox +from PyQt5.QtWidgets import QGroupBox + from custom_legendary.core import LegendaryCore +from rare.components.tabs.settings.dxvk_ui import Ui_DxvkSettings logger = getLogger("DXVK Settings") +class DxvkSettings(QGroupBox, Ui_DxvkSettings): + + def __init__(self, core: LegendaryCore, name=None): + super(DxvkSettings, self).__init__() + self.setupUi(self) + + self.name = name if name is not None else "default" + self.core = core + + self.dxvk_options_map = { + "devinfo": self.devinfo, + "fps": self.fps, + "frametime": self.frametime, + "memory": self.memory, + "gpuload": self.gpuload, + "version": self.version, + "api": self.api, + } + + self.load_settings() + self.show_dxvk.currentIndexChanged.connect(self.store_settings) + for opt in self.dxvk_options_map: + self.dxvk_options_map[opt].stateChanged.connect(self.store_settings) + + # Show HUD ComboBox + # System Default, index 0, removes DXVK_HUD to use setting from env + # Hidden , index 1, adds DXVK_HUD=0 to override system configuration + # Visible , index 2, adds DXVK_HUD=1 to override system configuration + # Custom Options, index 3, adds DXVK_HUD=devinfo,fps and enables the customization panel + + def load_settings(self): + dxvk_options = self.core.lgd.config.get(f"{self.name}.env", "DXVK_HUD", fallback=None) + self.gb_dxvk_options.setDisabled(True) + if dxvk_options is not None: + if dxvk_options == "0": + self.show_dxvk.setCurrentIndex(1) + elif dxvk_options == "1": + self.show_dxvk.setCurrentIndex(2) + else: + self.show_dxvk.setCurrentIndex(3) + self.gb_dxvk_options.setDisabled(False) + for opt in dxvk_options.split(","): + try: + self.dxvk_options_map[opt].setChecked(True) + except KeyError: + print("Malformed DXVK Option: " + opt) + continue + else: + self.show_dxvk.setCurrentIndex(0) + + def store_settings(self): + show_dxvk_index = self.show_dxvk.currentIndex() + if show_dxvk_index: + if f"{self.name}.env" not in self.core.lgd.config.sections(): + print("add section dxvk") + self.core.lgd.config.add_section(f"{self.name}.env") + if show_dxvk_index == 1: + self.core.lgd.config[f"{self.name}.env"]["DXVK_HUD"] = "0" + if show_dxvk_index == 2: + self.core.lgd.config[f"{self.name}.env"]["DXVK_HUD"] = "1" + if show_dxvk_index == 3: + dxvk_options = [] + for o in self.dxvk_options_map: + if self.dxvk_options_map[o].isChecked(): + dxvk_options.append(o) + if not dxvk_options: + dxvk_options = ["devinfo", "fps"] + self.core.lgd.config[f"{self.name}.env"]["DXVK_HUD"] = ",".join(dxvk_options) + else: + if self.core.lgd.config.get(f"{self.name}.env", "DXVK_HUD", fallback=None) is not None: + self.core.lgd.config.remove_option(f"{self.name}.env", "DXVK_HUD") + if not self.core.lgd.config[f"{self.name}.env"]: + self.core.lgd.config.remove_section(f"{self.name}.env") + self.core.lgd.save_config() + self.load_settings() + + class DxvkWidget(QGroupBox): def __init__(self, core: LegendaryCore): diff --git a/rare/components/tabs/settings/dxvk_ui.py b/rare/components/tabs/settings/dxvk_ui.py new file mode 100644 index 00000000..60fd9a9f --- /dev/null +++ b/rare/components/tabs/settings/dxvk_ui.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'resources/ui/components/tabs/settings/dxvk.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_DxvkSettings(object): + def setupUi(self, DxvkSettings): + DxvkSettings.setObjectName("DxvkSettings") + DxvkSettings.resize(598, 182) + self.gridLayout = QtWidgets.QGridLayout(DxvkSettings) + self.gridLayout.setObjectName("gridLayout") + self.gb_dxvk_options = QtWidgets.QGroupBox(DxvkSettings) + self.gb_dxvk_options.setObjectName("gb_dxvk_options") + self.layout_dxvk_options = QtWidgets.QGridLayout(self.gb_dxvk_options) + self.layout_dxvk_options.setObjectName("layout_dxvk_options") + self.api = QtWidgets.QCheckBox(self.gb_dxvk_options) + self.api.setObjectName("api") + self.layout_dxvk_options.addWidget(self.api, 2, 2, 1, 1) + self.version = QtWidgets.QCheckBox(self.gb_dxvk_options) + self.version.setObjectName("version") + self.layout_dxvk_options.addWidget(self.version, 0, 2, 1, 1) + self.memory = QtWidgets.QCheckBox(self.gb_dxvk_options) + self.memory.setObjectName("memory") + self.layout_dxvk_options.addWidget(self.memory, 0, 1, 1, 1) + self.devinfo = QtWidgets.QCheckBox(self.gb_dxvk_options) + self.devinfo.setObjectName("devinfo") + self.layout_dxvk_options.addWidget(self.devinfo, 0, 0, 1, 1) + self.frametime = QtWidgets.QCheckBox(self.gb_dxvk_options) + self.frametime.setObjectName("frametime") + self.layout_dxvk_options.addWidget(self.frametime, 3, 0, 1, 1) + self.gpuload = QtWidgets.QCheckBox(self.gb_dxvk_options) + self.gpuload.setObjectName("gpuload") + self.layout_dxvk_options.addWidget(self.gpuload, 2, 1, 1, 1) + self.fps = QtWidgets.QCheckBox(self.gb_dxvk_options) + self.fps.setObjectName("fps") + self.layout_dxvk_options.addWidget(self.fps, 2, 0, 1, 1) + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.layout_dxvk_options.addItem(spacerItem, 0, 3, 4, 1) + self.gridLayout.addWidget(self.gb_dxvk_options, 2, 0, 1, 3) + self.lbl_show_dxvk = QtWidgets.QLabel(DxvkSettings) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lbl_show_dxvk.sizePolicy().hasHeightForWidth()) + self.lbl_show_dxvk.setSizePolicy(sizePolicy) + self.lbl_show_dxvk.setObjectName("lbl_show_dxvk") + self.gridLayout.addWidget(self.lbl_show_dxvk, 0, 0, 1, 1) + self.show_dxvk = QtWidgets.QComboBox(DxvkSettings) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.show_dxvk.sizePolicy().hasHeightForWidth()) + self.show_dxvk.setSizePolicy(sizePolicy) + self.show_dxvk.setObjectName("show_dxvk") + self.show_dxvk.addItem("") + self.show_dxvk.addItem("") + self.show_dxvk.addItem("") + self.show_dxvk.addItem("") + self.gridLayout.addWidget(self.show_dxvk, 0, 1, 1, 2) + + self.retranslateUi(DxvkSettings) + QtCore.QMetaObject.connectSlotsByName(DxvkSettings) + + def retranslateUi(self, DxvkSettings): + _translate = QtCore.QCoreApplication.translate + DxvkSettings.setWindowTitle(_translate("DxvkSettings", "DxvkSettings")) + DxvkSettings.setTitle(_translate("DxvkSettings", "DXVK Settings")) + self.gb_dxvk_options.setTitle(_translate("DxvkSettings", "DXVK HUD Options")) + self.api.setText(_translate("DxvkSettings", "D3D Version")) + self.version.setText(_translate("DxvkSettings", "DXVK Version")) + self.memory.setText(_translate("DxvkSettings", "Memory Usage")) + self.devinfo.setText(_translate("DxvkSettings", "Device Info")) + self.frametime.setText(_translate("DxvkSettings", "Frame Time graph")) + self.gpuload.setText(_translate("DxvkSettings", "GPU Usage")) + self.fps.setText(_translate("DxvkSettings", "FPS")) + self.lbl_show_dxvk.setText(_translate("DxvkSettings", "Show HUD:")) + self.show_dxvk.setItemText(0, _translate("DxvkSettings", "System Default")) + self.show_dxvk.setItemText(1, _translate("DxvkSettings", "Hidden")) + self.show_dxvk.setItemText(2, _translate("DxvkSettings", "Visible")) + self.show_dxvk.setItemText(3, _translate("DxvkSettings", "Custom Options")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + DxvkSettings = QtWidgets.QGroupBox() + ui = Ui_DxvkSettings() + ui.setupUi(DxvkSettings) + DxvkSettings.show() + sys.exit(app.exec_()) diff --git a/rare/components/tabs/settings/linux.py b/rare/components/tabs/settings/linux.py index c08a9d5f..d63633b3 100644 --- a/rare/components/tabs/settings/linux.py +++ b/rare/components/tabs/settings/linux.py @@ -3,19 +3,19 @@ from logging import getLogger from PyQt5.QtWidgets import QFileDialog, QWidget from custom_legendary.core import LegendaryCore -from rare.components.tabs.settings.dxvk import DxvkWidget +from rare.components.tabs.settings.dxvk import DxvkSettings, DxvkWidget +from rare.components.tabs.settings.linux_ui import Ui_LinuxSettings from rare.utils.extra_widgets import PathEdit -from .linux_ui import Ui_LinuxSettings logger = getLogger("LinuxSettings") class LinuxSettings(QWidget, Ui_LinuxSettings): - def __init__(self, core: LegendaryCore, name="default"): + def __init__(self, core: LegendaryCore, name=None): super(LinuxSettings, self).__init__() self.setupUi(self) - self.name = name + self.name = name if name is not None else "default" self.core = core # Wineprefix @@ -46,7 +46,11 @@ class LinuxSettings(QWidget, Ui_LinuxSettings): self.layout_exec.addWidget(self.wine_exec) # dxvk - self.dxvk = DxvkWidget(core) + # FIXME: Remove this check when done with per game settings + if name is None: + self.dxvk = DxvkSettings(core, self.name) + else: + self.dxvk = DxvkWidget(core) self.layout_dxvk.addWidget(self.dxvk) def save_setting(self, widget: PathEdit, setting_name: str): diff --git a/rare/components/tabs/settings/linux_ui.py b/rare/components/tabs/settings/linux_ui.py index a5de9bf6..d9171d70 100644 --- a/rare/components/tabs/settings/linux_ui.py +++ b/rare/components/tabs/settings/linux_ui.py @@ -57,7 +57,7 @@ class Ui_LinuxSettings(object): def retranslateUi(self, LinuxSettings): _translate = QtCore.QCoreApplication.translate LinuxSettings.setWindowTitle(_translate("LinuxSettings", "LinuxSettings")) - self.gb_wine.setTitle(_translate("LinuxSettings", "Default Wine Settings")) + self.gb_wine.setTitle(_translate("LinuxSettings", "Wine Settings")) self.lbl_exec.setText(_translate("LinuxSettings", "Wine executable:")) self.lbl_prefix.setText(_translate("LinuxSettings", "Wine prefix:")) diff --git a/resources/ui/components/tabs/settings/dxvk.ui b/resources/ui/components/tabs/settings/dxvk.ui new file mode 100644 index 00000000..7b6be624 --- /dev/null +++ b/resources/ui/components/tabs/settings/dxvk.ui @@ -0,0 +1,138 @@ + + + DxvkSettings + + + + 0 + 0 + 598 + 182 + + + + DxvkSettings + + + DXVK Settings + + + + + + DXVK HUD Options + + + + + + D3D Version + + + + + + + DXVK Version + + + + + + + Memory Usage + + + + + + + Device Info + + + + + + + Frame Time graph + + + + + + + GPU Usage + + + + + + + FPS + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 0 + 0 + + + + Show HUD: + + + + + + + + 0 + 0 + + + + + System Default + + + + + Hidden + + + + + Visible + + + + + Custom Options + + + + + + + + + diff --git a/resources/ui/components/tabs/settings/linux.ui b/resources/ui/components/tabs/settings/linux.ui index e0df7553..4afa9d4c 100644 --- a/resources/ui/components/tabs/settings/linux.ui +++ b/resources/ui/components/tabs/settings/linux.ui @@ -20,7 +20,7 @@ - Default Wine Settings + Wine Settings From e5d01674dd94b0a58072f2f1fede9d12ca9a5c69 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Thu, 29 Apr 2021 14:19:05 +0300 Subject: [PATCH 13/34] Exclude non-static strings from translation --- rare/components/tabs/settings/about_ui.py | 8 ++++---- resources/ui/components/tabs/settings/about.ui | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/rare/components/tabs/settings/about_ui.py b/rare/components/tabs/settings/about_ui.py index 3da76f71..ddfcb7c7 100644 --- a/rare/components/tabs/settings/about_ui.py +++ b/rare/components/tabs/settings/about_ui.py @@ -30,6 +30,7 @@ class Ui_About(object): self.lbl_lgd_dev.setObjectName("lbl_lgd_dev") self.gridLayout.addWidget(self.lbl_lgd_dev, 6, 0, 1, 1) self.dev = QtWidgets.QLabel(About) + self.dev.setText("Dummerle") self.dev.setOpenExternalLinks(True) self.dev.setObjectName("dev") self.gridLayout.addWidget(self.dev, 5, 1, 1, 1) @@ -37,6 +38,7 @@ class Ui_About(object): self.lbl_update.setObjectName("lbl_update") self.gridLayout.addWidget(self.lbl_update, 3, 0, 1, 1, QtCore.Qt.AlignRight) self.version = QtWidgets.QLabel(About) + self.version.setText("error") self.version.setObjectName("version") self.gridLayout.addWidget(self.version, 2, 1, 1, 1) self.lbl_dev = QtWidgets.QLabel(About) @@ -46,9 +48,11 @@ class Ui_About(object): self.license.setObjectName("license") self.gridLayout.addWidget(self.license, 7, 1, 1, 1) self.update = QtWidgets.QLabel(About) + self.update.setText("error") self.update.setObjectName("update") self.gridLayout.addWidget(self.update, 3, 1, 1, 1) self.lgd_dev = QtWidgets.QLabel(About) + self.lgd_dev.setText("derrod") self.lgd_dev.setOpenExternalLinks(True) self.lgd_dev.setObjectName("lgd_dev") self.gridLayout.addWidget(self.lgd_dev, 6, 1, 1, 1) @@ -76,14 +80,10 @@ class Ui_About(object): self.lbl_license.setText(_translate("About", "License:")) self.lbl_lgd_dev.setText(_translate("About", "Legendary Developer:")) self.dev.setToolTip(_translate("About", "Github")) - self.dev.setText(_translate("About", "Dummerle")) self.lbl_update.setText(_translate("About", "Update available:")) - self.version.setText(_translate("About", "version")) self.lbl_dev.setText(_translate("About", "Rare Developer:")) self.license.setText(_translate("About", "GNU General Public License v3.0")) - self.update.setText(_translate("About", "update")) self.lgd_dev.setToolTip(_translate("About", "Github")) - self.lgd_dev.setText(_translate("About", "derrod")) self.info_text.setText(_translate("About", "This is a beta version, so you can get bugs. If you get a bug, please report it by creating an Issue on Github. You can also contact me on Discord (Dummerle#7419). Or you can join the Discord server")) self.title.setText(_translate("About", "

About

")) diff --git a/resources/ui/components/tabs/settings/about.ui b/resources/ui/components/tabs/settings/about.ui index f2eb5471..7a3c9929 100644 --- a/resources/ui/components/tabs/settings/about.ui +++ b/resources/ui/components/tabs/settings/about.ui @@ -48,7 +48,7 @@ Github - <a href='https://github.com/Dummerle'>Dummerle</a> + <a href='https://github.com/Dummerle'>Dummerle</a> true @@ -65,7 +65,7 @@ - version + error @@ -86,7 +86,7 @@ - update + error @@ -96,7 +96,7 @@ Github - <a href='https://github.com/derrod/'>derrod</a> + <a href='https://github.com/derrod/'>derrod</a> true From 115d142f94998a33699180d278be15eb19d1a03e Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Thu, 29 Apr 2021 14:20:20 +0300 Subject: [PATCH 14/34] Improve the layout of PathEdit --- rare/utils/extra_widgets.py | 7 ++-- rare/utils/pathedit_ui.py | 20 ++++++----- resources/ui/utils/pathedit.ui | 66 ++++++++++++++++------------------ 3 files changed, 45 insertions(+), 48 deletions(-) diff --git a/rare/utils/extra_widgets.py b/rare/utils/extra_widgets.py index 912810fc..54443cc2 100644 --- a/rare/utils/extra_widgets.py +++ b/rare/utils/extra_widgets.py @@ -2,13 +2,12 @@ import os from PyQt5.QtCore import Qt, QRect, QSize, QPoint, pyqtSignal from PyQt5.QtGui import QMovie -from PyQt5.QtWidgets import QLayout, QStyle, QSizePolicy, QLabel, QFileDialog, QHBoxLayout, QWidget, QLineEdit, \ - QPushButton, QStyleOptionTab, QStylePainter, QTabBar +from PyQt5.QtWidgets import QLayout, QStyle, QSizePolicy, QLabel, QFileDialog, QHBoxLayout, QWidget, QPushButton, \ + QStyleOptionTab, QStylePainter, QTabBar from qtawesome import icon from rare import style_path - -from .pathedit_ui import Ui_PathEdit +from rare.utils.pathedit_ui import Ui_PathEdit class FlowLayout(QLayout): diff --git a/rare/utils/pathedit_ui.py b/rare/utils/pathedit_ui.py index 03326695..d444e962 100644 --- a/rare/utils/pathedit_ui.py +++ b/rare/utils/pathedit_ui.py @@ -14,22 +14,25 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_PathEdit(object): def setupUi(self, PathEdit): PathEdit.setObjectName("PathEdit") - PathEdit.resize(407, 182) - self.gridLayout = QtWidgets.QGridLayout(PathEdit) - self.gridLayout.setContentsMargins(0, 0, 0, 0) - self.gridLayout.setObjectName("gridLayout") + self.layout_pathedit = QtWidgets.QGridLayout(PathEdit) + self.layout_pathedit.setContentsMargins(0, 0, 0, 0) + self.layout_pathedit.setObjectName("layout_pathedit") self.path_select = QtWidgets.QToolButton(PathEdit) + self.path_select.setText("...") self.path_select.setObjectName("path_select") - self.gridLayout.addWidget(self.path_select, 1, 2, 1, 1) + self.layout_pathedit.addWidget(self.path_select, 0, 1, 1, 1) self.text_edit = QtWidgets.QLineEdit(PathEdit) self.text_edit.setObjectName("text_edit") - self.gridLayout.addWidget(self.text_edit, 1, 0, 1, 2) + self.layout_pathedit.addWidget(self.text_edit, 0, 0, 1, 1) + self.layout_pathedit_save = QtWidgets.QHBoxLayout() + self.layout_pathedit_save.setObjectName("layout_pathedit_save") spacerItem = QtWidgets.QSpacerItem(40, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.gridLayout.addItem(spacerItem, 2, 0, 1, 1) + self.layout_pathedit_save.addItem(spacerItem) self.save_path_button = QtWidgets.QPushButton(PathEdit) self.save_path_button.setEnabled(True) self.save_path_button.setObjectName("save_path_button") - self.gridLayout.addWidget(self.save_path_button, 2, 1, 1, 2) + self.layout_pathedit_save.addWidget(self.save_path_button) + self.layout_pathedit.addLayout(self.layout_pathedit_save, 1, 0, 1, 2) self.retranslateUi(PathEdit) QtCore.QMetaObject.connectSlotsByName(PathEdit) @@ -37,7 +40,6 @@ class Ui_PathEdit(object): def retranslateUi(self, PathEdit): _translate = QtCore.QCoreApplication.translate PathEdit.setWindowTitle(_translate("PathEdit", "PathEdit")) - self.path_select.setText(_translate("PathEdit", "...")) self.save_path_button.setText(_translate("PathEdit", "Save")) diff --git a/resources/ui/utils/pathedit.ui b/resources/ui/utils/pathedit.ui index 53bf6935..7b0cb78a 100644 --- a/resources/ui/utils/pathedit.ui +++ b/resources/ui/utils/pathedit.ui @@ -2,18 +2,10 @@ PathEdit - - - 0 - 0 - 407 - 182 - - PathEdit - + 0 @@ -26,39 +18,43 @@ 0 - + - ... + ... - - - - Qt::Horizontal - - - - 40 - 0 - - - - - - - - true - - - Save - - - - + + + + + + + Qt::Horizontal + + + + 40 + 0 + + + + + + + + true + + + Save + + + + + From 748d51f31fd04d0fdf6fd9551f1d85ae615c31b0 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Thu, 29 Apr 2021 19:05:04 +0300 Subject: [PATCH 15/34] Improve PathEdit a bit more Add placeholder text Remove some unused variables Open dialog starting from path if set --- rare/components/dialogs/install_dialog.py | 2 +- rare/components/tabs/settings/legendary.py | 3 +-- rare/components/tabs/settings/linux.py | 8 +++--- rare/components/tabs/settings/rare.py | 2 +- rare/utils/extra_widgets.py | 30 ++++++++++++---------- rare/utils/pathedit_ui.py | 2 ++ resources/ui/utils/pathedit.ui | 12 ++++++++- 7 files changed, 35 insertions(+), 24 deletions(-) diff --git a/rare/components/dialogs/install_dialog.py b/rare/components/dialogs/install_dialog.py index d3629725..dabb7654 100644 --- a/rare/components/dialogs/install_dialog.py +++ b/rare/components/dialogs/install_dialog.py @@ -26,7 +26,7 @@ class InstallDialog(QDialog): if not default_path: default_path = os.path.expanduser("~/legendary") if not update: - self.install_path_field = PathEdit(text=default_path, type_of_file=QFileDialog.DirectoryOnly) + self.install_path_field = PathEdit(text=default_path, file_type=QFileDialog.DirectoryOnly) self.form.addRow(QLabel("Install directory"), self.install_path_field) if self.core.lgd.config.has_option("Legendary", "max_workers"): diff --git a/rare/components/tabs/settings/legendary.py b/rare/components/tabs/settings/legendary.py index c23b98b7..3b9911bc 100644 --- a/rare/components/tabs/settings/legendary.py +++ b/rare/components/tabs/settings/legendary.py @@ -19,8 +19,7 @@ class LegendarySettings(QWidget, Ui_LegendarySettings): # Default installation directory self.install_dir = PathEdit(core.get_default_install_dir(), - type_of_file=QFileDialog.DirectoryOnly, - infotext="Default") + file_type=QFileDialog.DirectoryOnly) self.install_dir.text_edit.textChanged.connect( lambda t: self.install_dir.save_path_button.setDisabled(False) ) diff --git a/rare/components/tabs/settings/linux.py b/rare/components/tabs/settings/linux.py index d63633b3..09c5c078 100644 --- a/rare/components/tabs/settings/linux.py +++ b/rare/components/tabs/settings/linux.py @@ -20,8 +20,7 @@ class LinuxSettings(QWidget, Ui_LinuxSettings): # Wineprefix self.wine_prefix = PathEdit(self.core.lgd.config.get(self.name, "wine_prefix", fallback=""), - type_of_file=QFileDialog.DirectoryOnly, - infotext="Default") + file_type=QFileDialog.DirectoryOnly) self.wine_prefix.text_edit.textChanged.connect( lambda t: self.wine_prefix.save_path_button.setDisabled(False) ) @@ -33,9 +32,8 @@ class LinuxSettings(QWidget, Ui_LinuxSettings): # Wine executable self.wine_exec = PathEdit(self.core.lgd.config.get(self.name, "wine_executable", fallback=""), - type_of_file=QFileDialog.ExistingFile, - name_filter="Wine executable (wine wine64)", - infotext="Default") + file_type=QFileDialog.ExistingFile, + name_filter="Wine executable (wine wine64)") self.wine_exec.text_edit.textChanged.connect( lambda t: self.wine_exec.save_path_button.setDisabled(False) ) diff --git a/rare/components/tabs/settings/rare.py b/rare/components/tabs/settings/rare.py index 8a1b9f13..f6845467 100644 --- a/rare/components/tabs/settings/rare.py +++ b/rare/components/tabs/settings/rare.py @@ -41,7 +41,7 @@ class RareSettings(QWidget, Ui_RareSettings): language = self.settings.value("language", get_lang(), type=str) # Select Image directory - self.img_dir = PathEdit(self.img_dir_path, type_of_file=QFileDialog.DirectoryOnly) + self.img_dir = PathEdit(self.img_dir_path, file_type=QFileDialog.DirectoryOnly) self.img_dir.text_edit.textChanged.connect(lambda t: self.img_dir.save_path_button.setDisabled(False)) self.img_dir.save_path_button.clicked.connect(self.save_path) self.img_dir.save_path_button.setDisabled(True) diff --git a/rare/utils/extra_widgets.py b/rare/utils/extra_widgets.py index 54443cc2..35139142 100644 --- a/rare/utils/extra_widgets.py +++ b/rare/utils/extra_widgets.py @@ -122,30 +122,32 @@ class ClickableLabel(QLabel): class PathEdit(QWidget, Ui_PathEdit): - def __init__(self, text: str = "", - type_of_file: QFileDialog.FileType = QFileDialog.AnyFile, - filter: str = None, name_filter: str = None, infotext: str = ""): + def __init__(self, + text: str = "", + file_type: QFileDialog.FileType = QFileDialog.AnyFile, + type_filter: str = None, + name_filter: str = None): super(PathEdit, self).__init__() self.setupUi(self) - self.filter = filter + self.type_filter = type_filter self.name_filter = name_filter - self.type_of_file = type_of_file - self.info_text = infotext - self.text_edit.setText(text) + self.file_type = file_type + if text: + self.text_edit.setText(text) self.path_select.clicked.connect(self.set_path) - def setPlaceholderText(self, text: str): - self.text_edit.setPlaceholderText(text) - def text(self): return self.text_edit.text() def set_path(self): - dlg = QFileDialog(self, self.tr("Choose Path"), os.path.expanduser("~/")) - dlg.setFileMode(self.type_of_file) - if self.filter: - dlg.setFilter([self.filter]) + dlg_path = self.text_edit.text() + if not dlg_path: + dlg_path = os.path.expanduser("~/") + dlg = QFileDialog(self, self.tr("Choose Path"), dlg_path) + dlg.setFileMode(self.file_type) + if self.type_filter: + dlg.setFilter([self.type_filter]) if self.name_filter: dlg.setNameFilter(self.name_filter) if dlg.exec_(): diff --git a/rare/utils/pathedit_ui.py b/rare/utils/pathedit_ui.py index d444e962..ec1f3413 100644 --- a/rare/utils/pathedit_ui.py +++ b/rare/utils/pathedit_ui.py @@ -22,6 +22,7 @@ class Ui_PathEdit(object): self.path_select.setObjectName("path_select") self.layout_pathedit.addWidget(self.path_select, 0, 1, 1, 1) self.text_edit = QtWidgets.QLineEdit(PathEdit) + self.text_edit.setMinimumSize(QtCore.QSize(300, 0)) self.text_edit.setObjectName("text_edit") self.layout_pathedit.addWidget(self.text_edit, 0, 0, 1, 1) self.layout_pathedit_save = QtWidgets.QHBoxLayout() @@ -40,6 +41,7 @@ class Ui_PathEdit(object): def retranslateUi(self, PathEdit): _translate = QtCore.QCoreApplication.translate PathEdit.setWindowTitle(_translate("PathEdit", "PathEdit")) + self.text_edit.setPlaceholderText(_translate("PathEdit", "Default")) self.save_path_button.setText(_translate("PathEdit", "Save")) diff --git a/resources/ui/utils/pathedit.ui b/resources/ui/utils/pathedit.ui index 7b0cb78a..b3b0e946 100644 --- a/resources/ui/utils/pathedit.ui +++ b/resources/ui/utils/pathedit.ui @@ -26,7 +26,17 @@
- + + + + 300 + 0 + + + + Default + + From 1f92beb2857bd744e4f34ff78ea66e429e8f5980 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Thu, 29 Apr 2021 23:07:28 +0300 Subject: [PATCH 16/34] Remove proton layout from global linux settings. --- .../tabs/games/game_info/game_settings.py | 10 +- rare/components/tabs/settings/linux.py | 6 +- rare/components/tabs/settings/linux_ui.py | 71 ++++++------ .../ui/components/tabs/settings/linux.ui | 101 +++++++++--------- 4 files changed, 91 insertions(+), 97 deletions(-) diff --git a/rare/components/tabs/games/game_info/game_settings.py b/rare/components/tabs/games/game_info/game_settings.py index 735f32ce..1422087f 100644 --- a/rare/components/tabs/games/game_info/game_settings.py +++ b/rare/components/tabs/games/game_info/game_settings.py @@ -83,21 +83,21 @@ class GameSettings(QScrollArea): self.layout.addWidget(self.wrapper_widget) if os.name != "nt": - self.linux_settings = LinuxAppSettings(core) - self.layout.addWidget(self.linux_settings) - self.possible_proton_wrappers = find_proton_wrappers() self.select_proton = QComboBox() self.select_proton.addItems(["Don't use Proton"] + self.possible_proton_wrappers) self.select_proton.currentIndexChanged.connect(self.change_proton) self.select_proton_widget = SettingsWidget(self.tr("Proton Wrapper"), self.select_proton) - self.linux_settings.layout_proton.addWidget(self.select_proton_widget) + self.layout.addWidget(self.select_proton_widget) self.proton_prefix = PathEdit("x", QFileDialog.DirectoryOnly) self.proton_prefix.save_path_button.clicked.connect(self.update_prefix) self.proton_prefix_widget = SettingsWidget(self.tr("Proton prefix"), self.proton_prefix) - self.linux_settings.layout_proton.addWidget(self.proton_prefix_widget) + self.layout.addWidget(self.proton_prefix_widget) + + self.linux_settings = LinuxAppSettings(core) + self.layout.addWidget(self.linux_settings) # startparams, skip_update_check diff --git a/rare/components/tabs/settings/linux.py b/rare/components/tabs/settings/linux.py index 09c5c078..1eaf3551 100644 --- a/rare/components/tabs/settings/linux.py +++ b/rare/components/tabs/settings/linux.py @@ -28,7 +28,7 @@ class LinuxSettings(QWidget, Ui_LinuxSettings): lambda: self.save_setting(self.wine_prefix, "wine_prefix") ) self.wine_prefix.save_path_button.setDisabled(True) - self.layout_prefix.addWidget(self.wine_prefix) + self.prefix_layout.addWidget(self.wine_prefix) # Wine executable self.wine_exec = PathEdit(self.core.lgd.config.get(self.name, "wine_executable", fallback=""), @@ -41,7 +41,7 @@ class LinuxSettings(QWidget, Ui_LinuxSettings): lambda: self.save_setting(self.wine_exec, "wine_executable") ) self.wine_exec.save_path_button.setDisabled(True) - self.layout_exec.addWidget(self.wine_exec) + self.exec_layout.addWidget(self.wine_exec) # dxvk # FIXME: Remove this check when done with per game settings @@ -49,7 +49,7 @@ class LinuxSettings(QWidget, Ui_LinuxSettings): self.dxvk = DxvkSettings(core, self.name) else: self.dxvk = DxvkWidget(core) - self.layout_dxvk.addWidget(self.dxvk) + self.dxvk_layout.addWidget(self.dxvk) def save_setting(self, widget: PathEdit, setting_name: str): if self.name not in self.core.lgd.config.sections(): diff --git a/rare/components/tabs/settings/linux_ui.py b/rare/components/tabs/settings/linux_ui.py index d9171d70..1a8c6ea7 100644 --- a/rare/components/tabs/settings/linux_ui.py +++ b/rare/components/tabs/settings/linux_ui.py @@ -15,41 +15,38 @@ class Ui_LinuxSettings(object): def setupUi(self, LinuxSettings): LinuxSettings.setObjectName("LinuxSettings") LinuxSettings.resize(569, 454) - self.layout_linux = QtWidgets.QGridLayout(LinuxSettings) - self.layout_linux.setObjectName("layout_linux") - self.layout_dxvk = QtWidgets.QVBoxLayout() - self.layout_dxvk.setObjectName("layout_dxvk") - self.layout_linux.addLayout(self.layout_dxvk, 2, 0, 1, 1) - self.gb_wine = QtWidgets.QGroupBox(LinuxSettings) - self.gb_wine.setObjectName("gb_wine") - self.layout_wine = QtWidgets.QGridLayout(self.gb_wine) - self.layout_wine.setObjectName("layout_wine") - self.lbl_exec = QtWidgets.QLabel(self.gb_wine) - self.lbl_exec.setObjectName("lbl_exec") - self.layout_wine.addWidget(self.lbl_exec, 1, 0, 1, 1, QtCore.Qt.AlignRight) - self.lbl_prefix = QtWidgets.QLabel(self.gb_wine) - self.lbl_prefix.setObjectName("lbl_prefix") - self.layout_wine.addWidget(self.lbl_prefix, 0, 0, 1, 1, QtCore.Qt.AlignRight) - self.frame_prefix = QtWidgets.QFrame(self.gb_wine) - self.frame_prefix.setFrameShape(QtWidgets.QFrame.StyledPanel) - self.frame_prefix.setFrameShadow(QtWidgets.QFrame.Sunken) - self.frame_prefix.setObjectName("frame_prefix") - self.layout_prefix = QtWidgets.QVBoxLayout(self.frame_prefix) - self.layout_prefix.setObjectName("layout_prefix") - self.layout_wine.addWidget(self.frame_prefix, 0, 1, 1, 1) - self.frame_exec = QtWidgets.QFrame(self.gb_wine) - self.frame_exec.setFrameShape(QtWidgets.QFrame.StyledPanel) - self.frame_exec.setFrameShadow(QtWidgets.QFrame.Sunken) - self.frame_exec.setObjectName("frame_exec") - self.layout_exec = QtWidgets.QVBoxLayout(self.frame_exec) - self.layout_exec.setObjectName("layout_exec") - self.layout_wine.addWidget(self.frame_exec, 1, 1, 1, 1) - self.layout_linux.addWidget(self.gb_wine, 0, 0, 1, 1) + self.linux_layout = QtWidgets.QGridLayout(LinuxSettings) + self.linux_layout.setObjectName("linux_layout") spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.layout_linux.addItem(spacerItem, 4, 0, 1, 1) - self.layout_proton = QtWidgets.QVBoxLayout() - self.layout_proton.setObjectName("layout_proton") - self.layout_linux.addLayout(self.layout_proton, 1, 0, 1, 1) + self.linux_layout.addItem(spacerItem, 3, 0, 1, 1) + self.wine_groupbox = QtWidgets.QGroupBox(LinuxSettings) + self.wine_groupbox.setObjectName("wine_groupbox") + self.wine_layout = QtWidgets.QGridLayout(self.wine_groupbox) + self.wine_layout.setObjectName("wine_layout") + self.exec_label = QtWidgets.QLabel(self.wine_groupbox) + self.exec_label.setObjectName("exec_label") + self.wine_layout.addWidget(self.exec_label, 1, 0, 1, 1, QtCore.Qt.AlignRight) + self.prefix_label = QtWidgets.QLabel(self.wine_groupbox) + self.prefix_label.setObjectName("prefix_label") + self.wine_layout.addWidget(self.prefix_label, 0, 0, 1, 1, QtCore.Qt.AlignRight) + self.prefix_frame = QtWidgets.QFrame(self.wine_groupbox) + self.prefix_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) + self.prefix_frame.setFrameShadow(QtWidgets.QFrame.Sunken) + self.prefix_frame.setObjectName("prefix_frame") + self.prefix_layout = QtWidgets.QVBoxLayout(self.prefix_frame) + self.prefix_layout.setObjectName("prefix_layout") + self.wine_layout.addWidget(self.prefix_frame, 0, 1, 1, 1) + self.exec_frame = QtWidgets.QFrame(self.wine_groupbox) + self.exec_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) + self.exec_frame.setFrameShadow(QtWidgets.QFrame.Sunken) + self.exec_frame.setObjectName("exec_frame") + self.exec_layout = QtWidgets.QVBoxLayout(self.exec_frame) + self.exec_layout.setObjectName("exec_layout") + self.wine_layout.addWidget(self.exec_frame, 1, 1, 1, 1) + self.linux_layout.addWidget(self.wine_groupbox, 0, 0, 1, 1) + self.dxvk_layout = QtWidgets.QVBoxLayout() + self.dxvk_layout.setObjectName("dxvk_layout") + self.linux_layout.addLayout(self.dxvk_layout, 1, 0, 1, 1) self.retranslateUi(LinuxSettings) QtCore.QMetaObject.connectSlotsByName(LinuxSettings) @@ -57,9 +54,9 @@ class Ui_LinuxSettings(object): def retranslateUi(self, LinuxSettings): _translate = QtCore.QCoreApplication.translate LinuxSettings.setWindowTitle(_translate("LinuxSettings", "LinuxSettings")) - self.gb_wine.setTitle(_translate("LinuxSettings", "Wine Settings")) - self.lbl_exec.setText(_translate("LinuxSettings", "Wine executable:")) - self.lbl_prefix.setText(_translate("LinuxSettings", "Wine prefix:")) + self.wine_groupbox.setTitle(_translate("LinuxSettings", "Wine Settings")) + self.exec_label.setText(_translate("LinuxSettings", "Wine executable:")) + self.prefix_label.setText(_translate("LinuxSettings", "Wine prefix:")) if __name__ == "__main__": diff --git a/resources/ui/components/tabs/settings/linux.ui b/resources/ui/components/tabs/settings/linux.ui index 4afa9d4c..cb013d92 100644 --- a/resources/ui/components/tabs/settings/linux.ui +++ b/resources/ui/components/tabs/settings/linux.ui @@ -13,57 +13,9 @@ LinuxSettings - - - - - - - - Wine Settings - - - - - - Wine executable: - - - - - - - Wine prefix: - - - - - - - QFrame::StyledPanel - - - QFrame::Sunken - - - - - - - - QFrame::StyledPanel - - - QFrame::Sunken - - - - - - - - - + + + Qt::Vertical @@ -75,8 +27,53 @@ + + + + Wine Settings + + + + + + Wine executable: + + + + + + + Wine prefix: + + + + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + + - +
From b1a7a1fb26f17312a3aacfd0d2678c86d1e9236f Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Fri, 30 Apr 2021 00:08:28 +0300 Subject: [PATCH 17/34] Align the labels with the the text widget of PathEdit --- rare/components/tabs/settings/linux_ui.py | 28 ++++++++------- .../ui/components/tabs/settings/linux.ui | 34 +++++++++++-------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/rare/components/tabs/settings/linux_ui.py b/rare/components/tabs/settings/linux_ui.py index 1a8c6ea7..c7d89e08 100644 --- a/rare/components/tabs/settings/linux_ui.py +++ b/rare/components/tabs/settings/linux_ui.py @@ -25,24 +25,26 @@ class Ui_LinuxSettings(object): self.wine_layout.setObjectName("wine_layout") self.exec_label = QtWidgets.QLabel(self.wine_groupbox) self.exec_label.setObjectName("exec_label") - self.wine_layout.addWidget(self.exec_label, 1, 0, 1, 1, QtCore.Qt.AlignRight) + self.wine_layout.addWidget(self.exec_label, 2, 0, 1, 1, QtCore.Qt.AlignRight) self.prefix_label = QtWidgets.QLabel(self.wine_groupbox) self.prefix_label.setObjectName("prefix_label") self.wine_layout.addWidget(self.prefix_label, 0, 0, 1, 1, QtCore.Qt.AlignRight) - self.prefix_frame = QtWidgets.QFrame(self.wine_groupbox) - self.prefix_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) - self.prefix_frame.setFrameShadow(QtWidgets.QFrame.Sunken) - self.prefix_frame.setObjectName("prefix_frame") - self.prefix_layout = QtWidgets.QVBoxLayout(self.prefix_frame) + self.prefix_alignment_label = QtWidgets.QLabel(self.wine_groupbox) + self.prefix_alignment_label.setEnabled(False) + self.prefix_alignment_label.setText("") + self.prefix_alignment_label.setObjectName("prefix_alignment_label") + self.wine_layout.addWidget(self.prefix_alignment_label, 1, 0, 1, 1) + self.exec_alignment_label = QtWidgets.QLabel(self.wine_groupbox) + self.exec_alignment_label.setEnabled(False) + self.exec_alignment_label.setText("") + self.exec_alignment_label.setObjectName("exec_alignment_label") + self.wine_layout.addWidget(self.exec_alignment_label, 3, 0, 1, 1) + self.prefix_layout = QtWidgets.QVBoxLayout() self.prefix_layout.setObjectName("prefix_layout") - self.wine_layout.addWidget(self.prefix_frame, 0, 1, 1, 1) - self.exec_frame = QtWidgets.QFrame(self.wine_groupbox) - self.exec_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) - self.exec_frame.setFrameShadow(QtWidgets.QFrame.Sunken) - self.exec_frame.setObjectName("exec_frame") - self.exec_layout = QtWidgets.QVBoxLayout(self.exec_frame) + self.wine_layout.addLayout(self.prefix_layout, 0, 1, 2, 1) + self.exec_layout = QtWidgets.QVBoxLayout() self.exec_layout.setObjectName("exec_layout") - self.wine_layout.addWidget(self.exec_frame, 1, 1, 1, 1) + self.wine_layout.addLayout(self.exec_layout, 2, 1, 2, 1) self.linux_layout.addWidget(self.wine_groupbox, 0, 0, 1, 1) self.dxvk_layout = QtWidgets.QVBoxLayout() self.dxvk_layout.setObjectName("dxvk_layout") diff --git a/resources/ui/components/tabs/settings/linux.ui b/resources/ui/components/tabs/settings/linux.ui index cb013d92..d3e1a209 100644 --- a/resources/ui/components/tabs/settings/linux.ui +++ b/resources/ui/components/tabs/settings/linux.ui @@ -33,7 +33,7 @@ Wine Settings - + Wine executable: @@ -47,28 +47,32 @@ - - - - QFrame::StyledPanel + + + + false - - QFrame::Sunken + + - - - - - QFrame::StyledPanel + + + + false - - QFrame::Sunken + + - + + + + + +
From b66bb716add196421714224c61d3ac5dc7fe0872 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Fri, 30 Apr 2021 00:43:51 +0300 Subject: [PATCH 18/34] Align the labels, not the widgets --- rare/components/tabs/settings/linux_ui.py | 10 ++++++---- resources/ui/components/tabs/settings/linux.ui | 14 ++++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/rare/components/tabs/settings/linux_ui.py b/rare/components/tabs/settings/linux_ui.py index c7d89e08..02eee180 100644 --- a/rare/components/tabs/settings/linux_ui.py +++ b/rare/components/tabs/settings/linux_ui.py @@ -24,11 +24,13 @@ class Ui_LinuxSettings(object): self.wine_layout = QtWidgets.QGridLayout(self.wine_groupbox) self.wine_layout.setObjectName("wine_layout") self.exec_label = QtWidgets.QLabel(self.wine_groupbox) + self.exec_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.exec_label.setObjectName("exec_label") - self.wine_layout.addWidget(self.exec_label, 2, 0, 1, 1, QtCore.Qt.AlignRight) + self.wine_layout.addWidget(self.exec_label, 2, 0, 1, 1) self.prefix_label = QtWidgets.QLabel(self.wine_groupbox) + self.prefix_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.prefix_label.setObjectName("prefix_label") - self.wine_layout.addWidget(self.prefix_label, 0, 0, 1, 1, QtCore.Qt.AlignRight) + self.wine_layout.addWidget(self.prefix_label, 0, 0, 1, 1) self.prefix_alignment_label = QtWidgets.QLabel(self.wine_groupbox) self.prefix_alignment_label.setEnabled(False) self.prefix_alignment_label.setText("") @@ -57,8 +59,8 @@ class Ui_LinuxSettings(object): _translate = QtCore.QCoreApplication.translate LinuxSettings.setWindowTitle(_translate("LinuxSettings", "LinuxSettings")) self.wine_groupbox.setTitle(_translate("LinuxSettings", "Wine Settings")) - self.exec_label.setText(_translate("LinuxSettings", "Wine executable:")) - self.prefix_label.setText(_translate("LinuxSettings", "Wine prefix:")) + self.exec_label.setText(_translate("LinuxSettings", "Executable:")) + self.prefix_label.setText(_translate("LinuxSettings", "Prefix:")) if __name__ == "__main__": diff --git a/resources/ui/components/tabs/settings/linux.ui b/resources/ui/components/tabs/settings/linux.ui index d3e1a209..b7170c0e 100644 --- a/resources/ui/components/tabs/settings/linux.ui +++ b/resources/ui/components/tabs/settings/linux.ui @@ -33,17 +33,23 @@ Wine Settings - + - Wine executable: + Executable: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + - Wine prefix: + Prefix: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter From 7eee31c3e2f6cdffef904cc5918af5627474b928 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Sat, 1 May 2021 01:02:12 +0300 Subject: [PATCH 19/34] Search for toolmanifest.vdf alongside compatibilitytool.vdf to verify proton folder --- rare/components/tabs/games/game_info/game_settings.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rare/components/tabs/games/game_info/game_settings.py b/rare/components/tabs/games/game_info/game_settings.py index 1422087f..e614f91f 100644 --- a/rare/components/tabs/games/game_info/game_settings.py +++ b/rare/components/tabs/games/game_info/game_settings.py @@ -21,8 +21,9 @@ def find_proton_wrappers(): for c in compatibilitytools_dirs: for i in os.listdir(c): proton = os.path.join(c, i, "proton") - vdf = os.path.join(c, i, "compatibilitytool.vdf") - if os.path.exists(proton) and os.path.exists(vdf): + compatibilitytool = os.path.join(c, i, "compatibilitytool.vdf") + toolmanifest = os.path.join(c, i, "toolmanifest.vdf") + if os.path.exists(proton) and (os.path.exists(compatibilitytool) or os.path.exists(toolmanifest)): wrapper = '"' + proton + '" run' possible_proton_wrappers.append(wrapper) except FileNotFoundError as e: @@ -191,6 +192,7 @@ class GameSettings(QScrollArea): self.core.lgd.config.set(self.game.app_name + ".env", "STEAM_COMPAT_DATA_PATH", text) self.core.lgd.save_config() + self.proton_prefix.save_path_button.setDisabled(True) def update_game(self, app_name): self.change = False From 127728d329ce5e414f7fe4f6ff75b7acc5729d5f Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Sat, 1 May 2021 17:15:43 +0300 Subject: [PATCH 20/34] Fix proton wrapper search --- .../tabs/games/game_info/game_settings.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rare/components/tabs/games/game_info/game_settings.py b/rare/components/tabs/games/game_info/game_settings.py index e614f91f..d53d27bd 100644 --- a/rare/components/tabs/games/game_info/game_settings.py +++ b/rare/components/tabs/games/game_info/game_settings.py @@ -13,12 +13,12 @@ from rare.utils.extra_widgets import PathEdit def find_proton_wrappers(): possible_proton_wrappers = [] - try: - compatibilitytools_dirs = [ - os.path.expanduser("~/.steam/steam/steamapps/common"), - "/usr/share/steam/compatibilitytools.d" - ] - for c in compatibilitytools_dirs: + compatibilitytools_dirs = [ + os.path.expanduser("~/.steam/steam/steamapps/common"), + "/usr/share/steam/compatibilitytools.d" + ] + for c in compatibilitytools_dirs: + if os.path.exists(c): for i in os.listdir(c): proton = os.path.join(c, i, "proton") compatibilitytool = os.path.join(c, i, "compatibilitytool.vdf") @@ -26,7 +26,7 @@ def find_proton_wrappers(): if os.path.exists(proton) and (os.path.exists(compatibilitytool) or os.path.exists(toolmanifest)): wrapper = '"' + proton + '" run' possible_proton_wrappers.append(wrapper) - except FileNotFoundError as e: + if not possible_proton_wrappers: print("Unable to find any Proton version") return possible_proton_wrappers From 7662f52ba86c136361d647505462a736b6d47794 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Sat, 1 May 2021 17:27:37 +0300 Subject: [PATCH 21/34] Adjust to include the open log dir button in rare settings --- rare/components/tabs/settings/rare.py | 13 +-- rare/components/tabs/settings/rare_ui.py | 45 +++++++--- resources/ui/components/tabs/settings/rare.ui | 83 +++++++++++++------ 3 files changed, 97 insertions(+), 44 deletions(-) diff --git a/rare/components/tabs/settings/rare.py b/rare/components/tabs/settings/rare.py index f6845467..f4f37388 100644 --- a/rare/components/tabs/settings/rare.py +++ b/rare/components/tabs/settings/rare.py @@ -39,6 +39,7 @@ class RareSettings(QWidget, Ui_RareSettings): self.settings = QSettings() self.img_dir_path = self.settings.value("img_dir", os.path.expanduser("~/.cache/rare/images/"), type=str) language = self.settings.value("language", get_lang(), type=str) + self.logdir = os.path.expanduser("~/.cache/rare/logs") # Select Image directory self.img_dir = PathEdit(self.img_dir_path, file_type=QFileDialog.DirectoryOnly) @@ -80,17 +81,17 @@ class RareSettings(QWidget, Ui_RareSettings): lambda: self.settings.setValue("save_size", self.save_size.isChecked()) ) - self.open_log_dir = QPushButton(self.tr("Open Log directory")) - self.open_log_dir.clicked.connect(self.open_dir) - self.layout().addWidget(self.open_log_dir) + self.log_dir_open_button.clicked.connect(self.open_dir) + # TODO: Implement + self.log_dir_clean_button.setVisible(False) + self.log_dir_size_label.setVisible(False) def open_dir(self): - logdir = os.path.expanduser("~/.cache/rare/logs") if os.name == "nt": - os.startfile(logdir) + os.startfile(self.logdir) else: opener = "open" if sys.platform == "darwin" else "xdg-open" - subprocess.Popen([opener, logdir]) + subprocess.Popen([opener, self.logdir]) def save_window_size(self): self.settings.setValue("save_size", self.save_size.isChecked()) diff --git a/rare/components/tabs/settings/rare_ui.py b/rare/components/tabs/settings/rare_ui.py index f817c991..76847edf 100644 --- a/rare/components/tabs/settings/rare_ui.py +++ b/rare/components/tabs/settings/rare_ui.py @@ -16,9 +16,11 @@ class Ui_RareSettings(object): RareSettings.setObjectName("RareSettings") self.layout_rare = QtWidgets.QGridLayout(RareSettings) self.layout_rare.setObjectName("layout_rare") - self.layout_rpc = QtWidgets.QVBoxLayout() - self.layout_rpc.setObjectName("layout_rpc") - self.layout_rare.addLayout(self.layout_rpc, 1, 1, 1, 1) + self.gb_img_dir = QtWidgets.QGroupBox(RareSettings) + self.gb_img_dir.setObjectName("gb_img_dir") + self.layout_img_dir = QtWidgets.QVBoxLayout(self.gb_img_dir) + self.layout_img_dir.setObjectName("layout_img_dir") + self.layout_rare.addWidget(self.gb_img_dir, 0, 0, 1, 1) self.gb_lang = QtWidgets.QGroupBox(RareSettings) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) @@ -39,13 +41,6 @@ class Ui_RareSettings(object): self.info_lang.setObjectName("info_lang") self.layout_lang.addWidget(self.info_lang, 0, QtCore.Qt.AlignTop) self.layout_rare.addWidget(self.gb_lang, 0, 1, 1, 1) - spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.layout_rare.addItem(spacerItem, 2, 0, 1, 2) - self.gb_img_dir = QtWidgets.QGroupBox(RareSettings) - self.gb_img_dir.setObjectName("gb_img_dir") - self.layout_img_dir = QtWidgets.QVBoxLayout(self.gb_img_dir) - self.layout_img_dir.setObjectName("layout_img_dir") - self.layout_rare.addWidget(self.gb_img_dir, 0, 0, 1, 1) self.gb_settings = QtWidgets.QGroupBox(RareSettings) self.gb_settings.setObjectName("gb_settings") self.gridLayout = QtWidgets.QGridLayout(self.gb_settings) @@ -98,9 +93,30 @@ class Ui_RareSettings(object): self.save_size.setSizePolicy(sizePolicy) self.save_size.setObjectName("save_size") self.gridLayout.addWidget(self.save_size, 1, 1, 1, 1) - spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.gridLayout.addItem(spacerItem1, 0, 2, 4, 1) + spacerItem = QtWidgets.QSpacerItem(0, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.gridLayout.addItem(spacerItem, 0, 2, 4, 1) self.layout_rare.addWidget(self.gb_settings, 1, 0, 1, 1) + spacerItem1 = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.layout_rare.addItem(spacerItem1, 3, 0, 1, 2) + self.layout_rpc = QtWidgets.QVBoxLayout() + self.layout_rpc.setObjectName("layout_rpc") + self.layout_rare.addLayout(self.layout_rpc, 1, 1, 1, 1) + self.log_dir_group = QtWidgets.QGroupBox(RareSettings) + self.log_dir_group.setObjectName("log_dir_group") + self.log_dir_layout = QtWidgets.QVBoxLayout(self.log_dir_group) + self.log_dir_layout.setObjectName("log_dir_layout") + self.log_dir_open_button = QtWidgets.QPushButton(self.log_dir_group) + self.log_dir_open_button.setObjectName("log_dir_open_button") + self.log_dir_layout.addWidget(self.log_dir_open_button) + self.log_dir_clean_button = QtWidgets.QPushButton(self.log_dir_group) + self.log_dir_clean_button.setObjectName("log_dir_clean_button") + self.log_dir_layout.addWidget(self.log_dir_clean_button) + self.log_dir_size_label = QtWidgets.QLabel(self.log_dir_group) + self.log_dir_size_label.setText("") + self.log_dir_size_label.setWordWrap(True) + self.log_dir_size_label.setObjectName("log_dir_size_label") + self.log_dir_layout.addWidget(self.log_dir_size_label) + self.layout_rare.addWidget(self.log_dir_group, 2, 1, 1, 1) self.retranslateUi(RareSettings) QtCore.QMetaObject.connectSlotsByName(RareSettings) @@ -108,9 +124,9 @@ class Ui_RareSettings(object): def retranslateUi(self, RareSettings): _translate = QtCore.QCoreApplication.translate RareSettings.setWindowTitle(_translate("RareSettings", "RareSettings")) + self.gb_img_dir.setTitle(_translate("RareSettings", "Image Cache Directory")) self.gb_lang.setTitle(_translate("RareSettings", "Language")) self.info_lang.setText(_translate("RareSettings", "Restart Rare to apply the new settings.")) - self.gb_img_dir.setTitle(_translate("RareSettings", "Image Cache DIrectory")) self.gb_settings.setTitle(_translate("RareSettings", "Behaviour")) self.auto_update.setText(_translate("RareSettings", "Update games on application startup")) self.confirm_start.setText(_translate("RareSettings", "Confirm game launch")) @@ -118,6 +134,9 @@ class Ui_RareSettings(object): self.notification.setText(_translate("RareSettings", "Show notification on download completion")) self.auto_sync_cloud.setText(_translate("RareSettings", "Automatically sync with cloud")) self.save_size.setText(_translate("RareSettings", "Restore window size on application startup")) + self.log_dir_group.setTitle(_translate("RareSettings", "Logs")) + self.log_dir_open_button.setText(_translate("RareSettings", "Open Log directory")) + self.log_dir_clean_button.setText(_translate("RareSettings", "Clean Log directory")) if __name__ == "__main__": diff --git a/resources/ui/components/tabs/settings/rare.ui b/resources/ui/components/tabs/settings/rare.ui index eae33424..95243cdc 100644 --- a/resources/ui/components/tabs/settings/rare.ui +++ b/resources/ui/components/tabs/settings/rare.ui @@ -6,8 +6,13 @@ RareSettings - - + + + + Image Cache Directory + + + @@ -42,27 +47,6 @@
- - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Image Cache DIrectory - - - - @@ -148,13 +132,13 @@ - + Qt::Horizontal - 40 + 0 20 @@ -163,6 +147,55 @@
+ + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + + + Logs + + + + + + Open Log directory + + + + + + + Clean Log directory + + + + + + + + + + true + + + + + + From 6b79b3a55e1f5bc8b2fa96171b229b2c3864de30 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Sat, 1 May 2021 21:00:32 +0300 Subject: [PATCH 22/34] Set DXVK to hidden all options are deselected --- rare/components/tabs/settings/dxvk.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/rare/components/tabs/settings/dxvk.py b/rare/components/tabs/settings/dxvk.py index 356e70c8..9b19e889 100644 --- a/rare/components/tabs/settings/dxvk.py +++ b/rare/components/tabs/settings/dxvk.py @@ -73,12 +73,19 @@ class DxvkSettings(QGroupBox, Ui_DxvkSettings): self.core.lgd.config[f"{self.name}.env"]["DXVK_HUD"] = "1" if show_dxvk_index == 3: dxvk_options = [] - for o in self.dxvk_options_map: - if self.dxvk_options_map[o].isChecked(): - dxvk_options.append(o) + for opt in self.dxvk_options_map: + if self.dxvk_options_map[opt].isChecked(): + dxvk_options.append(opt) if not dxvk_options: - dxvk_options = ["devinfo", "fps"] - self.core.lgd.config[f"{self.name}.env"]["DXVK_HUD"] = ",".join(dxvk_options) + # Check if this is the first activation + stored = self.core.lgd.config.get(f"{self.name}.env", "DXVK_HUD", fallback=None) + if stored not in [None, "0", "1"]: + self.core.lgd.config[f"{self.name}.env"]["DXVK_HUD"] = "0" + else: + dxvk_options = ["devinfo", "fps"] + # Check again if dxvk_options changed due to first activation + if dxvk_options: + self.core.lgd.config[f"{self.name}.env"]["DXVK_HUD"] = ",".join(dxvk_options) else: if self.core.lgd.config.get(f"{self.name}.env", "DXVK_HUD", fallback=None) is not None: self.core.lgd.config.remove_option(f"{self.name}.env", "DXVK_HUD") @@ -90,7 +97,7 @@ class DxvkSettings(QGroupBox, Ui_DxvkSettings): class DxvkWidget(QGroupBox): - def __init__(self, core: LegendaryCore): + def __init__(self, core: LegendaryCore, name=None): super(DxvkWidget, self).__init__() self.core = core self.setObjectName("settings_widget") @@ -103,7 +110,7 @@ class DxvkWidget(QGroupBox): "api": [False, self.tr("D3D Level of application")], "frametime": [False, self.tr("Frame time graph")] } - self.name = "default" + self.name = name self.layout = QVBoxLayout() self.child_layout = QHBoxLayout() self.setTitle(self.tr("dxvk settings")) From 8c882177e1a9900a70a8bd9d4209efe05c9d864a Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Sat, 1 May 2021 23:15:42 +0300 Subject: [PATCH 23/34] Make PathEdit more self-contained --- .../tabs/games/game_info/game_settings.py | 3 +-- rare/components/tabs/games/import_widget.py | 3 +-- rare/components/tabs/settings/dxvk_ui.py | 3 +-- rare/components/tabs/settings/legendary.py | 8 ++---- rare/components/tabs/settings/linux.py | 25 +++++-------------- rare/components/tabs/settings/rare.py | 6 +---- rare/utils/extra_widgets.py | 18 ++++++++++++- resources/ui/components/tabs/settings/dxvk.ui | 10 +------- 8 files changed, 30 insertions(+), 46 deletions(-) diff --git a/rare/components/tabs/games/game_info/game_settings.py b/rare/components/tabs/games/game_info/game_settings.py index d53d27bd..bb9d7623 100644 --- a/rare/components/tabs/games/game_info/game_settings.py +++ b/rare/components/tabs/games/game_info/game_settings.py @@ -92,8 +92,7 @@ class GameSettings(QScrollArea): self.select_proton_widget = SettingsWidget(self.tr("Proton Wrapper"), self.select_proton) self.layout.addWidget(self.select_proton_widget) - self.proton_prefix = PathEdit("x", QFileDialog.DirectoryOnly) - self.proton_prefix.save_path_button.clicked.connect(self.update_prefix) + self.proton_prefix = PathEdit("x", QFileDialog.DirectoryOnly, save_func=self.update_prefix) self.proton_prefix_widget = SettingsWidget(self.tr("Proton prefix"), self.proton_prefix) self.layout.addWidget(self.proton_prefix_widget) diff --git a/rare/components/tabs/games/import_widget.py b/rare/components/tabs/games/import_widget.py index 0cd15230..93fe9126 100644 --- a/rare/components/tabs/games/import_widget.py +++ b/rare/components/tabs/games/import_widget.py @@ -55,8 +55,7 @@ class ImportWidget(QWidget): self.app_name_input.setLayout(minilayout) self.app_name_input.textChanged.connect(self.app_name_changed) - self.path_edit = PathEdit(os.path.expanduser("~"), QFileDialog.DirectoryOnly) - self.path_edit.text_edit.textChanged.connect(self.path_changed) + self.path_edit = PathEdit(os.path.expanduser("~"), QFileDialog.DirectoryOnly, edit_func=self.path_changed) self.gb_layout.addWidget(self.path_edit) self.gb_layout.addWidget(self.override_app_name_label) diff --git a/rare/components/tabs/settings/dxvk_ui.py b/rare/components/tabs/settings/dxvk_ui.py index 60fd9a9f..577cdae9 100644 --- a/rare/components/tabs/settings/dxvk_ui.py +++ b/rare/components/tabs/settings/dxvk_ui.py @@ -14,7 +14,6 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_DxvkSettings(object): def setupUi(self, DxvkSettings): DxvkSettings.setObjectName("DxvkSettings") - DxvkSettings.resize(598, 182) self.gridLayout = QtWidgets.QGridLayout(DxvkSettings) self.gridLayout.setObjectName("gridLayout") self.gb_dxvk_options = QtWidgets.QGroupBox(DxvkSettings) @@ -42,7 +41,7 @@ class Ui_DxvkSettings(object): self.fps = QtWidgets.QCheckBox(self.gb_dxvk_options) self.fps.setObjectName("fps") self.layout_dxvk_options.addWidget(self.fps, 2, 0, 1, 1) - spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + spacerItem = QtWidgets.QSpacerItem(0, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.layout_dxvk_options.addItem(spacerItem, 0, 3, 4, 1) self.gridLayout.addWidget(self.gb_dxvk_options, 2, 0, 1, 3) self.lbl_show_dxvk = QtWidgets.QLabel(DxvkSettings) diff --git a/rare/components/tabs/settings/legendary.py b/rare/components/tabs/settings/legendary.py index 3b9911bc..ed3c0796 100644 --- a/rare/components/tabs/settings/legendary.py +++ b/rare/components/tabs/settings/legendary.py @@ -19,12 +19,8 @@ class LegendarySettings(QWidget, Ui_LegendarySettings): # Default installation directory self.install_dir = PathEdit(core.get_default_install_dir(), - file_type=QFileDialog.DirectoryOnly) - self.install_dir.text_edit.textChanged.connect( - lambda t: self.install_dir.save_path_button.setDisabled(False) - ) - self.install_dir.save_path_button.clicked.connect(self.save_path) - self.install_dir.save_path_button.setDisabled(True) + file_type=QFileDialog.DirectoryOnly, + save_func=self.save_path) self.layout_install_dir.addWidget(self.install_dir) # Max Workers diff --git a/rare/components/tabs/settings/linux.py b/rare/components/tabs/settings/linux.py index 1eaf3551..d889e323 100644 --- a/rare/components/tabs/settings/linux.py +++ b/rare/components/tabs/settings/linux.py @@ -18,29 +18,17 @@ class LinuxSettings(QWidget, Ui_LinuxSettings): self.name = name if name is not None else "default" self.core = core - # Wineprefix + # Wine prefix self.wine_prefix = PathEdit(self.core.lgd.config.get(self.name, "wine_prefix", fallback=""), - file_type=QFileDialog.DirectoryOnly) - self.wine_prefix.text_edit.textChanged.connect( - lambda t: self.wine_prefix.save_path_button.setDisabled(False) - ) - self.wine_prefix.save_path_button.clicked.connect( - lambda: self.save_setting(self.wine_prefix, "wine_prefix") - ) - self.wine_prefix.save_path_button.setDisabled(True) + file_type=QFileDialog.DirectoryOnly, + save_func=lambda: self.save_setting(self.wine_prefix, "wine_prefix")) self.prefix_layout.addWidget(self.wine_prefix) # Wine executable self.wine_exec = PathEdit(self.core.lgd.config.get(self.name, "wine_executable", fallback=""), file_type=QFileDialog.ExistingFile, - name_filter="Wine executable (wine wine64)") - self.wine_exec.text_edit.textChanged.connect( - lambda t: self.wine_exec.save_path_button.setDisabled(False) - ) - self.wine_exec.save_path_button.clicked.connect( - lambda: self.save_setting(self.wine_exec, "wine_executable") - ) - self.wine_exec.save_path_button.setDisabled(True) + name_filter="Wine executable (wine wine64)", + save_func=lambda: self.save_setting(self.wine_exec, "wine_executable")) self.exec_layout.addWidget(self.wine_exec) # dxvk @@ -56,11 +44,10 @@ class LinuxSettings(QWidget, Ui_LinuxSettings): self.core.lgd.config.add_section(self.name) self.core.lgd.config.set(self.name, setting_name, widget.text()) - if widget.text() == "": + if not widget.text(): self.core.lgd.config.remove_option(self.name, setting_name) else: logger.info("Set config of wine_prefix to " + widget.text()) if self.core.lgd.config[self.name] == {}: self.core.lgd.config.remove_section(self.name) - widget.save_path_button.setDisabled(True) self.core.lgd.save_config() diff --git a/rare/components/tabs/settings/rare.py b/rare/components/tabs/settings/rare.py index f4f37388..2b5a8029 100644 --- a/rare/components/tabs/settings/rare.py +++ b/rare/components/tabs/settings/rare.py @@ -42,10 +42,7 @@ class RareSettings(QWidget, Ui_RareSettings): self.logdir = os.path.expanduser("~/.cache/rare/logs") # Select Image directory - self.img_dir = PathEdit(self.img_dir_path, file_type=QFileDialog.DirectoryOnly) - self.img_dir.text_edit.textChanged.connect(lambda t: self.img_dir.save_path_button.setDisabled(False)) - self.img_dir.save_path_button.clicked.connect(self.save_path) - self.img_dir.save_path_button.setDisabled(True) + self.img_dir = PathEdit(self.img_dir_path, file_type=QFileDialog.DirectoryOnly, save_func=self.save_path) self.layout_img_dir.addWidget(self.img_dir) # Select lang @@ -98,7 +95,6 @@ class RareSettings(QWidget, Ui_RareSettings): self.settings.remove("window_size") def save_path(self): - self.img_dir.save_path_button.setDisabled(True) self.update_path() def update_lang(self, i: int): diff --git a/rare/utils/extra_widgets.py b/rare/utils/extra_widgets.py index 35139142..5d1bae80 100644 --- a/rare/utils/extra_widgets.py +++ b/rare/utils/extra_widgets.py @@ -126,20 +126,36 @@ class PathEdit(QWidget, Ui_PathEdit): text: str = "", file_type: QFileDialog.FileType = QFileDialog.AnyFile, type_filter: str = None, - name_filter: str = None): + name_filter: str = None, + edit_func: callable = None, + save_func: callable = None): super(PathEdit, self).__init__() self.setupUi(self) self.type_filter = type_filter self.name_filter = name_filter self.file_type = file_type + self.edit_func = edit_func + self.save_func = save_func if text: self.text_edit.setText(text) + if self.edit_func is not None: + self.text_edit.textChanged.connect(self.edit_func) + if self.save_func is None: + self.save_path_button.setVisible(False) + else: + self.text_edit.textChanged.connect(lambda t: self.save_path_button.setDisabled(False)) + self.save_path_button.clicked.connect(self.save) + self.save_path_button.setDisabled(True) self.path_select.clicked.connect(self.set_path) def text(self): return self.text_edit.text() + def save(self): + self.save_func() + self.save_path_button.setDisabled(True) + def set_path(self): dlg_path = self.text_edit.text() if not dlg_path: diff --git a/resources/ui/components/tabs/settings/dxvk.ui b/resources/ui/components/tabs/settings/dxvk.ui index 7b6be624..edf5b241 100644 --- a/resources/ui/components/tabs/settings/dxvk.ui +++ b/resources/ui/components/tabs/settings/dxvk.ui @@ -2,14 +2,6 @@ DxvkSettings - - - 0 - 0 - 598 - 182 - - DxvkSettings @@ -79,7 +71,7 @@ - 40 + 0 20 From 2f58422191700dc79a0373cadd4aa284771e28ab Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Fri, 30 Apr 2021 00:30:42 +0300 Subject: [PATCH 24/34] Redesign Game Info and Game Settings tabs --- rare/app.py | 7 +- .../tabs/games/game_info/__init__.py | 120 +----- .../tabs/games/game_info/game_info_ui.py | 206 ++++++++++ .../tabs/games/game_info/game_settings.py | 126 +++--- .../tabs/games/game_info/game_settings_ui.py | 157 ++++++++ .../tabs/games/game_info/game_info.ui | 363 ++++++++++++++++++ .../tabs/games/game_info/game_settings.ui | 270 +++++++++++++ 7 files changed, 1066 insertions(+), 183 deletions(-) create mode 100644 rare/components/tabs/games/game_info/game_info_ui.py create mode 100644 rare/components/tabs/games/game_info/game_settings_ui.py create mode 100644 resources/ui/components/tabs/games/game_info/game_info.ui create mode 100644 resources/ui/components/tabs/games/game_info/game_settings.ui diff --git a/rare/app.py b/rare/app.py index a58d3bfc..4a426fa8 100644 --- a/rare/app.py +++ b/rare/app.py @@ -7,7 +7,7 @@ import time from PyQt5.QtCore import QSettings, QTranslator from PyQt5.QtGui import QIcon -from PyQt5.QtWidgets import QApplication, QSystemTrayIcon +from PyQt5.QtWidgets import QApplication, QSystemTrayIcon, QStyleFactory from custom_legendary.core import LegendaryCore from rare import lang_path, style_path @@ -67,7 +67,8 @@ class App(QApplication): self.installTranslator(self.translator) # Style - self.setStyleSheet(open(style_path + "RareStyle.qss").read()) + # self.setStyle(QStyleFactory.create("Fusion")) + # self.setStyleSheet(open(style_path + "RareStyle.qss").read()) self.setWindowIcon(QIcon(style_path + "Logo.png")) # launch app @@ -107,4 +108,4 @@ def start(args): if exit_code != -133742: break # restart app - del app \ No newline at end of file + del app diff --git a/rare/components/tabs/games/game_info/__init__.py b/rare/components/tabs/games/game_info/__init__.py index 7b6ad379..d74e0bad 100644 --- a/rare/components/tabs/games/game_info/__init__.py +++ b/rare/components/tabs/games/game_info/__init__.py @@ -3,14 +3,14 @@ import os from PyQt5.QtCore import Qt, pyqtSignal from PyQt5.QtGui import QPixmap, QKeyEvent -from PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout, QLabel, QHBoxLayout, QTabWidget, QMessageBox, \ - QProgressBar, QStackedWidget, QGroupBox, QScrollArea +from PyQt5.QtWidgets import QWidget, QTabWidget, QMessageBox from qtawesome import icon from custom_legendary.core import LegendaryCore from custom_legendary.models.game import InstalledGame, Game from rare.components.dialogs.uninstall_dialog import UninstallDialog from rare.components.tabs.games.game_info.dlcs import DlcTab +from rare.components.tabs.games.game_info.game_info_ui import Ui_GameInfo from rare.components.tabs.games.game_info.game_settings import GameSettings from rare.utils import legendary_utils from rare.utils.extra_widgets import SideTabBar @@ -56,7 +56,7 @@ class InfoTabs(QTabWidget): self.parent().layout.setCurrentIndex(0) -class GameInfo(QScrollArea): +class GameInfo(QWidget, Ui_GameInfo): igame: InstalledGame game: Game update_list = pyqtSignal() @@ -67,6 +67,7 @@ class GameInfo(QScrollArea): def __init__(self, core: LegendaryCore, parent): super(GameInfo, self).__init__(parent=parent) + self.setupUi(self) self.ratings = {"platinum": self.tr("Platimum"), "gold": self.tr("Gold"), @@ -77,58 +78,15 @@ class GameInfo(QScrollArea): self.widget = QWidget() self.core = core - self.layout = QVBoxLayout() - self.setWidgetResizable(True) - - top_layout = QHBoxLayout() - - # No Game at start. Game is set when clicked info - self.image = QLabel() - top_layout.addWidget(self.image) - - right_layout = QVBoxLayout() - self.game_title = QLabel("Error") - self.game_title.setTextInteractionFlags(Qt.TextSelectableByMouse) - right_layout.addWidget(self.game_title) - - self.dev = QLabel("Error") - self.dev.setTextInteractionFlags(Qt.TextSelectableByMouse) - right_layout.addWidget(self.dev) - - self.app_name = QLabel("Error") - self.app_name.setTextInteractionFlags(Qt.TextSelectableByMouse) - right_layout.addWidget(self.app_name) if os.name != "nt": self.grade = QLabel("Error") right_layout.addWidget(self.grade) self.grade.setTextInteractionFlags(Qt.TextSelectableByMouse) - self.version = QLabel("Error") - self.version.setTextInteractionFlags(Qt.TextSelectableByMouse) - right_layout.addWidget(self.version) - - self.install_size = QLabel("Error") - right_layout.addWidget(self.install_size) - - self.install_path = QLabel("Error") - self.install_path.setTextInteractionFlags(Qt.TextSelectableByMouse) - self.install_path.setWordWrap(True) - right_layout.addWidget(self.install_path) - - top_layout.addLayout(right_layout) - top_layout.addStretch() - self.game_actions = GameActions() - - self.game_actions.uninstall_button.clicked.connect(self.uninstall) - self.game_actions.verify_button.clicked.connect(self.verify) - self.game_actions.repair_button.clicked.connect(self.repair) - - self.layout.addLayout(top_layout) - self.layout.addWidget(self.game_actions) - self.layout.addStretch() - self.widget.setLayout(self.layout) - self.setWidget(self.widget) + self.uninstall_button.clicked.connect(self.uninstall) + self.verify_button.clicked.connect(self.verify) + self.repair_button.clicked.connect(self.repair) def uninstall(self): infos = UninstallDialog(self.game).get_information() @@ -147,18 +105,18 @@ class GameInfo(QScrollArea): self.verify_game.emit(self.game.app_name) def verify(self): - self.game_actions.verify_widget.setCurrentIndex(1) + self.verify_widget.setCurrentIndex(1) verify_thread = VerifyThread(self.core, self.game.app_name) verify_thread.status.connect(self.verify_satistics) verify_thread.summary.connect(self.finish_verify) verify_thread.start() - self.game_actions.verify_progress_bar.setValue(0) + self.verify_progress.setValue(0) self.verify_threads[self.game.app_name] = verify_thread def verify_satistics(self, progress): # checked, max, app_name if progress[2] == self.game.app_name: - self.game_actions.verify_progress_bar.setValue(progress[0] * 100 / progress[1]) + self.verify_progress.setValue(progress[0] * 100 / progress[1]) def finish_verify(self, failed): failed, missing, app_name = failed @@ -171,7 +129,7 @@ class GameInfo(QScrollArea): failed, missing), QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) if ans == QMessageBox.Yes: self.verify_game.emit(self.game.app_name) - self.game_actions.verify_widget.setCurrentIndex(0) + self.verify_widget.setCurrentIndex(0) self.verify_threads.pop(app_name) def update_game(self, app_name): @@ -193,12 +151,11 @@ class GameInfo(QScrollArea): w = 200 pixmap = pixmap.scaled(w, int(w * 4 / 3)) self.image.setPixmap(pixmap) - self.app_name.setText("App name: " + self.game.app_name) - self.version.setText("Version: " + self.game.app_version) - self.dev.setText(self.tr("Developer: ") + self.game.metadata["developer"]) - self.install_size.setText( - self.tr("Install size: ") + get_size(self.igame.install_size)) - self.install_path.setText(self.tr("Install path: ") + self.igame.install_path) + self.app_name.setText(self.game.app_name) + self.version.setText(self.game.app_version) + self.dev.setText(self.game.metadata["developer"]) + self.install_size.setText(get_size(self.igame.install_size)) + self.install_path.setText(self.igame.install_path) if os.name != "nt": if grade := self.ratings.get(self.grade_table[app_name].get("grade")): @@ -207,48 +164,9 @@ class GameInfo(QScrollArea): self.grade.setText(self.tr("ProtonDB rating: Error")) if len(self.verify_threads.keys()) == 0 or not self.verify_threads.get(app_name): - self.game_actions.verify_widget.setCurrentIndex(0) + self.verify_widget.setCurrentIndex(0) elif self.verify_threads.get(app_name): - self.game_actions.verify_widget.setCurrentIndex(1) - self.game_actions.verify_progress_bar.setValue( + self.verify_widget.setCurrentIndex(1) + self.verify_progress.setValue( self.verify_threads[app_name].num / self.verify_threads[app_name].total * 100) - -class GameActions(QGroupBox): - def __init__(self): - super(GameActions, self).__init__() - self.setTitle(f"{self.tr('Game actions')}") - self.setStyleSheet("QGroupBox{font-size: 20px}") - self.layout = QVBoxLayout() - - uninstall_layout = QHBoxLayout() - self.uninstall_game = QLabel(self.tr("Uninstall game")) - uninstall_layout.addWidget(self.uninstall_game) - self.uninstall_button = QPushButton(self.tr("Uninstall")) - self.uninstall_button.setFixedWidth(250) - uninstall_layout.addWidget(self.uninstall_button) - self.layout.addLayout(uninstall_layout) - - verify_layout = QHBoxLayout() - self.verify_game = QLabel(self.tr("Verify Game")) - verify_layout.addWidget(self.verify_game) - self.verify_widget = QStackedWidget() - self.verify_widget.setMaximumHeight(20) - self.verify_widget.setFixedWidth(250) - self.verify_button = QPushButton(self.tr("Verify")) - self.verify_widget.addWidget(self.verify_button) - self.verify_progress_bar = QProgressBar() - self.verify_progress_bar.setMaximum(100) - self.verify_widget.addWidget(self.verify_progress_bar) - verify_layout.addWidget(self.verify_widget) - self.layout.addLayout(verify_layout) - - repair_layout = QHBoxLayout() - repair_info = QLabel(self.tr("Repair Game")) - repair_layout.addWidget(repair_info) - self.repair_button = QPushButton(self.tr("Repair")) - self.repair_button.setFixedWidth(250) - repair_layout.addWidget(self.repair_button) - self.layout.addLayout(repair_layout) - - self.setLayout(self.layout) diff --git a/rare/components/tabs/games/game_info/game_info_ui.py b/rare/components/tabs/games/game_info/game_info_ui.py new file mode 100644 index 00000000..c2919c44 --- /dev/null +++ b/rare/components/tabs/games/game_info/game_info_ui.py @@ -0,0 +1,206 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'resources/ui/components/tabs/games/game_info/game_info.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_GameInfo(object): + def setupUi(self, GameInfo): + GameInfo.setObjectName("GameInfo") + self.layout_game_info = QtWidgets.QGridLayout(GameInfo) + self.layout_game_info.setObjectName("layout_game_info") + self.layout_game_info_form = QtWidgets.QGridLayout() + self.layout_game_info_form.setContentsMargins(6, 6, 6, 6) + self.layout_game_info_form.setSpacing(12) + self.layout_game_info_form.setObjectName("layout_game_info_form") + self.install_path = QtWidgets.QLabel(GameInfo) + self.install_path.setText("error") + self.install_path.setWordWrap(True) + self.install_path.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) + self.install_path.setObjectName("install_path") + self.layout_game_info_form.addWidget(self.install_path, 4, 1, 1, 1) + self.version = QtWidgets.QLabel(GameInfo) + self.version.setText("error") + self.version.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) + self.version.setObjectName("version") + self.layout_game_info_form.addWidget(self.version, 2, 1, 1, 1) + self.install_size = QtWidgets.QLabel(GameInfo) + self.install_size.setText("error") + self.install_size.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) + self.install_size.setObjectName("install_size") + self.layout_game_info_form.addWidget(self.install_size, 3, 1, 1, 1) + self.lbl_dev = QtWidgets.QLabel(GameInfo) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lbl_dev.sizePolicy().hasHeightForWidth()) + self.lbl_dev.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.lbl_dev.setFont(font) + self.lbl_dev.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.lbl_dev.setObjectName("lbl_dev") + self.layout_game_info_form.addWidget(self.lbl_dev, 0, 0, 1, 1) + self.dev = QtWidgets.QLabel(GameInfo) + self.dev.setText("error") + self.dev.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) + self.dev.setObjectName("dev") + self.layout_game_info_form.addWidget(self.dev, 0, 1, 1, 1) + self.app_name = QtWidgets.QLabel(GameInfo) + self.app_name.setText("error") + self.app_name.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) + self.app_name.setObjectName("app_name") + self.layout_game_info_form.addWidget(self.app_name, 1, 1, 1, 1) + self.lbl_version = QtWidgets.QLabel(GameInfo) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lbl_version.sizePolicy().hasHeightForWidth()) + self.lbl_version.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.lbl_version.setFont(font) + self.lbl_version.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.lbl_version.setObjectName("lbl_version") + self.layout_game_info_form.addWidget(self.lbl_version, 2, 0, 1, 1) + self.lbl_install_path = QtWidgets.QLabel(GameInfo) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lbl_install_path.sizePolicy().hasHeightForWidth()) + self.lbl_install_path.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.lbl_install_path.setFont(font) + self.lbl_install_path.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.lbl_install_path.setObjectName("lbl_install_path") + self.layout_game_info_form.addWidget(self.lbl_install_path, 4, 0, 1, 1) + spacerItem = QtWidgets.QSpacerItem(0, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.layout_game_info_form.addItem(spacerItem, 6, 1, 1, 1) + self.lbl_game_actions = QtWidgets.QLabel(GameInfo) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lbl_game_actions.sizePolicy().hasHeightForWidth()) + self.lbl_game_actions.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.lbl_game_actions.setFont(font) + self.lbl_game_actions.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.lbl_game_actions.setObjectName("lbl_game_actions") + self.layout_game_info_form.addWidget(self.lbl_game_actions, 5, 0, 1, 1) + self.lbl_app_name = QtWidgets.QLabel(GameInfo) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lbl_app_name.sizePolicy().hasHeightForWidth()) + self.lbl_app_name.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.lbl_app_name.setFont(font) + self.lbl_app_name.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.lbl_app_name.setObjectName("lbl_app_name") + self.layout_game_info_form.addWidget(self.lbl_app_name, 1, 0, 1, 1) + self.lbl_install_size = QtWidgets.QLabel(GameInfo) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lbl_install_size.sizePolicy().hasHeightForWidth()) + self.lbl_install_size.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.lbl_install_size.setFont(font) + self.lbl_install_size.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.lbl_install_size.setObjectName("lbl_install_size") + self.layout_game_info_form.addWidget(self.lbl_install_size, 3, 0, 1, 1) + spacerItem1 = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.layout_game_info_form.addItem(spacerItem1, 6, 0, 1, 1) + self.wg_game_actions = QtWidgets.QWidget(GameInfo) + self.wg_game_actions.setMinimumSize(QtCore.QSize(250, 0)) + self.wg_game_actions.setObjectName("wg_game_actions") + self.layout_game_actions = QtWidgets.QVBoxLayout(self.wg_game_actions) + self.layout_game_actions.setContentsMargins(0, 0, 0, 0) + self.layout_game_actions.setObjectName("layout_game_actions") + self.uninstall_button = QtWidgets.QPushButton(self.wg_game_actions) + self.uninstall_button.setObjectName("uninstall_button") + self.layout_game_actions.addWidget(self.uninstall_button) + self.verify_widget = QtWidgets.QStackedWidget(self.wg_game_actions) + self.verify_widget.setObjectName("verify_widget") + self.page_verify_button = QtWidgets.QWidget() + self.page_verify_button.setObjectName("page_verify_button") + self.layout_verify_button = QtWidgets.QVBoxLayout(self.page_verify_button) + self.layout_verify_button.setContentsMargins(0, 0, 0, 0) + self.layout_verify_button.setSpacing(0) + self.layout_verify_button.setObjectName("layout_verify_button") + self.verify_button = QtWidgets.QPushButton(self.page_verify_button) + self.verify_button.setObjectName("verify_button") + self.layout_verify_button.addWidget(self.verify_button) + self.verify_widget.addWidget(self.page_verify_button) + self.page_verify_progress = QtWidgets.QWidget() + self.page_verify_progress.setObjectName("page_verify_progress") + self.layout_verify_progress = QtWidgets.QVBoxLayout(self.page_verify_progress) + self.layout_verify_progress.setContentsMargins(0, 0, 0, 0) + self.layout_verify_progress.setSpacing(0) + self.layout_verify_progress.setObjectName("layout_verify_progress") + self.verify_progress = QtWidgets.QProgressBar(self.page_verify_progress) + self.verify_progress.setProperty("value", 24) + self.verify_progress.setObjectName("verify_progress") + self.layout_verify_progress.addWidget(self.verify_progress) + self.verify_widget.addWidget(self.page_verify_progress) + self.layout_game_actions.addWidget(self.verify_widget) + self.repair_button = QtWidgets.QPushButton(self.wg_game_actions) + self.repair_button.setObjectName("repair_button") + self.layout_game_actions.addWidget(self.repair_button) + self.layout_game_info_form.addWidget(self.wg_game_actions, 5, 1, 1, 1, QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) + self.layout_game_info.addLayout(self.layout_game_info_form, 2, 1, 1, 1) + self.image = QtWidgets.QLabel(GameInfo) + self.image.setFrameShape(QtWidgets.QFrame.StyledPanel) + self.image.setFrameShadow(QtWidgets.QFrame.Sunken) + self.image.setText("") + self.image.setObjectName("image") + self.layout_game_info.addWidget(self.image, 2, 0, 1, 1, QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) + self.game_title = QtWidgets.QLabel(GameInfo) + self.game_title.setText("error") + self.game_title.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) + self.game_title.setObjectName("game_title") + self.layout_game_info.addWidget(self.game_title, 0, 0, 1, 3) + + self.retranslateUi(GameInfo) + self.verify_widget.setCurrentIndex(0) + QtCore.QMetaObject.connectSlotsByName(GameInfo) + + def retranslateUi(self, GameInfo): + _translate = QtCore.QCoreApplication.translate + GameInfo.setWindowTitle(_translate("GameInfo", "Game Info")) + self.lbl_dev.setText(_translate("GameInfo", "Developer:")) + self.lbl_version.setText(_translate("GameInfo", "Version:")) + self.lbl_install_path.setText(_translate("GameInfo", "Installation Path:")) + self.lbl_game_actions.setText(_translate("GameInfo", "Game Actions:")) + self.lbl_app_name.setText(_translate("GameInfo", "Application Name:")) + self.lbl_install_size.setText(_translate("GameInfo", "Installation Size:")) + self.uninstall_button.setText(_translate("GameInfo", "Uninstall Game")) + self.verify_button.setText(_translate("GameInfo", "Verify Installation")) + self.repair_button.setText(_translate("GameInfo", "Repair Instalation")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + GameInfo = QtWidgets.QWidget() + ui = Ui_GameInfo() + ui.setupUi(GameInfo) + GameInfo.show() + sys.exit(app.exec_()) diff --git a/rare/components/tabs/games/game_info/game_settings.py b/rare/components/tabs/games/game_info/game_settings.py index bb9d7623..bd22b7ae 100644 --- a/rare/components/tabs/games/game_info/game_settings.py +++ b/rare/components/tabs/games/game_info/game_settings.py @@ -1,13 +1,12 @@ import os from PyQt5.QtCore import QSettings -from PyQt5.QtWidgets import QWidget, QLabel, QVBoxLayout, QComboBox, QFileDialog, QPushButton, QMessageBox, QLineEdit, \ - QScrollArea, QCheckBox +from PyQt5.QtWidgets import QWidget, QFileDialog, QMessageBox from custom_legendary.core import LegendaryCore from custom_legendary.models.game import InstalledGame, Game +from rare.components.tabs.games.game_info.game_settings_ui import Ui_GameSettings from rare.components.tabs.settings.linux import LinuxSettings -from rare.components.tabs.settings.settings_widget import SettingsWidget from rare.utils.extra_widgets import PathEdit @@ -31,7 +30,7 @@ def find_proton_wrappers(): return possible_proton_wrappers -class GameSettings(QScrollArea): +class GameSettings(QWidget, Ui_GameSettings): game: Game igame: InstalledGame @@ -40,71 +39,40 @@ class GameSettings(QScrollArea): def __init__(self, core: LegendaryCore, parent): super(GameSettings, self).__init__(parent=parent) + self.setupUi(self) + self.core = core - self.widget = QWidget() self.settings = QSettings() - self.setWidgetResizable(True) - self.layout = QVBoxLayout() - self.title = QLabel("Error") - self.layout.addWidget(self.title) - - self.offline = QComboBox() - self.offline.addItems(["unset", "true", "false"]) - self.offline_widget = SettingsWidget(self.tr("Launch Game offline"), self.offline) - self.offline.currentIndexChanged.connect(lambda x: self.update_combobox(x, "offline")) - - self.skip_update = QComboBox() - self.skip_update.addItems(["unset", "true", "false"]) - self.skip_update_widget = SettingsWidget(self.tr("Skip update check before launching"), self.skip_update) - self.layout.addWidget(self.skip_update_widget) - self.skip_update.currentIndexChanged.connect(lambda x: self.update_combobox(x, "skip_update_check")) - - self.launch_params = QLineEdit("") - self.launch_params.setPlaceholderText(self.tr("Start parameter")) - self.launch_params_accept_button = QPushButton(self.tr("Save")) - self.launch_params_widget = SettingsWidget(self.tr("Launch parameters"), self.launch_params, - self.launch_params_accept_button) - self.layout.addWidget(self.launch_params_widget) - self.launch_params_accept_button.clicked.connect( - lambda: self.save_line_edit("start_params", self.launch_params.text())) - - self.cloud_sync = QCheckBox("Sync with cloud") - self.cloud_sync_widget = SettingsWidget(self.tr("Auto sync with cloud"), self.cloud_sync) - self.layout.addWidget(self.cloud_sync_widget) - self.cloud_sync.stateChanged.connect(lambda: self.settings.setValue(f"{self.game.app_name}/auto_sync_cloud", - self.cloud_sync.isChecked())) - - self.layout.addWidget(self.offline_widget) - - self.wrapper = QLineEdit("") - self.wrapper.setPlaceholderText("Wrapper") - self.wrapper_save_button = QPushButton(self.tr("Save")) - self.wrapper_save_button.clicked.connect(lambda: self.save_line_edit("wrapper", self.wrapper.text())) - self.wrapper_widget = SettingsWidget(self.tr("Wrapper (e.g. optirun)"), self.wrapper, self.wrapper_save_button) - self.layout.addWidget(self.wrapper_widget) + self.offline.currentIndexChanged.connect( + lambda x: self.update_combobox(x, "offline") + ) + self.skip_update.currentIndexChanged.connect( + lambda x: self.update_combobox(x, "skip_update_check") + ) + self.launch_params_button.clicked.connect( + lambda: self.save_line_edit("start_params", self.launch_params.text()) + ) + self.cloud_sync.stateChanged.connect( + lambda: self.settings.setValue(f"{self.game.app_name}/auto_sync_cloud", self.cloud_sync.isChecked()) + ) + self.wrapper_button.clicked.connect( + lambda: self.save_line_edit("wrapper", self.wrapper.text()) + ) if os.name != "nt": self.possible_proton_wrappers = find_proton_wrappers() - self.select_proton = QComboBox() - self.select_proton.addItems(["Don't use Proton"] + self.possible_proton_wrappers) - self.select_proton.currentIndexChanged.connect(self.change_proton) - self.select_proton_widget = SettingsWidget(self.tr("Proton Wrapper"), self.select_proton) - self.layout.addWidget(self.select_proton_widget) + self.proton_wrapper.addItems(self.possible_proton_wrappers) + self.proton_wrapper.currentIndexChanged.connect(self.change_proton) - self.proton_prefix = PathEdit("x", QFileDialog.DirectoryOnly, save_func=self.update_prefix) - self.proton_prefix_widget = SettingsWidget(self.tr("Proton prefix"), self.proton_prefix) - self.layout.addWidget(self.proton_prefix_widget) + self.proton_prefix = PathEdit("None", QFileDialog.DirectoryOnly, save_func=self.update_prefix) + self.proton_prefix_layout.addWidget(self.proton_prefix) self.linux_settings = LinuxAppSettings(core) - self.layout.addWidget(self.linux_settings) + self.linux_layout.addWidget(self.linux_settings) # startparams, skip_update_check - self.layout.addStretch(1) - self.widget.setLayout(self.layout) - self.setWidget(self.widget) - def save_line_edit(self, option, value): if value != "": if not (self.game.app_name in self.core.lgd.config.sections()): @@ -121,26 +89,27 @@ class GameSettings(QScrollArea): def update_combobox(self, i, option): if self.change: # remove section - if i == 0: + if i: + if not self.core.lgd.config[self.game.app_name]: + self.core.lgd.config.add_section(self.game.app_name) + if i == 1: + self.core.lgd.config.set(self.game.app_name, option, "true") + if i == 2: + self.core.lgd.config.set(self.game.app_name, option, "false") + else: if self.game.app_name in self.core.lgd.config.sections(): if self.core.lgd.config.get(f"{self.game.app_name}", option, fallback="") != "": self.core.lgd.config.remove_option(self.game.app_name, option) if self.core.lgd.config[self.game.app_name] == {}: self.core.lgd.config.remove_section(self.game.app_name) - elif i == 1: - self.core.lgd.config.add_section(self.game.app_name) - self.core.lgd.config.set(self.game.app_name, option, "true") - elif i == 2: - self.core.lgd.config.add_section(self.game.app_name) - self.core.lgd.config.set(self.game.app_name, option, "false") self.core.lgd.save_config() def change_proton(self, i): if self.change: # Dont use Proton if i == 0: - self.proton_prefix_widget.setVisible(False) - self.wrapper_widget.setVisible(True) + self.proton_prefix.setEnabled(False) + self.wrapper_widget.setEnabled(True) if f"{self.game.app_name}" in self.core.lgd.config.sections(): if self.core.lgd.config.get(f"{self.game.app_name}", "wrapper", fallback="") != "": self.core.lgd.config.remove_option(self.game.app_name, "wrapper") @@ -155,8 +124,8 @@ class GameSettings(QScrollArea): if self.core.lgd.config[self.game.app_name + ".env"] == {}: self.core.lgd.config.remove_section(self.game.app_name + ".env") else: - self.proton_prefix_widget.setVisible(True) - self.wrapper_widget.setVisible(False) + self.proton_prefix.setEnabled(True) + self.wrapper_widget.setEnabled(False) wrapper = self.possible_proton_wrappers[i - 1] if not self.game.app_name in self.core.lgd.config.sections(): self.core.lgd.config[self.game.app_name] = {} @@ -191,7 +160,6 @@ class GameSettings(QScrollArea): self.core.lgd.config.set(self.game.app_name + ".env", "STEAM_COMPAT_DATA_PATH", text) self.core.lgd.save_config() - self.proton_prefix.save_path_button.setDisabled(True) def update_game(self, app_name): self.change = False @@ -207,9 +175,9 @@ class GameSettings(QScrollArea): else: self.offline.setCurrentIndex(0) - self.offline_widget.setVisible(True) + self.offline.setEnabled(True) else: - self.offline_widget.setVisible(False) + self.offline.setEnabled(False) skip_update = self.core.lgd.config.get(self.game.app_name, "skip_update_check", fallback="unset") if skip_update == "true": @@ -228,22 +196,22 @@ class GameSettings(QScrollArea): self.linux_settings.dxvk.update_settings(app_name) proton = self.core.lgd.config.get(f"{app_name}", "wrapper", fallback="").replace('"', "") if proton != "": - self.proton_prefix_widget.setVisible(True) - self.select_proton.setCurrentText(f'"{proton.replace(" run", "")}" run') + self.proton_prefix.setEnabled(True) + self.proton_wrapper.setCurrentText(f'"{proton.replace(" run", "")}" run') proton_prefix = self.core.lgd.config.get(f"{app_name}.env", "STEAM_COMPAT_DATA_PATH", fallback=self.tr( "Please select path for proton prefix")) self.proton_prefix.text_edit.setText(proton_prefix) - self.wrapper_widget.setVisible(False) + self.wrapper_widget.setEnabled(False) else: - self.select_proton.setCurrentIndex(0) - self.proton_prefix_widget.setVisible(False) - self.wrapper_widget.setVisible(True) + self.proton_wrapper.setCurrentIndex(0) + self.proton_prefix.setEnabled(False) + self.wrapper_widget.setEnabled(True) if not self.game.supports_cloud_saves: - self.cloud_sync_widget.setVisible(False) + self.cloud_sync.setEnabled(False) else: - self.cloud_sync_widget.setVisible(True) + self.cloud_sync.setEnabled(True) sync_cloud = self.settings.value(f"{self.game.app_name}/auto_sync_cloud", True, bool) self.cloud_sync.setChecked(sync_cloud) diff --git a/rare/components/tabs/games/game_info/game_settings_ui.py b/rare/components/tabs/games/game_info/game_settings_ui.py new file mode 100644 index 00000000..bb3276ee --- /dev/null +++ b/rare/components/tabs/games/game_info/game_settings_ui.py @@ -0,0 +1,157 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'resources/ui/components/tabs/games/game_info/game_settings.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_GameSettings(object): + def setupUi(self, GameSettings): + GameSettings.setObjectName("GameSettings") + GameSettings.resize(668, 433) + self.game_settings_layout = QtWidgets.QVBoxLayout(GameSettings) + self.game_settings_layout.setObjectName("game_settings_layout") + self.title = QtWidgets.QLabel(GameSettings) + self.title.setText("error") + self.title.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) + self.title.setObjectName("title") + self.game_settings_layout.addWidget(self.title) + self.launch_settings_groupbox = QtWidgets.QGroupBox(GameSettings) + self.launch_settings_groupbox.setObjectName("launch_settings_groupbox") + self.launch_settings_layout = QtWidgets.QGridLayout(self.launch_settings_groupbox) + self.launch_settings_layout.setObjectName("launch_settings_layout") + self.launch_params_label = QtWidgets.QLabel(self.launch_settings_groupbox) + self.launch_params_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.launch_params_label.setObjectName("launch_params_label") + self.launch_settings_layout.addWidget(self.launch_params_label, 3, 0, 1, 1) + self.skip_update = QtWidgets.QComboBox(self.launch_settings_groupbox) + self.skip_update.setObjectName("skip_update") + self.skip_update.addItem("") + self.skip_update.addItem("") + self.skip_update.addItem("") + self.launch_settings_layout.addWidget(self.skip_update, 0, 1, 1, 1, QtCore.Qt.AlignLeft) + self.skip_update_label = QtWidgets.QLabel(self.launch_settings_groupbox) + self.skip_update_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.skip_update_label.setObjectName("skip_update_label") + self.launch_settings_layout.addWidget(self.skip_update_label, 0, 0, 1, 1) + self.offline_label = QtWidgets.QLabel(self.launch_settings_groupbox) + self.offline_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.offline_label.setObjectName("offline_label") + self.launch_settings_layout.addWidget(self.offline_label, 1, 0, 1, 1) + self.wrapper_label = QtWidgets.QLabel(self.launch_settings_groupbox) + self.wrapper_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.wrapper_label.setObjectName("wrapper_label") + self.launch_settings_layout.addWidget(self.wrapper_label, 4, 0, 1, 1) + self.offline = QtWidgets.QComboBox(self.launch_settings_groupbox) + self.offline.setObjectName("offline") + self.offline.addItem("") + self.offline.addItem("") + self.offline.addItem("") + self.launch_settings_layout.addWidget(self.offline, 1, 1, 1, 1, QtCore.Qt.AlignLeft) + self.cloud_sync = QtWidgets.QCheckBox(self.launch_settings_groupbox) + self.cloud_sync.setText("") + self.cloud_sync.setObjectName("cloud_sync") + self.launch_settings_layout.addWidget(self.cloud_sync, 2, 1, 1, 1, QtCore.Qt.AlignLeft) + self.cloud_sync_label = QtWidgets.QLabel(self.launch_settings_groupbox) + self.cloud_sync_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.cloud_sync_label.setObjectName("cloud_sync_label") + self.launch_settings_layout.addWidget(self.cloud_sync_label, 2, 0, 1, 1) + self.wrapper_widget = QtWidgets.QWidget(self.launch_settings_groupbox) + self.wrapper_widget.setObjectName("wrapper_widget") + self.wrapper_layout = QtWidgets.QHBoxLayout(self.wrapper_widget) + self.wrapper_layout.setContentsMargins(0, 0, 0, 0) + self.wrapper_layout.setObjectName("wrapper_layout") + self.wrapper = QtWidgets.QLineEdit(self.wrapper_widget) + self.wrapper.setObjectName("wrapper") + self.wrapper_layout.addWidget(self.wrapper) + self.wrapper_button = QtWidgets.QPushButton(self.wrapper_widget) + self.wrapper_button.setObjectName("wrapper_button") + self.wrapper_layout.addWidget(self.wrapper_button) + self.launch_settings_layout.addWidget(self.wrapper_widget, 4, 1, 1, 1) + self.launch_params_widget = QtWidgets.QWidget(self.launch_settings_groupbox) + self.launch_params_widget.setObjectName("launch_params_widget") + self.launch_params_layout = QtWidgets.QHBoxLayout(self.launch_params_widget) + self.launch_params_layout.setContentsMargins(0, 0, 0, 0) + self.launch_params_layout.setObjectName("launch_params_layout") + self.launch_params = QtWidgets.QLineEdit(self.launch_params_widget) + self.launch_params.setObjectName("launch_params") + self.launch_params_layout.addWidget(self.launch_params) + self.launch_params_button = QtWidgets.QPushButton(self.launch_params_widget) + self.launch_params_button.setObjectName("launch_params_button") + self.launch_params_layout.addWidget(self.launch_params_button) + self.launch_settings_layout.addWidget(self.launch_params_widget, 3, 1, 1, 1) + self.game_settings_layout.addWidget(self.launch_settings_groupbox) + self.proton_groupbox = QtWidgets.QGroupBox(GameSettings) + self.proton_groupbox.setObjectName("proton_groupbox") + self.proton_layout = QtWidgets.QGridLayout(self.proton_groupbox) + self.proton_layout.setObjectName("proton_layout") + self.proton_prefix_label = QtWidgets.QLabel(self.proton_groupbox) + self.proton_prefix_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.proton_prefix_label.setObjectName("proton_prefix_label") + self.proton_layout.addWidget(self.proton_prefix_label, 1, 0, 1, 1) + self.proton_wrapper_label = QtWidgets.QLabel(self.proton_groupbox) + self.proton_wrapper_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.proton_wrapper_label.setObjectName("proton_wrapper_label") + self.proton_layout.addWidget(self.proton_wrapper_label, 0, 0, 1, 1) + self.proton_wrapper = QtWidgets.QComboBox(self.proton_groupbox) + self.proton_wrapper.setObjectName("proton_wrapper") + self.proton_wrapper.addItem("") + self.proton_layout.addWidget(self.proton_wrapper, 0, 1, 1, 1, QtCore.Qt.AlignLeft) + self.proton_prefix_layout = QtWidgets.QVBoxLayout() + self.proton_prefix_layout.setObjectName("proton_prefix_layout") + self.proton_layout.addLayout(self.proton_prefix_layout, 1, 1, 2, 1) + self.proton_prefix_alignment_label = QtWidgets.QLabel(self.proton_groupbox) + self.proton_prefix_alignment_label.setEnabled(False) + self.proton_prefix_alignment_label.setText("") + self.proton_prefix_alignment_label.setObjectName("proton_prefix_alignment_label") + self.proton_layout.addWidget(self.proton_prefix_alignment_label, 2, 0, 1, 1) + self.game_settings_layout.addWidget(self.proton_groupbox) + self.linux_layout = QtWidgets.QVBoxLayout() + self.linux_layout.setSpacing(0) + self.linux_layout.setObjectName("linux_layout") + self.game_settings_layout.addLayout(self.linux_layout) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.game_settings_layout.addItem(spacerItem) + + self.retranslateUi(GameSettings) + QtCore.QMetaObject.connectSlotsByName(GameSettings) + + def retranslateUi(self, GameSettings): + _translate = QtCore.QCoreApplication.translate + GameSettings.setWindowTitle(_translate("GameSettings", "Game Settings")) + self.launch_settings_groupbox.setTitle(_translate("GameSettings", "Launch Settings")) + self.launch_params_label.setText(_translate("GameSettings", "Launch parameters:")) + self.skip_update.setItemText(0, _translate("GameSettings", "Default")) + self.skip_update.setItemText(1, _translate("GameSettings", "Yes")) + self.skip_update.setItemText(2, _translate("GameSettings", "No")) + self.skip_update_label.setText(_translate("GameSettings", "Skip update check:")) + self.offline_label.setText(_translate("GameSettings", "Offline mode:")) + self.wrapper_label.setText(_translate("GameSettings", "Wrapper:")) + self.offline.setItemText(0, _translate("GameSettings", "Default")) + self.offline.setItemText(1, _translate("GameSettings", "Yes")) + self.offline.setItemText(2, _translate("GameSettings", "No")) + self.cloud_sync_label.setText(_translate("GameSettings", "Sync with cloud:")) + self.wrapper.setPlaceholderText(_translate("GameSettings", "e.g. optirun")) + self.wrapper_button.setText(_translate("GameSettings", "Save")) + self.launch_params.setPlaceholderText(_translate("GameSettings", "parameters")) + self.launch_params_button.setText(_translate("GameSettings", "Save")) + self.proton_groupbox.setTitle(_translate("GameSettings", "Proton")) + self.proton_prefix_label.setText(_translate("GameSettings", "Prefix:")) + self.proton_wrapper_label.setText(_translate("GameSettings", "Wrapper:")) + self.proton_wrapper.setItemText(0, _translate("GameSettings", "Don\'t use Proton")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + GameSettings = QtWidgets.QWidget() + ui = Ui_GameSettings() + ui.setupUi(GameSettings) + GameSettings.show() + sys.exit(app.exec_()) diff --git a/resources/ui/components/tabs/games/game_info/game_info.ui b/resources/ui/components/tabs/games/game_info/game_info.ui new file mode 100644 index 00000000..82029a12 --- /dev/null +++ b/resources/ui/components/tabs/games/game_info/game_info.ui @@ -0,0 +1,363 @@ + + + GameInfo + + + Game Info + + + + + + 6 + + + 6 + + + 6 + + + 6 + + + 12 + + + + + error + + + true + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Developer: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Version: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Installation Path: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Horizontal + + + + 0 + 20 + + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Game Actions: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Application Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Installation Size: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + 250 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Uninstall Game + + + + + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Verify Installation + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 24 + + + + + + + + + + + Repair Instalation + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + diff --git a/resources/ui/components/tabs/games/game_info/game_settings.ui b/resources/ui/components/tabs/games/game_info/game_settings.ui new file mode 100644 index 00000000..54aa71d4 --- /dev/null +++ b/resources/ui/components/tabs/games/game_info/game_settings.ui @@ -0,0 +1,270 @@ + + + GameSettings + + + + 0 + 0 + 668 + 433 + + + + Game Settings + + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Launch Settings + + + + + + Launch parameters: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + Default + + + + + Yes + + + + + No + + + + + + + + Skip update check: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Offline mode: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Wrapper: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + Default + + + + + Yes + + + + + No + + + + + + + + + + + + + + + Sync with cloud: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + e.g. optirun + + + + + + + Save + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + parameters + + + + + + + Save + + + + + + + + + + + + + Proton + + + + + + Prefix: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Wrapper: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + Don't use Proton + + + + + + + + + + + false + + + + + + + + + + + + + 0 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + From 2061afefb02f51599b2b9f1da7939996e25a7fe3 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Fri, 30 Apr 2021 10:10:36 +0300 Subject: [PATCH 25/34] Use widget alignment instead of label alignment --- .../tabs/games/game_info/game_info_ui.py | 19 ++++------ .../tabs/games/game_info/game_settings_ui.py | 21 ++++------ rare/components/tabs/settings/about_ui.py | 2 +- rare/components/tabs/settings/legendary_ui.py | 2 +- rare/components/tabs/settings/linux_ui.py | 6 +-- .../tabs/games/game_info/game_info.ui | 38 +++++++------------ .../tabs/games/game_info/game_settings.ui | 35 ++++------------- .../ui/components/tabs/settings/about.ui | 2 +- .../ui/components/tabs/settings/legendary.ui | 2 +- .../ui/components/tabs/settings/linux.ui | 10 +---- 10 files changed, 43 insertions(+), 94 deletions(-) diff --git a/rare/components/tabs/games/game_info/game_info_ui.py b/rare/components/tabs/games/game_info/game_info_ui.py index c2919c44..4ea6e898 100644 --- a/rare/components/tabs/games/game_info/game_info_ui.py +++ b/rare/components/tabs/games/game_info/game_info_ui.py @@ -14,6 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_GameInfo(object): def setupUi(self, GameInfo): GameInfo.setObjectName("GameInfo") + GameInfo.resize(424, 308) self.layout_game_info = QtWidgets.QGridLayout(GameInfo) self.layout_game_info.setObjectName("layout_game_info") self.layout_game_info_form = QtWidgets.QGridLayout() @@ -46,9 +47,8 @@ class Ui_GameInfo(object): font.setBold(True) font.setWeight(75) self.lbl_dev.setFont(font) - self.lbl_dev.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.lbl_dev.setObjectName("lbl_dev") - self.layout_game_info_form.addWidget(self.lbl_dev, 0, 0, 1, 1) + self.layout_game_info_form.addWidget(self.lbl_dev, 0, 0, 1, 1, QtCore.Qt.AlignRight) self.dev = QtWidgets.QLabel(GameInfo) self.dev.setText("error") self.dev.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) @@ -69,9 +69,8 @@ class Ui_GameInfo(object): font.setBold(True) font.setWeight(75) self.lbl_version.setFont(font) - self.lbl_version.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.lbl_version.setObjectName("lbl_version") - self.layout_game_info_form.addWidget(self.lbl_version, 2, 0, 1, 1) + self.layout_game_info_form.addWidget(self.lbl_version, 2, 0, 1, 1, QtCore.Qt.AlignRight) self.lbl_install_path = QtWidgets.QLabel(GameInfo) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) @@ -82,9 +81,8 @@ class Ui_GameInfo(object): font.setBold(True) font.setWeight(75) self.lbl_install_path.setFont(font) - self.lbl_install_path.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.lbl_install_path.setObjectName("lbl_install_path") - self.layout_game_info_form.addWidget(self.lbl_install_path, 4, 0, 1, 1) + self.layout_game_info_form.addWidget(self.lbl_install_path, 4, 0, 1, 1, QtCore.Qt.AlignRight) spacerItem = QtWidgets.QSpacerItem(0, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.layout_game_info_form.addItem(spacerItem, 6, 1, 1, 1) self.lbl_game_actions = QtWidgets.QLabel(GameInfo) @@ -97,9 +95,8 @@ class Ui_GameInfo(object): font.setBold(True) font.setWeight(75) self.lbl_game_actions.setFont(font) - self.lbl_game_actions.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.lbl_game_actions.setObjectName("lbl_game_actions") - self.layout_game_info_form.addWidget(self.lbl_game_actions, 5, 0, 1, 1) + self.layout_game_info_form.addWidget(self.lbl_game_actions, 5, 0, 1, 1, QtCore.Qt.AlignRight) self.lbl_app_name = QtWidgets.QLabel(GameInfo) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) @@ -110,9 +107,8 @@ class Ui_GameInfo(object): font.setBold(True) font.setWeight(75) self.lbl_app_name.setFont(font) - self.lbl_app_name.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.lbl_app_name.setObjectName("lbl_app_name") - self.layout_game_info_form.addWidget(self.lbl_app_name, 1, 0, 1, 1) + self.layout_game_info_form.addWidget(self.lbl_app_name, 1, 0, 1, 1, QtCore.Qt.AlignRight) self.lbl_install_size = QtWidgets.QLabel(GameInfo) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) @@ -123,9 +119,8 @@ class Ui_GameInfo(object): font.setBold(True) font.setWeight(75) self.lbl_install_size.setFont(font) - self.lbl_install_size.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.lbl_install_size.setObjectName("lbl_install_size") - self.layout_game_info_form.addWidget(self.lbl_install_size, 3, 0, 1, 1) + self.layout_game_info_form.addWidget(self.lbl_install_size, 3, 0, 1, 1, QtCore.Qt.AlignRight) spacerItem1 = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.layout_game_info_form.addItem(spacerItem1, 6, 0, 1, 1) self.wg_game_actions = QtWidgets.QWidget(GameInfo) diff --git a/rare/components/tabs/games/game_info/game_settings_ui.py b/rare/components/tabs/games/game_info/game_settings_ui.py index bb3276ee..318eca31 100644 --- a/rare/components/tabs/games/game_info/game_settings_ui.py +++ b/rare/components/tabs/games/game_info/game_settings_ui.py @@ -27,9 +27,8 @@ class Ui_GameSettings(object): self.launch_settings_layout = QtWidgets.QGridLayout(self.launch_settings_groupbox) self.launch_settings_layout.setObjectName("launch_settings_layout") self.launch_params_label = QtWidgets.QLabel(self.launch_settings_groupbox) - self.launch_params_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.launch_params_label.setObjectName("launch_params_label") - self.launch_settings_layout.addWidget(self.launch_params_label, 3, 0, 1, 1) + self.launch_settings_layout.addWidget(self.launch_params_label, 3, 0, 1, 1, QtCore.Qt.AlignRight) self.skip_update = QtWidgets.QComboBox(self.launch_settings_groupbox) self.skip_update.setObjectName("skip_update") self.skip_update.addItem("") @@ -37,17 +36,14 @@ class Ui_GameSettings(object): self.skip_update.addItem("") self.launch_settings_layout.addWidget(self.skip_update, 0, 1, 1, 1, QtCore.Qt.AlignLeft) self.skip_update_label = QtWidgets.QLabel(self.launch_settings_groupbox) - self.skip_update_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.skip_update_label.setObjectName("skip_update_label") - self.launch_settings_layout.addWidget(self.skip_update_label, 0, 0, 1, 1) + self.launch_settings_layout.addWidget(self.skip_update_label, 0, 0, 1, 1, QtCore.Qt.AlignRight) self.offline_label = QtWidgets.QLabel(self.launch_settings_groupbox) - self.offline_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.offline_label.setObjectName("offline_label") - self.launch_settings_layout.addWidget(self.offline_label, 1, 0, 1, 1) + self.launch_settings_layout.addWidget(self.offline_label, 1, 0, 1, 1, QtCore.Qt.AlignRight) self.wrapper_label = QtWidgets.QLabel(self.launch_settings_groupbox) - self.wrapper_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.wrapper_label.setObjectName("wrapper_label") - self.launch_settings_layout.addWidget(self.wrapper_label, 4, 0, 1, 1) + self.launch_settings_layout.addWidget(self.wrapper_label, 4, 0, 1, 1, QtCore.Qt.AlignRight) self.offline = QtWidgets.QComboBox(self.launch_settings_groupbox) self.offline.setObjectName("offline") self.offline.addItem("") @@ -59,9 +55,8 @@ class Ui_GameSettings(object): self.cloud_sync.setObjectName("cloud_sync") self.launch_settings_layout.addWidget(self.cloud_sync, 2, 1, 1, 1, QtCore.Qt.AlignLeft) self.cloud_sync_label = QtWidgets.QLabel(self.launch_settings_groupbox) - self.cloud_sync_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.cloud_sync_label.setObjectName("cloud_sync_label") - self.launch_settings_layout.addWidget(self.cloud_sync_label, 2, 0, 1, 1) + self.launch_settings_layout.addWidget(self.cloud_sync_label, 2, 0, 1, 1, QtCore.Qt.AlignRight) self.wrapper_widget = QtWidgets.QWidget(self.launch_settings_groupbox) self.wrapper_widget.setObjectName("wrapper_widget") self.wrapper_layout = QtWidgets.QHBoxLayout(self.wrapper_widget) @@ -92,13 +87,11 @@ class Ui_GameSettings(object): self.proton_layout = QtWidgets.QGridLayout(self.proton_groupbox) self.proton_layout.setObjectName("proton_layout") self.proton_prefix_label = QtWidgets.QLabel(self.proton_groupbox) - self.proton_prefix_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.proton_prefix_label.setObjectName("proton_prefix_label") - self.proton_layout.addWidget(self.proton_prefix_label, 1, 0, 1, 1) + self.proton_layout.addWidget(self.proton_prefix_label, 1, 0, 1, 1, QtCore.Qt.AlignRight) self.proton_wrapper_label = QtWidgets.QLabel(self.proton_groupbox) - self.proton_wrapper_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.proton_wrapper_label.setObjectName("proton_wrapper_label") - self.proton_layout.addWidget(self.proton_wrapper_label, 0, 0, 1, 1) + self.proton_layout.addWidget(self.proton_wrapper_label, 0, 0, 1, 1, QtCore.Qt.AlignRight) self.proton_wrapper = QtWidgets.QComboBox(self.proton_groupbox) self.proton_wrapper.setObjectName("proton_wrapper") self.proton_wrapper.addItem("") diff --git a/rare/components/tabs/settings/about_ui.py b/rare/components/tabs/settings/about_ui.py index ddfcb7c7..8bb8538d 100644 --- a/rare/components/tabs/settings/about_ui.py +++ b/rare/components/tabs/settings/about_ui.py @@ -28,7 +28,7 @@ class Ui_About(object): self.gridLayout.addWidget(self.lbl_license, 7, 0, 1, 1, QtCore.Qt.AlignRight) self.lbl_lgd_dev = QtWidgets.QLabel(About) self.lbl_lgd_dev.setObjectName("lbl_lgd_dev") - self.gridLayout.addWidget(self.lbl_lgd_dev, 6, 0, 1, 1) + self.gridLayout.addWidget(self.lbl_lgd_dev, 6, 0, 1, 1, QtCore.Qt.AlignRight) self.dev = QtWidgets.QLabel(About) self.dev.setText("Dummerle") self.dev.setOpenExternalLinks(True) diff --git a/rare/components/tabs/settings/legendary_ui.py b/rare/components/tabs/settings/legendary_ui.py index dcf8f247..ad71a6b9 100644 --- a/rare/components/tabs/settings/legendary_ui.py +++ b/rare/components/tabs/settings/legendary_ui.py @@ -33,7 +33,7 @@ class Ui_LegendarySettings(object): sizePolicy.setHeightForWidth(self.lbl_max_workers.sizePolicy().hasHeightForWidth()) self.lbl_max_workers.setSizePolicy(sizePolicy) self.lbl_max_workers.setObjectName("lbl_max_workers") - self.layout_downloads.addWidget(self.lbl_max_workers, 0, 0, 1, 1) + self.layout_downloads.addWidget(self.lbl_max_workers, 0, 0, 1, 1, QtCore.Qt.AlignRight) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.layout_downloads.addItem(spacerItem, 0, 3, 1, 1) self.max_worker_select = QtWidgets.QSpinBox(self.gb_downloads) diff --git a/rare/components/tabs/settings/linux_ui.py b/rare/components/tabs/settings/linux_ui.py index 02eee180..cad5fdd6 100644 --- a/rare/components/tabs/settings/linux_ui.py +++ b/rare/components/tabs/settings/linux_ui.py @@ -24,13 +24,11 @@ class Ui_LinuxSettings(object): self.wine_layout = QtWidgets.QGridLayout(self.wine_groupbox) self.wine_layout.setObjectName("wine_layout") self.exec_label = QtWidgets.QLabel(self.wine_groupbox) - self.exec_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.exec_label.setObjectName("exec_label") - self.wine_layout.addWidget(self.exec_label, 2, 0, 1, 1) + self.wine_layout.addWidget(self.exec_label, 2, 0, 1, 1, QtCore.Qt.AlignRight) self.prefix_label = QtWidgets.QLabel(self.wine_groupbox) - self.prefix_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.prefix_label.setObjectName("prefix_label") - self.wine_layout.addWidget(self.prefix_label, 0, 0, 1, 1) + self.wine_layout.addWidget(self.prefix_label, 0, 0, 1, 1, QtCore.Qt.AlignRight) self.prefix_alignment_label = QtWidgets.QLabel(self.wine_groupbox) self.prefix_alignment_label.setEnabled(False) self.prefix_alignment_label.setText("") diff --git a/resources/ui/components/tabs/games/game_info/game_info.ui b/resources/ui/components/tabs/games/game_info/game_info.ui index 82029a12..bafc4b3c 100644 --- a/resources/ui/components/tabs/games/game_info/game_info.ui +++ b/resources/ui/components/tabs/games/game_info/game_info.ui @@ -2,6 +2,14 @@ GameInfo + + + 0 + 0 + 424 + 308 + + Game Info @@ -56,7 +64,7 @@ - + @@ -73,9 +81,6 @@ Developer: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - @@ -98,7 +103,7 @@ - + @@ -115,12 +120,9 @@ Version: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + @@ -137,9 +139,6 @@ Installation Path: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - @@ -155,7 +154,7 @@ - + @@ -172,12 +171,9 @@ Game Actions: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + @@ -194,12 +190,9 @@ Application Name: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + @@ -216,9 +209,6 @@ Installation Size: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - diff --git a/resources/ui/components/tabs/games/game_info/game_settings.ui b/resources/ui/components/tabs/games/game_info/game_settings.ui index 54aa71d4..fddd8321 100644 --- a/resources/ui/components/tabs/games/game_info/game_settings.ui +++ b/resources/ui/components/tabs/games/game_info/game_settings.ui @@ -30,14 +30,11 @@ Launch Settings - + Launch parameters: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - @@ -59,34 +56,25 @@ - + Skip update check: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + Offline mode: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + Wrapper: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - @@ -115,14 +103,11 @@ - + Sync with cloud: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - @@ -198,24 +183,18 @@ Proton - + Prefix: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + Wrapper: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - diff --git a/resources/ui/components/tabs/settings/about.ui b/resources/ui/components/tabs/settings/about.ui index 7a3c9929..e7386a85 100644 --- a/resources/ui/components/tabs/settings/about.ui +++ b/resources/ui/components/tabs/settings/about.ui @@ -35,7 +35,7 @@ - + Legendary Developer: diff --git a/resources/ui/components/tabs/settings/legendary.ui b/resources/ui/components/tabs/settings/legendary.ui index 368c24f1..efa42912 100644 --- a/resources/ui/components/tabs/settings/legendary.ui +++ b/resources/ui/components/tabs/settings/legendary.ui @@ -28,7 +28,7 @@ Download Settings - + diff --git a/resources/ui/components/tabs/settings/linux.ui b/resources/ui/components/tabs/settings/linux.ui index b7170c0e..e4bf0abb 100644 --- a/resources/ui/components/tabs/settings/linux.ui +++ b/resources/ui/components/tabs/settings/linux.ui @@ -33,24 +33,18 @@ Wine Settings - + Executable: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + Prefix: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - From fc8b8bad373e096a3313e93c5aa496990077ebe6 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Fri, 30 Apr 2021 11:05:35 +0300 Subject: [PATCH 26/34] Move .ui and the corresponding .py files into the rare directory under ui for clarity --- rare/components/tabs/games/game_info/__init__.py | 2 +- rare/components/tabs/games/game_info/game_settings.py | 2 +- rare/components/tabs/settings/about.py | 2 +- rare/components/tabs/settings/dxvk.py | 5 ++--- rare/components/tabs/settings/legendary.py | 2 +- rare/components/tabs/settings/linux.py | 2 +- rare/components/tabs/settings/rare.py | 2 +- rare/components/tabs/settings/rpc_settings.py | 2 +- .../components/tabs/games/game_info/game_info.py} | 2 +- .../ui/components/tabs/games/game_info/game_info.ui | 0 .../components/tabs/games/game_info/game_settings.py} | 2 +- .../ui/components/tabs/games/game_info/game_settings.ui | 0 .../about_ui.py => ui/components/tabs/settings/about.py} | 2 +- {resources => rare}/ui/components/tabs/settings/about.ui | 0 .../dxvk_ui.py => ui/components/tabs/settings/dxvk.py} | 2 +- {resources => rare}/ui/components/tabs/settings/dxvk.ui | 0 .../components/tabs/settings/legendary.py} | 2 +- {resources => rare}/ui/components/tabs/settings/legendary.ui | 0 .../linux_ui.py => ui/components/tabs/settings/linux.py} | 2 +- {resources => rare}/ui/components/tabs/settings/linux.ui | 0 .../rare_ui.py => ui/components/tabs/settings/rare.py} | 2 +- {resources => rare}/ui/components/tabs/settings/rare.ui | 0 .../components/tabs/settings/rpc_settings.py} | 5 ++--- .../ui/components/tabs/settings/rpc_settings.ui | 0 rare/{utils/pathedit_ui.py => ui/utils/pathedit.py} | 2 +- {resources => rare}/ui/utils/pathedit.ui | 0 rare/utils/extra_widgets.py | 2 +- 27 files changed, 20 insertions(+), 22 deletions(-) rename rare/{components/tabs/games/game_info/game_info_ui.py => ui/components/tabs/games/game_info/game_info.py} (99%) rename {resources => rare}/ui/components/tabs/games/game_info/game_info.ui (100%) rename rare/{components/tabs/games/game_info/game_settings_ui.py => ui/components/tabs/games/game_info/game_settings.py} (98%) rename {resources => rare}/ui/components/tabs/games/game_info/game_settings.ui (100%) rename rare/{components/tabs/settings/about_ui.py => ui/components/tabs/settings/about.py} (97%) rename {resources => rare}/ui/components/tabs/settings/about.ui (100%) rename rare/{components/tabs/settings/dxvk_ui.py => ui/components/tabs/settings/dxvk.py} (98%) rename {resources => rare}/ui/components/tabs/settings/dxvk.ui (100%) rename rare/{components/tabs/settings/legendary_ui.py => ui/components/tabs/settings/legendary.py} (97%) rename {resources => rare}/ui/components/tabs/settings/legendary.ui (100%) rename rare/{components/tabs/settings/linux_ui.py => ui/components/tabs/settings/linux.py} (97%) rename {resources => rare}/ui/components/tabs/settings/linux.ui (100%) rename rare/{components/tabs/settings/rare_ui.py => ui/components/tabs/settings/rare.py} (98%) rename {resources => rare}/ui/components/tabs/settings/rare.ui (100%) rename rare/{components/tabs/settings/rpc_settings_ui.py => ui/components/tabs/settings/rpc_settings.py} (92%) rename {resources => rare}/ui/components/tabs/settings/rpc_settings.ui (100%) rename rare/{utils/pathedit_ui.py => ui/utils/pathedit.py} (96%) rename {resources => rare}/ui/utils/pathedit.ui (100%) diff --git a/rare/components/tabs/games/game_info/__init__.py b/rare/components/tabs/games/game_info/__init__.py index d74e0bad..b1fbda3e 100644 --- a/rare/components/tabs/games/game_info/__init__.py +++ b/rare/components/tabs/games/game_info/__init__.py @@ -10,8 +10,8 @@ from custom_legendary.core import LegendaryCore from custom_legendary.models.game import InstalledGame, Game from rare.components.dialogs.uninstall_dialog import UninstallDialog from rare.components.tabs.games.game_info.dlcs import DlcTab -from rare.components.tabs.games.game_info.game_info_ui import Ui_GameInfo from rare.components.tabs.games.game_info.game_settings import GameSettings +from rare.ui.components.tabs.games.game_info.game_info import Ui_GameInfo from rare.utils import legendary_utils from rare.utils.extra_widgets import SideTabBar from rare.utils.legendary_utils import VerifyThread diff --git a/rare/components/tabs/games/game_info/game_settings.py b/rare/components/tabs/games/game_info/game_settings.py index bd22b7ae..50914845 100644 --- a/rare/components/tabs/games/game_info/game_settings.py +++ b/rare/components/tabs/games/game_info/game_settings.py @@ -5,8 +5,8 @@ from PyQt5.QtWidgets import QWidget, QFileDialog, QMessageBox from custom_legendary.core import LegendaryCore from custom_legendary.models.game import InstalledGame, Game -from rare.components.tabs.games.game_info.game_settings_ui import Ui_GameSettings from rare.components.tabs.settings.linux import LinuxSettings +from rare.ui.components.tabs.games.game_info.game_settings import Ui_GameSettings from rare.utils.extra_widgets import PathEdit diff --git a/rare/components/tabs/settings/about.py b/rare/components/tabs/settings/about.py index 27cb92a3..99151208 100644 --- a/rare/components/tabs/settings/about.py +++ b/rare/components/tabs/settings/about.py @@ -3,7 +3,7 @@ import webbrowser from PyQt5.QtWidgets import QWidget from rare import __version__ -from rare.components.tabs.settings.about_ui import Ui_About +from rare.ui.components.tabs.settings.about import Ui_About from rare.utils.utils import get_latest_version diff --git a/rare/components/tabs/settings/dxvk.py b/rare/components/tabs/settings/dxvk.py index 9b19e889..59bbd89f 100644 --- a/rare/components/tabs/settings/dxvk.py +++ b/rare/components/tabs/settings/dxvk.py @@ -1,12 +1,11 @@ from logging import getLogger from PyQt5.QtCore import pyqtSignal -from PyQt5.QtWidgets import QWidget, QCheckBox, QVBoxLayout, QWidgetAction, QMenu, QToolButton, QHBoxLayout, QGroupBox - from PyQt5.QtWidgets import QGroupBox +from PyQt5.QtWidgets import QWidget, QCheckBox, QVBoxLayout, QWidgetAction, QMenu, QToolButton, QHBoxLayout from custom_legendary.core import LegendaryCore -from rare.components.tabs.settings.dxvk_ui import Ui_DxvkSettings +from rare.ui.components.tabs.settings.dxvk import Ui_DxvkSettings logger = getLogger("DXVK Settings") diff --git a/rare/components/tabs/settings/legendary.py b/rare/components/tabs/settings/legendary.py index ed3c0796..256aec25 100644 --- a/rare/components/tabs/settings/legendary.py +++ b/rare/components/tabs/settings/legendary.py @@ -3,7 +3,7 @@ from logging import getLogger from PyQt5.QtWidgets import QFileDialog, QMessageBox, QWidget from custom_legendary.core import LegendaryCore -from rare.components.tabs.settings.legendary_ui import Ui_LegendarySettings +from rare.ui.components.tabs.settings.legendary import Ui_LegendarySettings from rare.utils.extra_widgets import PathEdit from rare.utils.utils import get_size diff --git a/rare/components/tabs/settings/linux.py b/rare/components/tabs/settings/linux.py index d889e323..57109767 100644 --- a/rare/components/tabs/settings/linux.py +++ b/rare/components/tabs/settings/linux.py @@ -4,7 +4,7 @@ from PyQt5.QtWidgets import QFileDialog, QWidget from custom_legendary.core import LegendaryCore from rare.components.tabs.settings.dxvk import DxvkSettings, DxvkWidget -from rare.components.tabs.settings.linux_ui import Ui_LinuxSettings +from rare.ui.components.tabs.settings.linux import Ui_LinuxSettings from rare.utils.extra_widgets import PathEdit logger = getLogger("LinuxSettings") diff --git a/rare/components/tabs/settings/rare.py b/rare/components/tabs/settings/rare.py index 2b5a8029..671deff6 100644 --- a/rare/components/tabs/settings/rare.py +++ b/rare/components/tabs/settings/rare.py @@ -7,8 +7,8 @@ from logging import getLogger from PyQt5.QtCore import QSettings from PyQt5.QtWidgets import QFileDialog, QWidget -from rare.components.tabs.settings.rare_ui import Ui_RareSettings from rare.components.tabs.settings.rpc_settings import RPCSettings +from rare.ui.components.tabs.settings.rare import Ui_RareSettings from rare.utils.extra_widgets import PathEdit from rare.utils.utils import get_lang, get_possible_langs diff --git a/rare/components/tabs/settings/rpc_settings.py b/rare/components/tabs/settings/rpc_settings.py index e2e73ebc..1602f4b5 100644 --- a/rare/components/tabs/settings/rpc_settings.py +++ b/rare/components/tabs/settings/rpc_settings.py @@ -1,7 +1,7 @@ from PyQt5.QtCore import QSettings, pyqtSignal from PyQt5.QtWidgets import QGroupBox -from rare.components.tabs.settings.rpc_settings_ui import Ui_RPCSettings +from rare.ui.components.tabs.settings.rpc_settings import Ui_RPCSettings class RPCSettings(QGroupBox, Ui_RPCSettings): diff --git a/rare/components/tabs/games/game_info/game_info_ui.py b/rare/ui/components/tabs/games/game_info/game_info.py similarity index 99% rename from rare/components/tabs/games/game_info/game_info_ui.py rename to rare/ui/components/tabs/games/game_info/game_info.py index 4ea6e898..dd520c49 100644 --- a/rare/components/tabs/games/game_info/game_info_ui.py +++ b/rare/ui/components/tabs/games/game_info/game_info.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'resources/ui/components/tabs/games/game_info/game_info.ui' +# Form implementation generated from reading ui file 'game_info.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/resources/ui/components/tabs/games/game_info/game_info.ui b/rare/ui/components/tabs/games/game_info/game_info.ui similarity index 100% rename from resources/ui/components/tabs/games/game_info/game_info.ui rename to rare/ui/components/tabs/games/game_info/game_info.ui diff --git a/rare/components/tabs/games/game_info/game_settings_ui.py b/rare/ui/components/tabs/games/game_info/game_settings.py similarity index 98% rename from rare/components/tabs/games/game_info/game_settings_ui.py rename to rare/ui/components/tabs/games/game_info/game_settings.py index 318eca31..409ad566 100644 --- a/rare/components/tabs/games/game_info/game_settings_ui.py +++ b/rare/ui/components/tabs/games/game_info/game_settings.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'resources/ui/components/tabs/games/game_info/game_settings.ui' +# Form implementation generated from reading ui file 'game_settings.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/resources/ui/components/tabs/games/game_info/game_settings.ui b/rare/ui/components/tabs/games/game_info/game_settings.ui similarity index 100% rename from resources/ui/components/tabs/games/game_info/game_settings.ui rename to rare/ui/components/tabs/games/game_info/game_settings.ui diff --git a/rare/components/tabs/settings/about_ui.py b/rare/ui/components/tabs/settings/about.py similarity index 97% rename from rare/components/tabs/settings/about_ui.py rename to rare/ui/components/tabs/settings/about.py index 8bb8538d..b8133b04 100644 --- a/rare/components/tabs/settings/about_ui.py +++ b/rare/ui/components/tabs/settings/about.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'resources/ui/components/tabs/settings/about.ui' +# Form implementation generated from reading ui file 'about.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/resources/ui/components/tabs/settings/about.ui b/rare/ui/components/tabs/settings/about.ui similarity index 100% rename from resources/ui/components/tabs/settings/about.ui rename to rare/ui/components/tabs/settings/about.ui diff --git a/rare/components/tabs/settings/dxvk_ui.py b/rare/ui/components/tabs/settings/dxvk.py similarity index 98% rename from rare/components/tabs/settings/dxvk_ui.py rename to rare/ui/components/tabs/settings/dxvk.py index 577cdae9..64f5c9b8 100644 --- a/rare/components/tabs/settings/dxvk_ui.py +++ b/rare/ui/components/tabs/settings/dxvk.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'resources/ui/components/tabs/settings/dxvk.ui' +# Form implementation generated from reading ui file 'dxvk.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/resources/ui/components/tabs/settings/dxvk.ui b/rare/ui/components/tabs/settings/dxvk.ui similarity index 100% rename from resources/ui/components/tabs/settings/dxvk.ui rename to rare/ui/components/tabs/settings/dxvk.ui diff --git a/rare/components/tabs/settings/legendary_ui.py b/rare/ui/components/tabs/settings/legendary.py similarity index 97% rename from rare/components/tabs/settings/legendary_ui.py rename to rare/ui/components/tabs/settings/legendary.py index ad71a6b9..b9d5cfb3 100644 --- a/rare/components/tabs/settings/legendary_ui.py +++ b/rare/ui/components/tabs/settings/legendary.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'resources/ui/components/tabs/settings/legendary.ui' +# Form implementation generated from reading ui file 'legendary.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/resources/ui/components/tabs/settings/legendary.ui b/rare/ui/components/tabs/settings/legendary.ui similarity index 100% rename from resources/ui/components/tabs/settings/legendary.ui rename to rare/ui/components/tabs/settings/legendary.ui diff --git a/rare/components/tabs/settings/linux_ui.py b/rare/ui/components/tabs/settings/linux.py similarity index 97% rename from rare/components/tabs/settings/linux_ui.py rename to rare/ui/components/tabs/settings/linux.py index cad5fdd6..ddce9200 100644 --- a/rare/components/tabs/settings/linux_ui.py +++ b/rare/ui/components/tabs/settings/linux.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'resources/ui/components/tabs/settings/linux.ui' +# Form implementation generated from reading ui file 'linux.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/resources/ui/components/tabs/settings/linux.ui b/rare/ui/components/tabs/settings/linux.ui similarity index 100% rename from resources/ui/components/tabs/settings/linux.ui rename to rare/ui/components/tabs/settings/linux.ui diff --git a/rare/components/tabs/settings/rare_ui.py b/rare/ui/components/tabs/settings/rare.py similarity index 98% rename from rare/components/tabs/settings/rare_ui.py rename to rare/ui/components/tabs/settings/rare.py index 76847edf..369fddbf 100644 --- a/rare/components/tabs/settings/rare_ui.py +++ b/rare/ui/components/tabs/settings/rare.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'resources/ui/components/tabs/settings/rare.ui' +# Form implementation generated from reading ui file 'rare.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/resources/ui/components/tabs/settings/rare.ui b/rare/ui/components/tabs/settings/rare.ui similarity index 100% rename from resources/ui/components/tabs/settings/rare.ui rename to rare/ui/components/tabs/settings/rare.ui diff --git a/rare/components/tabs/settings/rpc_settings_ui.py b/rare/ui/components/tabs/settings/rpc_settings.py similarity index 92% rename from rare/components/tabs/settings/rpc_settings_ui.py rename to rare/ui/components/tabs/settings/rpc_settings.py index 5a866dd8..a01c3d36 100644 --- a/rare/components/tabs/settings/rpc_settings_ui.py +++ b/rare/ui/components/tabs/settings/rpc_settings.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'resources/ui/components/tabs/settings/rpc_settings.ui' +# Form implementation generated from reading ui file 'rpc_settings.ui' # # Created by: PyQt5 UI code generator 5.15.4 # @@ -14,8 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_RPCSettings(object): def setupUi(self, RPCSettings): RPCSettings.setObjectName("RPCSettings") - RPCSettings.resize(487, 318) - RPCSettings.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) + RPCSettings.resize(167, 144) self.gridLayout = QtWidgets.QGridLayout(RPCSettings) self.gridLayout.setObjectName("gridLayout") self.enable = QtWidgets.QComboBox(RPCSettings) diff --git a/resources/ui/components/tabs/settings/rpc_settings.ui b/rare/ui/components/tabs/settings/rpc_settings.ui similarity index 100% rename from resources/ui/components/tabs/settings/rpc_settings.ui rename to rare/ui/components/tabs/settings/rpc_settings.ui diff --git a/rare/utils/pathedit_ui.py b/rare/ui/utils/pathedit.py similarity index 96% rename from rare/utils/pathedit_ui.py rename to rare/ui/utils/pathedit.py index ec1f3413..28e7068f 100644 --- a/rare/utils/pathedit_ui.py +++ b/rare/ui/utils/pathedit.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'resources/ui/utils/pathedit.ui' +# Form implementation generated from reading ui file 'pathedit.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/resources/ui/utils/pathedit.ui b/rare/ui/utils/pathedit.ui similarity index 100% rename from resources/ui/utils/pathedit.ui rename to rare/ui/utils/pathedit.ui diff --git a/rare/utils/extra_widgets.py b/rare/utils/extra_widgets.py index 5d1bae80..31db79cf 100644 --- a/rare/utils/extra_widgets.py +++ b/rare/utils/extra_widgets.py @@ -7,7 +7,7 @@ from PyQt5.QtWidgets import QLayout, QStyle, QSizePolicy, QLabel, QFileDialog, Q from qtawesome import icon from rare import style_path -from rare.utils.pathedit_ui import Ui_PathEdit +from rare.ui.utils.pathedit import Ui_PathEdit class FlowLayout(QLayout): From edb5735133b46d02efee0c9bb61cf29d70b48127 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Fri, 30 Apr 2021 21:45:12 +0300 Subject: [PATCH 27/34] Make About labels bold --- rare/app.py | 4 +- rare/components/tabs/settings/about.py | 4 +- rare/ui/components/tabs/settings/about.py | 60 +++++++++++++++-------- rare/ui/components/tabs/settings/about.ui | 44 ++++++++++++++--- 4 files changed, 81 insertions(+), 31 deletions(-) diff --git a/rare/app.py b/rare/app.py index 4a426fa8..d025cd53 100644 --- a/rare/app.py +++ b/rare/app.py @@ -67,8 +67,8 @@ class App(QApplication): self.installTranslator(self.translator) # Style - # self.setStyle(QStyleFactory.create("Fusion")) - # self.setStyleSheet(open(style_path + "RareStyle.qss").read()) + self.setStyle(QStyleFactory.create("Fusion")) + self.setStyleSheet(open(style_path + "RareStyle.qss").read()) self.setWindowIcon(QIcon(style_path + "Logo.png")) # launch app diff --git a/rare/components/tabs/settings/about.py b/rare/components/tabs/settings/about.py index 99151208..446b4ca8 100644 --- a/rare/components/tabs/settings/about.py +++ b/rare/components/tabs/settings/about.py @@ -21,7 +21,7 @@ class About(QWidget, Ui_About): self.version.setText(__version__) - self.lbl_update.setVisible(False) + self.update_label.setVisible(False) self.update.setVisible(False) self.open_browser.setVisible(False) @@ -35,6 +35,6 @@ class About(QWidget, Ui_About): if self.update_available: print(f"Update available: {__version__} -> {latest_tag}") - self.lbl_update.setVisible(True) + self.update_label.setVisible(True) self.update.setVisible(True) self.open_browser.setVisible(True) diff --git a/rare/ui/components/tabs/settings/about.py b/rare/ui/components/tabs/settings/about.py index b8133b04..9aea4e10 100644 --- a/rare/ui/components/tabs/settings/about.py +++ b/rare/ui/components/tabs/settings/about.py @@ -20,30 +20,50 @@ class Ui_About(object): self.open_browser = QtWidgets.QPushButton(About) self.open_browser.setObjectName("open_browser") self.gridLayout.addWidget(self.open_browser, 4, 1, 1, 1) - self.lbl_version = QtWidgets.QLabel(About) - self.lbl_version.setObjectName("lbl_version") - self.gridLayout.addWidget(self.lbl_version, 2, 0, 1, 1, QtCore.Qt.AlignRight) - self.lbl_license = QtWidgets.QLabel(About) - self.lbl_license.setObjectName("lbl_license") - self.gridLayout.addWidget(self.lbl_license, 7, 0, 1, 1, QtCore.Qt.AlignRight) - self.lbl_lgd_dev = QtWidgets.QLabel(About) - self.lbl_lgd_dev.setObjectName("lbl_lgd_dev") - self.gridLayout.addWidget(self.lbl_lgd_dev, 6, 0, 1, 1, QtCore.Qt.AlignRight) + self.version_label = QtWidgets.QLabel(About) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.version_label.setFont(font) + self.version_label.setObjectName("version_label") + self.gridLayout.addWidget(self.version_label, 2, 0, 1, 1, QtCore.Qt.AlignRight) + self.license_label = QtWidgets.QLabel(About) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.license_label.setFont(font) + self.license_label.setObjectName("license_label") + self.gridLayout.addWidget(self.license_label, 7, 0, 1, 1, QtCore.Qt.AlignRight) + self.lgd_dev_label = QtWidgets.QLabel(About) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.lgd_dev_label.setFont(font) + self.lgd_dev_label.setObjectName("lgd_dev_label") + self.gridLayout.addWidget(self.lgd_dev_label, 6, 0, 1, 1, QtCore.Qt.AlignRight) self.dev = QtWidgets.QLabel(About) self.dev.setText("Dummerle") self.dev.setOpenExternalLinks(True) self.dev.setObjectName("dev") self.gridLayout.addWidget(self.dev, 5, 1, 1, 1) - self.lbl_update = QtWidgets.QLabel(About) - self.lbl_update.setObjectName("lbl_update") - self.gridLayout.addWidget(self.lbl_update, 3, 0, 1, 1, QtCore.Qt.AlignRight) + self.update_label = QtWidgets.QLabel(About) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.update_label.setFont(font) + self.update_label.setObjectName("update_label") + self.gridLayout.addWidget(self.update_label, 3, 0, 1, 1, QtCore.Qt.AlignRight) self.version = QtWidgets.QLabel(About) self.version.setText("error") self.version.setObjectName("version") self.gridLayout.addWidget(self.version, 2, 1, 1, 1) - self.lbl_dev = QtWidgets.QLabel(About) - self.lbl_dev.setObjectName("lbl_dev") - self.gridLayout.addWidget(self.lbl_dev, 5, 0, 1, 1, QtCore.Qt.AlignRight) + self.dev_label = QtWidgets.QLabel(About) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.dev_label.setFont(font) + self.dev_label.setObjectName("dev_label") + self.gridLayout.addWidget(self.dev_label, 5, 0, 1, 1, QtCore.Qt.AlignRight) self.license = QtWidgets.QLabel(About) self.license.setObjectName("license") self.gridLayout.addWidget(self.license, 7, 1, 1, 1) @@ -76,12 +96,12 @@ class Ui_About(object): _translate = QtCore.QCoreApplication.translate About.setWindowTitle(_translate("About", "About")) self.open_browser.setText(_translate("About", "Download latest release")) - self.lbl_version.setText(_translate("About", "Version:")) - self.lbl_license.setText(_translate("About", "License:")) - self.lbl_lgd_dev.setText(_translate("About", "Legendary Developer:")) + self.version_label.setText(_translate("About", "Version:")) + self.license_label.setText(_translate("About", "License:")) + self.lgd_dev_label.setText(_translate("About", "Legendary Developer:")) self.dev.setToolTip(_translate("About", "Github")) - self.lbl_update.setText(_translate("About", "Update available:")) - self.lbl_dev.setText(_translate("About", "Rare Developer:")) + self.update_label.setText(_translate("About", "Update available:")) + self.dev_label.setText(_translate("About", "Rare Developer:")) self.license.setText(_translate("About", "GNU General Public License v3.0")) self.lgd_dev.setToolTip(_translate("About", "Github")) self.info_text.setText(_translate("About", "This is a beta version, so you can get bugs. If you get a bug, please report it by creating an Issue on Github. You can also contact me on Discord (Dummerle#7419). Or you can join the Discord server")) diff --git a/rare/ui/components/tabs/settings/about.ui b/rare/ui/components/tabs/settings/about.ui index e7386a85..f46dfd69 100644 --- a/rare/ui/components/tabs/settings/about.ui +++ b/rare/ui/components/tabs/settings/about.ui @@ -22,21 +22,39 @@ - + + + + 75 + true + + Version: - + + + + 75 + true + + License: - + + + + 75 + true + + Legendary Developer: @@ -56,7 +74,13 @@ - + + + + 75 + true + + Update available: @@ -70,7 +94,13 @@ - + + + + 75 + true + + Rare Developer: @@ -117,7 +147,7 @@ - + Qt::Vertical @@ -137,7 +167,7 @@ - + Qt::Horizontal From 8b13e9b7341404b345fb6ba5d4351bde24742397 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Wed, 5 May 2021 17:40:23 +0300 Subject: [PATCH 28/34] Various UI fixups * Remove colons from labels * Change the label in PathEdit path button * Fix layout issues in dxvk --- .../tabs/games/game_info/game_info.py | 13 +- .../tabs/games/game_info/game_info.ui | 16 +- .../tabs/games/game_info/game_settings.py | 87 ++++----- .../tabs/games/game_info/game_settings.ui | 176 ++++++++++-------- rare/ui/components/tabs/settings/about.py | 10 +- rare/ui/components/tabs/settings/about.ui | 10 +- rare/ui/components/tabs/settings/dxvk.py | 30 +-- rare/ui/components/tabs/settings/dxvk.ui | 46 +++-- rare/ui/components/tabs/settings/legendary.py | 2 +- rare/ui/components/tabs/settings/legendary.ui | 2 +- rare/ui/components/tabs/settings/linux.py | 4 +- rare/ui/components/tabs/settings/linux.ui | 4 +- .../components/tabs/settings/rpc_settings.py | 3 +- .../components/tabs/settings/rpc_settings.ui | 6 +- rare/ui/utils/pathedit.py | 2 +- rare/ui/utils/pathedit.ui | 2 +- 16 files changed, 225 insertions(+), 188 deletions(-) diff --git a/rare/ui/components/tabs/games/game_info/game_info.py b/rare/ui/components/tabs/games/game_info/game_info.py index dd520c49..e4ed446f 100644 --- a/rare/ui/components/tabs/games/game_info/game_info.py +++ b/rare/ui/components/tabs/games/game_info/game_info.py @@ -14,7 +14,6 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_GameInfo(object): def setupUi(self, GameInfo): GameInfo.setObjectName("GameInfo") - GameInfo.resize(424, 308) self.layout_game_info = QtWidgets.QGridLayout(GameInfo) self.layout_game_info.setObjectName("layout_game_info") self.layout_game_info_form = QtWidgets.QGridLayout() @@ -180,12 +179,12 @@ class Ui_GameInfo(object): def retranslateUi(self, GameInfo): _translate = QtCore.QCoreApplication.translate GameInfo.setWindowTitle(_translate("GameInfo", "Game Info")) - self.lbl_dev.setText(_translate("GameInfo", "Developer:")) - self.lbl_version.setText(_translate("GameInfo", "Version:")) - self.lbl_install_path.setText(_translate("GameInfo", "Installation Path:")) - self.lbl_game_actions.setText(_translate("GameInfo", "Game Actions:")) - self.lbl_app_name.setText(_translate("GameInfo", "Application Name:")) - self.lbl_install_size.setText(_translate("GameInfo", "Installation Size:")) + self.lbl_dev.setText(_translate("GameInfo", "Developer")) + self.lbl_version.setText(_translate("GameInfo", "Version")) + self.lbl_install_path.setText(_translate("GameInfo", "Installation Path")) + self.lbl_game_actions.setText(_translate("GameInfo", "Actions")) + self.lbl_app_name.setText(_translate("GameInfo", "Application Name")) + self.lbl_install_size.setText(_translate("GameInfo", "Installation Size")) self.uninstall_button.setText(_translate("GameInfo", "Uninstall Game")) self.verify_button.setText(_translate("GameInfo", "Verify Installation")) self.repair_button.setText(_translate("GameInfo", "Repair Instalation")) diff --git a/rare/ui/components/tabs/games/game_info/game_info.ui b/rare/ui/components/tabs/games/game_info/game_info.ui index bafc4b3c..09955772 100644 --- a/rare/ui/components/tabs/games/game_info/game_info.ui +++ b/rare/ui/components/tabs/games/game_info/game_info.ui @@ -6,8 +6,8 @@ 0 0 - 424 - 308 + 436 + 317 @@ -79,7 +79,7 @@ - Developer: + Developer @@ -118,7 +118,7 @@ - Version: + Version @@ -137,7 +137,7 @@ - Installation Path: + Installation Path @@ -169,7 +169,7 @@ - Game Actions: + Actions @@ -188,7 +188,7 @@ - Application Name: + Application Name @@ -207,7 +207,7 @@ - Installation Size: + Installation Size diff --git a/rare/ui/components/tabs/games/game_info/game_settings.py b/rare/ui/components/tabs/games/game_info/game_settings.py index 409ad566..bed1ca0c 100644 --- a/rare/ui/components/tabs/games/game_info/game_settings.py +++ b/rare/ui/components/tabs/games/game_info/game_settings.py @@ -14,7 +14,6 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_GameSettings(object): def setupUi(self, GameSettings): GameSettings.setObjectName("GameSettings") - GameSettings.resize(668, 433) self.game_settings_layout = QtWidgets.QVBoxLayout(GameSettings) self.game_settings_layout.setObjectName("game_settings_layout") self.title = QtWidgets.QLabel(GameSettings) @@ -26,76 +25,80 @@ class Ui_GameSettings(object): self.launch_settings_groupbox.setObjectName("launch_settings_groupbox") self.launch_settings_layout = QtWidgets.QGridLayout(self.launch_settings_groupbox) self.launch_settings_layout.setObjectName("launch_settings_layout") - self.launch_params_label = QtWidgets.QLabel(self.launch_settings_groupbox) - self.launch_params_label.setObjectName("launch_params_label") - self.launch_settings_layout.addWidget(self.launch_params_label, 3, 0, 1, 1, QtCore.Qt.AlignRight) self.skip_update = QtWidgets.QComboBox(self.launch_settings_groupbox) self.skip_update.setObjectName("skip_update") self.skip_update.addItem("") self.skip_update.addItem("") self.skip_update.addItem("") self.launch_settings_layout.addWidget(self.skip_update, 0, 1, 1, 1, QtCore.Qt.AlignLeft) - self.skip_update_label = QtWidgets.QLabel(self.launch_settings_groupbox) - self.skip_update_label.setObjectName("skip_update_label") - self.launch_settings_layout.addWidget(self.skip_update_label, 0, 0, 1, 1, QtCore.Qt.AlignRight) - self.offline_label = QtWidgets.QLabel(self.launch_settings_groupbox) - self.offline_label.setObjectName("offline_label") - self.launch_settings_layout.addWidget(self.offline_label, 1, 0, 1, 1, QtCore.Qt.AlignRight) - self.wrapper_label = QtWidgets.QLabel(self.launch_settings_groupbox) - self.wrapper_label.setObjectName("wrapper_label") - self.launch_settings_layout.addWidget(self.wrapper_label, 4, 0, 1, 1, QtCore.Qt.AlignRight) - self.offline = QtWidgets.QComboBox(self.launch_settings_groupbox) - self.offline.setObjectName("offline") - self.offline.addItem("") - self.offline.addItem("") - self.offline.addItem("") - self.launch_settings_layout.addWidget(self.offline, 1, 1, 1, 1, QtCore.Qt.AlignLeft) self.cloud_sync = QtWidgets.QCheckBox(self.launch_settings_groupbox) self.cloud_sync.setText("") self.cloud_sync.setObjectName("cloud_sync") self.launch_settings_layout.addWidget(self.cloud_sync, 2, 1, 1, 1, QtCore.Qt.AlignLeft) - self.cloud_sync_label = QtWidgets.QLabel(self.launch_settings_groupbox) - self.cloud_sync_label.setObjectName("cloud_sync_label") - self.launch_settings_layout.addWidget(self.cloud_sync_label, 2, 0, 1, 1, QtCore.Qt.AlignRight) + self.launch_params_label = QtWidgets.QLabel(self.launch_settings_groupbox) + self.launch_params_label.setObjectName("launch_params_label") + self.launch_settings_layout.addWidget(self.launch_params_label, 3, 0, 1, 1, QtCore.Qt.AlignRight) + self.wrapper_label = QtWidgets.QLabel(self.launch_settings_groupbox) + self.wrapper_label.setObjectName("wrapper_label") + self.launch_settings_layout.addWidget(self.wrapper_label, 4, 0, 1, 1, QtCore.Qt.AlignRight) + self.skip_update_label = QtWidgets.QLabel(self.launch_settings_groupbox) + self.skip_update_label.setObjectName("skip_update_label") + self.launch_settings_layout.addWidget(self.skip_update_label, 0, 0, 1, 1, QtCore.Qt.AlignRight) self.wrapper_widget = QtWidgets.QWidget(self.launch_settings_groupbox) self.wrapper_widget.setObjectName("wrapper_widget") self.wrapper_layout = QtWidgets.QHBoxLayout(self.wrapper_widget) self.wrapper_layout.setContentsMargins(0, 0, 0, 0) self.wrapper_layout.setObjectName("wrapper_layout") self.wrapper = QtWidgets.QLineEdit(self.wrapper_widget) + self.wrapper.setMinimumSize(QtCore.QSize(400, 0)) self.wrapper.setObjectName("wrapper") self.wrapper_layout.addWidget(self.wrapper) self.wrapper_button = QtWidgets.QPushButton(self.wrapper_widget) self.wrapper_button.setObjectName("wrapper_button") self.wrapper_layout.addWidget(self.wrapper_button) self.launch_settings_layout.addWidget(self.wrapper_widget, 4, 1, 1, 1) + self.offline_label = QtWidgets.QLabel(self.launch_settings_groupbox) + self.offline_label.setObjectName("offline_label") + self.launch_settings_layout.addWidget(self.offline_label, 1, 0, 1, 1, QtCore.Qt.AlignRight) + self.offline = QtWidgets.QComboBox(self.launch_settings_groupbox) + self.offline.setObjectName("offline") + self.offline.addItem("") + self.offline.addItem("") + self.offline.addItem("") + self.launch_settings_layout.addWidget(self.offline, 1, 1, 1, 1, QtCore.Qt.AlignLeft) self.launch_params_widget = QtWidgets.QWidget(self.launch_settings_groupbox) self.launch_params_widget.setObjectName("launch_params_widget") self.launch_params_layout = QtWidgets.QHBoxLayout(self.launch_params_widget) self.launch_params_layout.setContentsMargins(0, 0, 0, 0) self.launch_params_layout.setObjectName("launch_params_layout") self.launch_params = QtWidgets.QLineEdit(self.launch_params_widget) + self.launch_params.setMinimumSize(QtCore.QSize(400, 0)) self.launch_params.setObjectName("launch_params") self.launch_params_layout.addWidget(self.launch_params) self.launch_params_button = QtWidgets.QPushButton(self.launch_params_widget) self.launch_params_button.setObjectName("launch_params_button") self.launch_params_layout.addWidget(self.launch_params_button) self.launch_settings_layout.addWidget(self.launch_params_widget, 3, 1, 1, 1) + self.cloud_sync_label = QtWidgets.QLabel(self.launch_settings_groupbox) + self.cloud_sync_label.setObjectName("cloud_sync_label") + self.launch_settings_layout.addWidget(self.cloud_sync_label, 2, 0, 1, 1, QtCore.Qt.AlignRight) self.game_settings_layout.addWidget(self.launch_settings_groupbox) self.proton_groupbox = QtWidgets.QGroupBox(GameSettings) self.proton_groupbox.setObjectName("proton_groupbox") self.proton_layout = QtWidgets.QGridLayout(self.proton_groupbox) self.proton_layout.setObjectName("proton_layout") - self.proton_prefix_label = QtWidgets.QLabel(self.proton_groupbox) - self.proton_prefix_label.setObjectName("proton_prefix_label") - self.proton_layout.addWidget(self.proton_prefix_label, 1, 0, 1, 1, QtCore.Qt.AlignRight) - self.proton_wrapper_label = QtWidgets.QLabel(self.proton_groupbox) - self.proton_wrapper_label.setObjectName("proton_wrapper_label") - self.proton_layout.addWidget(self.proton_wrapper_label, 0, 0, 1, 1, QtCore.Qt.AlignRight) self.proton_wrapper = QtWidgets.QComboBox(self.proton_groupbox) self.proton_wrapper.setObjectName("proton_wrapper") self.proton_wrapper.addItem("") self.proton_layout.addWidget(self.proton_wrapper, 0, 1, 1, 1, QtCore.Qt.AlignLeft) + self.proton_wrapper_label = QtWidgets.QLabel(self.proton_groupbox) + self.proton_wrapper_label.setObjectName("proton_wrapper_label") + self.proton_layout.addWidget(self.proton_wrapper_label, 0, 0, 1, 1, QtCore.Qt.AlignRight) + self.proton_prefix_label = QtWidgets.QLabel(self.proton_groupbox) + self.proton_prefix_label.setObjectName("proton_prefix_label") + self.proton_layout.addWidget(self.proton_prefix_label, 1, 0, 1, 1, QtCore.Qt.AlignRight) + spacerItem = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum) + self.proton_layout.addItem(spacerItem, 4, 1, 1, 1) self.proton_prefix_layout = QtWidgets.QVBoxLayout() self.proton_prefix_layout.setObjectName("proton_prefix_layout") self.proton_layout.addLayout(self.proton_prefix_layout, 1, 1, 2, 1) @@ -104,13 +107,13 @@ class Ui_GameSettings(object): self.proton_prefix_alignment_label.setText("") self.proton_prefix_alignment_label.setObjectName("proton_prefix_alignment_label") self.proton_layout.addWidget(self.proton_prefix_alignment_label, 2, 0, 1, 1) - self.game_settings_layout.addWidget(self.proton_groupbox) self.linux_layout = QtWidgets.QVBoxLayout() self.linux_layout.setSpacing(0) self.linux_layout.setObjectName("linux_layout") - self.game_settings_layout.addLayout(self.linux_layout) - spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.game_settings_layout.addItem(spacerItem) + self.proton_layout.addLayout(self.linux_layout, 3, 0, 1, 2) + self.game_settings_layout.addWidget(self.proton_groupbox) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.game_settings_layout.addItem(spacerItem1) self.retranslateUi(GameSettings) QtCore.QMetaObject.connectSlotsByName(GameSettings) @@ -119,25 +122,25 @@ class Ui_GameSettings(object): _translate = QtCore.QCoreApplication.translate GameSettings.setWindowTitle(_translate("GameSettings", "Game Settings")) self.launch_settings_groupbox.setTitle(_translate("GameSettings", "Launch Settings")) - self.launch_params_label.setText(_translate("GameSettings", "Launch parameters:")) self.skip_update.setItemText(0, _translate("GameSettings", "Default")) self.skip_update.setItemText(1, _translate("GameSettings", "Yes")) self.skip_update.setItemText(2, _translate("GameSettings", "No")) - self.skip_update_label.setText(_translate("GameSettings", "Skip update check:")) - self.offline_label.setText(_translate("GameSettings", "Offline mode:")) - self.wrapper_label.setText(_translate("GameSettings", "Wrapper:")) + self.launch_params_label.setText(_translate("GameSettings", "Launch parameters")) + self.wrapper_label.setText(_translate("GameSettings", "Wrapper")) + self.skip_update_label.setText(_translate("GameSettings", "Skip update check")) + self.wrapper.setPlaceholderText(_translate("GameSettings", "e.g. optirun")) + self.wrapper_button.setText(_translate("GameSettings", "Save")) + self.offline_label.setText(_translate("GameSettings", "Offline mode")) self.offline.setItemText(0, _translate("GameSettings", "Default")) self.offline.setItemText(1, _translate("GameSettings", "Yes")) self.offline.setItemText(2, _translate("GameSettings", "No")) - self.cloud_sync_label.setText(_translate("GameSettings", "Sync with cloud:")) - self.wrapper.setPlaceholderText(_translate("GameSettings", "e.g. optirun")) - self.wrapper_button.setText(_translate("GameSettings", "Save")) self.launch_params.setPlaceholderText(_translate("GameSettings", "parameters")) self.launch_params_button.setText(_translate("GameSettings", "Save")) - self.proton_groupbox.setTitle(_translate("GameSettings", "Proton")) - self.proton_prefix_label.setText(_translate("GameSettings", "Prefix:")) - self.proton_wrapper_label.setText(_translate("GameSettings", "Wrapper:")) + self.cloud_sync_label.setText(_translate("GameSettings", "Sync with cloud")) + self.proton_groupbox.setTitle(_translate("GameSettings", "Linux Settings")) self.proton_wrapper.setItemText(0, _translate("GameSettings", "Don\'t use Proton")) + self.proton_wrapper_label.setText(_translate("GameSettings", "Proton")) + self.proton_prefix_label.setText(_translate("GameSettings", "Prefix")) if __name__ == "__main__": diff --git a/rare/ui/components/tabs/games/game_info/game_settings.ui b/rare/ui/components/tabs/games/game_info/game_settings.ui index fddd8321..b33b20a3 100644 --- a/rare/ui/components/tabs/games/game_info/game_settings.ui +++ b/rare/ui/components/tabs/games/game_info/game_settings.ui @@ -6,8 +6,8 @@ 0 0 - 668 - 433 + 759 + 617 @@ -30,13 +30,6 @@ Launch Settings - - - - Launch parameters: - - - @@ -56,46 +49,6 @@ - - - - Skip update check: - - - - - - - Offline mode: - - - - - - - Wrapper: - - - - - - - - Default - - - - - Yes - - - - - No - - - - @@ -103,10 +56,24 @@ - - + + - Sync with cloud: + Launch parameters + + + + + + + Wrapper + + + + + + + Skip update check @@ -127,6 +94,12 @@ + + + 400 + 0 + + e.g. optirun @@ -142,6 +115,32 @@ + + + + Offline mode + + + + + + + + Default + + + + + Yes + + + + + No + + + + @@ -159,6 +158,12 @@ + + + 400 + 0 + + parameters @@ -174,29 +179,22 @@ + + + + Sync with cloud + + + - Proton + Linux Settings - - - - Prefix: - - - - - - - Wrapper: - - - @@ -206,6 +204,36 @@ + + + + Proton + + + + + + + Prefix + + + + + + + Qt::Vertical + + + QSizePolicy::Maximum + + + + 20 + 0 + + + + @@ -219,16 +247,16 @@ + + + + 0 + + + - - - - 0 - - - diff --git a/rare/ui/components/tabs/settings/about.py b/rare/ui/components/tabs/settings/about.py index 9aea4e10..e98ac7f9 100644 --- a/rare/ui/components/tabs/settings/about.py +++ b/rare/ui/components/tabs/settings/about.py @@ -96,12 +96,12 @@ class Ui_About(object): _translate = QtCore.QCoreApplication.translate About.setWindowTitle(_translate("About", "About")) self.open_browser.setText(_translate("About", "Download latest release")) - self.version_label.setText(_translate("About", "Version:")) - self.license_label.setText(_translate("About", "License:")) - self.lgd_dev_label.setText(_translate("About", "Legendary Developer:")) + self.version_label.setText(_translate("About", "Version")) + self.license_label.setText(_translate("About", "License")) + self.lgd_dev_label.setText(_translate("About", "Legendary Developer")) self.dev.setToolTip(_translate("About", "Github")) - self.update_label.setText(_translate("About", "Update available:")) - self.dev_label.setText(_translate("About", "Rare Developer:")) + self.update_label.setText(_translate("About", "Update available")) + self.dev_label.setText(_translate("About", "Rare Developer")) self.license.setText(_translate("About", "GNU General Public License v3.0")) self.lgd_dev.setToolTip(_translate("About", "Github")) self.info_text.setText(_translate("About", "This is a beta version, so you can get bugs. If you get a bug, please report it by creating an Issue on Github. You can also contact me on Discord (Dummerle#7419). Or you can join the Discord server")) diff --git a/rare/ui/components/tabs/settings/about.ui b/rare/ui/components/tabs/settings/about.ui index f46dfd69..eb21f288 100644 --- a/rare/ui/components/tabs/settings/about.ui +++ b/rare/ui/components/tabs/settings/about.ui @@ -30,7 +30,7 @@ - Version: + Version @@ -43,7 +43,7 @@ - License: + License @@ -56,7 +56,7 @@ - Legendary Developer: + Legendary Developer @@ -82,7 +82,7 @@ - Update available: + Update available @@ -102,7 +102,7 @@ - Rare Developer: + Rare Developer diff --git a/rare/ui/components/tabs/settings/dxvk.py b/rare/ui/components/tabs/settings/dxvk.py index 64f5c9b8..56b0f335 100644 --- a/rare/ui/components/tabs/settings/dxvk.py +++ b/rare/ui/components/tabs/settings/dxvk.py @@ -20,29 +20,29 @@ class Ui_DxvkSettings(object): self.gb_dxvk_options.setObjectName("gb_dxvk_options") self.layout_dxvk_options = QtWidgets.QGridLayout(self.gb_dxvk_options) self.layout_dxvk_options.setObjectName("layout_dxvk_options") - self.api = QtWidgets.QCheckBox(self.gb_dxvk_options) - self.api.setObjectName("api") - self.layout_dxvk_options.addWidget(self.api, 2, 2, 1, 1) self.version = QtWidgets.QCheckBox(self.gb_dxvk_options) self.version.setObjectName("version") self.layout_dxvk_options.addWidget(self.version, 0, 2, 1, 1) + self.fps = QtWidgets.QCheckBox(self.gb_dxvk_options) + self.fps.setObjectName("fps") + self.layout_dxvk_options.addWidget(self.fps, 1, 0, 1, 1) self.memory = QtWidgets.QCheckBox(self.gb_dxvk_options) self.memory.setObjectName("memory") self.layout_dxvk_options.addWidget(self.memory, 0, 1, 1, 1) self.devinfo = QtWidgets.QCheckBox(self.gb_dxvk_options) self.devinfo.setObjectName("devinfo") self.layout_dxvk_options.addWidget(self.devinfo, 0, 0, 1, 1) - self.frametime = QtWidgets.QCheckBox(self.gb_dxvk_options) - self.frametime.setObjectName("frametime") - self.layout_dxvk_options.addWidget(self.frametime, 3, 0, 1, 1) self.gpuload = QtWidgets.QCheckBox(self.gb_dxvk_options) self.gpuload.setObjectName("gpuload") - self.layout_dxvk_options.addWidget(self.gpuload, 2, 1, 1, 1) - self.fps = QtWidgets.QCheckBox(self.gb_dxvk_options) - self.fps.setObjectName("fps") - self.layout_dxvk_options.addWidget(self.fps, 2, 0, 1, 1) + self.layout_dxvk_options.addWidget(self.gpuload, 1, 1, 1, 1) + self.frametime = QtWidgets.QCheckBox(self.gb_dxvk_options) + self.frametime.setObjectName("frametime") + self.layout_dxvk_options.addWidget(self.frametime, 2, 0, 1, 1) spacerItem = QtWidgets.QSpacerItem(0, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.layout_dxvk_options.addItem(spacerItem, 0, 3, 4, 1) + self.layout_dxvk_options.addItem(spacerItem, 0, 3, 3, 1) + self.api = QtWidgets.QCheckBox(self.gb_dxvk_options) + self.api.setObjectName("api") + self.layout_dxvk_options.addWidget(self.api, 1, 2, 1, 1) self.gridLayout.addWidget(self.gb_dxvk_options, 2, 0, 1, 3) self.lbl_show_dxvk = QtWidgets.QLabel(DxvkSettings) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) @@ -73,14 +73,14 @@ class Ui_DxvkSettings(object): DxvkSettings.setWindowTitle(_translate("DxvkSettings", "DxvkSettings")) DxvkSettings.setTitle(_translate("DxvkSettings", "DXVK Settings")) self.gb_dxvk_options.setTitle(_translate("DxvkSettings", "DXVK HUD Options")) - self.api.setText(_translate("DxvkSettings", "D3D Version")) self.version.setText(_translate("DxvkSettings", "DXVK Version")) + self.fps.setText(_translate("DxvkSettings", "FPS")) self.memory.setText(_translate("DxvkSettings", "Memory Usage")) self.devinfo.setText(_translate("DxvkSettings", "Device Info")) - self.frametime.setText(_translate("DxvkSettings", "Frame Time graph")) self.gpuload.setText(_translate("DxvkSettings", "GPU Usage")) - self.fps.setText(_translate("DxvkSettings", "FPS")) - self.lbl_show_dxvk.setText(_translate("DxvkSettings", "Show HUD:")) + self.frametime.setText(_translate("DxvkSettings", "Frame Time graph")) + self.api.setText(_translate("DxvkSettings", "D3D Version")) + self.lbl_show_dxvk.setText(_translate("DxvkSettings", "Show HUD")) self.show_dxvk.setItemText(0, _translate("DxvkSettings", "System Default")) self.show_dxvk.setItemText(1, _translate("DxvkSettings", "Hidden")) self.show_dxvk.setItemText(2, _translate("DxvkSettings", "Visible")) diff --git a/rare/ui/components/tabs/settings/dxvk.ui b/rare/ui/components/tabs/settings/dxvk.ui index edf5b241..dfa9eceb 100644 --- a/rare/ui/components/tabs/settings/dxvk.ui +++ b/rare/ui/components/tabs/settings/dxvk.ui @@ -2,6 +2,14 @@ DxvkSettings + + + 0 + 0 + 419 + 185 + + DxvkSettings @@ -15,13 +23,6 @@ DXVK HUD Options - - - - D3D Version - - - @@ -29,6 +30,13 @@ + + + + FPS + + + @@ -43,14 +51,7 @@ - - - - Frame Time graph - - - - + GPU Usage @@ -58,13 +59,13 @@ - + - FPS + Frame Time graph - + Qt::Horizontal @@ -77,6 +78,13 @@ + + + + D3D Version + + + @@ -89,7 +97,7 @@ - Show HUD: + Show HUD diff --git a/rare/ui/components/tabs/settings/legendary.py b/rare/ui/components/tabs/settings/legendary.py index b9d5cfb3..c2a0c8c8 100644 --- a/rare/ui/components/tabs/settings/legendary.py +++ b/rare/ui/components/tabs/settings/legendary.py @@ -68,7 +68,7 @@ class Ui_LegendarySettings(object): LegendarySettings.setWindowTitle(_translate("LegendarySettings", "LegendarySettings")) self.gb_install_dir.setTitle(_translate("LegendarySettings", "Default Installation Directory")) self.gb_downloads.setTitle(_translate("LegendarySettings", "Download Settings")) - self.lbl_max_workers.setText(_translate("LegendarySettings", "Max Workers:")) + self.lbl_max_workers.setText(_translate("LegendarySettings", "Max Workers")) self.lbl_max_workers_info.setText(_translate("LegendarySettings", "Less is slower (0: Default)")) self.gb_clean.setTitle(_translate("LegendarySettings", "Cleanup")) self.clean_button_without_manifests.setText(_translate("LegendarySettings", "Clean, but keep manifests")) diff --git a/rare/ui/components/tabs/settings/legendary.ui b/rare/ui/components/tabs/settings/legendary.ui index efa42912..50481a31 100644 --- a/rare/ui/components/tabs/settings/legendary.ui +++ b/rare/ui/components/tabs/settings/legendary.ui @@ -37,7 +37,7 @@ - Max Workers: + Max Workers diff --git a/rare/ui/components/tabs/settings/linux.py b/rare/ui/components/tabs/settings/linux.py index ddce9200..4c23dec1 100644 --- a/rare/ui/components/tabs/settings/linux.py +++ b/rare/ui/components/tabs/settings/linux.py @@ -57,8 +57,8 @@ class Ui_LinuxSettings(object): _translate = QtCore.QCoreApplication.translate LinuxSettings.setWindowTitle(_translate("LinuxSettings", "LinuxSettings")) self.wine_groupbox.setTitle(_translate("LinuxSettings", "Wine Settings")) - self.exec_label.setText(_translate("LinuxSettings", "Executable:")) - self.prefix_label.setText(_translate("LinuxSettings", "Prefix:")) + self.exec_label.setText(_translate("LinuxSettings", "Executable")) + self.prefix_label.setText(_translate("LinuxSettings", "Prefix")) if __name__ == "__main__": diff --git a/rare/ui/components/tabs/settings/linux.ui b/rare/ui/components/tabs/settings/linux.ui index e4bf0abb..4cee6742 100644 --- a/rare/ui/components/tabs/settings/linux.ui +++ b/rare/ui/components/tabs/settings/linux.ui @@ -36,14 +36,14 @@ - Executable: + Executable - Prefix: + Prefix diff --git a/rare/ui/components/tabs/settings/rpc_settings.py b/rare/ui/components/tabs/settings/rpc_settings.py index a01c3d36..3005e246 100644 --- a/rare/ui/components/tabs/settings/rpc_settings.py +++ b/rare/ui/components/tabs/settings/rpc_settings.py @@ -14,7 +14,6 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_RPCSettings(object): def setupUi(self, RPCSettings): RPCSettings.setObjectName("RPCSettings") - RPCSettings.resize(167, 144) self.gridLayout = QtWidgets.QGridLayout(RPCSettings) self.gridLayout.setObjectName("gridLayout") self.enable = QtWidgets.QComboBox(RPCSettings) @@ -51,7 +50,7 @@ class Ui_RPCSettings(object): self.enable.setItemText(0, _translate("RPCSettings", "When Playing")) self.enable.setItemText(1, _translate("RPCSettings", "Always")) self.enable.setItemText(2, _translate("RPCSettings", "Never")) - self.label.setText(_translate("RPCSettings", "Show:")) + self.label.setText(_translate("RPCSettings", "Show")) self.show_game.setText(_translate("RPCSettings", "Show Game")) self.show_os.setText(_translate("RPCSettings", "Show OS")) self.show_time.setText(_translate("RPCSettings", "Show Time playing")) diff --git a/rare/ui/components/tabs/settings/rpc_settings.ui b/rare/ui/components/tabs/settings/rpc_settings.ui index 4a92cf7e..b71d4119 100644 --- a/rare/ui/components/tabs/settings/rpc_settings.ui +++ b/rare/ui/components/tabs/settings/rpc_settings.ui @@ -6,8 +6,8 @@ 0 0 - 167 - 144 + 178 + 146 @@ -45,7 +45,7 @@ - Show: + Show diff --git a/rare/ui/utils/pathedit.py b/rare/ui/utils/pathedit.py index 28e7068f..0752f0b1 100644 --- a/rare/ui/utils/pathedit.py +++ b/rare/ui/utils/pathedit.py @@ -18,7 +18,6 @@ class Ui_PathEdit(object): self.layout_pathedit.setContentsMargins(0, 0, 0, 0) self.layout_pathedit.setObjectName("layout_pathedit") self.path_select = QtWidgets.QToolButton(PathEdit) - self.path_select.setText("...") self.path_select.setObjectName("path_select") self.layout_pathedit.addWidget(self.path_select, 0, 1, 1, 1) self.text_edit = QtWidgets.QLineEdit(PathEdit) @@ -41,6 +40,7 @@ class Ui_PathEdit(object): def retranslateUi(self, PathEdit): _translate = QtCore.QCoreApplication.translate PathEdit.setWindowTitle(_translate("PathEdit", "PathEdit")) + self.path_select.setText(_translate("PathEdit", "Browse...")) self.text_edit.setPlaceholderText(_translate("PathEdit", "Default")) self.save_path_button.setText(_translate("PathEdit", "Save")) diff --git a/rare/ui/utils/pathedit.ui b/rare/ui/utils/pathedit.ui index b3b0e946..a297a6d0 100644 --- a/rare/ui/utils/pathedit.ui +++ b/rare/ui/utils/pathedit.ui @@ -21,7 +21,7 @@ - ... + Browse... From 2b35f057f206255f11fdcb92c0f92d71c78a038d Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Wed, 5 May 2021 17:44:27 +0300 Subject: [PATCH 29/34] Fix game settings tab * Fix combobox config saving * Fix lineedit confgi saving and disable buttons after save * Disable Wine settings when a Proton version is active --- .../tabs/games/game_info/game_settings.py | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/rare/components/tabs/games/game_info/game_settings.py b/rare/components/tabs/games/game_info/game_settings.py index 50914845..1164cf66 100644 --- a/rare/components/tabs/games/game_info/game_settings.py +++ b/rare/components/tabs/games/game_info/game_settings.py @@ -49,15 +49,19 @@ class GameSettings(QWidget, Ui_GameSettings): self.skip_update.currentIndexChanged.connect( lambda x: self.update_combobox(x, "skip_update_check") ) - self.launch_params_button.clicked.connect( - lambda: self.save_line_edit("start_params", self.launch_params.text()) - ) self.cloud_sync.stateChanged.connect( lambda: self.settings.setValue(f"{self.game.app_name}/auto_sync_cloud", self.cloud_sync.isChecked()) ) + self.launch_params.textChanged.connect(lambda: self.launch_params_button.setEnabled(True)) + self.launch_params_button.clicked.connect( + lambda: self.save_line_edit("start_params", self.launch_params.text()) + ) + self.launch_params_button.setEnabled(False) + self.wrapper.textChanged.connect(lambda: self.wrapper_button.setEnabled(True)) self.wrapper_button.clicked.connect( lambda: self.save_line_edit("wrapper", self.wrapper.text()) ) + self.wrapper_button.setEnabled(False) if os.name != "nt": self.possible_proton_wrappers = find_proton_wrappers() @@ -74,23 +78,24 @@ class GameSettings(QWidget, Ui_GameSettings): # startparams, skip_update_check def save_line_edit(self, option, value): - if value != "": - if not (self.game.app_name in self.core.lgd.config.sections()): + if value: + if self.game.app_name not in self.core.lgd.config.sections(): self.core.lgd.config.add_section(self.game.app_name) self.core.lgd.config.set(self.game.app_name, option, value) else: if self.game.app_name in self.core.lgd.config.sections() and self.core.lgd.config.get( - f"{self.game.app_name}", option, fallback="") != "": + f"{self.game.app_name}", option, fallback=None) is not None: self.core.lgd.config.remove_option(self.game.app_name, option) - if not self.core.lgd.config.get(self.game.app_name): + if not self.core.lgd.config[self.game.app_name]: self.core.lgd.config.remove_section(self.game.app_name) self.core.lgd.save_config() + self.sender().setEnabled(False) def update_combobox(self, i, option): if self.change: # remove section if i: - if not self.core.lgd.config[self.game.app_name]: + if self.game.app_name not in self.core.lgd.config.sections(): self.core.lgd.config.add_section(self.game.app_name) if i == 1: self.core.lgd.config.set(self.game.app_name, option, "true") @@ -98,9 +103,9 @@ class GameSettings(QWidget, Ui_GameSettings): self.core.lgd.config.set(self.game.app_name, option, "false") else: if self.game.app_name in self.core.lgd.config.sections(): - if self.core.lgd.config.get(f"{self.game.app_name}", option, fallback="") != "": + if self.core.lgd.config.get(f"{self.game.app_name}", option, fallback=None) is not None: self.core.lgd.config.remove_option(self.game.app_name, option) - if self.core.lgd.config[self.game.app_name] == {}: + if not self.core.lgd.config[self.game.app_name]: self.core.lgd.config.remove_section(self.game.app_name) self.core.lgd.save_config() @@ -110,6 +115,7 @@ class GameSettings(QWidget, Ui_GameSettings): if i == 0: self.proton_prefix.setEnabled(False) self.wrapper_widget.setEnabled(True) + self.linux_settings.wine_groupbox.setEnabled(True) if f"{self.game.app_name}" in self.core.lgd.config.sections(): if self.core.lgd.config.get(f"{self.game.app_name}", "wrapper", fallback="") != "": self.core.lgd.config.remove_option(self.game.app_name, "wrapper") @@ -126,6 +132,7 @@ class GameSettings(QWidget, Ui_GameSettings): else: self.proton_prefix.setEnabled(True) self.wrapper_widget.setEnabled(False) + self.linux_settings.wine_groupbox.setEnabled(False) wrapper = self.possible_proton_wrappers[i - 1] if not self.game.app_name in self.core.lgd.config.sections(): self.core.lgd.config[self.game.app_name] = {} From 6af78aa57279f616ebe8600f60cc6b16ecb63ba3 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Sat, 8 May 2021 11:07:00 +0300 Subject: [PATCH 30/34] Make tests more pythonic --- .../tabs/games/game_info/game_settings.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/rare/components/tabs/games/game_info/game_settings.py b/rare/components/tabs/games/game_info/game_settings.py index 1164cf66..ddb5e468 100644 --- a/rare/components/tabs/games/game_info/game_settings.py +++ b/rare/components/tabs/games/game_info/game_settings.py @@ -103,7 +103,7 @@ class GameSettings(QWidget, Ui_GameSettings): self.core.lgd.config.set(self.game.app_name, option, "false") else: if self.game.app_name in self.core.lgd.config.sections(): - if self.core.lgd.config.get(f"{self.game.app_name}", option, fallback=None) is not None: + if self.core.lgd.config.get(f"{self.game.app_name}", option, fallback=False): self.core.lgd.config.remove_option(self.game.app_name, option) if not self.core.lgd.config[self.game.app_name]: self.core.lgd.config.remove_section(self.game.app_name) @@ -117,26 +117,25 @@ class GameSettings(QWidget, Ui_GameSettings): self.wrapper_widget.setEnabled(True) self.linux_settings.wine_groupbox.setEnabled(True) if f"{self.game.app_name}" in self.core.lgd.config.sections(): - if self.core.lgd.config.get(f"{self.game.app_name}", "wrapper", fallback="") != "": + if self.core.lgd.config.get(f"{self.game.app_name}", "wrapper", fallback=False): self.core.lgd.config.remove_option(self.game.app_name, "wrapper") - if self.core.lgd.config.get(f"{self.game.app_name}", "no_wine", fallback="") != "": + if self.core.lgd.config.get(f"{self.game.app_name}", "no_wine", fallback=False): self.core.lgd.config.remove_option(self.game.app_name, "no_wine") - if self.core.lgd.config[self.game.app_name] == {}: + if not self.core.lgd.config[self.game.app_name]: self.core.lgd.config.remove_section(self.game.app_name) if f"{self.game.app_name}.env" in self.core.lgd.config.sections(): - if self.core.lgd.config.get(f"{self.game.app_name}.env", "STEAM_COMPAT_DATA_PATH", - fallback="") != "": + if self.core.lgd.config.get(f"{self.game.app_name}.env", "STEAM_COMPAT_DATA_PATH", fallback=False): self.core.lgd.config.remove_option(f"{self.game.app_name}.env", "STEAM_COMPAT_DATA_PATH") - if self.core.lgd.config[self.game.app_name + ".env"] == {}: + if not self.core.lgd.config[self.game.app_name + ".env"]: self.core.lgd.config.remove_section(self.game.app_name + ".env") else: self.proton_prefix.setEnabled(True) self.wrapper_widget.setEnabled(False) self.linux_settings.wine_groupbox.setEnabled(False) wrapper = self.possible_proton_wrappers[i - 1] - if not self.game.app_name in self.core.lgd.config.sections(): + if self.game.app_name not in self.core.lgd.config.sections(): self.core.lgd.config[self.game.app_name] = {} - if not self.game.app_name + ".env" in self.core.lgd.config.sections(): + if self.game.app_name + ".env" not in self.core.lgd.config.sections(): self.core.lgd.config[self.game.app_name + ".env"] = {} self.core.lgd.config.set(self.game.app_name, "wrapper", wrapper) self.core.lgd.config.set(self.game.app_name, "no_wine", "true") @@ -154,7 +153,7 @@ class GameSettings(QWidget, Ui_GameSettings): def update_prefix(self): text = self.proton_prefix.text() - if text == "": + if not text: text = os.path.expanduser("~/.proton") self.proton_prefix.text_edit.setText(text) if not os.path.exists(text): From f094dacc4425996618a4b25dae50e96455977516 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Thu, 13 May 2021 00:17:35 +0300 Subject: [PATCH 31/34] Adjust Proton DB grade for the redesign --- .../tabs/games/game_info/__init__.py | 16 +- .../tabs/games/game_info/game_info.py | 147 ++++++----- .../tabs/games/game_info/game_info.ui | 241 ++++++++++-------- 3 files changed, 220 insertions(+), 184 deletions(-) diff --git a/rare/components/tabs/games/game_info/__init__.py b/rare/components/tabs/games/game_info/__init__.py index b1fbda3e..1dfb8fd1 100644 --- a/rare/components/tabs/games/game_info/__init__.py +++ b/rare/components/tabs/games/game_info/__init__.py @@ -79,10 +79,9 @@ class GameInfo(QWidget, Ui_GameInfo): self.widget = QWidget() self.core = core - if os.name != "nt": - self.grade = QLabel("Error") - right_layout.addWidget(self.grade) - self.grade.setTextInteractionFlags(Qt.TextSelectableByMouse) + if os.name == "nt": + self.lbl_grade.setVisible(False) + self.grade.setVisible(False) self.uninstall_button.clicked.connect(self.uninstall) self.verify_button.clicked.connect(self.verify) @@ -158,10 +157,11 @@ class GameInfo(QWidget, Ui_GameInfo): self.install_path.setText(self.igame.install_path) if os.name != "nt": - if grade := self.ratings.get(self.grade_table[app_name].get("grade")): - self.grade.setText(self.tr("ProtonDB rating: ") + grade) - else: - self.grade.setText(self.tr("ProtonDB rating: Error")) + try: + grade = self.ratings.get(self.grade_table[app_name].get("grade")) + except KeyError: + grade = (self.tr("Error")) + self.grade.setText(grade) if len(self.verify_threads.keys()) == 0 or not self.verify_threads.get(app_name): self.verify_widget.setCurrentIndex(0) diff --git a/rare/ui/components/tabs/games/game_info/game_info.py b/rare/ui/components/tabs/games/game_info/game_info.py index e4ed446f..b5bad854 100644 --- a/rare/ui/components/tabs/games/game_info/game_info.py +++ b/rare/ui/components/tabs/games/game_info/game_info.py @@ -20,22 +20,11 @@ class Ui_GameInfo(object): self.layout_game_info_form.setContentsMargins(6, 6, 6, 6) self.layout_game_info_form.setSpacing(12) self.layout_game_info_form.setObjectName("layout_game_info_form") - self.install_path = QtWidgets.QLabel(GameInfo) - self.install_path.setText("error") - self.install_path.setWordWrap(True) - self.install_path.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) - self.install_path.setObjectName("install_path") - self.layout_game_info_form.addWidget(self.install_path, 4, 1, 1, 1) - self.version = QtWidgets.QLabel(GameInfo) - self.version.setText("error") - self.version.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) - self.version.setObjectName("version") - self.layout_game_info_form.addWidget(self.version, 2, 1, 1, 1) self.install_size = QtWidgets.QLabel(GameInfo) self.install_size.setText("error") self.install_size.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.install_size.setObjectName("install_size") - self.layout_game_info_form.addWidget(self.install_size, 3, 1, 1, 1) + self.layout_game_info_form.addWidget(self.install_size, 4, 1, 1, 1) self.lbl_dev = QtWidgets.QLabel(GameInfo) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) @@ -48,28 +37,11 @@ class Ui_GameInfo(object): self.lbl_dev.setFont(font) self.lbl_dev.setObjectName("lbl_dev") self.layout_game_info_form.addWidget(self.lbl_dev, 0, 0, 1, 1, QtCore.Qt.AlignRight) - self.dev = QtWidgets.QLabel(GameInfo) - self.dev.setText("error") - self.dev.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) - self.dev.setObjectName("dev") - self.layout_game_info_form.addWidget(self.dev, 0, 1, 1, 1) - self.app_name = QtWidgets.QLabel(GameInfo) - self.app_name.setText("error") - self.app_name.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) - self.app_name.setObjectName("app_name") - self.layout_game_info_form.addWidget(self.app_name, 1, 1, 1, 1) - self.lbl_version = QtWidgets.QLabel(GameInfo) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.lbl_version.sizePolicy().hasHeightForWidth()) - self.lbl_version.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setBold(True) - font.setWeight(75) - self.lbl_version.setFont(font) - self.lbl_version.setObjectName("lbl_version") - self.layout_game_info_form.addWidget(self.lbl_version, 2, 0, 1, 1, QtCore.Qt.AlignRight) + self.version = QtWidgets.QLabel(GameInfo) + self.version.setText("error") + self.version.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) + self.version.setObjectName("version") + self.layout_game_info_form.addWidget(self.version, 2, 1, 1, 1) self.lbl_install_path = QtWidgets.QLabel(GameInfo) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) @@ -81,33 +53,7 @@ class Ui_GameInfo(object): font.setWeight(75) self.lbl_install_path.setFont(font) self.lbl_install_path.setObjectName("lbl_install_path") - self.layout_game_info_form.addWidget(self.lbl_install_path, 4, 0, 1, 1, QtCore.Qt.AlignRight) - spacerItem = QtWidgets.QSpacerItem(0, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.layout_game_info_form.addItem(spacerItem, 6, 1, 1, 1) - self.lbl_game_actions = QtWidgets.QLabel(GameInfo) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.lbl_game_actions.sizePolicy().hasHeightForWidth()) - self.lbl_game_actions.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setBold(True) - font.setWeight(75) - self.lbl_game_actions.setFont(font) - self.lbl_game_actions.setObjectName("lbl_game_actions") - self.layout_game_info_form.addWidget(self.lbl_game_actions, 5, 0, 1, 1, QtCore.Qt.AlignRight) - self.lbl_app_name = QtWidgets.QLabel(GameInfo) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.lbl_app_name.sizePolicy().hasHeightForWidth()) - self.lbl_app_name.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setBold(True) - font.setWeight(75) - self.lbl_app_name.setFont(font) - self.lbl_app_name.setObjectName("lbl_app_name") - self.layout_game_info_form.addWidget(self.lbl_app_name, 1, 0, 1, 1, QtCore.Qt.AlignRight) + self.layout_game_info_form.addWidget(self.lbl_install_path, 5, 0, 1, 1, QtCore.Qt.AlignRight) self.lbl_install_size = QtWidgets.QLabel(GameInfo) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) @@ -119,9 +65,11 @@ class Ui_GameInfo(object): font.setWeight(75) self.lbl_install_size.setFont(font) self.lbl_install_size.setObjectName("lbl_install_size") - self.layout_game_info_form.addWidget(self.lbl_install_size, 3, 0, 1, 1, QtCore.Qt.AlignRight) + self.layout_game_info_form.addWidget(self.lbl_install_size, 4, 0, 1, 1, QtCore.Qt.AlignRight) + spacerItem = QtWidgets.QSpacerItem(0, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.layout_game_info_form.addItem(spacerItem, 7, 1, 1, 1) spacerItem1 = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.layout_game_info_form.addItem(spacerItem1, 6, 0, 1, 1) + self.layout_game_info_form.addItem(spacerItem1, 7, 0, 1, 1) self.wg_game_actions = QtWidgets.QWidget(GameInfo) self.wg_game_actions.setMinimumSize(QtCore.QSize(250, 0)) self.wg_game_actions.setObjectName("wg_game_actions") @@ -158,7 +106,71 @@ class Ui_GameInfo(object): self.repair_button = QtWidgets.QPushButton(self.wg_game_actions) self.repair_button.setObjectName("repair_button") self.layout_game_actions.addWidget(self.repair_button) - self.layout_game_info_form.addWidget(self.wg_game_actions, 5, 1, 1, 1, QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) + self.layout_game_info_form.addWidget(self.wg_game_actions, 6, 1, 1, 1, QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) + self.lbl_version = QtWidgets.QLabel(GameInfo) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lbl_version.sizePolicy().hasHeightForWidth()) + self.lbl_version.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.lbl_version.setFont(font) + self.lbl_version.setObjectName("lbl_version") + self.layout_game_info_form.addWidget(self.lbl_version, 2, 0, 1, 1, QtCore.Qt.AlignRight) + self.lbl_app_name = QtWidgets.QLabel(GameInfo) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lbl_app_name.sizePolicy().hasHeightForWidth()) + self.lbl_app_name.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.lbl_app_name.setFont(font) + self.lbl_app_name.setObjectName("lbl_app_name") + self.layout_game_info_form.addWidget(self.lbl_app_name, 1, 0, 1, 1, QtCore.Qt.AlignRight) + self.dev = QtWidgets.QLabel(GameInfo) + self.dev.setText("error") + self.dev.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) + self.dev.setObjectName("dev") + self.layout_game_info_form.addWidget(self.dev, 0, 1, 1, 1) + self.app_name = QtWidgets.QLabel(GameInfo) + self.app_name.setText("error") + self.app_name.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) + self.app_name.setObjectName("app_name") + self.layout_game_info_form.addWidget(self.app_name, 1, 1, 1, 1) + self.install_path = QtWidgets.QLabel(GameInfo) + self.install_path.setText("error") + self.install_path.setWordWrap(True) + self.install_path.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) + self.install_path.setObjectName("install_path") + self.layout_game_info_form.addWidget(self.install_path, 5, 1, 1, 1) + self.lbl_game_actions = QtWidgets.QLabel(GameInfo) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lbl_game_actions.sizePolicy().hasHeightForWidth()) + self.lbl_game_actions.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.lbl_game_actions.setFont(font) + self.lbl_game_actions.setObjectName("lbl_game_actions") + self.layout_game_info_form.addWidget(self.lbl_game_actions, 6, 0, 1, 1, QtCore.Qt.AlignRight) + self.lbl_grade = QtWidgets.QLabel(GameInfo) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.lbl_grade.setFont(font) + self.lbl_grade.setObjectName("lbl_grade") + self.layout_game_info_form.addWidget(self.lbl_grade, 3, 0, 1, 1, QtCore.Qt.AlignRight) + self.grade = QtWidgets.QLabel(GameInfo) + self.grade.setText("error") + self.grade.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) + self.grade.setObjectName("grade") + self.layout_game_info_form.addWidget(self.grade, 3, 1, 1, 1) self.layout_game_info.addLayout(self.layout_game_info_form, 2, 1, 1, 1) self.image = QtWidgets.QLabel(GameInfo) self.image.setFrameShape(QtWidgets.QFrame.StyledPanel) @@ -180,14 +192,15 @@ class Ui_GameInfo(object): _translate = QtCore.QCoreApplication.translate GameInfo.setWindowTitle(_translate("GameInfo", "Game Info")) self.lbl_dev.setText(_translate("GameInfo", "Developer")) - self.lbl_version.setText(_translate("GameInfo", "Version")) self.lbl_install_path.setText(_translate("GameInfo", "Installation Path")) - self.lbl_game_actions.setText(_translate("GameInfo", "Actions")) - self.lbl_app_name.setText(_translate("GameInfo", "Application Name")) self.lbl_install_size.setText(_translate("GameInfo", "Installation Size")) self.uninstall_button.setText(_translate("GameInfo", "Uninstall Game")) self.verify_button.setText(_translate("GameInfo", "Verify Installation")) self.repair_button.setText(_translate("GameInfo", "Repair Instalation")) + self.lbl_version.setText(_translate("GameInfo", "Version")) + self.lbl_app_name.setText(_translate("GameInfo", "Application Name")) + self.lbl_game_actions.setText(_translate("GameInfo", "Actions")) + self.lbl_grade.setText(_translate("GameInfo", "ProtonDB Grade")) if __name__ == "__main__": diff --git a/rare/ui/components/tabs/games/game_info/game_info.ui b/rare/ui/components/tabs/games/game_info/game_info.ui index 09955772..d20c92fa 100644 --- a/rare/ui/components/tabs/games/game_info/game_info.ui +++ b/rare/ui/components/tabs/games/game_info/game_info.ui @@ -32,29 +32,6 @@ 12 - - - error - - - true - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - error - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - error @@ -83,8 +60,8 @@ - - + + error @@ -93,36 +70,7 @@ - - - - error - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - - 0 - 0 - - - - - 75 - true - - - - Version - - - - + @@ -141,58 +89,7 @@ - - - - Qt::Horizontal - - - - 0 - 20 - - - - - - - - - 0 - 0 - - - - - 75 - true - - - - Actions - - - - - - - - 0 - 0 - - - - - 75 - true - - - - Application Name - - - - + @@ -211,7 +108,20 @@ - + + + + Qt::Horizontal + + + + 0 + 20 + + + + + Qt::Vertical @@ -224,7 +134,7 @@ - + @@ -321,6 +231,119 @@ + + + + + 0 + 0 + + + + + 75 + true + + + + Version + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Application Name + + + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + error + + + true + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Actions + + + + + + + + 75 + true + + + + ProtonDB Grade + + + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + From d512b559835f97de62ac89fb40d1584cc65f6fb9 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Thu, 13 May 2021 00:30:50 +0300 Subject: [PATCH 32/34] Some unfinished qss style improvements --- rare/styles/RareStyle.qss | 147 ++++++++++++++++++++++++++++++++------ 1 file changed, 125 insertions(+), 22 deletions(-) diff --git a/rare/styles/RareStyle.qss b/rare/styles/RareStyle.qss index e2b79158..4f110abf 100644 --- a/rare/styles/RareStyle.qss +++ b/rare/styles/RareStyle.qss @@ -1,10 +1,65 @@ QWidget { background-color: #202225; - color: white; + color: #eee; } QLabel { background-color: transparent; + padding: 4px; +} + +QLineEdit { + border: 1px solid darkslategrey; + border-radius: 2px; + background-color: #334; + padding: 2px; +} + +QScrollBar { + border: 1px solid darkslategrey; + border-radius: 4px; + background-color: #334; + padding: 1px; +} + +QScrollBar::add-line:vertical { + border: none; + background: transparent; + height: 0px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical { + border: none; + background: transparent; + height: 0px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal { + border: none; + background: transparent; + height: 0px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + border: none; + background: green; + height: 0px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::handle{ + border: 1px solid darkslategrey; + background-color: gray; + border-radius: 4px; + min-height: 20px; + min-width: 20px; } QTabBar#main_tab_bar { @@ -27,12 +82,18 @@ QTabBar::tab:selected#main_tab_bar { QTabBar::tab:hover#main_tab_bar { border-bottom: 2px solid black; - } QGroupBox { - padding: 4px; - margin: 8px; + border: 1px solid gray; + font-size: 13px; + font-weight: bold; + border-radius: 6px; + margin-top: 3ex; + padding-top: 0px; + padding-bottom: 0px; + padding-left: 0px; + padding-right: 0px; } QGroupBox#settings_widget { @@ -60,15 +121,21 @@ QGroupBox#group { QToolButton { - padding: 6px; + border: 1px solid gray; + border-radius: 2px; + background-color: #3c3f41; + padding: 4px; } +QToolButton:hover { + background-color: #223; +} QPushButton { - border: 1px solid white; - border-radius: 4px; + border: 1px solid gray; + border-radius: 2px; background-color: #3c3f41; - padding: 3px; + padding: 5px; } QPushButton:hover { @@ -97,19 +164,65 @@ QPushButton:hover#menu_button { background-color: #334; } -QLineEdit { - border: 1px solid white; +QRadioButton { + background-color: none; + border-radius: 50%; +} + +QRadioButton::indicator { + border: 1px solid gray; + border-radius: 5%; } QCheckBox { - color: #F0F0F0; background-color: none; } QCheckBox::indicator { - + border: 1px solid gray; + border-radius: 2px; } +QCheckBox::indicator:checked { + width: -20ex; + height: -20ex; + background: #5F5F80; + border-radius: 10px; + +} + +QSpinBox { + border: 1px solid darkslategrey; + border-radius: 2px; + background-color: #334; + padding: 2px; +} + +/* +QCheckBox::indicator { + border: 1px solid gray; +} +*/ + +QComboBox { + border: 1px solid gray; + border-radius: 2px; + background-color: #3c3f41; + padding: 5px; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; +/* + border-left-width: 1px; + border-left-color: darkgray; + border-left-style: solid; +*/ + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} #list_widget { border-top: 2px solid white; @@ -141,13 +254,3 @@ QTabBar::tab:disabled#settings_bar { color: transparent; background-color: transparent; } - -/* -QScrollBar:vertical{ - border: 1px solid white; -} -QScrollBar::handle:vertical{ - background-color: gray; - border-radius: 4px; -} -*/ From 10cd3d52275f8d59d9fdac3773a81138dc572ef5 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Mon, 17 May 2021 14:16:11 +0300 Subject: [PATCH 33/34] Use default size policy for rare settings ui. Fixes truncated labels in checkbuttons --- rare/ui/components/tabs/settings/rare.py | 30 -------------------- rare/ui/components/tabs/settings/rare.ui | 36 ------------------------ 2 files changed, 66 deletions(-) diff --git a/rare/ui/components/tabs/settings/rare.py b/rare/ui/components/tabs/settings/rare.py index 369fddbf..439e32eb 100644 --- a/rare/ui/components/tabs/settings/rare.py +++ b/rare/ui/components/tabs/settings/rare.py @@ -46,51 +46,21 @@ class Ui_RareSettings(object): self.gridLayout = QtWidgets.QGridLayout(self.gb_settings) self.gridLayout.setObjectName("gridLayout") self.auto_update = QtWidgets.QCheckBox(self.gb_settings) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.auto_update.sizePolicy().hasHeightForWidth()) - self.auto_update.setSizePolicy(sizePolicy) self.auto_update.setObjectName("auto_update") self.gridLayout.addWidget(self.auto_update, 1, 0, 1, 1) self.confirm_start = QtWidgets.QCheckBox(self.gb_settings) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.confirm_start.sizePolicy().hasHeightForWidth()) - self.confirm_start.setSizePolicy(sizePolicy) self.confirm_start.setObjectName("confirm_start") self.gridLayout.addWidget(self.confirm_start, 2, 0, 1, 1) self.sys_tray = QtWidgets.QCheckBox(self.gb_settings) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.sys_tray.sizePolicy().hasHeightForWidth()) - self.sys_tray.setSizePolicy(sizePolicy) self.sys_tray.setObjectName("sys_tray") self.gridLayout.addWidget(self.sys_tray, 0, 0, 1, 1) self.notification = QtWidgets.QCheckBox(self.gb_settings) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.notification.sizePolicy().hasHeightForWidth()) - self.notification.setSizePolicy(sizePolicy) self.notification.setObjectName("notification") self.gridLayout.addWidget(self.notification, 0, 1, 1, 1) self.auto_sync_cloud = QtWidgets.QCheckBox(self.gb_settings) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.auto_sync_cloud.sizePolicy().hasHeightForWidth()) - self.auto_sync_cloud.setSizePolicy(sizePolicy) self.auto_sync_cloud.setObjectName("auto_sync_cloud") self.gridLayout.addWidget(self.auto_sync_cloud, 3, 0, 1, 1) self.save_size = QtWidgets.QCheckBox(self.gb_settings) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.save_size.sizePolicy().hasHeightForWidth()) - self.save_size.setSizePolicy(sizePolicy) self.save_size.setObjectName("save_size") self.gridLayout.addWidget(self.save_size, 1, 1, 1, 1) spacerItem = QtWidgets.QSpacerItem(0, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) diff --git a/rare/ui/components/tabs/settings/rare.ui b/rare/ui/components/tabs/settings/rare.ui index 95243cdc..596d46ed 100644 --- a/rare/ui/components/tabs/settings/rare.ui +++ b/rare/ui/components/tabs/settings/rare.ui @@ -55,12 +55,6 @@ - - - 0 - 0 - - Update games on application startup @@ -68,12 +62,6 @@ - - - 0 - 0 - - Confirm game launch @@ -81,12 +69,6 @@ - - - 0 - 0 - - Exit to System tray @@ -94,12 +76,6 @@ - - - 0 - 0 - - Show notification on download completion @@ -107,12 +83,6 @@ - - - 0 - 0 - - Automatically sync with cloud @@ -120,12 +90,6 @@ - - - 0 - 0 - - Restore window size on application startup From f34e1ce61fd730fd6e3fc5a70a7350c264314cb8 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Tue, 18 May 2021 01:56:01 +0300 Subject: [PATCH 34/34] Add selectable colors schemes and style sheets --- rare/app.py | 11 +- rare/components/tabs/settings/rare.py | 59 +++++-- rare/styles/colors/Numix-Dark.scheme | 61 ++++++++ rare/styles/colors/Rare.scheme | 61 ++++++++ rare/styles/colors/ia_ora.scheme | 61 ++++++++ rare/styles/{ => qss}/RareStyle.qss | 0 rare/ui/components/tabs/settings/rare.py | 134 +++++++++------- rare/ui/components/tabs/settings/rare.ui | 145 +++++++++++------- .../components/tabs/settings/rpc_settings.ui | 8 - rare/utils/utils.py | 73 +++++++++ 10 files changed, 484 insertions(+), 129 deletions(-) create mode 100644 rare/styles/colors/Numix-Dark.scheme create mode 100644 rare/styles/colors/Rare.scheme create mode 100644 rare/styles/colors/ia_ora.scheme rename rare/styles/{ => qss}/RareStyle.qss (100%) diff --git a/rare/app.py b/rare/app.py index d025cd53..96b4667a 100644 --- a/rare/app.py +++ b/rare/app.py @@ -14,7 +14,7 @@ from rare import lang_path, style_path from rare.components.dialogs.launch_dialog import LaunchDialog from rare.components.main_window import MainWindow from rare.components.tray_icon import TrayIcon -from rare.utils.utils import get_lang +from rare.utils.utils import get_lang, load_color_scheme start_time = time.strftime('%y-%m-%d--%H:%M') # year-month-day-hour-minute file_name = os.path.expanduser(f"~/.cache/rare/logs/Rare_{start_time}.log") @@ -68,8 +68,13 @@ class App(QApplication): # Style self.setStyle(QStyleFactory.create("Fusion")) - self.setStyleSheet(open(style_path + "RareStyle.qss").read()) - self.setWindowIcon(QIcon(style_path + "Logo.png")) + if (color := settings.value("color_scheme", None)) is not None: + custom_palette = load_color_scheme(os.path.join(style_path, "colors", color + ".scheme")) + if custom_palette is not None: + self.setPalette(custom_palette) + if (style := settings.value("style_sheet", None)) is not None: + self.setStyleSheet(open(os.path.join(style_path, "qss", style + ".qss")).read()) + self.setWindowIcon(QIcon(os.path.join(style_path + "Logo.png"))) # launch app self.launch_dialog = LaunchDialog(self.core, args.offline) diff --git a/rare/components/tabs/settings/rare.py b/rare/components/tabs/settings/rare.py index 671deff6..e067f142 100644 --- a/rare/components/tabs/settings/rare.py +++ b/rare/components/tabs/settings/rare.py @@ -10,7 +10,7 @@ from PyQt5.QtWidgets import QFileDialog, QWidget from rare.components.tabs.settings.rpc_settings import RPCSettings from rare.ui.components.tabs.settings.rare import Ui_RareSettings from rare.utils.extra_widgets import PathEdit -from rare.utils.utils import get_lang, get_possible_langs +from rare.utils.utils import get_lang, get_possible_langs, get_color_schemes, get_style_sheets logger = getLogger("RareSettings") @@ -43,20 +43,41 @@ class RareSettings(QWidget, Ui_RareSettings): # Select Image directory self.img_dir = PathEdit(self.img_dir_path, file_type=QFileDialog.DirectoryOnly, save_func=self.save_path) - self.layout_img_dir.addWidget(self.img_dir) + self.img_dir_layout.addWidget(self.img_dir) # Select lang - self.select_lang.addItems([i[1] for i in languages]) + self.lang_select.addItems([i[1] for i in languages]) if language in get_possible_langs(): index = [lang[0] for lang in languages].index(language) - self.select_lang.setCurrentIndex(index) + self.lang_select.setCurrentIndex(index) else: - self.select_lang.setCurrentIndex(0) - self.info_lang.setVisible(False) - self.select_lang.currentIndexChanged.connect(self.update_lang) + self.lang_select.setCurrentIndex(0) + self.lang_select.currentIndexChanged.connect(self.update_lang) + + colors = get_color_schemes() + self.color_select.addItems(colors) + if (color := self.settings.value("color_scheme")) in colors: + self.color_select.setCurrentIndex(self.color_select.findText(color)) + 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) + + styles = get_style_sheets() + self.style_select.addItems(styles) + if (style := self.settings.value("style_sheet")) in styles: + self.style_select.setCurrentIndex(self.style_select.findText(style)) + 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.interface_info.setVisible(False) self.rpc = RPCSettings() - self.layout_rpc.addWidget(self.rpc) + self.rpc_layout.addWidget(self.rpc) self.init_checkboxes(self.checkboxes) self.sys_tray.stateChanged.connect( @@ -83,6 +104,26 @@ class RareSettings(QWidget, Ui_RareSettings): self.log_dir_clean_button.setVisible(False) self.log_dir_size_label.setVisible(False) + def on_color_select_changed(self, color): + if color: + self.style_select.setCurrentIndex(0) + self.style_select.setDisabled(True) + self.settings.setValue("color_scheme", self.color_select.currentText()) + else: + self.settings.remove("color_scheme") + self.style_select.setDisabled(False) + self.interface_info.setVisible(True) + + def on_style_select_changed(self, style): + if style: + self.color_select.setCurrentIndex(0) + self.color_select.setDisabled(True) + self.settings.setValue("style_sheet", self.style_select.currentText()) + else: + self.settings.remove("style_sheet") + self.color_select.setDisabled(False) + self.interface_info.setVisible(True) + def open_dir(self): if os.name == "nt": os.startfile(self.logdir) @@ -99,7 +140,7 @@ class RareSettings(QWidget, Ui_RareSettings): def update_lang(self, i: int): self.settings.setValue("language", languages[i][0]) - self.info_lang.setVisible(True) + self.interface_info.setVisible(True) def update_path(self): old_path = self.img_dir_path diff --git a/rare/styles/colors/Numix-Dark.scheme b/rare/styles/colors/Numix-Dark.scheme new file mode 100644 index 00000000..7aa182da --- /dev/null +++ b/rare/styles/colors/Numix-Dark.scheme @@ -0,0 +1,61 @@ +[ColorScheme] +Active\AlternateBase=#2f2f2f +Active\Base=#333333 +Active\BrightText=#ffffff +Active\Button=#525252 +Active\ButtonText=#dddddd +Active\Dark=#333333 +Active\Highlight=#f0544c +Active\HighlightedText=#ffffff +Active\Light=#555555 +Active\Link=#fc6f5d +Active\LinkVisited=#853931 +Active\Mid=#a0a0a4 +Active\Midlight=#e9e7e3 +Active\PlaceholderText=#eeeeee +Active\Shadow=#343434 +Active\Text=#eeeeee +Active\ToolTipBase=#444444 +Active\ToolTipText=#eeeeee +Active\Window=#444444 +Active\WindowText=#dddddd +Disabled\AlternateBase=#2f2f2f +Disabled\Base=#333333 +Disabled\BrightText=#ffffff +Disabled\Button=#525252 +Disabled\ButtonText=#808080 +Disabled\Dark=#333333 +Disabled\Highlight=#f0544c +Disabled\HighlightedText=#808080 +Disabled\Light=#555555 +Disabled\Link=#fc6f5d +Disabled\LinkVisited=#853931 +Disabled\Mid=#a0a0a4 +Disabled\Midlight=#e9e7e3 +Disabled\PlaceholderText=#eeeeee +Disabled\Shadow=#343434 +Disabled\Text=#808080 +Disabled\ToolTipBase=#444444 +Disabled\ToolTipText=#eeeeee +Disabled\Window=#444444 +Disabled\WindowText=#808080 +Inactive\AlternateBase=#2f2f2f +Inactive\Base=#333333 +Inactive\BrightText=#ffffff +Inactive\Button=#525252 +Inactive\ButtonText=#dddddd +Inactive\Dark=#333333 +Inactive\Highlight=#f0544c +Inactive\HighlightedText=#ffffff +Inactive\Light=#555555 +Inactive\Link=#fc6f5d +Inactive\LinkVisited=#853931 +Inactive\Mid=#a0a0a4 +Inactive\Midlight=#e9e7e3 +Inactive\PlaceholderText=#eeeeee +Inactive\Shadow=#343434 +Inactive\Text=#eeeeee +Inactive\ToolTipBase=#444444 +Inactive\ToolTipText=#eeeeee +Inactive\Window=#444444 +Inactive\WindowText=#dddddd diff --git a/rare/styles/colors/Rare.scheme b/rare/styles/colors/Rare.scheme new file mode 100644 index 00000000..1b954210 --- /dev/null +++ b/rare/styles/colors/Rare.scheme @@ -0,0 +1,61 @@ +[ColorScheme] +Active\AlternateBase=#f7f7f7 +Active\Base=#333344 +Active\BrightText=#ffffff +Active\Button=#3c3f41 +Active\ButtonText=#eeeeee +Active\Dark=#9f0910 +Active\Highlight=#2f4f4f +Active\HighlightedText=#eeeeee +Active\Light=#ffffff +Active\Link=#0000ff +Active\LinkVisited=#ff00ff +Active\Mid=#b80e35 +Active\Midlight=#ca0651 +Active\PlaceholderText=#eeeeee +Active\Shadow=#767676 +Active\Text=#eeeeee +Active\ToolTipBase=#ffffdc +Active\ToolTipText=#eeeeee +Active\Window=#202225 +Active\WindowText=#eeeeee +Disabled\AlternateBase=#f7f7f7 +Disabled\Base=#333344 +Disabled\BrightText=#ffffff +Disabled\Button=#3c3f41 +Disabled\ButtonText=#808080 +Disabled\Dark=#9f0910 +Disabled\Highlight=#2f4f4f +Disabled\HighlightedText=#808080 +Disabled\Light=#ffffff +Disabled\Link=#0000ff +Disabled\LinkVisited=#ff00ff +Disabled\Mid=#b80e35 +Disabled\Midlight=#ca0651 +Disabled\PlaceholderText=#eeeeee +Disabled\Shadow=#767676 +Disabled\Text=#808080 +Disabled\ToolTipBase=#ffffdc +Disabled\ToolTipText=#eeeeee +Disabled\Window=#202225 +Disabled\WindowText=#808080 +Inactive\AlternateBase=#f7f7f7 +Inactive\Base=#333344 +Inactive\BrightText=#ffffff +Inactive\Button=#3c3f41 +Inactive\ButtonText=#eeeeee +Inactive\Dark=#9f0910 +Inactive\Highlight=#2f4f4f +Inactive\HighlightedText=#eeeeee +Inactive\Light=#ffffff +Inactive\Link=#0000ff +Inactive\LinkVisited=#ff00ff +Inactive\Mid=#b80e35 +Inactive\Midlight=#ca0651 +Inactive\PlaceholderText=#eeeeee +Inactive\Shadow=#767676 +Inactive\Text=#eeeeee +Inactive\ToolTipBase=#ffffdc +Inactive\ToolTipText=#eeeeee +Inactive\Window=#202225 +Inactive\WindowText=#eeeeee diff --git a/rare/styles/colors/ia_ora.scheme b/rare/styles/colors/ia_ora.scheme new file mode 100644 index 00000000..5fbbc868 --- /dev/null +++ b/rare/styles/colors/ia_ora.scheme @@ -0,0 +1,61 @@ +[ColorScheme] +Active\AlternateBase=#eff3f7 +Active\Base=#eff3f7 +Active\BrightText=#ffffff +Active\Button=#eff3f7 +Active\ButtonText=#000000 +Active\Dark=#c7cbce +Active\Highlight=#4965ae +Active\HighlightedText=#ffffff +Active\Light=#ffffff +Active\Link=#0000ff +Active\LinkVisited=#ff00ff +Active\Mid=#a0a0a4 +Active\Midlight=#e9e7e3 +Active\PlaceholderText=#000000 +Active\Shadow=#b8bbbe +Active\Text=#000000 +Active\ToolTipBase=#ffffdc +Active\ToolTipText=#000000 +Active\Window=#eff3f7 +Active\WindowText=#000000 +Disabled\AlternateBase=#eff3f7 +Disabled\Base=#eff3f7 +Disabled\BrightText=#ffffff +Disabled\Button=#eff3f7 +Disabled\ButtonText=#808080 +Disabled\Dark=#c7cbce +Disabled\Highlight=#4965ae +Disabled\HighlightedText=#808080 +Disabled\Light=#ffffff +Disabled\Link=#0000ff +Disabled\LinkVisited=#ff00ff +Disabled\Mid=#a0a0a4 +Disabled\Midlight=#e9e7e3 +Disabled\PlaceholderText=#000000 +Disabled\Shadow=#b8bbbe +Disabled\Text=#808080 +Disabled\ToolTipBase=#ffffdc +Disabled\ToolTipText=#000000 +Disabled\Window=#eff3f7 +Disabled\WindowText=#808080 +Inactive\AlternateBase=#eff3f7 +Inactive\Base=#eff3f7 +Inactive\BrightText=#ffffff +Inactive\Button=#eff3f7 +Inactive\ButtonText=#000000 +Inactive\Dark=#c7cbce +Inactive\Highlight=#4965ae +Inactive\HighlightedText=#ffffff +Inactive\Light=#ffffff +Inactive\Link=#0000ff +Inactive\LinkVisited=#ff00ff +Inactive\Mid=#a0a0a4 +Inactive\Midlight=#e9e7e3 +Inactive\PlaceholderText=#000000 +Inactive\Shadow=#b8bbbe +Inactive\Text=#000000 +Inactive\ToolTipBase=#ffffdc +Inactive\ToolTipText=#000000 +Inactive\Window=#eff3f7 +Inactive\WindowText=#000000 diff --git a/rare/styles/RareStyle.qss b/rare/styles/qss/RareStyle.qss similarity index 100% rename from rare/styles/RareStyle.qss rename to rare/styles/qss/RareStyle.qss diff --git a/rare/ui/components/tabs/settings/rare.py b/rare/ui/components/tabs/settings/rare.py index 439e32eb..12ee9ddd 100644 --- a/rare/ui/components/tabs/settings/rare.py +++ b/rare/ui/components/tabs/settings/rare.py @@ -14,63 +14,78 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_RareSettings(object): def setupUi(self, RareSettings): RareSettings.setObjectName("RareSettings") - self.layout_rare = QtWidgets.QGridLayout(RareSettings) - self.layout_rare.setObjectName("layout_rare") - self.gb_img_dir = QtWidgets.QGroupBox(RareSettings) - self.gb_img_dir.setObjectName("gb_img_dir") - self.layout_img_dir = QtWidgets.QVBoxLayout(self.gb_img_dir) - self.layout_img_dir.setObjectName("layout_img_dir") - self.layout_rare.addWidget(self.gb_img_dir, 0, 0, 1, 1) - self.gb_lang = QtWidgets.QGroupBox(RareSettings) + self.rare_layout = QtWidgets.QGridLayout(RareSettings) + self.rare_layout.setObjectName("rare_layout") + self.rpc_layout = QtWidgets.QVBoxLayout() + self.rpc_layout.setObjectName("rpc_layout") + self.rare_layout.addLayout(self.rpc_layout, 1, 2, 1, 1) + self.img_dir_group = QtWidgets.QGroupBox(RareSettings) + self.img_dir_group.setObjectName("img_dir_group") + self.img_dir_layout = QtWidgets.QVBoxLayout(self.img_dir_group) + self.img_dir_layout.setObjectName("img_dir_layout") + self.rare_layout.addWidget(self.img_dir_group, 0, 0, 1, 2, QtCore.Qt.AlignTop) + self.interface_group = QtWidgets.QGroupBox(RareSettings) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.gb_lang.sizePolicy().hasHeightForWidth()) - self.gb_lang.setSizePolicy(sizePolicy) - self.gb_lang.setObjectName("gb_lang") - self.layout_lang = QtWidgets.QVBoxLayout(self.gb_lang) - self.layout_lang.setObjectName("layout_lang") - self.select_lang = QtWidgets.QComboBox(self.gb_lang) - self.select_lang.setObjectName("select_lang") - self.layout_lang.addWidget(self.select_lang, 0, QtCore.Qt.AlignTop) - self.info_lang = QtWidgets.QLabel(self.gb_lang) + sizePolicy.setHeightForWidth(self.interface_group.sizePolicy().hasHeightForWidth()) + self.interface_group.setSizePolicy(sizePolicy) + self.interface_group.setObjectName("interface_group") + self.interface_layout = QtWidgets.QGridLayout(self.interface_group) + self.interface_layout.setObjectName("interface_layout") + self.lang_label = QtWidgets.QLabel(self.interface_group) + self.lang_label.setObjectName("lang_label") + self.interface_layout.addWidget(self.lang_label, 0, 1, 1, 1, QtCore.Qt.AlignRight) + self.style_label = QtWidgets.QLabel(self.interface_group) + self.style_label.setObjectName("style_label") + self.interface_layout.addWidget(self.style_label, 2, 1, 1, 1, QtCore.Qt.AlignRight) + self.color_label = QtWidgets.QLabel(self.interface_group) + self.color_label.setObjectName("color_label") + self.interface_layout.addWidget(self.color_label, 1, 1, 1, 1, QtCore.Qt.AlignRight) + self.lang_select = QtWidgets.QComboBox(self.interface_group) + self.lang_select.setObjectName("lang_select") + self.interface_layout.addWidget(self.lang_select, 0, 2, 1, 1) + self.interface_info = QtWidgets.QLabel(self.interface_group) font = QtGui.QFont() font.setItalic(True) - self.info_lang.setFont(font) - self.info_lang.setWordWrap(True) - self.info_lang.setObjectName("info_lang") - self.layout_lang.addWidget(self.info_lang, 0, QtCore.Qt.AlignTop) - self.layout_rare.addWidget(self.gb_lang, 0, 1, 1, 1) - self.gb_settings = QtWidgets.QGroupBox(RareSettings) - self.gb_settings.setObjectName("gb_settings") - self.gridLayout = QtWidgets.QGridLayout(self.gb_settings) - self.gridLayout.setObjectName("gridLayout") - self.auto_update = QtWidgets.QCheckBox(self.gb_settings) - self.auto_update.setObjectName("auto_update") - self.gridLayout.addWidget(self.auto_update, 1, 0, 1, 1) - self.confirm_start = QtWidgets.QCheckBox(self.gb_settings) - self.confirm_start.setObjectName("confirm_start") - self.gridLayout.addWidget(self.confirm_start, 2, 0, 1, 1) - self.sys_tray = QtWidgets.QCheckBox(self.gb_settings) - self.sys_tray.setObjectName("sys_tray") - self.gridLayout.addWidget(self.sys_tray, 0, 0, 1, 1) - self.notification = QtWidgets.QCheckBox(self.gb_settings) - self.notification.setObjectName("notification") - self.gridLayout.addWidget(self.notification, 0, 1, 1, 1) - self.auto_sync_cloud = QtWidgets.QCheckBox(self.gb_settings) + self.interface_info.setFont(font) + self.interface_info.setWordWrap(True) + self.interface_info.setObjectName("interface_info") + self.interface_layout.addWidget(self.interface_info, 3, 0, 1, 4) + self.style_select = QtWidgets.QComboBox(self.interface_group) + self.style_select.setObjectName("style_select") + self.style_select.addItem("") + self.interface_layout.addWidget(self.style_select, 2, 2, 1, 1) + self.color_select = QtWidgets.QComboBox(self.interface_group) + self.color_select.setObjectName("color_select") + self.color_select.addItem("") + self.interface_layout.addWidget(self.color_select, 1, 2, 1, 1) + self.rare_layout.addWidget(self.interface_group, 1, 0, 1, 1, QtCore.Qt.AlignTop) + self.settings_group = QtWidgets.QGroupBox(RareSettings) + self.settings_group.setObjectName("settings_group") + self.behaviour_layout = QtWidgets.QGridLayout(self.settings_group) + self.behaviour_layout.setObjectName("behaviour_layout") + self.auto_sync_cloud = QtWidgets.QCheckBox(self.settings_group) self.auto_sync_cloud.setObjectName("auto_sync_cloud") - self.gridLayout.addWidget(self.auto_sync_cloud, 3, 0, 1, 1) - self.save_size = QtWidgets.QCheckBox(self.gb_settings) + self.behaviour_layout.addWidget(self.auto_sync_cloud, 3, 0, 1, 1) + self.auto_update = QtWidgets.QCheckBox(self.settings_group) + self.auto_update.setObjectName("auto_update") + self.behaviour_layout.addWidget(self.auto_update, 1, 0, 1, 1) + self.confirm_start = QtWidgets.QCheckBox(self.settings_group) + self.confirm_start.setObjectName("confirm_start") + self.behaviour_layout.addWidget(self.confirm_start, 2, 0, 1, 1) + self.sys_tray = QtWidgets.QCheckBox(self.settings_group) + self.sys_tray.setObjectName("sys_tray") + self.behaviour_layout.addWidget(self.sys_tray, 0, 0, 1, 1) + spacerItem = QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.behaviour_layout.addItem(spacerItem, 0, 2, 4, 1) + self.notification = QtWidgets.QCheckBox(self.settings_group) + self.notification.setObjectName("notification") + self.behaviour_layout.addWidget(self.notification, 0, 1, 1, 1) + self.save_size = QtWidgets.QCheckBox(self.settings_group) self.save_size.setObjectName("save_size") - self.gridLayout.addWidget(self.save_size, 1, 1, 1, 1) - spacerItem = QtWidgets.QSpacerItem(0, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.gridLayout.addItem(spacerItem, 0, 2, 4, 1) - self.layout_rare.addWidget(self.gb_settings, 1, 0, 1, 1) - spacerItem1 = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.layout_rare.addItem(spacerItem1, 3, 0, 1, 2) - self.layout_rpc = QtWidgets.QVBoxLayout() - self.layout_rpc.setObjectName("layout_rpc") - self.layout_rare.addLayout(self.layout_rpc, 1, 1, 1, 1) + self.behaviour_layout.addWidget(self.save_size, 1, 1, 1, 1) + self.rare_layout.addWidget(self.settings_group, 1, 1, 1, 1, QtCore.Qt.AlignTop) self.log_dir_group = QtWidgets.QGroupBox(RareSettings) self.log_dir_group.setObjectName("log_dir_group") self.log_dir_layout = QtWidgets.QVBoxLayout(self.log_dir_group) @@ -86,7 +101,9 @@ class Ui_RareSettings(object): self.log_dir_size_label.setWordWrap(True) self.log_dir_size_label.setObjectName("log_dir_size_label") self.log_dir_layout.addWidget(self.log_dir_size_label) - self.layout_rare.addWidget(self.log_dir_group, 2, 1, 1, 1) + self.rare_layout.addWidget(self.log_dir_group, 0, 2, 1, 1, QtCore.Qt.AlignTop) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.rare_layout.addItem(spacerItem1, 2, 1, 1, 1) self.retranslateUi(RareSettings) QtCore.QMetaObject.connectSlotsByName(RareSettings) @@ -94,15 +111,20 @@ class Ui_RareSettings(object): def retranslateUi(self, RareSettings): _translate = QtCore.QCoreApplication.translate RareSettings.setWindowTitle(_translate("RareSettings", "RareSettings")) - self.gb_img_dir.setTitle(_translate("RareSettings", "Image Cache Directory")) - self.gb_lang.setTitle(_translate("RareSettings", "Language")) - self.info_lang.setText(_translate("RareSettings", "Restart Rare to apply the new settings.")) - self.gb_settings.setTitle(_translate("RareSettings", "Behaviour")) + self.img_dir_group.setTitle(_translate("RareSettings", "Image Cache Directory")) + self.interface_group.setTitle(_translate("RareSettings", "Interface")) + self.lang_label.setText(_translate("RareSettings", "Language")) + self.style_label.setText(_translate("RareSettings", "Style Sheet")) + self.color_label.setText(_translate("RareSettings", "Color Scheme")) + self.interface_info.setText(_translate("RareSettings", "Restart Rare to apply.")) + self.style_select.setItemText(0, _translate("RareSettings", "None")) + self.color_select.setItemText(0, _translate("RareSettings", "None")) + self.settings_group.setTitle(_translate("RareSettings", "Behaviour")) + self.auto_sync_cloud.setText(_translate("RareSettings", "Automatically sync with cloud")) self.auto_update.setText(_translate("RareSettings", "Update games on application startup")) self.confirm_start.setText(_translate("RareSettings", "Confirm game launch")) self.sys_tray.setText(_translate("RareSettings", "Exit to System tray")) self.notification.setText(_translate("RareSettings", "Show notification on download completion")) - self.auto_sync_cloud.setText(_translate("RareSettings", "Automatically sync with cloud")) self.save_size.setText(_translate("RareSettings", "Restore window size on application startup")) self.log_dir_group.setTitle(_translate("RareSettings", "Logs")) self.log_dir_open_button.setText(_translate("RareSettings", "Open Log directory")) diff --git a/rare/ui/components/tabs/settings/rare.ui b/rare/ui/components/tabs/settings/rare.ui index 596d46ed..a2ff7ab7 100644 --- a/rare/ui/components/tabs/settings/rare.ui +++ b/rare/ui/components/tabs/settings/rare.ui @@ -5,17 +5,20 @@ RareSettings - - - + + + + + + Image Cache Directory - + - - + + 0 @@ -23,36 +26,82 @@ - Language + Interface - - - + + + + + Language + + - - + + + + Style Sheet + + + + + + + Color Scheme + + + + + + + + true - Restart Rare to apply the new settings. + Restart Rare to apply. true + + + + + None + + + + + + + + + None + + + + - - + + Behaviour - + + + + + Automatically sync with cloud + + + @@ -74,6 +123,19 @@ + + + + Qt::Horizontal + + + + 0 + 0 + + + + @@ -81,13 +143,6 @@ - - - - Automatically sync with cloud - - - @@ -95,39 +150,10 @@ - - - - Qt::Horizontal - - - - 0 - 20 - - - - - - - - Qt::Vertical - - - - 20 - 0 - - - - - - - - + Logs @@ -160,6 +186,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + diff --git a/rare/ui/components/tabs/settings/rpc_settings.ui b/rare/ui/components/tabs/settings/rpc_settings.ui index b71d4119..ff480e58 100644 --- a/rare/ui/components/tabs/settings/rpc_settings.ui +++ b/rare/ui/components/tabs/settings/rpc_settings.ui @@ -2,14 +2,6 @@ RPCSettings - - - 0 - 0 - 178 - 146 - - Discord RPC diff --git a/rare/utils/utils.py b/rare/utils/utils.py index 7b618588..9f99d140 100644 --- a/rare/utils/utils.py +++ b/rare/utils/utils.py @@ -7,6 +7,8 @@ from logging import getLogger import requests from PIL import Image, UnidentifiedImageError from PyQt5.QtCore import pyqtSignal, QLocale, QSettings +from PyQt5.QtGui import QPalette, QColor +from rare import style_path # Windows if os.name == "nt": @@ -122,6 +124,77 @@ def get_lang(): return QLocale.system().name().split("_")[0] +color_role_map = { + 0: "WindowText", + 1: "Button", + 2: "Light", + 3: "Midlight", + 4: "Dark", + 5: "Mid", + 6: "Text", + 7: "BrightText", + 8: "ButtonText", + 9: "Base", + 10: "Window", + 11: "Shadow", + 12: "Highlight", + 13: "HighlightedText", + 14: "Link", + 15: "LinkVisited", + 16: "AlternateBase", + # 17: "NoRole", + 18: "ToolTipBase", + 19: "ToolTipText", + 20: "PlaceholderText", + # 21: "NColorRoles", +} + +color_group_map = { + 0: "Active", + 1: "Disabled", + 2: "Inactive", +} + + +def load_color_scheme(path: str): + custom_palette = QPalette() + settings = QSettings(path, QSettings.IniFormat) + try: + settings.beginGroup("ColorScheme") + for g in color_group_map: + settings.beginGroup(color_group_map[g]) + group = QPalette.ColorGroup(g) + for r in color_role_map: + role = QPalette.ColorRole(r) + custom_palette.setColor(group, role, QColor(settings.value(color_role_map[r]))) + settings.endGroup() + settings.endGroup() + text_color = custom_palette.text().color() + text_color.setAlpha(128) + custom_palette.setColor(custom_palette.Active, custom_palette.PlaceholderText, text_color) + custom_palette.setColor(custom_palette.Inactive, custom_palette.PlaceholderText, text_color) + custom_palette.setColor(custom_palette.Disabled, custom_palette.PlaceholderText, text_color) + except: + custom_palette = None + return custom_palette + + +def get_color_schemes(): + colors = [] + for file in os.listdir(os.path.join(style_path, "colors")): + if file.endswith(".scheme") and os.path.isfile(os.path.join(style_path, "colors", file)): + colors.append(file.replace(".scheme", "")) + return colors + + +def get_style_sheets(): + styles = [] + for file in os.listdir(os.path.join(style_path, "qss")): + if file.endswith(".qss") and os.path.isfile(os.path.join(style_path, "qss", file)): + styles.append(file.replace(".qss", "")) + return styles + + def get_possible_langs(): langs = ["en"] for i in os.listdir(lang_path):