From 41523cd1c5ad87730ee6eb258d86c052fdf5ef56 Mon Sep 17 00:00:00 2001 From: BarsTiger Date: Sun, 29 May 2022 15:36:08 +0300 Subject: [PATCH] theme switch --- admin/data/settings.py | 18 ++- admin/daunRat_admin.py | 4 +- admin/gui/functions.py | 2 + admin/gui/gui.py | 302 +++-------------------------------------- admin/gui/gui.ui | 32 +++++ admin/gui/styles.py | 263 ++++++++++++++++++++++++++++++++++- 6 files changed, 330 insertions(+), 291 deletions(-) diff --git a/admin/data/settings.py b/admin/data/settings.py index 7169f04..704e74a 100644 --- a/admin/data/settings.py +++ b/admin/data/settings.py @@ -3,17 +3,21 @@ import json class Settings: @staticmethod - def fix() -> None: - settings = { + def default(): + return { "animation": "InOutQuart", + "theme": "Black acrylic", "app_id": None, "key": None, "secret": None, "cluster": None, "client_id": None } + + @staticmethod + def fix() -> None: with open("data/settings.json", "w") as file: - json.dump(settings, file) + json.dump(Settings.default(), file) @staticmethod def get_settings() -> dict: @@ -61,3 +65,11 @@ class Settings: json.dump(settings, file) return settings + + @staticmethod + def get(key: str) -> any: + try: + return Settings.get_settings()[key] + except KeyError: + Settings.update(key, Settings.default()[key]) + return Settings.default()[key] diff --git a/admin/daunRat_admin.py b/admin/daunRat_admin.py index 043dd9b..ab2abd1 100644 --- a/admin/daunRat_admin.py +++ b/admin/daunRat_admin.py @@ -36,7 +36,9 @@ MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) ui.pagesWidget.setCurrentIndex(0) -GlobalBlur(MainWindow.winId(), acrylic=True) + +if 'acrylic' in Settings.get("theme"): + GlobalBlur(MainWindow.winId(), acrylic=True) # Trying to get settings or set default try: diff --git a/admin/gui/functions.py b/admin/gui/functions.py index d685cf1..a4cb103 100644 --- a/admin/gui/functions.py +++ b/admin/gui/functions.py @@ -25,6 +25,7 @@ def t_popup(title, text, style=0): def fill_settings(ui) -> None: settings = Settings.get_settings() ui.chooseAnimationBox.setCurrentText(settings.get("animation")) + ui.chooseThemeBox.setCurrentText(settings.get("theme")) ui.pusher_app_id_edit.setText(settings.get("app_id")) ui.pusher_key_edit.setText(settings.get("key")) ui.pusher_secret_edit.setText(settings.get("secret")) @@ -37,6 +38,7 @@ def update_settings(ui) -> None: settings = { "animation": get_text(ui.chooseAnimationBox.currentText()), + "theme": get_text(ui.chooseThemeBox.currentText()), "app_id": get_text(ui.pusher_app_id_edit.text().strip()), "key": get_text(ui.pusher_key_edit.text().strip()), "secret": get_text(ui.pusher_secret_edit.text().strip()), diff --git a/admin/gui/gui.py b/admin/gui/gui.py index 92d4bdd..0f980f4 100644 --- a/admin/gui/gui.py +++ b/admin/gui/gui.py @@ -9,6 +9,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets +import gui.styles as styles class Ui_MainWindow(object): @@ -26,269 +27,7 @@ class Ui_MainWindow(object): icon.addPixmap(QtGui.QPixmap(":/img/img/logo.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) MainWindow.setWindowIcon(icon) MainWindow.setAutoFillBackground(False) - MainWindow.setStyleSheet("\n" -"QWidget {\n" -" background-color: rgba(30, 30, 30, 0.1);\n" -" color: white;\n" -" font: 10pt \"Segoe UI\";\n" -"}\n" -"\n" -"\n" -"QScrollBar:vertical,\n" -"QScrollBar:horizontal {\n" -" border: none;\n" -" background: rgba(30, 30, 30, 0);\n" -" width: 10px;\n" -" margin: 15px 0 15px 0;\n" -" border-radius: 0px;\n" -"}\n" -"\n" -"QScrollBar::handle:vertical,\n" -"QScrollBar::handle:horizontal { \n" -" background-color: rgba(139, 139, 139, 0);\n" -" min-height: 30px;\n" -" border-radius: 5px;\n" -"}\n" -"\n" -"QScrollBar::handle:vertical:hover,\n" -"QScrollBar::handle:vertical:pressed,\n" -"QScrollBar::handle:horizontal:hover,\n" -"QScrollBar::handle:horizontal:pressed { \n" -" background-color: rgba(149, 149, 149, 0);\n" -"}\n" -"\n" -"QScrollBar::sub-line:vertical,\n" -"QScrollBar::add-line:vertical,\n" -"QScrollBar::up-arrow:vertical,\n" -"QScrollBar::down-arrow:vertical {\n" -" height: 0px;\n" -"}\n" -"\n" -"QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical,\n" -"QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical, \n" -"QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal,\n" -"QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal {\n" -" background: none;\n" -"}\n" -"\n" -"\n" -"QPushButton {\n" -" color: white;\n" -" border-width: 1px;\n" -" border-radius:6px;\n" -" border-style: solid;\n" -" border-color: rgba(48, 48, 48, 0.5);\n" -" background-color: rgba(44, 45, 46, 0.3);\n" -"}\n" -"QPushButton:hover {\n" -" border-width: 2px;\n" -" background-color: rgba(50, 50, 50, 0.7);\n" -"}\n" -"QPushButton:pressed {\n" -" background-color: rgba(38, 39, 40, 0.7);\n" -"}\n" -"QPushButton:disabled {\n" -" background-color: rgba(67, 67, 67, 0.7);\n" -" border-color: rgba(0, 0, 0, 0.7);\n" -"}\n" -"\n" -"\n" -"QLineEdit, QTextBrowser, QPlainTextEdit, QTextEdit {\n" -" border-width: 1px;\n" -" border-radius: 5px;\n" -" border-style: solid;\n" -" border-color: rgba(48, 48, 48);\n" -" background-color: rgba(36, 36, 36, 0);\n" -" font: 10pt \"Segoe UI\";\n" -"}\n" -"\n" -"\n" -"QListWidget {\n" -" border-width: 1px;\n" -" border-radius: 15px;\n" -" border-style: solid;\n" -" border-color: rgba(48, 48, 48);\n" -" padding: 10px;\n" -" background-color: rgba(100, 100, 100, 0);\n" -" font: 10pt \"Segoe UI\";\n" -"}\n" -"QListWidget:item {\n" -" background-color: rgba(36, 36, 36, 0);\n" -" selection-color: white;\n" -"}\n" -"QListWidget:item:hover {\n" -" background-color: rgba(50, 50, 50, 0);\n" -"}\n" -"QListWidget:item:selected {\n" -" background-color: rgba(119, 119, 119, 1);\n" -"}\n" -"\n" -"\n" -"QComboBox\n" -"{\n" -" border-width: 1px;\n" -" border-radius:6px;\n" -" border-style: solid;\n" -" border-color: rgba(48, 48, 48);\n" -" background-color: rgba(44, 45, 46, 0);\n" -" color: white;\n" -"}\n" -"\n" -"QComboBox::disabled\n" -"{\n" -" background-color: rgba(67, 67, 67, 0);\n" -" color: #656565;\n" -" border-color: rgba(67, 67, 67);\n" -"}\n" -"\n" -"QComboBox:hover\n" -"{\n" -" background-color: rgba(50, 50, 50, 0);\n" -"}\n" -"\n" -"QComboBox:on\n" -"{\n" -" background-color: rgba(67, 67, 67, 0);\n" -"}\n" -"\n" -"QComboBox QAbstractItemView\n" -"{\n" -" background-color: rgba(67, 67, 67, 0);\n" -" color: #ffffff;\n" -" selection-background-color: rgba(119, 119, 119, 0);\n" -" selection-color: white;\n" -" outline: 0;\n" -"}\n" -"\n" -"QComboBox::drop-down\n" -"{\n" -" subcontrol-origin: padding;\n" -" subcontrol-position: top right;\n" -" border-radius: 6px; \n" -"}\n" -"\n" -"\n" -"QTabBar::tab\n" -"{\n" -" background-color: rgba(44, 45, 46, 0);\n" -" color: #ffffff;\n" -" border-style: solid;\n" -" border-width: 1px;\n" -" border-top-left-radius: 3px;\n" -" border-top-right-radius: 3px;\n" -" border-color: rgba(48, 48, 48);\n" -" padding: 5px;\n" -"}\n" -"\n" -"QTabBar::tab:disabled\n" -"{\n" -" background-color: rgba(101, 101, 101, 0);\n" -" color: #656565;\n" -"}\n" -"\n" -"QTabWidget::pane \n" -"{\n" -" background-color: rgba(160, 160, 160, 0);\n" -" color: #ffffff;\n" -" border: 3px solid;\n" -" border-radius: 15px;\n" -" border-color: rgba(28, 28, 28);\n" -"}\n" -"\n" -"QTabBar::tab:selected\n" -"{\n" -" background-color: rgba(38, 39, 40, 0);\n" -" color: #ffffff;\n" -" border-style: solid;\n" -" border-width: 1px;\n" -" border-top-left-radius: 3px;\n" -" border-top-right-radius: 3px;\n" -" border-color: rgba(48, 48, 48);\n" -" padding: 5px;\n" -"}\n" -"\n" -"QTabBar::tab:selected:disabled\n" -"{\n" -" background-color: rgba(64, 64, 64, 0);\n" -" color: #656565;\n" -"}\n" -"\n" -"QTabBar::tab:!selected \n" -"{\n" -" background-color: rgba(38, 38, 38, 0);\n" -"}\n" -"\n" -"QTabBar::tab:!selected:hover \n" -"{\n" -" background-color: rgba(50, 50, 50, 0);\n" -"}\n" -"\n" -"QTabBar::tab:top:!selected \n" -"{\n" -" margin-top: 3px;\n" -"}\n" -"\n" -"QTabBar::tab:bottom:!selected \n" -"{\n" -" margin-bottom: 3px;\n" -"}\n" -"\n" -"QTabBar::tab:top, QTabBar::tab:bottom \n" -"{\n" -" min-width: 8ex;\n" -" margin-right: -1px;\n" -" padding: 5px 10px 5px 10px;\n" -"}\n" -"\n" -"QTabBar::tab:top:selected \n" -"{\n" -" border-bottom-color: none;\n" -"}\n" -"\n" -"QTabBar::tab:bottom:selected \n" -"{\n" -" border-top-color: none;\n" -"}\n" -"\n" -"QTabBar::tab:top:last, QTabBar::tab:bottom:last,\n" -"QTabBar::tab:top:only-one, QTabBar::tab:bottom:only-one \n" -"{\n" -" margin-right: 0;\n" -"}\n" -"\n" -"QTabBar::tab:left:!selected \n" -"{\n" -" margin-right: 3px;\n" -"}\n" -"\n" -"QTabBar::tab:right:!selected\n" -"{\n" -" margin-left: 3px;\n" -"}\n" -"\n" -"QTabBar::tab:left, QTabBar::tab:right \n" -"{\n" -" min-height: 8ex;\n" -" margin-bottom: -1px;\n" -" padding: 10px 5px 10px 5px;\n" -"}\n" -"\n" -"QTabBar::tab:left:selected \n" -"{\n" -" border-left-color: none;\n" -"}\n" -"\n" -"QTabBar::tab:right:selected \n" -"{\n" -" border-right-color: none;\n" -"}\n" -"\n" -"QTabBar::tab:left:last, QTabBar::tab:right:last,\n" -"QTabBar::tab:left:only-one, QTabBar::tab:right:only-one \n" -"{\n" -" margin-bottom: 0;\n" -"}\n" -"") + MainWindow.setStyleSheet(styles.centralwidget()) MainWindow.setLocale(QtCore.QLocale(QtCore.QLocale.Russian, QtCore.QLocale.Ukraine)) MainWindow.setDockOptions(QtWidgets.QMainWindow.AllowTabbedDocks|QtWidgets.QMainWindow.AnimatedDocks) self.centralwidget = QtWidgets.QWidget(MainWindow) @@ -301,28 +40,7 @@ class Ui_MainWindow(object): self.leftMenu.setMinimumSize(QtCore.QSize(60, 0)) self.leftMenu.setMaximumSize(QtCore.QSize(60, 16777215)) self.leftMenu.setFocusPolicy(QtCore.Qt.NoFocus) - self.leftMenu.setStyleSheet("\n" -"QListWidget {\n" -" border-width: 0px;\n" -" border-radius: 0px;\n" -" border: none;\n" -" padding: 0px;\n" -" background-color: rgba(36, 36, 36, 0);\n" -" font: 10pt \"Segoe UI\";\n" -"}\n" -"QListWidget:item {\n" -" padding-left: 10px;\n" -" height: 60px;\n" -" background-color: rgba(25, 25, 25, 0);\n" -" selection-color: rgba(255, 255, 255);\n" -"}\n" -"QListWidget:item:hover {\n" -" background-color: rgba(50, 50, 50, 0);\n" -"}\n" -"QListWidget:item:selected {\n" -" background-color: rgba(38, 39, 40, 0);\n" -"}\n" -"") + self.leftMenu.setStyleSheet(styles.menupage()) self.leftMenu.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.leftMenu.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.leftMenu.setAutoScroll(False) @@ -599,6 +317,16 @@ class Ui_MainWindow(object): self.chooseAnimationBox.addItem("") self.chooseAnimationBox.addItem("") self.verticalLayout_7.addWidget(self.chooseAnimationBox, 0, QtCore.Qt.AlignTop) + self.chooseThemeLabel = QtWidgets.QLabel(self.visualSettingsTab) + self.chooseThemeLabel.setObjectName("chooseThemeLabel") + self.verticalLayout_7.addWidget(self.chooseThemeLabel) + self.chooseThemeBox = QtWidgets.QComboBox(self.visualSettingsTab) + self.chooseThemeBox.setMinimumSize(QtCore.QSize(0, 30)) + self.chooseThemeBox.setObjectName("chooseThemeBox") + self.chooseThemeBox.addItem("") + self.chooseThemeBox.addItem("") + self.chooseThemeBox.addItem("") + self.verticalLayout_7.addWidget(self.chooseThemeBox) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_7.addItem(spacerItem) self.settingsTabWidget.addTab(self.visualSettingsTab, "") @@ -714,6 +442,10 @@ class Ui_MainWindow(object): self.chooseAnimationBox.setItemText(2, _translate("MainWindow", "InOutBounce")) self.chooseAnimationBox.setItemText(3, _translate("MainWindow", "OutBack")) self.chooseAnimationBox.setItemText(4, _translate("MainWindow", "OutElastic")) + self.chooseThemeLabel.setText(_translate("MainWindow", "Admin theme (requires app restart)")) + self.chooseThemeBox.setItemText(0, _translate("MainWindow", "Black acrylic")) + self.chooseThemeBox.setItemText(1, _translate("MainWindow", "Black")) + self.chooseThemeBox.setItemText(2, _translate("MainWindow", "Dark gray")) self.settingsTabWidget.setTabText(self.settingsTabWidget.indexOf(self.visualSettingsTab), _translate("MainWindow", "Visual")) self.pusher_app_id_edit.setPlaceholderText(_translate("MainWindow", "app_id")) self.pusher_key_edit.setPlaceholderText(_translate("MainWindow", "key")) diff --git a/admin/gui/gui.ui b/admin/gui/gui.ui index 35c5d68..fb7b4e2 100644 --- a/admin/gui/gui.ui +++ b/admin/gui/gui.ui @@ -1020,6 +1020,38 @@ p, li { white-space: pre-wrap; } + + + + Admin theme (requires app restart) + + + + + + + + 0 + 30 + + + + + Black acrylic + + + + + Black + + + + + Dark gray + + + + diff --git a/admin/gui/styles.py b/admin/gui/styles.py index 8bd4e52..7f40a75 100644 --- a/admin/gui/styles.py +++ b/admin/gui/styles.py @@ -1,4 +1,7 @@ -centralwidget = """ +from data.settings import Settings + + +centralwidget_b = """ QWidget { background-color: rgba(30, 30, 30, 0.1); color: white; @@ -262,7 +265,7 @@ QTabBar::tab:left:only-one, QTabBar::tab:right:only-one } """ -menupage = """ +menupage_b = """ QListWidget { border-width: 0px; border-radius: 0px; @@ -284,3 +287,259 @@ QListWidget:item:selected { background-color: rgba(38, 39, 40, 0); } """ + +centralwidget_g = """ +QWidget { + background-color: rgb(30, 30, 30); + color: rgb(255, 255, 255); + font: 10pt "Segoe UI"; +} +QScrollBar:vertical, +QScrollBar:horizontal { + border: none; + background: rgb(30, 30, 30); + width: 10px; + margin: 15px 0 15px 0; + border-radius: 0px; +} +QScrollBar::handle:vertical, +QScrollBar::handle:horizontal { + background-color: rgb(139, 139, 139); + min-height: 30px; + border-radius: 5px; +} +QScrollBar::handle:vertical:hover, +QScrollBar::handle:vertical:pressed, +QScrollBar::handle:horizontal:hover, +QScrollBar::handle:horizontal:pressed { + background-color: rgb(149, 149, 149); +} +QScrollBar::sub-line:vertical, +QScrollBar::add-line:vertical, +QScrollBar::up-arrow:vertical, +QScrollBar::down-arrow:vertical { + height: 0px; +} +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical, +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical, +QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal, +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + background: none; +} +QPushButton { + color: white; + border-width: 1px; + border-radius:6px; + border-style: solid; + border-color: #303030; + background-color: #2c2d2e; +} +QPushButton:hover { + border-width: 2px; + background-color: #323232; +} +QPushButton:pressed { + background-color: #262728; +} +QPushButton:disabled { + background-color: #434343; + border-color: #0000; +} +QLineEdit, QTextBrowser, QPlainTextEdit, QTextEdit { + border-width: 1px; + border-radius: 5px; + border-style: solid; + border-color: #303030; + background-color: #242424; + font: 10pt "Segoe UI"; +} +QListWidget { + border-width: 1px; + border-radius: 15px; + border-style: solid; + border-color: #303030; + padding: 10px; + background-color: #242424; + font: 10pt "Segoe UI"; +} +QListWidget:item { + background-color: #242424; + selection-color: white; +} +QListWidget:item:hover { + background-color: #323232; +} +QListWidget:item:selected { + background-color: #777777; +} +QComboBox +{ + border-width: 1px; + border-radius:6px; + border-style: solid; + border-color: #303030; + background-color: #2c2d2e; + color: #ffffff; +} +QComboBox::disabled +{ + background-color: #434343; + color: #656565; + border-color: #434343; +} +QComboBox:hover +{ + background-color: #323232; +} +QComboBox:on +{ + background-color: #434343; +} +QComboBox QAbstractItemView +{ + background-color: #434343; + color: #ffffff; + selection-background-color: #777777; + selection-color: white; + outline: 0; +} +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + border-radius: 6px; +} +QTabBar::tab +{ + background-color: #2c2d2e; + color: #ffffff; + border-style: solid; + border-width: 1px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-color: #303030; + padding: 5px; +} +QTabBar::tab:disabled +{ + background-color: #656565; + color: #656565; +} +QTabWidget::pane +{ + background-color: #a0a0a0; + color: #ffffff; + border: 3px solid; + border-radius: 15px; + border-color: #1c1c1c; +} +QTabBar::tab:selected +{ + background-color: #262728; + color: #ffffff; + border-style: solid; + border-width: 1px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-color: #303030; + padding: 5px; +} +QTabBar::tab:selected:disabled +{ + background-color: #404040; + color: #656565; +} +QTabBar::tab:!selected +{ + background-color: #262626; +} +QTabBar::tab:!selected:hover +{ + background-color: #323232; +} +QTabBar::tab:top:!selected +{ + margin-top: 3px; +} +QTabBar::tab:bottom:!selected +{ + margin-bottom: 3px; +} +QTabBar::tab:top, QTabBar::tab:bottom +{ + min-width: 8ex; + margin-right: -1px; + padding: 5px 10px 5px 10px; +} +QTabBar::tab:top:selected +{ + border-bottom-color: none; +} +QTabBar::tab:bottom:selected +{ + border-top-color: none; +} +QTabBar::tab:top:last, QTabBar::tab:bottom:last, +QTabBar::tab:top:only-one, QTabBar::tab:bottom:only-one +{ + margin-right: 0; +} +QTabBar::tab:left:!selected +{ + margin-right: 3px; +} +QTabBar::tab:right:!selected +{ + margin-left: 3px; +} +QTabBar::tab:left, QTabBar::tab:right +{ + min-height: 8ex; + margin-bottom: -1px; + padding: 10px 5px 10px 5px; +} +QTabBar::tab:left:selected +{ + border-left-color: none; +} +QTabBar::tab:right:selected +{ + border-right-color: none; +} +QTabBar::tab:left:last, QTabBar::tab:right:last, +QTabBar::tab:left:only-one, QTabBar::tab:right:only-one +{ + margin-bottom: 0; +} +""" + +menupage_g = """ +QListWidget { + border-width: 0px; + border-radius: 0px; + border: none; + padding: 0px; + background-color: #242424; + font: 10pt "Segoe UI"; +} +QListWidget:item { + padding-left: 10px; + height: 60px; + background-color: #191919; + selection-color: rgba(255, 255, 255); +} +QListWidget:item:hover { + background-color: #323232; +} +QListWidget:item:selected { + background-color: #262728; +} +""" + + +def centralwidget(): + return centralwidget_g if Settings.get("theme") == "Dark gray" else centralwidget_b + + +def menupage(): + return menupage_g if Settings.get("theme") == "Dark gray" else menupage_b