From ebab1cf4fc5e6eaffd8f1a796f93b53077e7d86a Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Tue, 12 Jan 2021 18:41:23 -0500 Subject: [PATCH] themes: reduce code duplication in theming code --- src/main/python/main_window.py | 29 +---- src/main/python/themes.py | 205 ++++++++++++++++++--------------- 2 files changed, 117 insertions(+), 117 deletions(-) diff --git a/src/main/python/main_window.py b/src/main/python/main_window.py index cd84bca..b20fdc9 100644 --- a/src/main/python/main_window.py +++ b/src/main/python/main_window.py @@ -139,33 +139,14 @@ class MainWindow(QMainWindow): self.security_menu.addSeparator() self.security_menu.addAction(keyboard_reset_act) + self.theme_menu = self.menuBar().addMenu(tr("Menu", "Theme")) theme_set_default = QAction(tr("MenuTheme", "System"), self) theme_set_default.triggered.connect(lambda: self.set_theme("default")) - - theme_set_light = QAction(tr("MenuTheme", "Light"), self) - theme_set_light.triggered.connect(lambda: self.set_theme("light")) - - theme_set_dark = QAction(tr("MenuTheme", "Dark"), self) - theme_set_dark.triggered.connect(lambda: self.set_theme("dark")) - - theme_set_arc = QAction(tr("MenuTheme", "Arc"), self) - theme_set_arc.triggered.connect(lambda: self.set_theme("arc")) - - theme_set_nord = QAction(tr("MenuTheme", "Nord"), self) - theme_set_nord.triggered.connect(lambda: self.set_theme("nord")) - - theme_set_olivia = QAction(tr("MenuTheme", "Olivia"), self) - theme_set_olivia.triggered.connect(lambda: self.set_theme("olivia")) - - - self.theme_menu = self.menuBar().addMenu(tr("Menu", "Theme")) self.theme_menu.addAction(theme_set_default) - self.theme_menu.addAction(theme_set_light) - self.theme_menu.addAction(theme_set_dark) - self.theme_menu.addAction(theme_set_arc) - self.theme_menu.addAction(theme_set_nord) - self.theme_menu.addAction(theme_set_olivia) - + for name, _ in themes.themes: + act = QAction(tr("MenuTheme", name), self) + act.triggered.connect(lambda x,name=name: self.set_theme(name)) + self.theme_menu.addAction(act) def on_layout_load(self): dialog = QFileDialog() diff --git a/src/main/python/themes.py b/src/main/python/themes.py index 385406d..6b50d7b 100644 --- a/src/main/python/themes.py +++ b/src/main/python/themes.py @@ -1,106 +1,125 @@ # SPDX-License-Identifier: GPL-2.0-or-later -from PyQt5.QtCore import Qt, QSettings from PyQt5.QtWidgets import QApplication from PyQt5.QtGui import QPalette, QColor -dark_palette = QPalette() -dark_palette.setColor(QPalette.Window, QColor(53, 53, 53)) -dark_palette.setColor(QPalette.WindowText, Qt.white) -dark_palette.setColor(QPalette.Base, QColor(35, 35, 35)) -dark_palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53)) -dark_palette.setColor(QPalette.ToolTipBase, QColor(25, 25, 25)) -dark_palette.setColor(QPalette.ToolTipText, Qt.white) -dark_palette.setColor(QPalette.Text, Qt.white) -dark_palette.setColor(QPalette.Button, QColor(53, 53, 53)) -dark_palette.setColor(QPalette.ButtonText, Qt.white) -dark_palette.setColor(QPalette.BrightText, Qt.red) -dark_palette.setColor(QPalette.Link, QColor(247, 169, 72)) -dark_palette.setColor(QPalette.Highlight, QColor(186, 186, 186)) -dark_palette.setColor(QPalette.HighlightedText, QColor(35, 35, 35)) -dark_palette.setColor(QPalette.Active, QPalette.Button, QColor(53, 53, 53)) -dark_palette.setColor(QPalette.Disabled, QPalette.ButtonText, Qt.darkGray) -dark_palette.setColor(QPalette.Disabled, QPalette.WindowText, Qt.darkGray) -dark_palette.setColor(QPalette.Disabled, QPalette.Text, Qt.darkGray) -dark_palette.setColor(QPalette.Disabled, QPalette.Light, QColor(53, 53, 53)) +themes = [ + ("Light", { + QPalette.Window: "#ffefebe7", + QPalette.WindowText: "#ff000000", + QPalette.Base: "#ffffffff", + QPalette.AlternateBase: "#fff7f5f3", + QPalette.ToolTipBase: "#ffffffdc", + QPalette.ToolTipText: "#ff000000", + QPalette.Text: "#ff000000", + QPalette.Button: "#ffefebe7", + QPalette.ButtonText: "#ff000000", + QPalette.BrightText: "#ffffffff", + QPalette.Link: "#ff0000ff", + QPalette.Highlight: "#ff308cc6", + QPalette.HighlightedText: "#ffffffff", + (QPalette.Active, QPalette.Button): "#ffefebe7", + (QPalette.Disabled, QPalette.ButtonText): "#ffbebebe", + (QPalette.Disabled, QPalette.WindowText): "#ffbebebe", + (QPalette.Disabled, QPalette.Text): "#ffbebebe", + (QPalette.Disabled, QPalette.Light): "#ffffffff", + }), + ("Dark", { + QPalette.Window: "#353535", + QPalette.WindowText: "#ffffff", + QPalette.Base: "#232323", + QPalette.AlternateBase: "#353535", + QPalette.ToolTipBase: "#191919", + QPalette.ToolTipText: "#ffffff", + QPalette.Text: "#ffffff", + QPalette.Button: "#353535", + QPalette.ButtonText: "#ffffff", + QPalette.BrightText: "#ff0000", + QPalette.Link: "#f7a948", + QPalette.Highlight: "#bababa", + QPalette.HighlightedText: "#232323", + (QPalette.Active, QPalette.Button): "#353535", + (QPalette.Disabled, QPalette.ButtonText): "#808080", + (QPalette.Disabled, QPalette.WindowText): "#808080", + (QPalette.Disabled, QPalette.Text): "#808080", + (QPalette.Disabled, QPalette.Light): "#353535", + }), + ("Arc", { + QPalette.Window: "#353945", + QPalette.WindowText: "#d3dae3", + QPalette.Base: "#353945", + QPalette.AlternateBase: "#404552", + QPalette.ToolTipBase: "#4B5162", + QPalette.ToolTipText: "#d3dae3", + QPalette.Text: "#d3dae3", + QPalette.Button: "#353945", + QPalette.ButtonText: "#d3dae3", + QPalette.BrightText: "#5294e2", + QPalette.Link: "#89b1e0", + QPalette.Highlight: "#5294e2", + QPalette.HighlightedText: "#d3dae3", + (QPalette.Active, QPalette.Button): "#353945", + (QPalette.Disabled, QPalette.ButtonText): "#d3dae3", + (QPalette.Disabled, QPalette.WindowText): "#d3dae3", + (QPalette.Disabled, QPalette.Text): "#d3dae3", + (QPalette.Disabled, QPalette.Light): "#404552", + }), + ("Nord", { + QPalette.Window: "#2e3440", + QPalette.WindowText: "#eceff4", + QPalette.Base: "#2e3440", + QPalette.AlternateBase: "#434c5e", + QPalette.ToolTipBase: "#4c566a", + QPalette.ToolTipText: "#eceff4", + QPalette.Text: "#eceff4", + QPalette.Button: "#2e3440", + QPalette.ButtonText: "#eceff4", + QPalette.BrightText: "#88c0d0", + QPalette.Link: "#88c0d0", + QPalette.Highlight: "#88c0d0", + QPalette.HighlightedText: "#eceff4", + (QPalette.Active, QPalette.Button): "#2e3440", + (QPalette.Disabled, QPalette.ButtonText): "#eceff4", + (QPalette.Disabled, QPalette.WindowText): "#eceff4", + (QPalette.Disabled, QPalette.Text): "#eceff4", + (QPalette.Disabled, QPalette.Light): "#88c0d0", + }), + ("Olivia", { + QPalette.Window: "#181818", + QPalette.WindowText: "#d9d9d9", + QPalette.Base: "#181818", + QPalette.AlternateBase: "#2c2c2c", + QPalette.ToolTipBase: "#363636 ", + QPalette.ToolTipText: "#d9d9d9", + QPalette.Text: "#d9d9d9", + QPalette.Button: "#181818", + QPalette.ButtonText: "#d9d9d9", + QPalette.BrightText: "#fabcad", + QPalette.Link: "#fabcad", + QPalette.Highlight: "#fabcad", + QPalette.HighlightedText: "#2c2c2c", + (QPalette.Active, QPalette.Button): "#181818", + (QPalette.Disabled, QPalette.ButtonText): "#d9d9d9", + (QPalette.Disabled, QPalette.WindowText): "#d9d9d9", + (QPalette.Disabled, QPalette.Text): "#d9d9d9", + (QPalette.Disabled, QPalette.Light): "#fabcad", + }), +] -arc_palette = QPalette() -arc_palette.setColor(QPalette.Window, QColor("#353945")) -arc_palette.setColor(QPalette.WindowText, QColor("#d3dae3")) -arc_palette.setColor(QPalette.Base, QColor("#353945")) -arc_palette.setColor(QPalette.AlternateBase, QColor("#404552")) -arc_palette.setColor(QPalette.ToolTipBase, QColor("#4B5162")) -arc_palette.setColor(QPalette.ToolTipText, QColor("#d3dae3")) -arc_palette.setColor(QPalette.Text, QColor("#d3dae3")) -arc_palette.setColor(QPalette.Button, QColor("#353945")) -arc_palette.setColor(QPalette.ButtonText, QColor("#d3dae3")) -arc_palette.setColor(QPalette.BrightText, QColor("#5294e2")) -arc_palette.setColor(QPalette.Link, QColor("#89b1e0")) -arc_palette.setColor(QPalette.Highlight, QColor("#5294e2")) -arc_palette.setColor(QPalette.HighlightedText, QColor("#d3dae3")) -arc_palette.setColor(QPalette.Active, QPalette.Button, QColor("#353945")) -arc_palette.setColor(QPalette.Disabled, QPalette.ButtonText, QColor("#d3dae3")) -arc_palette.setColor(QPalette.Disabled, QPalette.WindowText, QColor("#d3dae3")) -arc_palette.setColor(QPalette.Disabled, QPalette.Text, QColor("#d3dae3")) -arc_palette.setColor(QPalette.Disabled, QPalette.Light, QColor("#404552")) +palettes = dict() +for name, colors in themes: + palette = QPalette() + for role, color in colors.items(): + if not hasattr(type(role), '__iter__'): + role = [role] + palette.setColor(*role, QColor(color)) + palettes[name] = palette -nord_palette = QPalette() -nord_palette.setColor(QPalette.Window, QColor("#2e3440")) -nord_palette.setColor(QPalette.WindowText, QColor("#eceff4")) -nord_palette.setColor(QPalette.Base, QColor("#2e3440")) -nord_palette.setColor(QPalette.AlternateBase, QColor("#434c5e")) -nord_palette.setColor(QPalette.ToolTipBase, QColor("#4c566a")) -nord_palette.setColor(QPalette.ToolTipText, QColor("#eceff4")) -nord_palette.setColor(QPalette.Text, QColor("#eceff4")) -nord_palette.setColor(QPalette.Button, QColor("#2e3440")) -nord_palette.setColor(QPalette.ButtonText, QColor("#eceff4")) -nord_palette.setColor(QPalette.BrightText, QColor("#88c0d0")) -nord_palette.setColor(QPalette.Link, QColor("#88c0d0")) -nord_palette.setColor(QPalette.Highlight, QColor("#88c0d0")) -nord_palette.setColor(QPalette.HighlightedText, QColor("#eceff4")) -nord_palette.setColor(QPalette.Active, QPalette.Button, QColor("#2e3440")) -nord_palette.setColor(QPalette.Disabled, QPalette.ButtonText, QColor("#eceff4")) -nord_palette.setColor(QPalette.Disabled, QPalette.WindowText, QColor("#eceff4")) -nord_palette.setColor(QPalette.Disabled, QPalette.Text, QColor("#eceff4")) -nord_palette.setColor(QPalette.Disabled, QPalette.Light, QColor("#88c0d0")) - - -olivia_palette = QPalette() -olivia_palette.setColor(QPalette.Window, QColor("#181818")) -olivia_palette.setColor(QPalette.WindowText, QColor("#d9d9d9")) -olivia_palette.setColor(QPalette.Base, QColor("#181818")) -olivia_palette.setColor(QPalette.AlternateBase, QColor("#2c2c2c")) -olivia_palette.setColor(QPalette.ToolTipBase, QColor("#363636 ")) -olivia_palette.setColor(QPalette.ToolTipText, QColor("#d9d9d9")) -olivia_palette.setColor(QPalette.Text, QColor("#d9d9d9")) -olivia_palette.setColor(QPalette.Button, QColor("#181818")) -olivia_palette.setColor(QPalette.ButtonText, QColor("#d9d9d9")) -olivia_palette.setColor(QPalette.BrightText, QColor("#fabcad")) -olivia_palette.setColor(QPalette.Link, QColor("#fabcad")) -olivia_palette.setColor(QPalette.Highlight, QColor("#fabcad")) -olivia_palette.setColor(QPalette.HighlightedText, QColor("#2c2c2c")) -olivia_palette.setColor(QPalette.Active, QPalette.Button, QColor("#181818")) -olivia_palette.setColor(QPalette.Disabled, QPalette.ButtonText, QColor("#d9d9d9")) -olivia_palette.setColor(QPalette.Disabled, QPalette.WindowText, QColor("#d9d9d9")) -olivia_palette.setColor(QPalette.Disabled, QPalette.Text, QColor("#d9d9d9")) -olivia_palette.setColor(QPalette.Disabled, QPalette.Light, QColor("#fabcad")) def set_theme(theme): - if theme == "light": - QApplication.setPalette(QApplication.style().standardPalette()) - QApplication.setStyle("Fusion") - elif theme == "dark": - QApplication.setPalette(dark_palette) - QApplication.setStyle("Fusion") - elif theme == "arc": - QApplication.setPalette(arc_palette) - QApplication.setStyle("Fusion") - elif theme == "nord": - QApplication.setPalette(nord_palette) - QApplication.setStyle("Fusion") - elif theme == "olivia": - QApplication.setPalette(olivia_palette) + if theme in palettes: + QApplication.setPalette(palettes[theme]) QApplication.setStyle("Fusion") # For default/system theme, do nothing # User will have to restart the application for it to be applied