From 1f9b6d7624ea406daf9386d01e24b33fe08c3a8f Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 27 Nov 2023 16:08:34 +0100 Subject: [PATCH] Fix icons not updating on theme switch in viewer panel --- novelwriter/gui/docviewerpanel.py | 35 ++++++++++++++++++++--- tests/test_gui/test_gui_docviewerpanel.py | 18 ++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/novelwriter/gui/docviewerpanel.py b/novelwriter/gui/docviewerpanel.py index 779cf894..5444bad3 100644 --- a/novelwriter/gui/docviewerpanel.py +++ b/novelwriter/gui/docviewerpanel.py @@ -73,7 +73,7 @@ class GuiDocViewerPanel(QWidget): self.outerBox.setContentsMargins(0, 0, 0, 0) self.setLayout(self.outerBox) - self.updateTheme() + self.updateTheme(updateTabs=False) logger.debug("Ready: GuiDocViewerPanel") @@ -83,7 +83,7 @@ class GuiDocViewerPanel(QWidget): # Methods ## - def updateTheme(self) -> None: + def updateTheme(self, updateTabs: bool = True) -> None: """Update theme elements.""" vPx = CONFIG.pxInt(4) lPx = CONFIG.pxInt(2) @@ -102,6 +102,11 @@ class GuiDocViewerPanel(QWidget): self.mainTabs.setStyleSheet(styleSheet) self.updateHandle(self._lastHandle) + if updateTabs: + self.tabBackRefs.updateTheme() + for tab in self.kwTabs.values(): + tab.updateTheme() + return def openProjectTasks(self) -> None: @@ -237,6 +242,16 @@ class _ViewPanelBackRefs(QTreeWidget): return + def updateTheme(self) -> None: + """Update theme elements.""" + self._editIcon = SHARED.theme.getIcon("edit") + self._viewIcon = SHARED.theme.getIcon("view") + for i in range(self.topLevelItemCount()): + if item := self.topLevelItem(i): + item.setIcon(self.C_EDIT, self._editIcon) + item.setIcon(self.C_VIEW, self._viewIcon) + return + def clearContent(self) -> None: """Clear the widget.""" self.clear() @@ -332,6 +347,7 @@ class _ViewPanelKeyWords(QTreeWidget): super().__init__(parent=parent) self._parent = parent + self._class = itemClass self._treeMap: dict[str, QTreeWidgetItem] = {} iPx = SHARED.theme.baseIconSize @@ -372,6 +388,17 @@ class _ViewPanelKeyWords(QTreeWidget): return + def updateTheme(self) -> None: + """Update theme elements.""" + self._classIcon = SHARED.theme.getIcon(nwLabels.CLASS_ICON[self._class]) + self._editIcon = SHARED.theme.getIcon("edit") + self._viewIcon = SHARED.theme.getIcon("view") + for i in range(self.topLevelItemCount()): + if item := self.topLevelItem(i): + item.setIcon(self.C_EDIT, self._editIcon) + item.setIcon(self.C_VIEW, self._viewIcon) + return + def countEntries(self) -> int: """Return the number of items in the list.""" return self.topLevelItemCount() @@ -392,8 +419,8 @@ class _ViewPanelKeyWords(QTreeWidget): iLevel = nwHeaders.H_LEVEL.get(hItem.level, 0) if nwItem.isDocumentLayout() else 5 hDec = SHARED.theme.getHeaderDecorationNarrow(iLevel) - # This can not use a get call to the dictionary as that creates - # some weird issue with Qt, so we need to do this with an if + # This can not use a get call to the dictionary as that would create an + # instance of the QTreeWidgetItem, which has some weird side effects trItem = self._treeMap[tag] if tag in self._treeMap else QTreeWidgetItem() trItem.setText(self.C_NAME, name) diff --git a/tests/test_gui/test_gui_docviewerpanel.py b/tests/test_gui/test_gui_docviewerpanel.py index da43c4f3..5c3370de 100644 --- a/tests/test_gui/test_gui_docviewerpanel.py +++ b/tests/test_gui/test_gui_docviewerpanel.py @@ -24,6 +24,8 @@ import pytest from tools import C, buildTestProject +from PyQt5.QtGui import QIcon + from novelwriter import CONFIG, SHARED from novelwriter.constants import nwLists from novelwriter.dialogs.editlabel import GuiEditLabel @@ -91,6 +93,13 @@ def testGuiViewerPanel_BackRefs(qtbot, monkeypatch, nwGUI, projPath, mockRnd): SHARED.project.index.rebuildIndex() assert tabBackRefs.topLevelItemCount() == 1 + # Test Update Theme + tabBackRefs._editIcon = None + tabBackRefs._viewIcon = None + tabBackRefs.updateTheme() + assert isinstance(tabBackRefs._editIcon, QIcon) + assert isinstance(tabBackRefs._viewIcon, QIcon) + # Click the Edit Button nwGUI.openDocument(C.hChapterDoc) assert nwGUI.docEditor.docHandle == C.hChapterDoc @@ -182,6 +191,15 @@ def testGuiViewerPanel_Tags(qtbot, monkeypatch, caplog, nwGUI, projPath, mockRnd SHARED.project.index.rebuildIndex() assert charTab.topLevelItemCount() == 2 + # Test Update Theme + charTab._classIcon = None + charTab._editIcon = None + charTab._viewIcon = None + charTab.updateTheme() + assert isinstance(charTab._classIcon, QIcon) + assert isinstance(charTab._editIcon, QIcon) + assert isinstance(charTab._viewIcon, QIcon) + # Remove Non-Existing Tag caplog.clear() viewPanel.updateChangedTags(["foo"], ["bar"])