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