Add icon colour settings to themes and enforce them on all GUI icons

This commit is contained in:
Veronica Berglyd Olsen
2025-10-26 14:02:18 +01:00
parent 2c1c46b98d
commit 6db67e909d
25 changed files with 216 additions and 187 deletions
+1 -1
View File
@@ -61,7 +61,7 @@ class NovelModel(QAbstractTableModel):
def __init__(self) -> None:
super().__init__()
self._rows: list[dict[int, T_NodeData]] = []
self._more = SHARED.theme.getIcon("more_arrow")
self._more = SHARED.theme.getIcon("more_arrow", "tool")
self._columns = 3
self._extraKey = ""
self._extraLabel = ""
+11 -9
View File
@@ -71,7 +71,7 @@ class GuiPreferences(NDialog):
)
# Search Box
self.searchAction = QAction(SHARED.theme.getIcon("search"), "")
self.searchAction = QAction(SHARED.theme.getIcon("search", "apply"), "")
self.searchAction.triggered.connect(self._gotoSearch)
self.searchText = QLineEdit(self)
@@ -211,7 +211,7 @@ class GuiPreferences(NDialog):
self.guiFont.setMinimumWidth(162)
self.guiFont.setText(describeFont(self._guiFont))
self.guiFont.setCursorPosition(0)
self.guiFontButton = NIconToolButton(self, iSz, "font")
self.guiFontButton = NIconToolButton(self, iSz, "font", "tool")
self.guiFontButton.clicked.connect(self._selectGuiFont)
self.mainForm.addRow(
self.tr("Application font"), self.guiFont,
@@ -265,7 +265,7 @@ class GuiPreferences(NDialog):
self.textFont.setMinimumWidth(162)
self.textFont.setText(describeFont(CONFIG.textFont))
self.textFont.setCursorPosition(0)
self.textFontButton = NIconToolButton(self, iSz, "font")
self.textFontButton = NIconToolButton(self, iSz, "font", "tool")
self.textFontButton.clicked.connect(self._selectTextFont)
self.mainForm.addRow(
self.tr("Document font"), self.textFont,
@@ -373,7 +373,9 @@ class GuiPreferences(NDialog):
# Backup Path
self.backupPath = CONFIG.backupPath()
self.backupGetPath = QPushButton(SHARED.theme.getIcon("browse"), self.tr("Browse"), self)
self.backupGetPath = QPushButton(
SHARED.theme.getIcon("browse", "systemio"), self.tr("Browse"), self
)
self.backupGetPath.setIconSize(iSz)
self.backupGetPath.clicked.connect(self._backupFolder)
self.mainForm.addRow(
@@ -665,7 +667,7 @@ class GuiPreferences(NDialog):
self.dialogLine.setAlignment(QtAlignCenter)
self.dialogLine.setText(" ".join(CONFIG.dialogLine))
self.dialogLineButton = NIconToolButton(self, iSz, "add", "green")
self.dialogLineButton = NIconToolButton(self, iSz, "add", "add")
self.dialogLineButton.setMenu(self.mnLineSymbols)
self.mainForm.addRow(
@@ -807,7 +809,7 @@ class GuiPreferences(NDialog):
self.fmtSQuoteOpen.setFixedWidth(boxFixed)
self.fmtSQuoteOpen.setAlignment(QtAlignCenter)
self.fmtSQuoteOpen.setText(CONFIG.fmtSQuoteOpen)
self.btnSQuoteOpen = NIconToolButton(self, iSz, "quote")
self.btnSQuoteOpen = NIconToolButton(self, iSz, "quote", "tool")
self.btnSQuoteOpen.clicked.connect(self._changeSingleQuoteOpen)
self.mainForm.addRow(
self.tr("Single quote open style"), self.fmtSQuoteOpen,
@@ -821,7 +823,7 @@ class GuiPreferences(NDialog):
self.fmtSQuoteClose.setFixedWidth(boxFixed)
self.fmtSQuoteClose.setAlignment(QtAlignCenter)
self.fmtSQuoteClose.setText(CONFIG.fmtSQuoteClose)
self.btnSQuoteClose = NIconToolButton(self, iSz, "quote")
self.btnSQuoteClose = NIconToolButton(self, iSz, "quote", "tool")
self.btnSQuoteClose.clicked.connect(self._changeSingleQuoteClose)
self.mainForm.addRow(
self.tr("Single quote close style"), self.fmtSQuoteClose,
@@ -836,7 +838,7 @@ class GuiPreferences(NDialog):
self.fmtDQuoteOpen.setFixedWidth(boxFixed)
self.fmtDQuoteOpen.setAlignment(QtAlignCenter)
self.fmtDQuoteOpen.setText(CONFIG.fmtDQuoteOpen)
self.btnDQuoteOpen = NIconToolButton(self, iSz, "quote")
self.btnDQuoteOpen = NIconToolButton(self, iSz, "quote", "tool")
self.btnDQuoteOpen.clicked.connect(self._changeDoubleQuoteOpen)
self.mainForm.addRow(
self.tr("Double quote open style"), self.fmtDQuoteOpen,
@@ -850,7 +852,7 @@ class GuiPreferences(NDialog):
self.fmtDQuoteClose.setFixedWidth(boxFixed)
self.fmtDQuoteClose.setAlignment(QtAlignCenter)
self.fmtDQuoteClose.setText(CONFIG.fmtDQuoteClose)
self.btnDQuoteClose = NIconToolButton(self, iSz, "quote")
self.btnDQuoteClose = NIconToolButton(self, iSz, "quote", "tool")
self.btnDQuoteClose.clicked.connect(self._changeDoubleQuoteClose)
self.mainForm.addRow(
self.tr("Double quote close style"), self.fmtDQuoteClose,
+8 -8
View File
@@ -356,27 +356,27 @@ class _StatusPage(NFixedPage):
self._addItem(key, StatusEntry.duplicate(entry))
# List Controls
self.addButton = NIconToolButton(self, iSz, "add", "green")
self.addButton = NIconToolButton(self, iSz, "add", "add")
self.addButton.setToolTip(self.tr("Add Label"))
self.addButton.clicked.connect(self._onItemCreate)
self.delButton = NIconToolButton(self, iSz, "remove", "red")
self.delButton = NIconToolButton(self, iSz, "remove", "remove")
self.delButton.setToolTip(self.tr("Delete Label"))
self.delButton.clicked.connect(self._onItemDelete)
self.upButton = NIconToolButton(self, iSz, "chevron_up", "blue")
self.upButton = NIconToolButton(self, iSz, "chevron_up", "action")
self.upButton.setToolTip(self.tr("Move Up"))
self.upButton.clicked.connect(qtLambda(self._moveItem, -1))
self.downButton = NIconToolButton(self, iSz, "chevron_down", "blue")
self.downButton = NIconToolButton(self, iSz, "chevron_down", "action")
self.downButton.setToolTip(self.tr("Move Down"))
self.downButton.clicked.connect(qtLambda(self._moveItem, 1))
self.importButton = NIconToolButton(self, iSz, "import", "green")
self.importButton = NIconToolButton(self, iSz, "import", "apply")
self.importButton.setToolTip(self.tr("Import Labels"))
self.importButton.clicked.connect(self._importLabels)
self.exportButton = NIconToolButton(self, iSz, "export", "blue")
self.exportButton = NIconToolButton(self, iSz, "export", "action")
self.exportButton.setToolTip(self.tr("Export Labels"))
self.exportButton.clicked.connect(self._exportLabels)
@@ -729,10 +729,10 @@ class _ReplacePage(NFixedPage):
self.listBox.setSortingEnabled(True)
# List Controls
self.addButton = NIconToolButton(self, iSz, "add", "green")
self.addButton = NIconToolButton(self, iSz, "add", "add")
self.addButton.clicked.connect(self._onEntryCreated)
self.delButton = NIconToolButton(self, iSz, "remove", "red")
self.delButton = NIconToolButton(self, iSz, "remove", "remove")
self.delButton.clicked.connect(self._onEntryDeleted)
# Edit Form
+4 -4
View File
@@ -75,11 +75,11 @@ class GuiWordList(NDialog):
scale=NColorLabel.HEADER_SCALE
)
self.importButton = NIconToolButton(self, iSz, "import", "green")
self.importButton = NIconToolButton(self, iSz, "import", "apply")
self.importButton.setToolTip(self.tr("Import words from text file"))
self.importButton.clicked.connect(self._importWords)
self.exportButton = NIconToolButton(self, iSz, "export", "blue")
self.exportButton = NIconToolButton(self, iSz, "export", "action")
self.exportButton.setToolTip(self.tr("Export words to text file"))
self.exportButton.clicked.connect(self._exportWords)
@@ -97,11 +97,11 @@ class GuiWordList(NDialog):
# Add/Remove Form
self.newEntry = QLineEdit(self)
self.addButton = NIconToolButton(self, iSz, "add", "green")
self.addButton = NIconToolButton(self, iSz, "add", "add")
self.addButton.setToolTip(self.tr("Add Word"))
self.addButton.clicked.connect(self._doAdd)
self.delButton = NIconToolButton(self, iSz, "remove", "red")
self.delButton = NIconToolButton(self, iSz, "remove", "remove")
self.delButton.setToolTip(self.tr("Remove Word"))
self.delButton.clicked.connect(self._doDelete)
+11 -8
View File
@@ -220,7 +220,7 @@ class NPushButton(QPushButton):
def updateIcon(self) -> None:
"""Update the theme icon."""
if self._icon:
if self._icon and self._color:
self.setIcon(SHARED.theme.getIcon(self._icon, self._color))
@@ -238,10 +238,10 @@ class NIconToolButton(QToolButton):
self.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly)
self.setIconSize(iconSize)
self.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup)
if icon:
if icon and color:
self.setThemeIcon(icon, color)
def setThemeIcon(self, icon: str, color: str | None = None) -> None:
def setThemeIcon(self, icon: str, color: str) -> None:
"""Set an icon from the current theme."""
self.setIcon(SHARED.theme.getIcon(icon, color))
@@ -252,20 +252,23 @@ class NIconToggleButton(QToolButton):
A quicker way to create a toggle button using the app theme.
"""
def __init__(self, parent: QWidget, iconSize: QSize, icon: str | None = None) -> None:
def __init__(
self, parent: QWidget, iconSize: QSize,
icon: str | None = None, color: str | None = None
) -> None:
super().__init__(parent=parent)
self.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly)
self.setIconSize(iconSize)
self.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup)
self.setCheckable(True)
self.setStyleSheet("border: none; background: transparent;")
if icon:
self.setThemeIcon(icon)
if icon and color:
self.setThemeIcon(icon, color)
def setThemeIcon(self, icon: str) -> None:
def setThemeIcon(self, icon: str, color: str) -> None:
"""Set an icon from the current theme."""
size = self.iconSize()
self.setIcon(SHARED.theme.getToggleIcon(icon, (size.width(), size.height())))
self.setIcon(SHARED.theme.getToggleIcon(icon, (size.width(), size.height()), color))
class NClickableLabel(QLabel):
+1 -1
View File
@@ -110,7 +110,7 @@ class NovelSelector(QComboBox):
self._firstHandle = None
self.clear()
icon = SHARED.theme.getIcon(nwLabels.CLASS_ICON[nwItemClass.NOVEL], "blue")
icon = SHARED.theme.getIcon(nwLabels.CLASS_ICON[nwItemClass.NOVEL], "root")
for tHandle, nwItem in SHARED.project.tree.iterRoots(nwItemClass.NOVEL):
if self._listFormat:
name = self._listFormat.format(nwItem.itemName)
+27 -27
View File
@@ -2489,17 +2489,17 @@ class GuiDocToolBar(QWidget):
palette.setColor(QPalette.ColorRole.Text, syntax.text)
self.setPalette(palette)
self.tbBoldMD.setThemeIcon("fmt_bold", "orange")
self.tbItalicMD.setThemeIcon("fmt_italic", "orange")
self.tbStrikeMD.setThemeIcon("fmt_strike", "orange")
self.tbMarkMD.setThemeIcon("fmt_mark", "orange")
self.tbBold.setThemeIcon("fmt_bold")
self.tbItalic.setThemeIcon("fmt_italic")
self.tbStrike.setThemeIcon("fmt_strike")
self.tbUnderline.setThemeIcon("fmt_underline")
self.tbMark.setThemeIcon("fmt_mark")
self.tbSuperscript.setThemeIcon("fmt_superscript")
self.tbSubscript.setThemeIcon("fmt_subscript")
self.tbBoldMD.setThemeIcon("fmt_bold", "mdformat")
self.tbItalicMD.setThemeIcon("fmt_italic", "mdformat")
self.tbStrikeMD.setThemeIcon("fmt_strike", "mdformat")
self.tbMarkMD.setThemeIcon("fmt_mark", "mdformat")
self.tbBold.setThemeIcon("fmt_bold", "scformat")
self.tbItalic.setThemeIcon("fmt_italic", "scformat")
self.tbStrike.setThemeIcon("fmt_strike", "scformat")
self.tbUnderline.setThemeIcon("fmt_underline", "scformat")
self.tbMark.setThemeIcon("fmt_mark", "scformat")
self.tbSuperscript.setThemeIcon("fmt_superscript", "scformat")
self.tbSubscript.setThemeIcon("fmt_subscript", "scformat")
class GuiDocEditSearch(QFrame):
@@ -2727,16 +2727,16 @@ class GuiDocEditSearch(QFrame):
self.replaceBox.setPalette(palette)
# Set icons
self.toggleCase.setIcon(SHARED.theme.getIcon("search_case"))
self.toggleWord.setIcon(SHARED.theme.getIcon("search_word"))
self.toggleRegEx.setIcon(SHARED.theme.getIcon("search_regex"))
self.toggleLoop.setIcon(SHARED.theme.getIcon("search_loop"))
self.toggleProject.setIcon(SHARED.theme.getIcon("search_project"))
self.toggleMatchCap.setIcon(SHARED.theme.getIcon("search_preserve"))
self.cancelSearch.setIcon(SHARED.theme.getIcon("search_cancel"))
self.searchButton.setThemeIcon("search", "green")
self.replaceButton.setThemeIcon("search_replace", "green")
self.showReplace.setThemeIcon("unfold")
self.toggleCase.setIcon(SHARED.theme.getIcon("search_case", "tool"))
self.toggleWord.setIcon(SHARED.theme.getIcon("search_word", "tool"))
self.toggleRegEx.setIcon(SHARED.theme.getIcon("search_regex", "tool"))
self.toggleLoop.setIcon(SHARED.theme.getIcon("search_loop", "tool"))
self.toggleProject.setIcon(SHARED.theme.getIcon("search_project", "tool"))
self.toggleMatchCap.setIcon(SHARED.theme.getIcon("search_preserve", "tool"))
self.cancelSearch.setIcon(SHARED.theme.getIcon("search_cancel", "tool"))
self.searchButton.setThemeIcon("search", "action")
self.replaceButton.setThemeIcon("search_replace", "apply")
self.showReplace.setThemeIcon("unfold", "default")
# Set stylesheets
self.searchOpt.setStyleSheet("QToolBar {padding: 0;}")
@@ -2967,11 +2967,11 @@ class GuiDocEditHeader(QWidget):
"""Update theme elements."""
logger.debug("Theme Update: GuiDocEditHeader")
self.tbButton.setThemeIcon("fmt_toolbar", "blue")
self.outlineButton.setThemeIcon("list", "blue")
self.searchButton.setThemeIcon("search", "blue")
self.minmaxButton.setThemeIcon("maximise", "blue")
self.closeButton.setThemeIcon("close", "red")
self.tbButton.setThemeIcon("fmt_toolbar", "action")
self.outlineButton.setThemeIcon("list", "action")
self.searchButton.setThemeIcon("search", "action")
self.minmaxButton.setThemeIcon("maximise", "action")
self.closeButton.setThemeIcon("close", "reject")
buttonStyle = SHARED.theme.getStyleSheet(STYLES_MIN_TOOLBUTTON)
self.tbButton.setStyleSheet(buttonStyle)
@@ -3037,7 +3037,7 @@ class GuiDocEditHeader(QWidget):
@pyqtSlot(bool)
def _focusModeChanged(self, focusMode: bool) -> None:
"""Update minimise/maximise icon of the Focus Mode button."""
self.minmaxButton.setThemeIcon("minimise" if focusMode else "maximise", "blue")
self.minmaxButton.setThemeIcon("minimise" if focusMode else "maximise", "action")
##
# Events
+8 -8
View File
@@ -727,12 +727,12 @@ class GuiDocViewHeader(QWidget):
"""Update theme elements."""
logger.debug("Theme Update: GuiDocViewHeader")
self.outlineButton.setThemeIcon("list", "blue")
self.backButton.setThemeIcon("chevron_left", "blue")
self.forwardButton.setThemeIcon("chevron_right", "blue")
self.editButton.setThemeIcon("edit", "green")
self.refreshButton.setThemeIcon("refresh", "green")
self.closeButton.setThemeIcon("close", "red")
self.outlineButton.setThemeIcon("list", "action")
self.backButton.setThemeIcon("chevron_left", "action")
self.forwardButton.setThemeIcon("chevron_right", "action")
self.editButton.setThemeIcon("edit", "change")
self.refreshButton.setThemeIcon("refresh", "change")
self.closeButton.setThemeIcon("close", "reject")
buttonStyle = SHARED.theme.getStyleSheet(STYLES_MIN_TOOLBUTTON)
self.outlineButton.setStyleSheet(buttonStyle)
@@ -916,9 +916,9 @@ class GuiDocViewFooter(QWidget):
logger.debug("Theme Update: GuiDocViewFooter")
fPx = int(0.9*SHARED.theme.fontPixelSize)
bulletIcon = SHARED.theme.getToggleIcon("bullet", (fPx, fPx), "blue")
bulletIcon = SHARED.theme.getToggleIcon("bullet", (fPx, fPx), "action")
self.showHide.setThemeIcon("panel")
self.showHide.setThemeIcon("panel", "default")
self.showComments.setIcon(bulletIcon)
self.showSynopsis.setIcon(bulletIcon)
self.showNotes.setIcon(bulletIcon)
+7 -7
View File
@@ -108,7 +108,7 @@ class GuiDocViewerPanel(QWidget):
"""Update theme elements."""
logger.debug("Theme Update: GuiDocViewerPanel")
self.optsButton.setThemeIcon("more_vertical")
self.optsButton.setThemeIcon("more_vertical", "default")
self.optsButton.setStyleSheet(SHARED.theme.getStyleSheet(STYLES_MIN_TOOLBUTTON))
self.mainTabs.setStyleSheet(SHARED.theme.getStyleSheet(STYLES_FLAT_TABS))
if updateTabs:
@@ -263,8 +263,8 @@ class _ViewPanelBackRefs(QTreeWidget):
header.setSectionsMovable(False)
# Cache Icons Locally
self._editIcon = SHARED.theme.getIcon("edit", "green")
self._viewIcon = SHARED.theme.getIcon("view", "blue")
self._editIcon = SHARED.theme.getIcon("edit", "change")
self._viewIcon = SHARED.theme.getIcon("view", "action")
# Signals
self.clicked.connect(self._treeItemClicked)
@@ -274,8 +274,8 @@ class _ViewPanelBackRefs(QTreeWidget):
"""Update theme elements."""
logger.debug("Theme Update: _ViewPanelBackRefs")
self._editIcon = SHARED.theme.getIcon("edit", "green")
self._viewIcon = SHARED.theme.getIcon("view", "blue")
self._editIcon = SHARED.theme.getIcon("edit", "change")
self._viewIcon = SHARED.theme.getIcon("view", "action")
for i in range(self.topLevelItemCount()):
if item := self.topLevelItem(i):
item.setIcon(self.C_EDIT, self._editIcon)
@@ -407,8 +407,8 @@ class _ViewPanelKeyWords(QTreeWidget):
logger.debug("Theme Update: _ViewPanelKeyWords")
self._classIcon = SHARED.theme.getIcon(nwLabels.CLASS_ICON[self._class], "root")
self._editIcon = SHARED.theme.getIcon("edit", "green")
self._viewIcon = SHARED.theme.getIcon("view", "blue")
self._editIcon = SHARED.theme.getIcon("edit", "change")
self._viewIcon = SHARED.theme.getIcon("view", "action")
def countEntries(self) -> int:
"""Return the number of items in the list."""
+3 -3
View File
@@ -247,9 +247,9 @@ class GuiNovelToolBar(QWidget):
"""Update theme elements."""
logger.debug("Theme Update: GuiNovelToolBar")
self.tbNovel.setThemeIcon("cls_novel", "red")
self.tbRefresh.setThemeIcon("refresh", "green")
self.tbMore.setThemeIcon("more_vertical")
self.tbNovel.setThemeIcon("cls_novel", "root")
self.tbRefresh.setThemeIcon("refresh", "change")
self.tbMore.setThemeIcon("more_vertical", "default")
buttonStyle = SHARED.theme.getStyleSheet(STYLES_MIN_TOOLBUTTON)
self.tbNovel.setStyleSheet(buttonStyle)
+3 -3
View File
@@ -264,9 +264,9 @@ class GuiOutlineToolBar(QToolBar):
self.setStyleSheet("QToolBar {border: 0px;}")
self.novelValue.refreshNovelList()
self.aRefresh.setIcon(SHARED.theme.getIcon("refresh", "green"))
self.aExport.setIcon(SHARED.theme.getIcon("export", "blue"))
self.tbColumns.setIcon(SHARED.theme.getIcon("more_vertical"))
self.aRefresh.setIcon(SHARED.theme.getIcon("refresh", "change"))
self.aExport.setIcon(SHARED.theme.getIcon("export", "action"))
self.tbColumns.setIcon(SHARED.theme.getIcon("more_vertical", "default"))
self.tbColumns.setStyleSheet("QToolButton::menu-indicator {image: none;}")
self.novelLabel.setTextColors(color=self.palette().windowText().color())
+7 -7
View File
@@ -356,11 +356,11 @@ class GuiProjectToolBar(QWidget):
self.tbAdd.setStyleSheet(buttonStyle)
self.tbMore.setStyleSheet(buttonStyle)
self.tbQuick.setThemeIcon("bookmarks", "blue")
self.tbMoveU.setThemeIcon("chevron_up", "blue")
self.tbMoveD.setThemeIcon("chevron_down", "blue")
self.tbAdd.setThemeIcon("add", "green")
self.tbMore.setThemeIcon("more_vertical")
self.tbQuick.setThemeIcon("bookmarks", "action")
self.tbMoveU.setThemeIcon("chevron_up", "action")
self.tbMoveD.setThemeIcon("chevron_down", "action")
self.tbAdd.setThemeIcon("add", "add")
self.tbMore.setThemeIcon("more_vertical", "default")
self.aAddScene.setIcon(SHARED.theme.getIcon("prj_scene", "scene"))
self.aAddChap.setIcon(SHARED.theme.getIcon("prj_chapter", "chapter"))
@@ -1183,10 +1183,10 @@ class _TreeContextMenu(QMenu):
if len(self._indices) > 1:
mSub = qtAddMenu(self, self.tr("Set Active to ..."))
aOne = qtAddAction(mSub, self._tree.trActive)
aOne.setIcon(SHARED.theme.getIcon("checked", "green"))
aOne.setIcon(SHARED.theme.getIcon("checked", "accept"))
aOne.triggered.connect(qtLambda(self._iterItemActive, True))
aTwo = qtAddAction(mSub, self._tree.trInactive)
aTwo.setIcon(SHARED.theme.getIcon("unchecked", "red"))
aTwo.setIcon(SHARED.theme.getIcon("unchecked", "reject"))
aTwo.triggered.connect(qtLambda(self._iterItemActive, False))
else:
action = qtAddAction(self, self.tr("Toggle Active"))
+5 -5
View File
@@ -107,7 +107,7 @@ class GuiProjectSearch(QWidget):
# Search Box
self.searchAction = QAction("", self)
self.searchAction.setIcon(SHARED.theme.getIcon("search", "blue"))
self.searchAction.setIcon(SHARED.theme.getIcon("search", "apply"))
self.searchAction.triggered.connect(self._processSearch)
self.searchText = QLineEdit(self)
@@ -170,10 +170,10 @@ class GuiProjectSearch(QWidget):
f"QLineEdit:focus {{border: 1px solid {colFocus};}} "
)
self.searchAction.setIcon(SHARED.theme.getIcon("search", "blue"))
self.toggleCase.setIcon(SHARED.theme.getIcon("search_case"))
self.toggleWord.setIcon(SHARED.theme.getIcon("search_word"))
self.toggleRegEx.setIcon(SHARED.theme.getIcon("search_regex"))
self.searchAction.setIcon(SHARED.theme.getIcon("search", "apply"))
self.toggleCase.setIcon(SHARED.theme.getIcon("search_case", "tool"))
self.toggleWord.setIcon(SHARED.theme.getIcon("search_word", "tool"))
self.toggleRegEx.setIcon(SHARED.theme.getIcon("search_regex", "tool"))
def processReturn(self) -> None:
"""Process a return keypress forwarded from the main GUI."""
+9 -9
View File
@@ -142,14 +142,14 @@ class GuiSideBar(QWidget):
self.tbTheme.setStyleSheet(buttonStyle)
self.tbSettings.setStyleSheet(buttonStyle)
self.tbProject.setThemeIcon("sb_project")
self.tbNovel.setThemeIcon("sb_novel")
self.tbSearch.setThemeIcon("sb_search")
self.tbOutline.setThemeIcon("sb_outline")
self.tbBuild.setThemeIcon("sb_build")
self.tbDetails.setThemeIcon("sb_details")
self.tbStats.setThemeIcon("sb_stats")
self.tbSettings.setThemeIcon("settings")
self.tbProject.setThemeIcon("sb_project", "default")
self.tbNovel.setThemeIcon("sb_novel", "default")
self.tbSearch.setThemeIcon("sb_search", "default")
self.tbOutline.setThemeIcon("sb_outline", "default")
self.tbBuild.setThemeIcon("sb_build", "default")
self.tbDetails.setThemeIcon("sb_details", "default")
self.tbStats.setThemeIcon("sb_stats", "default")
self.tbSettings.setThemeIcon("settings", "default")
self._setThemeModeIcon()
@@ -176,7 +176,7 @@ class GuiSideBar(QWidget):
def _setThemeModeIcon(self) -> None:
"""Set the theme button icon."""
self.tbTheme.setThemeIcon(nwLabels.THEME_MODE_ICON[CONFIG.themeMode])
self.tbTheme.setThemeIcon(nwLabels.THEME_MODE_ICON[CONFIG.themeMode], "default")
self.tbTheme.setToolTip(trConst(nwLabels.THEME_MODE_LABEL[CONFIG.themeMode]))
+42 -20
View File
@@ -57,23 +57,23 @@ STYLES_MIN_TOOLBUTTON = "minimalToolButton"
STYLES_BIG_TOOLBUTTON = "bigToolButton"
STANDARD_BUTTONS = {
nwStandardButton.OK: (QT_TRANSLATE_NOOP("Button", "OK"), "btn_ok", "blue"),
nwStandardButton.CANCEL: (QT_TRANSLATE_NOOP("Button", "Cancel"), "btn_cancel", "red"),
nwStandardButton.YES: (QT_TRANSLATE_NOOP("Button", "&Yes"), "btn_yes", "green"),
nwStandardButton.NO: (QT_TRANSLATE_NOOP("Button", "&No"), "btn_no", "red"),
nwStandardButton.OPEN: (QT_TRANSLATE_NOOP("Button", "Open"), "btn_open", "blue"),
nwStandardButton.CLOSE: (QT_TRANSLATE_NOOP("Button", "Close"), "btn_close", "faded"),
nwStandardButton.SAVE: (QT_TRANSLATE_NOOP("Button", "Save"), "btn_save", "blue"),
nwStandardButton.BROWSE: (QT_TRANSLATE_NOOP("Button", "Browse"), "btn_browse", "yellow"),
nwStandardButton.LIST: (QT_TRANSLATE_NOOP("Button", "List"), "btn_list", "blue"),
nwStandardButton.NEW: (QT_TRANSLATE_NOOP("Button", "New"), "btn_new", "green"),
nwStandardButton.CREATE: (QT_TRANSLATE_NOOP("Button", "Create"), "btn_create", "yellow"),
nwStandardButton.RESET: (QT_TRANSLATE_NOOP("Button", "Reset"), "btn_reset", "green"),
nwStandardButton.INSERT: (QT_TRANSLATE_NOOP("Button", "Insert"), "btn_insert", "blue"),
nwStandardButton.APPLY: (QT_TRANSLATE_NOOP("Button", "Apply"), "btn_apply", "blue"),
nwStandardButton.BUILD: (QT_TRANSLATE_NOOP("Button", "Build"), "btn_build", "blue"),
nwStandardButton.PRINT: (QT_TRANSLATE_NOOP("Button", "Print"), "btn_print", "blue"),
nwStandardButton.PREVIEW: (QT_TRANSLATE_NOOP("Button", "Preview"), "btn_preview", "blue"),
nwStandardButton.OK: (QT_TRANSLATE_NOOP("Button", "OK"), "btn_ok", "action"),
nwStandardButton.CANCEL: (QT_TRANSLATE_NOOP("Button", "Cancel"), "btn_cancel", "reject"),
nwStandardButton.YES: (QT_TRANSLATE_NOOP("Button", "&Yes"), "btn_yes", "accept"),
nwStandardButton.NO: (QT_TRANSLATE_NOOP("Button", "&No"), "btn_no", "reject"),
nwStandardButton.OPEN: (QT_TRANSLATE_NOOP("Button", "Open"), "btn_open", "action"),
nwStandardButton.CLOSE: (QT_TRANSLATE_NOOP("Button", "Close"), "btn_close", "destroy"),
nwStandardButton.SAVE: (QT_TRANSLATE_NOOP("Button", "Save"), "btn_save", "action"),
nwStandardButton.BROWSE: (QT_TRANSLATE_NOOP("Button", "Browse"), "btn_browse", "systemio"),
nwStandardButton.LIST: (QT_TRANSLATE_NOOP("Button", "List"), "btn_list", "action"),
nwStandardButton.NEW: (QT_TRANSLATE_NOOP("Button", "New"), "btn_new", "apply"),
nwStandardButton.CREATE: (QT_TRANSLATE_NOOP("Button", "Create"), "btn_create", "create"),
nwStandardButton.RESET: (QT_TRANSLATE_NOOP("Button", "Reset"), "btn_reset", "reset"),
nwStandardButton.INSERT: (QT_TRANSLATE_NOOP("Button", "Insert"), "btn_insert", "action"),
nwStandardButton.APPLY: (QT_TRANSLATE_NOOP("Button", "Apply"), "btn_apply", "apply"),
nwStandardButton.BUILD: (QT_TRANSLATE_NOOP("Button", "Build"), "btn_build", "action"),
nwStandardButton.PRINT: (QT_TRANSLATE_NOOP("Button", "Print"), "btn_print", "action"),
nwStandardButton.PREVIEW: (QT_TRANSLATE_NOOP("Button", "Preview"), "btn_preview", "action"),
}
@@ -357,6 +357,28 @@ class GuiTheme:
self._setBaseColor("inactive", self._readColor(parser, sec, "inactive"))
self._setBaseColor("disabled", self._readColor(parser, sec, "disabled"))
# Icon
sec = "Icon"
if parser.has_section(sec):
self._setBaseColor("tool", self._readColor(parser, sec, "tool"))
self._setBaseColor("accept", self._readColor(parser, sec, "accept"))
self._setBaseColor("reject", self._readColor(parser, sec, "reject"))
self._setBaseColor("action", self._readColor(parser, sec, "action"))
self._setBaseColor("altaction", self._readColor(parser, sec, "altaction"))
self._setBaseColor("apply", self._readColor(parser, sec, "apply"))
self._setBaseColor("create", self._readColor(parser, sec, "create"))
self._setBaseColor("destroy", self._readColor(parser, sec, "destroy"))
self._setBaseColor("reset", self._readColor(parser, sec, "reset"))
self._setBaseColor("add", self._readColor(parser, sec, "add"))
self._setBaseColor("change", self._readColor(parser, sec, "change"))
self._setBaseColor("remove", self._readColor(parser, sec, "remove"))
self._setBaseColor("scformat", self._readColor(parser, sec, "scformat"))
self._setBaseColor("mdformat", self._readColor(parser, sec, "mdformat"))
self._setBaseColor("systemio", self._readColor(parser, sec, "systemio"))
self._setBaseColor("info", self._readColor(parser, sec, "info"))
self._setBaseColor("warning", self._readColor(parser, sec, "warning"))
self._setBaseColor("error", self._readColor(parser, sec, "error"))
# Palette
sec = "Palette"
if parser.has_section(sec):
@@ -767,7 +789,7 @@ class GuiIcons:
# Access Functions
##
def getIcon(self, name: str, color: str | None = None, w: int = 24, h: int = 24) -> QIcon:
def getIcon(self, name: str, color: str, w: int = 24, h: int = 24) -> QIcon:
"""Return an icon from the icon buffer, or load it."""
variant = f"{name}-{color}" if color else name
if (key := f"{variant}-{w}x{h}") in self._qIcons:
@@ -778,7 +800,7 @@ class GuiIcons:
logger.debug("Icon: %s", key)
return icon
def getToggleIcon(self, name: str, size: tuple[int, int], color: str | None = None) -> QIcon:
def getToggleIcon(self, name: str, size: tuple[int, int], color: str) -> QIcon:
"""Return a toggle icon from the icon buffer, or load it."""
if name in self.TOGGLE_ICON_KEYS:
pOne = self.getPixmap(self.TOGGLE_ICON_KEYS[name][0], size, color)
@@ -830,7 +852,7 @@ class GuiIcons:
doesn't exist, return an empty QPixmap.
"""
w, h = size
return self.getIcon(name, color, w, h).pixmap(w, h, QIcon.Mode.Normal)
return self.getIcon(name, color or "default", w, h).pixmap(w, h, QIcon.Mode.Normal)
def getStandardButton(self, button: nwStandardButton, parent: QWidget) -> NPushButton:
"""Return a standard button with icon and text."""
+4 -4
View File
@@ -514,16 +514,16 @@ class _GuiAlert(QMessageBox):
pSz = 2*self._theme.baseIconHeight
if level == self.INFO:
self.setIconPixmap(self._theme.getPixmap("alert_info", (pSz, pSz), "blue"))
self.setIconPixmap(self._theme.getPixmap("alert_info", (pSz, pSz), "info"))
self.setWindowTitle(self.tr("Information"))
elif level == self.WARN:
self.setIconPixmap(self._theme.getPixmap("alert_warn", (pSz, pSz), "orange"))
self.setIconPixmap(self._theme.getPixmap("alert_warn", (pSz, pSz), "warning"))
self.setWindowTitle(self.tr("Warning"))
elif level == self.ERROR:
self.setIconPixmap(self._theme.getPixmap("alert_error", (pSz, pSz), "red"))
self.setIconPixmap(self._theme.getPixmap("alert_error", (pSz, pSz), "error"))
self.setWindowTitle(self.tr("Error"))
elif level == self.ASK:
self.setIconPixmap(self._theme.getPixmap("alert_question", (pSz, pSz), "blue"))
self.setIconPixmap(self._theme.getPixmap("alert_question", (pSz, pSz), "info"))
self.setWindowTitle(self.tr("Question"))
@pyqtSlot()
+3 -3
View File
@@ -79,10 +79,10 @@ class GuiDictionaries(NNonBlockingDialog):
self.huInfo.setOpenExternalLinks(True)
self.huInfo.setWordWrap(True)
self.huInput = QLineEdit(self)
self.huBrowse = NIconToolButton(self, iSz, "browse")
self.huBrowse = NIconToolButton(self, iSz, "browse", "systemio")
self.huBrowse.clicked.connect(self._doBrowseHunspell)
self.huImport = QPushButton(self.tr("Add Dictionary"), self)
self.huImport.setIcon(SHARED.theme.getIcon("add", "green"))
self.huImport.setIcon(SHARED.theme.getIcon("add", "add"))
self.huImport.clicked.connect(self._doImportHunspell)
self.huPathBox = QHBoxLayout()
@@ -97,7 +97,7 @@ class GuiDictionaries(NNonBlockingDialog):
self.inInfo = QLabel(self.tr("Dictionary install location"), self)
self.inPath = QLineEdit(self)
self.inPath.setReadOnly(True)
self.inBrowse = NIconToolButton(self, iSz, "browse")
self.inBrowse = NIconToolButton(self, iSz, "browse", "systemio")
self.inBrowse.clicked.connect(self._doOpenInstallLocation)
self.inBox = QHBoxLayout()
+1 -1
View File
@@ -59,7 +59,7 @@ class GuiLipsum(NDialog):
# Icon
self.docIcon = QLabel(self)
self.docIcon.setPixmap(SHARED.theme.getPixmap("text", (64, 64), "blue"))
self.docIcon.setPixmap(SHARED.theme.getPixmap("text", (64, 64), "info"))
self.leftBox = QVBoxLayout()
self.leftBox.setSpacing(4)
+9 -11
View File
@@ -43,7 +43,7 @@ from novelwriter.core.item import NWItem
from novelwriter.enum import nwBuildFmt, nwStandardButton
from novelwriter.extensions.modified import NDialog, NIconToolButton, NPushButton
from novelwriter.extensions.progressbars import NProgressSimple
from novelwriter.types import QtAlignCenter, QtRoleAction, QtRoleDestruct, QtRoleReject, QtUserRole
from novelwriter.types import QtAlignCenter, QtRoleAction, QtRoleDestruct, QtUserRole
if TYPE_CHECKING:
from PyQt6.QtGui import QCloseEvent
@@ -143,7 +143,7 @@ class GuiManuscriptBuild(NDialog):
# Build Path
self.lblPath = QLabel(self.tr("Path"), self)
self.buildPath = QLineEdit(self)
self.btnBrowse = NIconToolButton(self, iSz, "browse")
self.btnBrowse = NIconToolButton(self, iSz, "browse", "systemio")
self.pathBox = QHBoxLayout()
self.pathBox.addWidget(self.buildPath)
@@ -153,7 +153,7 @@ class GuiManuscriptBuild(NDialog):
# Build Name
self.lblName = QLabel(self.tr("File Name"), self)
self.buildName = QLineEdit(self)
self.btnReset = NIconToolButton(self, iSz, "revert", "green")
self.btnReset = NIconToolButton(self, iSz, "revert", "reset")
self.btnReset.setToolTip(self.tr("Reset file name to default"))
self.nameBox = QHBoxLayout()
@@ -178,7 +178,7 @@ class GuiManuscriptBuild(NDialog):
self.buildBox.setVerticalSpacing(4)
# Dialog Buttons
self.btnOpen = NPushButton(self, self.tr("Open Folder"), bSz, "browse", "yellow")
self.btnOpen = NPushButton(self, self.tr("Open Folder"), bSz, "browse", "systemio")
self.btnOpen.setAutoDefault(False)
self.btnBuild = SHARED.theme.getStandardButton(nwStandardButton.BUILD, self)
@@ -260,13 +260,11 @@ class GuiManuscriptBuild(NDialog):
@pyqtSlot("QAbstractButton*")
def _dialogButtonClicked(self, button: QAbstractButton) -> None:
"""Handle button clicks from the dialog button box."""
role = self.btnBox.buttonRole(button)
if role == QtRoleAction:
if button == self.btnBuild:
self._runBuild()
elif button == self.btnOpen:
self._openOutputFolder()
elif role == QtRoleReject:
if button == self.btnBuild:
self._runBuild()
elif button == self.btnOpen:
self._openOutputFolder()
elif button == self.btnClose:
self.close()
@pyqtSlot()
+8 -8
View File
@@ -271,10 +271,10 @@ class GuiManuscript(NToolDialog):
self.btnBuild.updateIcon()
self.btnClose.updateIcon()
self.tbAdd.setThemeIcon("add", "green")
self.tbDel.setThemeIcon("remove", "red")
self.tbCopy.setThemeIcon("copy", "blue")
self.tbEdit.setThemeIcon("edit", "green")
self.tbAdd.setThemeIcon("add", "add")
self.tbDel.setThemeIcon("remove", "remove")
self.tbCopy.setThemeIcon("copy", "accept")
self.tbEdit.setThemeIcon("edit", "change")
buttonStyle = SHARED.theme.getStyleSheet(STYLES_MIN_TOOLBUTTON)
self.tbAdd.setStyleSheet(buttonStyle)
@@ -484,7 +484,7 @@ class GuiManuscript(NToolDialog):
for key, name in self._builds.builds():
bItem = QListWidgetItem()
bItem.setText(name)
bItem.setIcon(SHARED.theme.getIcon("build_settings", "blue"))
bItem.setIcon(SHARED.theme.getIcon("build_settings", "action"))
bItem.setData(self.D_KEY, key)
self.buildList.addItem(bItem)
self._buildMap[key] = bItem
@@ -574,8 +574,8 @@ class _DetailsWidget(QWidget):
self.listView.clear()
on = SHARED.theme.getIcon("bullet-on", "blue")
off = SHARED.theme.getIcon("bullet-off", "blue")
on = SHARED.theme.getIcon("bullet-on", "action")
off = SHARED.theme.getIcon("bullet-off", "action")
# Name
item = QTreeWidgetItem()
@@ -991,7 +991,7 @@ class _StatsWidget(QWidget):
def updateTheme(self) -> None:
"""Update theme elements."""
logger.debug("Theme Update: _StatsWidget")
self.toggleButton.setThemeIcon("unfold")
self.toggleButton.setThemeIcon("unfold", "default")
##
# Private Slots
+21 -22
View File
@@ -52,7 +52,7 @@ from novelwriter.extensions.switch import NSwitch
from novelwriter.extensions.switchbox import NSwitchBox
from novelwriter.types import (
QtAlignCenter, QtAlignLeft, QtHeaderFixed, QtHeaderStretch, QtRoleAccept,
QtRoleApply, QtRoleDestruct, QtRoleReject, QtUserRole
QtRoleApply, QtRoleDestruct, QtUserRole
)
if TYPE_CHECKING:
@@ -229,15 +229,14 @@ class GuiBuildSettings(NToolDialog):
@pyqtSlot("QAbstractButton*")
def _dialogButtonClicked(self, button: QAbstractButton) -> None:
"""Handle button clicks from the dialog button box."""
role = self.btnBox.buttonRole(button)
if role == QtRoleApply:
if button == self.btnApply:
self._applyChanges()
self._emitBuildData()
elif role == QtRoleAccept:
elif button == self.btnSave:
self._applyChanges()
self._emitBuildData()
self.close()
elif role == QtRoleReject:
elif button == self.btnClose:
self._build.resetChangedState()
self.close()
@@ -302,9 +301,9 @@ class _FilterTab(NFixedPage):
self._statusFlags: dict[int, QIcon] = {
self.F_NONE: QIcon(),
self.F_FILTERED: SHARED.theme.getIcon("filter", "orange"),
self.F_INCLUDED: SHARED.theme.getIcon("pin", "blue"),
self.F_EXCLUDED: SHARED.theme.getIcon("exclude", "red"),
self.F_FILTERED: SHARED.theme.getIcon("filter", "altaction"),
self.F_INCLUDED: SHARED.theme.getIcon("pin", "action"),
self.F_EXCLUDED: SHARED.theme.getIcon("exclude", "reject"),
}
self._trIncluded = self.tr("Included in manuscript")
@@ -410,14 +409,14 @@ class _FilterTab(NFixedPage):
logger.debug("Theme Update: _FilterTab, init=%s", init)
if not init:
self._statusFlags[self.F_FILTERED] = SHARED.theme.getIcon("filter", "orange")
self._statusFlags[self.F_INCLUDED] = SHARED.theme.getIcon("pin", "blue")
self._statusFlags[self.F_EXCLUDED] = SHARED.theme.getIcon("exclude", "red")
self._statusFlags[self.F_FILTERED] = SHARED.theme.getIcon("filter", "altaction")
self._statusFlags[self.F_INCLUDED] = SHARED.theme.getIcon("pin", "action")
self._statusFlags[self.F_EXCLUDED] = SHARED.theme.getIcon("exclude", "reject")
self.loadContent()
self.includedButton.setIcon(self._statusFlags[self.F_INCLUDED])
self.excludedButton.setIcon(self._statusFlags[self.F_EXCLUDED])
self.resetButton.setThemeIcon("revert", "green")
self.resetButton.setThemeIcon("revert", "reset")
##
# Slots
@@ -492,7 +491,7 @@ class _FilterTab(NFixedPage):
default=self._build.getBool("filter.includeNotes")
)
self.filterOpt.addItem(
SHARED.theme.getIcon("unchecked", "red"),
SHARED.theme.getIcon("unchecked", "reject"),
self._build.getLabel("filter.includeInactive"),
"doc:filter.includeInactive",
default=self._build.getBool("filter.includeInactive")
@@ -811,12 +810,12 @@ class _HeadingsTab(NScrollablePage):
"""Update theme elements."""
logger.debug("Theme Update: _HeadingsTab")
self.btnPart.setThemeIcon("edit", "green")
self.btnChapter.setThemeIcon("edit", "green")
self.btnUnnumbered.setThemeIcon("edit", "green")
self.btnScene.setThemeIcon("edit", "green")
self.btnAScene.setThemeIcon("edit", "green")
self.btnSection.setThemeIcon("edit", "green")
self.btnPart.setThemeIcon("edit", "change")
self.btnChapter.setThemeIcon("edit", "change")
self.btnUnnumbered.setThemeIcon("edit", "change")
self.btnScene.setThemeIcon("edit", "change")
self.btnAScene.setThemeIcon("edit", "change")
self.btnSection.setThemeIcon("edit", "change")
self.formSyntax.initHighlighter()
self.formSyntax.rehighlight()
@@ -1318,9 +1317,9 @@ class _FormattingTab(NScrollableForm):
"""Update theme elements."""
logger.debug("Theme Update: _FormattingTab")
self.ignoredKeywordsButton.setThemeIcon("add", "green")
self.btnTextFont.setThemeIcon("font")
self.btnPageHeader.setThemeIcon("revert", "green")
self.ignoredKeywordsButton.setThemeIcon("add", "add")
self.btnTextFont.setThemeIcon("font", "tool")
self.btnPageHeader.setThemeIcon("revert", "reset")
iPx = SHARED.theme.baseIconHeight
self.pixT.setPixmap(SHARED.theme.getPixmap("margin_top", (iPx, iPx)))
+6 -6
View File
@@ -258,7 +258,7 @@ class _OpenProjectPage(QWidget):
# Info / Tool
self.aMissing = QAction(self)
self.aMissing.setIcon(SHARED.theme.getIcon("alert_warn", "orange"))
self.aMissing.setIcon(SHARED.theme.getIcon("alert_warn", "warning"))
self.aMissing.setToolTip(self.tr("The project path is not reachable."))
self.selectedPath = QLineEdit(self)
@@ -534,7 +534,7 @@ class _NewProjectForm(QWidget):
self.projPath = QLineEdit(self)
self.projPath.setReadOnly(True)
self.browsePath = NIconToolButton(self, iSz, "browse")
self.browsePath = NIconToolButton(self, iSz, "browse", "systemio")
self.browsePath.clicked.connect(self._doBrowse)
self.pathBox = QHBoxLayout()
@@ -545,20 +545,20 @@ class _NewProjectForm(QWidget):
self.projFill = QLineEdit(self)
self.projFill.setReadOnly(True)
self.browseFill = NIconToolButton(self, iSz, "document_add", "blue")
self.browseFill = NIconToolButton(self, iSz, "document_add", "add")
self.fillMenu = QMenu(self.browseFill)
self.fillBlank = qtAddAction(self.fillMenu, self.tr("Create a fresh project"))
self.fillBlank.setIcon(SHARED.theme.getIcon("document"))
self.fillBlank.setIcon(SHARED.theme.getIcon("document", "file"))
self.fillBlank.triggered.connect(self._setFillBlank)
self.fillSample = qtAddAction(self.fillMenu, self.tr("Create an example project"))
self.fillSample.setIcon(SHARED.theme.getIcon("document_add", "blue"))
self.fillSample.setIcon(SHARED.theme.getIcon("document_add", "add"))
self.fillSample.triggered.connect(self._setFillSample)
self.fillCopy = qtAddAction(self.fillMenu, self.tr("Copy an existing project"))
self.fillCopy.setIcon(SHARED.theme.getIcon("project_copy", "green"))
self.fillCopy.setIcon(SHARED.theme.getIcon("project_copy", "action"))
self.fillCopy.triggered.connect(self._setFillCopy)
self.browseFill.setMenu(self.fillMenu)
+1 -1
View File
@@ -292,7 +292,7 @@ class GuiWritingStats(NToolDialog):
self.saveMenu.addAction(self.saveJSON)
self.saveMenu.addAction(self.saveCSV)
self.btnSave = NPushButton(self, self.tr("Save As"), bSz, "btn_save", "blue")
self.btnSave = NPushButton(self, self.tr("Save As"), bSz, "btn_save", "action")
self.btnSave.setAutoDefault(False)
self.btnSave.setMenu(self.saveMenu)