From a6fde426a7e36cd4f8143e810672d521337491e5 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 8 Jan 2025 22:22:53 +0100 Subject: [PATCH] Add override settings for project tree icon colours --- novelwriter/assets/themes/dracula.conf | 2 +- novelwriter/config.py | 11 +++++--- novelwriter/constants.py | 11 ++++++++ novelwriter/dialogs/preferences.py | 37 ++++++++++++++++++-------- novelwriter/gui/theme.py | 34 +++++++++++++++++++++-- 5 files changed, 78 insertions(+), 17 deletions(-) diff --git a/novelwriter/assets/themes/dracula.conf b/novelwriter/assets/themes/dracula.conf index 5bcd14f3..d874e832 100644 --- a/novelwriter/assets/themes/dracula.conf +++ b/novelwriter/assets/themes/dracula.conf @@ -29,7 +29,7 @@ orange = 255, 184, 108 yellow = 241, 250, 140 green = 80, 250, 123 aqua = 139, 233, 253 -blue = 139, 233, 253 +blue = 147, 207, 249 purple = 189, 147, 249 [Project] diff --git a/novelwriter/config.py b/novelwriter/config.py index 697dd711..1e173da3 100644 --- a/novelwriter/config.py +++ b/novelwriter/config.py @@ -114,7 +114,6 @@ class Config: self.guiLocale = self._qLocale.name() self.guiTheme = "default" # GUI theme self.guiSyntax = "default_light" # Syntax theme - self.guiIcons = "material_rounded_normal" # Icons theme self.guiFont = QFont() # Main GUI font self.guiScale = 1.0 # Set automatically by Theme class self.hideVScroll = False # Hide vertical scroll bars on main widgets @@ -122,6 +121,10 @@ class Config: self.lastNotes = "0x0" # The latest release notes that have been shown self.nativeFont = True # Use native font dialog + # Icons + self.iconTheme = "material_rounded_normal" # Icons theme + self.iconColTree = "theme" # Project tree icon colours + # Size Settings self._mainWinSize = [1200, 650] # Last size of the main GUI window self._welcomeSize = [800, 550] # Last size of the welcome window @@ -606,7 +609,8 @@ class Config: self.setGuiFont(conf.rdStr(sec, "font", "")) self.guiTheme = conf.rdStr(sec, "theme", self.guiTheme) self.guiSyntax = conf.rdStr(sec, "syntax", self.guiSyntax) - self.guiIcons = conf.rdStr(sec, "icons", self.guiIcons) + self.iconTheme = conf.rdStr(sec, "icons", self.iconTheme) + self.iconColTree = conf.rdStr(sec, "iconcoltree", self.iconColTree) self.guiLocale = conf.rdStr(sec, "localisation", self.guiLocale) self.hideVScroll = conf.rdBool(sec, "hidevscroll", self.hideVScroll) self.hideHScroll = conf.rdBool(sec, "hidehscroll", self.hideHScroll) @@ -718,7 +722,8 @@ class Config: "font": self.guiFont.toString(), "theme": str(self.guiTheme), "syntax": str(self.guiSyntax), - "icons": str(self.guiIcons), + "icons": str(self.iconTheme), + "iconcoltree": str(self.iconColTree), "localisation": str(self.guiLocale), "hidevscroll": str(self.hideVScroll), "hidehscroll": str(self.hideHScroll), diff --git a/novelwriter/constants.py b/novelwriter/constants.py index bdedab10..e908cb20 100644 --- a/novelwriter/constants.py +++ b/novelwriter/constants.py @@ -426,6 +426,17 @@ class nwLabels: "Letter": (215.9, 279.4), "Custom": (-1.0, -1.0), } + THEME_COLORS = { + "theme": QT_TRANSLATE_NOOP("Constant", "Theme Colours"), + "default": QT_TRANSLATE_NOOP("Constant", "No Colours"), + "red": QT_TRANSLATE_NOOP("Constant", "Red"), + "orange": QT_TRANSLATE_NOOP("Constant", "Orange"), + "yellow": QT_TRANSLATE_NOOP("Constant", "Yellow"), + "green": QT_TRANSLATE_NOOP("Constant", "Green"), + "aqua": QT_TRANSLATE_NOOP("Constant", "Aqua"), + "blue": QT_TRANSLATE_NOOP("Constant", "Blue"), + "purple": QT_TRANSLATE_NOOP("Constant", "Purple"), + } class nwHeadFmt: diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index 8421acf5..9f6de15a 100644 --- a/novelwriter/dialogs/preferences.py +++ b/novelwriter/dialogs/preferences.py @@ -35,7 +35,7 @@ from PyQt5.QtWidgets import ( from novelwriter import CONFIG, SHARED from novelwriter.common import compact, describeFont, uniqueCompact -from novelwriter.constants import nwUnicode +from novelwriter.constants import nwLabels, nwUnicode, trConst from novelwriter.dialogs.quotes import GuiQuoteSelect from novelwriter.extensions.configlayout import NColourLabel, NScrollableForm from novelwriter.extensions.modified import ( @@ -177,17 +177,29 @@ class GuiPreferences(NDialog): ) # Icon Theme - self.guiIcons = NComboBox(self) - self.guiIcons.setMinimumWidth(minWidth) + self.iconTheme = NComboBox(self) + self.iconTheme.setMinimumWidth(minWidth) for theme, name in SHARED.theme.iconCache.listThemes(): - self.guiIcons.addItem(name, theme) - self.guiIcons.setCurrentData(CONFIG.guiIcons, "material_rounded_bold") + self.iconTheme.addItem(name, theme) + self.iconTheme.setCurrentData(CONFIG.iconTheme, "material_rounded_bold") self.mainForm.addRow( - self.tr("Icon theme"), self.guiIcons, + self.tr("Icon theme"), self.iconTheme, self.tr("User interface icon theme."), stretch=(3, 2) ) + # Tree Icon Colours + self.iconColTree = NComboBox(self) + self.iconColTree.setMinimumWidth(minWidth) + for key, label in nwLabels.THEME_COLORS.items(): + self.iconColTree.addItem(trConst(label), key) + self.iconColTree.setCurrentData(CONFIG.iconColTree, "theme") + + self.mainForm.addRow( + self.tr("Project tree icon colours"), self.iconColTree, + self.tr("Override colours for project icons."), stretch=(3, 2) + ) + # Application Font Family self.guiFont = QLineEdit(self) self.guiFont.setReadOnly(True) @@ -912,18 +924,21 @@ class GuiPreferences(NDialog): refreshTree = False # Appearance - guiLocale = self.guiLocale.currentData() - guiTheme = self.guiTheme.currentData() - guiIcons = self.guiIcons.currentData() + guiLocale = self.guiLocale.currentData() + guiTheme = self.guiTheme.currentData() + iconTheme = self.iconTheme.currentData() + iconColTree = self.iconColTree.currentData() updateTheme |= CONFIG.guiTheme != guiTheme - updateTheme |= CONFIG.guiIcons != guiIcons + updateTheme |= CONFIG.iconTheme != iconTheme + updateTheme |= CONFIG.iconColTree != iconColTree needsRestart |= CONFIG.guiLocale != guiLocale needsRestart |= CONFIG.guiFont != self._guiFont CONFIG.guiLocale = guiLocale CONFIG.guiTheme = guiTheme - CONFIG.guiIcons = guiIcons + CONFIG.iconTheme = iconTheme + CONFIG.iconColTree = iconColTree CONFIG.hideVScroll = self.hideVScroll.isChecked() CONFIG.hideHScroll = self.hideHScroll.isChecked() CONFIG.nativeFont = self.nativeFont.isChecked() diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index 924ec88c..4eef28e8 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -318,7 +318,7 @@ class GuiTheme: ) # Load icons after theme is parsed - self.iconCache.loadTheme(CONFIG.guiIcons) + self.iconCache.loadTheme(CONFIG.iconTheme) # Apply styles QApplication.setPalette(self._guiPalette) @@ -542,8 +542,27 @@ class GuiIcons: def clear(self) -> None: """Clear the icon cache.""" + text = QApplication.palette().windowText().color() + default = text.name(QColor.NameFormat.HexRgb).encode("utf-8") + self._svgData = {} - self._svgColours = {} + self._svgColours = { + "default": default, + "red": b"#ff0000", + "orange": b"#ff7f00", + "yellow": b"#ffff00", + "green": b"#00ff00", + "aqua": b"#00ffff", + "blue": b"#0000ff", + "purple": b"#ff00ff", + "root": b"#0000ff", + "folder": b"#ffff00", + "file": default, + "title": b"#00ff00", + "chapter": b"#ff0000", + "scene": b"#0000ff", + "note": b"#ffff00", + } self._qIcons = {} self._headerDec = [] self._headerDecNarrow = [] @@ -583,6 +602,17 @@ class GuiIcons: logException() return False + # Set colour overrides for project item icons + if (override := CONFIG.iconColTree) != "theme": + color = self._svgColours.get(override, b"#000000") + self._svgColours["root"] = color + self._svgColours["folder"] = color + self._svgColours["file"] = color + self._svgColours["title"] = color + self._svgColours["chapter"] = color + self._svgColours["scene"] = color + self._svgColours["note"] = color + return True def setIconColor(self, key: str, color: QColor) -> None: