diff --git a/rare/components/main_window.py b/rare/components/main_window.py
index 7e10531a..f3c6158e 100644
--- a/rare/components/main_window.py
+++ b/rare/components/main_window.py
@@ -2,7 +2,7 @@ import os
from logging import getLogger
from PyQt5.QtCore import Qt, QSettings, QTimer, QSize, pyqtSignal, pyqtSlot
-from PyQt5.QtGui import QCloseEvent, QCursor, QColor
+from PyQt5.QtGui import QCloseEvent, QCursor
from PyQt5.QtWidgets import (
QMainWindow,
QApplication,
@@ -173,27 +173,13 @@ class MainWindow(QMainWindow):
for label in self.queued_container.findChildren(QLabel, options=Qt.FindDirectChildrenOnly):
self.queued_container.layout().removeWidget(label)
label.deleteLater()
- stylesheet = """
- QLabel#QueueWorkerLabel {{
- border-radius: 3px;
- border: 1px solid {br_color};
- background-color: {bg_color};
- }}
- """
- color = {
- "Verify": QColor("#d6af57"),
- "Move": QColor("#41cad9"),
- }
for info in self.rcore.queue_info():
label = ElideLabel(info.app_title)
label.setObjectName("QueueWorkerLabel")
label.setToolTip(f"{info.worker_type}: {info.app_title}")
+ label.setProperty("workerType", info.worker_type)
label.setFixedWidth(150)
label.setContentsMargins(3, 0, 3, 0)
- label.setStyleSheet(stylesheet.format(
- br_color=color[info.worker_type].darker(200).name(),
- bg_color=color[info.worker_type].darker(400).name(),
- ))
if info.state == QueueWorkerState.ACTIVE:
self.active_container.layout().addWidget(label)
self.active_label.setVisible(True)
diff --git a/rare/components/tabs/games/game_widgets/icon_widget.py b/rare/components/tabs/games/game_widgets/icon_widget.py
index 86ff5656..4584002a 100644
--- a/rare/components/tabs/games/game_widgets/icon_widget.py
+++ b/rare/components/tabs/games/game_widgets/icon_widget.py
@@ -32,35 +32,12 @@ class IconWidget(object):
self.status_label = ElideLabel(parent=widget)
self.status_label.setObjectName(f"{type(self).__name__}StatusLabel")
self.status_label.setFixedHeight(False)
- self.status_label.setStyleSheet(
- f"""
- QLabel#{self.status_label.objectName()} {{
- font-weight: bold;
- color: white;
- background-color: rgba(0, 0, 0, 65%);
- border-radius: 5%;
- border-top-left-radius: 11%;
- border-top-right-radius: 11%;
- }}
- """
- )
self.status_label.setContentsMargins(6, 6, 6, 6)
self.status_label.setAutoFillBackground(False)
# on-hover popup
self.mini_widget = QWidget(parent=widget)
self.mini_widget.setObjectName(f"{type(self).__name__}MiniWidget")
- self.mini_widget.setStyleSheet(
- f"""
- QWidget#{self.mini_widget.objectName()} {{
- color: rgb(238, 238, 238);
- background-color: rgba(0, 0, 0, 65%);
- border-radius: 5%;
- border-bottom-left-radius: 9%;
- border-bottom-right-radius: 9%;
- }}
- """
- )
self.mini_widget.setFixedHeight(widget.height() // 3)
self.mini_effect = QGraphicsOpacityEffect(self.mini_widget)
@@ -69,14 +46,6 @@ class IconWidget(object):
# game title
self.title_label = QLabel(parent=self.mini_widget)
self.title_label.setObjectName(f"{type(self).__name__}TitleLabel")
- self.title_label.setStyleSheet(
- f"""
- QLabel#{self.title_label.objectName()} {{
- font-weight: bold;
- background-color: rgba(0, 0, 0, 0%); color: white;
- }}
- """
- )
self.title_label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.title_label.setAlignment(Qt.AlignVCenter)
self.title_label.setAutoFillBackground(False)
@@ -85,48 +54,17 @@ class IconWidget(object):
# information below title
self.tooltip_label = ElideLabel(parent=self.mini_widget)
self.tooltip_label.setObjectName(f"{type(self).__name__}TooltipLabel")
- self.tooltip_label.setStyleSheet(
- f"""
- QLabel#{self.tooltip_label.objectName()} {{
- background-color: rgba(0, 0, 0, 0%); color: white;
- }}
- """
- )
self.tooltip_label.setAutoFillBackground(False)
# play button
self.launch_btn = QPushButton(parent=self.mini_widget)
self.launch_btn.setObjectName(f"{type(self).__name__}LaunchButton")
- self.launch_btn.setStyleSheet(
- f"""
- QPushButton#{self.launch_btn.objectName()} {{
- border-radius: 10%;
- background-color: rgba(0, 0, 0, 65%);
- border-color: black; border-width: 1px;
- }}
- QPushButton#{self.launch_btn.objectName()}::hover {{
- border-color: gray;
- }}
- """
- )
self.launch_btn.setIcon(icon("ei.play-alt", color="white"))
self.launch_btn.setIconSize(QSize(20, 20))
self.launch_btn.setFixedSize(QSize(widget.width() // 4, widget.width() // 4))
self.install_btn = QPushButton(parent=self.mini_widget)
self.install_btn.setObjectName(f"{type(self).__name__}InstallButton")
- self.install_btn.setStyleSheet(
- f"""
- QPushButton#{self.install_btn.objectName()} {{
- border-radius: 10%;
- background-color: rgba(0, 0, 0, 65%);
- border-color: black; border-width: 1px;
- }}
- QPushButton#{self.install_btn.objectName()}::hover {{
- border-color: gray;
- }}
- """
- )
self.install_btn.setIcon(icon("ri.install-fill", color="white"))
self.install_btn.setIconSize(QSize(20, 20))
self.install_btn.setFixedSize(QSize(widget.width() // 4, widget.width() // 4))
diff --git a/rare/components/tabs/games/game_widgets/list_widget.py b/rare/components/tabs/games/game_widgets/list_widget.py
index 6bc86a62..402d580f 100644
--- a/rare/components/tabs/games/game_widgets/list_widget.py
+++ b/rare/components/tabs/games/game_widgets/list_widget.py
@@ -29,36 +29,14 @@ class ListWidget(object):
self.title_label = QLabel(parent=widget)
self.title_label.setObjectName(f"{type(self).__name__}TitleLabel")
self.title_label.setWordWrap(False)
- self.title_label.setStyleSheet(
- f"QLabel#{self.title_label.objectName()} {{font-weight: bold;}}"
- )
self.status_label = QLabel(parent=widget)
self.status_label.setObjectName(f"{type(self).__name__}StatusLabel")
self.status_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
- self.status_label.setStyleSheet(
- f"""
- QLabel#{self.status_label.objectName()} {{
- font-weight: bold;
- background-color: rgba(0,0,0,75%);
- border: 1px solid black;
- border-radius: 5px;
- }}
- """
- )
self.tooltip_label = QLabel(parent=widget)
self.tooltip_label.setObjectName(f"{type(self).__name__}TooltipLabel")
self.tooltip_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
- self.tooltip_label.setStyleSheet(
- f"""
- QLabel#{self.tooltip_label.objectName()} {{
- background-color: rgba(0,0,0,75%);
- border: 1px solid black;
- border-radius: 5px;
- }}
- """
- )
self.install_btn = QPushButton(parent=widget)
self.install_btn.setIcon(icon("ri.install-fill"))
@@ -75,24 +53,15 @@ class ListWidget(object):
self.developer_label = ElideLabel(parent=widget)
self.developer_label.setObjectName(f"{type(self).__name__}DeveloperLabel")
self.developer_label.setFixedWidth(120)
- self.developer_label.setStyleSheet(
- f"QLabel#{self.developer_label.objectName()} {{color: #999;}}"
- )
self.version_label = ElideLabel(parent=widget)
self.version_label.setObjectName(f"{type(self).__name__}VersionLabel")
self.version_label.setFixedWidth(120)
- self.version_label.setStyleSheet(
- f"QLabel#{self.version_label.objectName()} {{color: #999;}}"
- )
self.size_label = ElideLabel(parent=widget)
self.size_label.setObjectName(f"{type(self).__name__}SizeLabel")
self.size_label.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.size_label.setFixedWidth(60)
- self.size_label.setStyleSheet(
- f"QLabel#{self.size_label.objectName()} {{color: #999;}}"
- )
# Create layouts
top_layout = QHBoxLayout()
diff --git a/rare/resources/__init__.py b/rare/resources/__init__.py
index acf2c8cb..26569ee4 100644
--- a/rare/resources/__init__.py
+++ b/rare/resources/__init__.py
@@ -1,2 +1,4 @@
import rare.resources.resources
+# Static QSS independent of application style/colorsheme
+import rare.resources.static_css
import rare.resources.stylesheets
diff --git a/rare/resources/static_css/__init__.py b/rare/resources/static_css/__init__.py
new file mode 100644
index 00000000..985508ef
Binary files /dev/null and b/rare/resources/static_css/__init__.py differ
diff --git a/rare/resources/static_css/stylesheet.py b/rare/resources/static_css/stylesheet.py
new file mode 100644
index 00000000..7c2b2f81
--- /dev/null
+++ b/rare/resources/static_css/stylesheet.py
@@ -0,0 +1,180 @@
+import os
+import sys
+
+import qstylizer.style
+from PyQt5.QtCore import QDir
+from PyQt5.QtGui import QColor
+from PyQt5.pyrcc import RCCResourceLibrary, CONSTANT_COMPRESSLEVEL_DEFAULT, CONSTANT_COMPRESSTHRESHOLD_DEFAULT
+
+verbose = True
+compressLevel = 6
+compressThreshold = CONSTANT_COMPRESSTHRESHOLD_DEFAULT
+resourceRoot = ''
+
+
+def processResourceFile(filenamesIn, filenameOut, listFiles):
+ if verbose:
+ sys.stderr.write("PyQt5 resource compiler\n")
+
+ # Setup.
+ library = RCCResourceLibrary()
+ library.setInputFiles(filenamesIn)
+ library.setVerbose(verbose)
+ library.setCompressLevel(compressLevel)
+ library.setCompressThreshold(compressThreshold)
+ library.setResourceRoot(resourceRoot)
+
+ if not library.readFiles():
+ return False
+
+ if filenameOut == '-':
+ filenameOut = ''
+
+ if listFiles:
+ # Open the output file or use stdout if not specified.
+ if filenameOut:
+ try:
+ out_fd = open(filenameOut, 'w')
+ except Exception:
+ sys.stderr.write(
+ "Unable to open %s for writing\n" % filenameOut)
+ return False
+ else:
+ out_fd = sys.stdout
+
+ for df in library.dataFiles():
+ out_fd.write("%s\n" % QDir.cleanPath(df))
+
+ if out_fd is not sys.stdout:
+ out_fd.close()
+
+ return True
+
+ return library.output(filenameOut)
+
+
+css = qstylizer.style.StyleSheet()
+
+
+# [Un]InstallButton
+css.QPushButton["#InstallButton"].setValues(
+ borderColor=QColor(0, 180, 0).name(),
+ backgroundColor=QColor(0, 120, 0).name()
+)
+css.QPushButton["#InstallButton"].hover.setValues(
+ borderColor=QColor(0, 135, 0).name(),
+ backgroundColor=QColor(0, 90, 0).name()
+)
+css.QPushButton["#InstallButton"].disabled.setValues(
+ borderColor=QColor(0, 60, 0).name(),
+ backgroundColor=QColor(0, 40, 0).name()
+)
+css.QPushButton["#UninstallButton"].setValues(
+ borderColor=QColor(180, 0, 0).name(),
+ backgroundColor=QColor(120, 0, 0).name()
+)
+css.QPushButton["#UninstallButton"].hover.setValues(
+ borderColor=QColor(135, 0, 0).name(),
+ backgroundColor=QColor(90, 0, 0).name()
+)
+css.QPushButton["#UninstallButton"].disabled.setValues(
+ borderColor=QColor(60, 0, 0).name(),
+ backgroundColor=QColor(40, 0, 0).name()
+)
+
+
+# QueueWorkerLabel
+css.QLabel["#QueueWorkerLabel"].setValues(
+ borderWidth="1px",
+ borderStyle="solid",
+ borderRadius="3px",
+)
+verify_color = QColor("#d6af57")
+css.QLabel["#QueueWorkerLabel"]['[workerType="Verify"]'].setValues(
+ borderColor=verify_color.darker(200).name(),
+ backgroundColor=verify_color.darker(400).name()
+)
+move_color = QColor("#41cad9")
+css.QLabel["#QueueWorkerLabel"]['[workerType="Move"]'].setValues(
+ borderColor=move_color.darker(200).name(),
+ backgroundColor=move_color.darker(400).name()
+)
+
+
+# IconGameWidget
+icon_name = lambda x: f"#IconWidget{x}"
+icon_background_props = {
+ "backgroundColor":"rgba(0, 0, 0, 65%)",
+}
+css.QLabel[icon_name("StatusLabel")].setValues(
+ fontWeight="bold",
+ color="white",
+ **icon_background_props,
+ borderRadius="5%",
+ borderTopLeftRadius="11%",
+ borderTopRightRadius="11%",
+)
+css.QWidget[icon_name("MiniWidget")].setValues(
+ color="rgb(238, 238, 238)",
+ **icon_background_props,
+ borderRadius="5%",
+ borderBottomLeftRadius="9%",
+ borderBottomRightRadius="9%",
+)
+icon_bottom_label_props = {
+ "color": "white",
+ "backgroundColor": "rgba(0, 0, 0, 0%)",
+}
+css.QLabel[icon_name("TitleLabel")].setValues(
+ fontWeight="bold",
+ **icon_bottom_label_props,
+)
+css.QLabel[icon_name("TooltipLabel")].setValues(
+ **icon_bottom_label_props,
+)
+icon_square_button_props = {
+ "border": "1px solid black",
+ "borderRadius": "10%",
+}
+icon_square_button_props.update(icon_background_props)
+css.QPushButton[icon_name("LaunchButton")].setValues(
+ **icon_square_button_props
+)
+css.QPushButton[icon_name("LaunchButton")].hover.borderColor.setValue("gray")
+css.QPushButton[icon_name("InstallButton")].setValues(
+ **icon_square_button_props
+)
+css.QPushButton[icon_name("InstallButton")].hover.borderColor.setValue("gray")
+
+
+# ListGameWidget
+list_name = lambda x: f"#ListWidget{x}"
+css.QLabel[list_name("TitleLabel")].fontWeight.setValue("bold")
+list_status_label_props = {
+ "backgroundColor": "rgba(0, 0, 0, 75%)",
+ "border": "1px solid black",
+ "borderRadius": "5px",
+}
+css.QLabel[list_name("StatusLabel")].setValues(
+ fontWeight="bold",
+ **list_status_label_props,
+)
+css.QLabel[list_name("TooltipLabel")].setValues(
+ **list_status_label_props,
+)
+list_info_label_color = "#999"
+css.QLabel[list_name("DeveloperLabel")].color.setValue(list_info_label_color)
+css.QLabel[list_name("VersionLabel")].color.setValue(list_info_label_color)
+css.QLabel[list_name("SizeLabel")].color.setValue(list_info_label_color)
+
+
+if __name__ == "__main__":
+ with open("stylesheet.qss", "w") as qss:
+ qss.write(f'\n/* This file is auto-generated from "{os.path.basename(__file__)}". DO NOT EDIT!!! */\n\n')
+ qss.write(css.toString())
+
+ if not processResourceFile(["stylesheet.qrc"], "__init__.py", False):
+ print("Error while creating compiled resources")
+ sys.exit(1)
+
+ sys.exit(0)
diff --git a/rare/resources/static_css/stylesheet.qrc b/rare/resources/static_css/stylesheet.qrc
new file mode 100644
index 00000000..ef55dac5
--- /dev/null
+++ b/rare/resources/static_css/stylesheet.qrc
@@ -0,0 +1,5 @@
+
+
+ stylesheet.qss
+
+
\ No newline at end of file
diff --git a/rare/resources/static_css/stylesheet.qss b/rare/resources/static_css/stylesheet.qss
new file mode 100644
index 00000000..42019f17
--- /dev/null
+++ b/rare/resources/static_css/stylesheet.qss
@@ -0,0 +1,103 @@
+
+/* This file is auto-generated from "stylesheet.py". DO NOT EDIT!!! */
+
+QPushButton#InstallButton {
+ border-color: #00b400;
+ background-color: #007800;
+}
+QPushButton#InstallButton:hover {
+ border-color: #008700;
+ background-color: #005a00;
+}
+QPushButton#InstallButton:disabled {
+ border-color: #003c00;
+ background-color: #002800;
+}
+QPushButton#UninstallButton {
+ border-color: #b40000;
+ background-color: #780000;
+}
+QPushButton#UninstallButton:hover {
+ border-color: #870000;
+ background-color: #5a0000;
+}
+QPushButton#UninstallButton:disabled {
+ border-color: #3c0000;
+ background-color: #280000;
+}
+QLabel#QueueWorkerLabel {
+ border-width: 1px;
+ border-style: solid;
+ border-radius: 3px;
+}
+QLabel#QueueWorkerLabel[workerType="Verify"] {
+ border-color: #6b572c;
+ background-color: #352c16;
+}
+QLabel#QueueWorkerLabel[workerType="Move"] {
+ border-color: #20656c;
+ background-color: #103236;
+}
+QLabel#IconWidgetStatusLabel {
+ font-weight: bold;
+ color: white;
+ background-color: rgba(0, 0, 0, 65%);
+ border-radius: 5%;
+ border-top-left-radius: 11%;
+ border-top-right-radius: 11%;
+}
+QWidget#IconWidgetMiniWidget {
+ color: rgb(238, 238, 238);
+ background-color: rgba(0, 0, 0, 65%);
+ border-radius: 5%;
+ border-bottom-left-radius: 9%;
+ border-bottom-right-radius: 9%;
+}
+QLabel#IconWidgetTitleLabel {
+ font-weight: bold;
+ color: white;
+ background-color: rgba(0, 0, 0, 0%);
+}
+QLabel#IconWidgetTooltipLabel {
+ color: white;
+ background-color: rgba(0, 0, 0, 0%);
+}
+QPushButton#IconWidgetLaunchButton {
+ border: 1px solid black;
+ border-radius: 10%;
+ background-color: rgba(0, 0, 0, 65%);
+}
+QPushButton#IconWidgetLaunchButton:hover {
+ border-color: gray;
+}
+QPushButton#IconWidgetInstallButton {
+ border: 1px solid black;
+ border-radius: 10%;
+ background-color: rgba(0, 0, 0, 65%);
+}
+QPushButton#IconWidgetInstallButton:hover {
+ border-color: gray;
+}
+QLabel#ListWidgetTitleLabel {
+ font-weight: bold;
+}
+QLabel#ListWidgetStatusLabel {
+ font-weight: bold;
+ background-color: rgba(0, 0, 0, 75%);
+ border: 1px solid black;
+ border-radius: 5px;
+}
+QLabel#ListWidgetTooltipLabel {
+ background-color: rgba(0, 0, 0, 75%);
+ border: 1px solid black;
+ border-radius: 5px;
+}
+QLabel#ListWidgetDeveloperLabel {
+ color: #999;
+}
+QLabel#ListWidgetVersionLabel {
+ color: #999;
+}
+QLabel#ListWidgetSizeLabel {
+ color: #999;
+}
diff --git a/rare/resources/stylesheets/ChildOfMetropolis/__init__.py b/rare/resources/stylesheets/ChildOfMetropolis/__init__.py
index dcdef40a..24c1a194 100644
Binary files a/rare/resources/stylesheets/ChildOfMetropolis/__init__.py and b/rare/resources/stylesheets/ChildOfMetropolis/__init__.py differ
diff --git a/rare/resources/stylesheets/ChildOfMetropolis/stylesheet.qss b/rare/resources/stylesheets/ChildOfMetropolis/stylesheet.qss
index 4e681fbf..a79d468c 100644
--- a/rare/resources/stylesheets/ChildOfMetropolis/stylesheet.qss
+++ b/rare/resources/stylesheets/ChildOfMetropolis/stylesheet.qss
@@ -320,24 +320,6 @@ QPushButton::menu-indicator {
left: -2px;
border-style: none;
}
-QPushButton#InstallButton {
- background-color: #F9A7FF;
-}
-QPushButton#InstallButton:hover {
- background-color: #BB7DBF;
-}
-QPushButton#InstallButton:disabled {
- background-color: #7D5380;
-}
-QPushButton#UninstallButton {
- background-color: #FFB085;
-}
-QPushButton#UninstallButton:hover {
- background-color: #BF8464;
-}
-QPushButton#UninstallButton:disabled {
- background-color: #805843;
-}
QGroupBox,
QCheckBox,
diff --git a/rare/resources/stylesheets/RareStyle/__init__.py b/rare/resources/stylesheets/RareStyle/__init__.py
index 06485b43..10104819 100644
Binary files a/rare/resources/stylesheets/RareStyle/__init__.py and b/rare/resources/stylesheets/RareStyle/__init__.py differ
diff --git a/rare/resources/stylesheets/RareStyle/stylesheet.qss b/rare/resources/stylesheets/RareStyle/stylesheet.qss
index a8a8e253..810a3e8b 100644
--- a/rare/resources/stylesheets/RareStyle/stylesheet.qss
+++ b/rare/resources/stylesheets/RareStyle/stylesheet.qss
@@ -320,30 +320,6 @@ QPushButton::menu-indicator {
left: -2px;
border-style: none;
}
-QPushButton#InstallButton {
- border-color: rgb( 0, 180, 0);
- background-color: rgb( 0, 120, 0);
-}
-QPushButton#InstallButton:hover {
- border-color: rgb( 0, 135, 0);
- background-color: rgb( 0, 90, 0);
-}
-QPushButton#InstallButton:disabled {
- border-color: rgb( 0, 60, 0);
- background-color: rgb( 0, 40, 0);
-}
-QPushButton#UninstallButton {
- border-color: rgb(180, 0, 0);
- background-color: rgb(120, 0, 0);
-}
-QPushButton#UninstallButton:hover {
- border-color: rgb( 135, 0, 0);
- background-color: rgb( 90, 0, 0);
-}
-QPushButton#UninstallButton:disabled {
- border-color: rgb( 60, 0, 0);
- background-color: rgb( 40, 0, 0);
-}
QGroupBox,
QCheckBox,
diff --git a/rare/utils/misc.py b/rare/utils/misc.py
index 59157151..24177c3b 100644
--- a/rare/utils/misc.py
+++ b/rare/utils/misc.py
@@ -103,16 +103,23 @@ def get_color_schemes() -> List[str]:
def set_style_sheet(style_sheet: str):
+ file = QFile(":/static_css/stylesheet.qss")
+ file.open(QFile.ReadOnly)
+ static = file.readAll().data().decode("utf-8")
+ file.close()
+
if not style_sheet:
qApp.setStyle(QStyleFactory.create(qApp.property("rareDefaultQtStyle")))
- qApp.setStyleSheet("")
+ qApp.setStyleSheet(static)
return
+
qApp.setStyle(QStyleFactory.create("Fusion"))
file = QFile(f":/stylesheets/{style_sheet}/stylesheet.qss")
file.open(QFile.ReadOnly)
stylesheet = file.readAll().data().decode("utf-8")
+ file.close()
+ qApp.setStyleSheet(stylesheet + static)
- qApp.setStyleSheet(stylesheet)
icon_color = qApp.palette().color(QPalette.Text).name()
qtawesome.set_defaults(color="#eeeeee")
diff --git a/rare/widgets/rare_app.py b/rare/widgets/rare_app.py
index f0c5df91..85cc73fa 100644
--- a/rare/widgets/rare_app.py
+++ b/rare/widgets/rare_app.py
@@ -91,9 +91,14 @@ class RareApp(QApplication):
if color_scheme := self.settings.value("color_scheme", False):
self.settings.setValue("style_sheet", "")
set_color_pallete(color_scheme)
+ # lk: set the static stylesheet
+ set_style_sheet("")
elif style_sheet := self.settings.value("style_sheet", False):
self.settings.setValue("color_scheme", "")
set_style_sheet(style_sheet)
+ else:
+ # lk: set the static stylesheet
+ set_style_sheet("")
self.setWindowIcon(QIcon(":/images/Rare.png"))
def load_translator(self, lang: str):