Fix minor GUI issues (#1253)

This commit is contained in:
Veronica Berglyd Olsen
2022-11-22 13:19:12 +01:00
committed by GitHub
6 changed files with 143 additions and 121 deletions
+74 -71
View File
@@ -2063,38 +2063,38 @@
<context> <context>
<name>GuiMainStatus</name> <name>GuiMainStatus</name>
<message> <message>
<location filename="../novelwriter/gui/statusbar.py" line="221" /> <location filename="../novelwriter/gui/statusbar.py" line="222" />
<location filename="../novelwriter/gui/statusbar.py" line="67" /> <location filename="../novelwriter/gui/statusbar.py" line="68" />
<source>None</source> <source>None</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/statusbar.py" line="75" /> <location filename="../novelwriter/gui/statusbar.py" line="76" />
<source>Editor</source> <source>Editor</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/statusbar.py" line="83" /> <location filename="../novelwriter/gui/statusbar.py" line="84" />
<source>Project</source> <source>Project</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/statusbar.py" line="101" /> <location filename="../novelwriter/gui/statusbar.py" line="102" />
<source>Session Time</source> <source>Session Time</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/statusbar.py" line="192" /> <location filename="../novelwriter/gui/statusbar.py" line="193" />
<source>Words: {0} ({1})</source> <source>Words: {0} ({1})</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/statusbar.py" line="194" /> <location filename="../novelwriter/gui/statusbar.py" line="195" />
<source>Project word count (session change)</source> <source>Project word count (session change)</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/statusbar.py" line="196" /> <location filename="../novelwriter/gui/statusbar.py" line="197" />
<source>Novel word count (session change)</source> <source>Novel word count (session change)</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
@@ -2102,47 +2102,47 @@
<context> <context>
<name>GuiNovelToolBar</name> <name>GuiNovelToolBar</name>
<message> <message>
<location filename="../novelwriter/gui/noveltree.py" line="203" /> <location filename="../novelwriter/gui/noveltree.py" line="207" />
<source>Novel Outline</source> <source>Outline of {0}</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/noveltree.py" line="209" /> <location filename="../novelwriter/gui/noveltree.py" line="215" />
<source>Refresh</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/noveltree.py" line="219" />
<source>Novel Root</source> <source>Novel Root</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/noveltree.py" line="227" /> <location filename="../novelwriter/gui/noveltree.py" line="221" />
<source>Refresh</source>
<translation type="unfinished" />
</message>
<message>
<location filename="../novelwriter/gui/noveltree.py" line="228" />
<source>Last Column</source> <source>Last Column</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/noveltree.py" line="230" /> <location filename="../novelwriter/gui/noveltree.py" line="231" />
<source>Hidden</source> <source>Hidden</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/noveltree.py" line="231" /> <location filename="../novelwriter/gui/noveltree.py" line="232" />
<source>Point of View Character</source> <source>Point of View Character</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/noveltree.py" line="232" /> <location filename="../novelwriter/gui/noveltree.py" line="233" />
<source>Focus Character</source> <source>Focus Character</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/noveltree.py" line="233" /> <location filename="../novelwriter/gui/noveltree.py" line="234" />
<source>Novel Plot</source> <source>Novel Plot</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/noveltree.py" line="236" /> <location filename="../novelwriter/gui/noveltree.py" line="237" />
<source>More Options</source> <source>More Options</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
@@ -2150,7 +2150,7 @@
<context> <context>
<name>GuiNovelTree</name> <name>GuiNovelTree</name>
<message> <message>
<location filename="../novelwriter/gui/noveltree.py" line="771" /> <location filename="../novelwriter/gui/noveltree.py" line="778" />
<source>No meta data</source> <source>No meta data</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
@@ -2158,65 +2158,65 @@
<context> <context>
<name>GuiOutlineDetails</name> <name>GuiOutlineDetails</name>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="1061" /> <location filename="../novelwriter/gui/outline.py" line="1053" />
<location filename="../novelwriter/gui/outline.py" line="1022" /> <location filename="../novelwriter/gui/outline.py" line="1014" />
<location filename="../novelwriter/gui/outline.py" line="826" /> <location filename="../novelwriter/gui/outline.py" line="818" />
<location filename="../novelwriter/gui/outline.py" line="799" /> <location filename="../novelwriter/gui/outline.py" line="791" />
<source>Title</source> <source>Title</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="800" /> <location filename="../novelwriter/gui/outline.py" line="792" />
<source>Chapter</source> <source>Chapter</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="801" /> <location filename="../novelwriter/gui/outline.py" line="793" />
<source>Scene</source> <source>Scene</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="802" /> <location filename="../novelwriter/gui/outline.py" line="794" />
<source>Section</source> <source>Section</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="827" /> <location filename="../novelwriter/gui/outline.py" line="819" />
<source>Document</source> <source>Document</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="828" /> <location filename="../novelwriter/gui/outline.py" line="820" />
<source>Status</source> <source>Status</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="841" /> <location filename="../novelwriter/gui/outline.py" line="833" />
<source>Characters</source> <source>Characters</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="842" /> <location filename="../novelwriter/gui/outline.py" line="834" />
<source>Words</source> <source>Words</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="843" /> <location filename="../novelwriter/gui/outline.py" line="835" />
<source>Paragraphs</source> <source>Paragraphs</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="856" /> <location filename="../novelwriter/gui/outline.py" line="848" />
<source>Synopsis</source> <source>Synopsis</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="928" /> <location filename="../novelwriter/gui/outline.py" line="920" />
<source>Title Details</source> <source>Title Details</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="953" /> <location filename="../novelwriter/gui/outline.py" line="945" />
<source>Reference Tags</source> <source>Reference Tags</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
@@ -2224,7 +2224,7 @@
<context> <context>
<name>GuiOutlineHeaderMenu</name> <name>GuiOutlineHeaderMenu</name>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="761" /> <location filename="../novelwriter/gui/outline.py" line="753" />
<source>Select Columns</source> <source>Select Columns</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
@@ -2232,20 +2232,15 @@
<context> <context>
<name>GuiOutlineToolBar</name> <name>GuiOutlineToolBar</name>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="233" /> <location filename="../novelwriter/gui/outline.py" line="234" />
<source>Outline of</source> <source>Outline of</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="241" /> <location filename="../novelwriter/gui/outline.py" line="242" />
<source>Refresh</source> <source>Refresh</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message>
<location filename="../novelwriter/gui/outline.py" line="290" />
<source>All Novel Folders</source>
<translation type="unfinished" />
</message>
</context> </context>
<context> <context>
<name>GuiPreferences</name> <name>GuiPreferences</name>
@@ -2923,17 +2918,17 @@
<context> <context>
<name>GuiProjectDetails</name> <name>GuiProjectDetails</name>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="58" /> <location filename="../novelwriter/dialogs/projdetails.py" line="57" />
<source>Project Details</source> <source>Project Details</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="74" /> <location filename="../novelwriter/dialogs/projdetails.py" line="73" />
<source>Overview</source> <source>Overview</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="75" /> <location filename="../novelwriter/dialogs/projdetails.py" line="74" />
<source>Contents</source> <source>Contents</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
@@ -2941,72 +2936,72 @@
<context> <context>
<name>GuiProjectDetailsContents</name> <name>GuiProjectDetailsContents</name>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="298" /> <location filename="../novelwriter/dialogs/projdetails.py" line="297" />
<source>Table of Contents</source> <source>Table of Contents</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="317" /> <location filename="../novelwriter/dialogs/projdetails.py" line="316" />
<source>Title</source> <source>Title</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="318" /> <location filename="../novelwriter/dialogs/projdetails.py" line="317" />
<source>Words</source> <source>Words</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="319" /> <location filename="../novelwriter/dialogs/projdetails.py" line="318" />
<source>Pages</source> <source>Pages</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="320" /> <location filename="../novelwriter/dialogs/projdetails.py" line="319" />
<source>Page</source> <source>Page</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="321" /> <location filename="../novelwriter/dialogs/projdetails.py" line="320" />
<source>Progress</source> <source>Progress</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="356" /> <location filename="../novelwriter/dialogs/projdetails.py" line="355" />
<source>Typical word count for a 5 by 8 inch book page with 11 pt font is 350.</source> <source>Typical word count for a 5 by 8 inch book page with 11 pt font is 350.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="359" /> <location filename="../novelwriter/dialogs/projdetails.py" line="358" />
<source>Start counting page numbers from this page.</source> <source>Start counting page numbers from this page.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="362" /> <location filename="../novelwriter/dialogs/projdetails.py" line="361" />
<source>Assume a new chapter or partition always start on an odd numbered page.</source> <source>Assume a new chapter or partition always start on an odd numbered page.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="365" /> <location filename="../novelwriter/dialogs/projdetails.py" line="364" />
<source>Words per page</source> <source>Words per page</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="376" /> <location filename="../novelwriter/dialogs/projdetails.py" line="375" />
<source>Count pages from</source> <source>Count pages from</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="387" /> <location filename="../novelwriter/dialogs/projdetails.py" line="386" />
<source>Clear double pages</source> <source>Clear double pages</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="462" /> <location filename="../novelwriter/dialogs/projdetails.py" line="449" />
<source>END</source> <source>END</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="517" /> <location filename="../novelwriter/dialogs/projdetails.py" line="503" />
<source>Untitled</source> <source>Untitled</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
@@ -3014,42 +3009,42 @@
<context> <context>
<name>GuiProjectDetailsMain</name> <name>GuiProjectDetailsMain</name>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="169" /> <location filename="../novelwriter/dialogs/projdetails.py" line="168" />
<source>Working Title: {0}</source> <source>Working Title: {0}</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="178" /> <location filename="../novelwriter/dialogs/projdetails.py" line="177" />
<source>By {0}</source> <source>By {0}</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="190" /> <location filename="../novelwriter/dialogs/projdetails.py" line="189" />
<source>Words</source> <source>Words</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="193" /> <location filename="../novelwriter/dialogs/projdetails.py" line="192" />
<source>Chapters</source> <source>Chapters</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="196" /> <location filename="../novelwriter/dialogs/projdetails.py" line="195" />
<source>Scenes</source> <source>Scenes</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="199" /> <location filename="../novelwriter/dialogs/projdetails.py" line="198" />
<source>Revisions</source> <source>Revisions</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="202" /> <location filename="../novelwriter/dialogs/projdetails.py" line="201" />
<source>Editing Time</source> <source>Editing Time</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/projdetails.py" line="222" /> <location filename="../novelwriter/dialogs/projdetails.py" line="221" />
<source>Path</source> <source>Path</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
@@ -4004,6 +3999,14 @@
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
</context> </context>
<context>
<name>NovelSelector</name>
<message>
<location filename="../novelwriter/gui/components.py" line="106" />
<source>All Novel Folders</source>
<translation type="unfinished" />
</message>
</context>
<context> <context>
<name>ProjWizardCustomPage</name> <name>ProjWizardCustomPage</name>
<message> <message>
+14 -28
View File
@@ -30,15 +30,14 @@ import novelwriter
from PyQt5.QtCore import Qt, QSize, pyqtSlot from PyQt5.QtCore import Qt, QSize, pyqtSlot
from PyQt5.QtGui import QFont from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QAbstractItemView, QComboBox, QDialogButtonBox, QGridLayout, QHBoxLayout, QAbstractItemView, QDialogButtonBox, QGridLayout, QHBoxLayout, QLabel,
QLabel, QLineEdit, QSpinBox, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QLineEdit, QSpinBox, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget
QWidget
) )
from novelwriter.enum import nwItemClass
from novelwriter.common import numberToRoman from novelwriter.common import numberToRoman
from novelwriter.custom import PagedDialog, QSwitch from novelwriter.custom import PagedDialog, QSwitch
from novelwriter.constants import nwLabels, nwUnicode from novelwriter.constants import nwUnicode
from novelwriter.gui.components import NovelSelector
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -297,9 +296,9 @@ class GuiProjectDetailsContents(QWidget):
self.tocLabel = QLabel("<b>%s</b>" % self.tr("Table of Contents")) self.tocLabel = QLabel("<b>%s</b>" % self.tr("Table of Contents"))
self.novelValue = QComboBox(self) self.novelValue = NovelSelector(self, self.theProject, self.mainGui)
self.novelValue.setMinimumWidth(self.mainConf.pxInt(200)) self.novelValue.setMinimumWidth(self.mainConf.pxInt(200))
self.novelValue.currentIndexChanged.connect(self._novelValueChanged) self.novelValue.novelSelectionChanged.connect(self._novelValueChanged)
self.headBox = QHBoxLayout() self.headBox = QHBoxLayout()
self.headBox.addWidget(self.tocLabel) self.headBox.addWidget(self.tocLabel)
@@ -431,10 +430,9 @@ class GuiProjectDetailsContents(QWidget):
"""Populate the tree. """Populate the tree.
""" """
self._currentRoot = None self._currentRoot = None
self._populateNovelList() self.novelValue.updateList()
self.novelValue.setHandle(self.novelValue.firstHandle)
rootHandle = self.novelValue.currentData() self._prepareData(self.novelValue.firstHandle)
self._prepareData(rootHandle)
self._populateTree() self._populateTree()
return return
@@ -443,17 +441,6 @@ class GuiProjectDetailsContents(QWidget):
# Internal Functions # Internal Functions
## ##
def _populateNovelList(self):
"""Fill the novel combo box with a list of all novel folders.
"""
self.novelValue.clear()
tIcon = self.mainTheme.getIcon(nwLabels.CLASS_ICON[nwItemClass.NOVEL])
for tHandle, nwItem in self.theProject.tree.iterRoots(nwItemClass.NOVEL):
self.novelValue.addItem(tIcon, nwItem.itemName, tHandle)
return
def _prepareData(self, rootHandle): def _prepareData(self, rootHandle):
"""Extract the information from the project index. """Extract the information from the project index.
""" """
@@ -466,15 +453,14 @@ class GuiProjectDetailsContents(QWidget):
# Slots # Slots
## ##
@pyqtSlot() @pyqtSlot(str)
def _novelValueChanged(self): def _novelValueChanged(self, tHandle):
"""Refresh the tree with another root item. """Refresh the tree with another root item.
""" """
rootHandle = self.novelValue.currentData() if tHandle != self._currentRoot:
if rootHandle != self._currentRoot: self._prepareData(tHandle)
self._prepareData(rootHandle)
self._populateTree() self._populateTree()
self._currentRoot = rootHandle self._currentRoot = self.novelValue.handle
return return
@pyqtSlot() @pyqtSlot()
+23 -6
View File
@@ -40,20 +40,35 @@ class NovelSelector(QComboBox):
novelSelectionChanged = pyqtSignal(str) novelSelectionChanged = pyqtSignal(str)
def __init__(self, parent, project, theme): def __init__(self, parent, project, mainGui):
super().__init__(parent=parent) super().__init__(parent=parent)
self._mainGui = mainGui
self._project = project self._project = project
self._theme = theme self._theme = mainGui.mainTheme
self._blockSignal = False self._blockSignal = False
self._firstHandle = None
self.currentIndexChanged.connect(self._indexChanged) self.currentIndexChanged.connect(self._indexChanged)
return return
##
# Properties
##
@property @property
def handle(self): def handle(self):
return self.currentData() return self.currentData()
@property
def firstHandle(self):
return self._firstHandle
##
# Methods
##
def setHandle(self, tHandle, blockSignal=True): def setHandle(self, tHandle, blockSignal=True):
"""Set the currently selected handle. """Set the currently selected handle.
""" """
@@ -71,6 +86,7 @@ class NovelSelector(QComboBox):
"""Rebuild the list of novel items. """Rebuild the list of novel items.
""" """
self._blockSignal = True self._blockSignal = True
self._firstHandle = None
self.clear() self.clear()
icon = self._theme.getIcon(nwLabels.CLASS_ICON[nwItemClass.NOVEL]) icon = self._theme.getIcon(nwLabels.CLASS_ICON[nwItemClass.NOVEL])
@@ -82,13 +98,12 @@ class NovelSelector(QComboBox):
else: else:
name = nwItem.itemName name = nwItem.itemName
self.addItem(icon, nwItem.itemName, tHandle) self.addItem(icon, nwItem.itemName, tHandle)
if self._firstHandle is None:
self._firstHandle = tHandle
if includeAll: if includeAll:
self.insertSeparator(self.count()) self.insertSeparator(self.count())
if prefix: self.addItem(icon, self.tr("All Novel Folders"), "")
self.addItem(prefix.format(self.tr("All Novel Folders")), "")
else:
self.addItem(icon, self.tr("All Novel Folders"), "")
self.setHandle(handle) self.setHandle(handle)
self.setEnabled(self.count() > 1) self.setEnabled(self.count() > 1)
@@ -102,6 +117,8 @@ class NovelSelector(QComboBox):
@pyqtSlot(int) @pyqtSlot(int)
def _indexChanged(self, index): def _indexChanged(self, index):
"""Re-emit the change of selected novel signal, unless blocked.
"""
if not self._blockSignal: if not self._blockSignal:
self.novelSelectionChanged.emit(self.currentData()) self.novelSelectionChanged.emit(self.currentData())
return return
+26 -15
View File
@@ -191,6 +191,7 @@ class GuiNovelToolBar(QWidget):
self.mainConf = novelwriter.CONFIG self.mainConf = novelwriter.CONFIG
self.novelView = novelView self.novelView = novelView
self.mainGui = novelView.mainGui
self.theProject = novelView.mainGui.theProject self.theProject = novelView.mainGui.theProject
self.mainTheme = novelView.mainGui.mainTheme self.mainTheme = novelView.mainGui.mainTheme
@@ -204,12 +205,17 @@ class GuiNovelToolBar(QWidget):
selFont = self.font() selFont = self.font()
selFont.setWeight(QFont.Bold) selFont.setWeight(QFont.Bold)
self.novelPrefix = self.tr("Outline of {0}") self.novelPrefix = self.tr("Outline of {0}")
self.novelValue = NovelSelector(self, self.theProject, self.mainTheme) self.novelValue = NovelSelector(self, self.theProject, self.mainGui)
self.novelValue.setFont(selFont) self.novelValue.setFont(selFont)
self.novelValue.setMinimumWidth(self.mainConf.pxInt(150)) self.novelValue.setMinimumWidth(self.mainConf.pxInt(150))
self.novelValue.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.novelValue.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.novelValue.novelSelectionChanged.connect(self.setCurrentRoot) self.novelValue.novelSelectionChanged.connect(self.setCurrentRoot)
self.tbNovel = QToolButton(self)
self.tbNovel.setToolTip(self.tr("Novel Root"))
self.tbNovel.setIconSize(QSize(iPx, iPx))
self.tbNovel.clicked.connect(self._openNovelSelector)
# Refresh Button # Refresh Button
self.tbRefresh = QToolButton(self) self.tbRefresh = QToolButton(self)
self.tbRefresh.setToolTip(self.tr("Refresh")) self.tbRefresh.setToolTip(self.tr("Refresh"))
@@ -236,6 +242,7 @@ class GuiNovelToolBar(QWidget):
# Assemble # Assemble
self.outerBox = QHBoxLayout() self.outerBox = QHBoxLayout()
self.outerBox.addWidget(self.novelValue) self.outerBox.addWidget(self.novelValue)
self.outerBox.addWidget(self.tbNovel)
self.outerBox.addWidget(self.tbRefresh) self.outerBox.addWidget(self.tbRefresh)
self.outerBox.addWidget(self.tbMore) self.outerBox.addWidget(self.tbMore)
self.outerBox.setContentsMargins(mPx, mPx, 0, mPx) self.outerBox.setContentsMargins(mPx, mPx, 0, mPx)
@@ -257,6 +264,7 @@ class GuiNovelToolBar(QWidget):
"""Update theme elements. """Update theme elements.
""" """
# Icons # Icons
self.tbNovel.setIcon(self.mainTheme.getIcon("cls_novel"))
self.tbRefresh.setIcon(self.mainTheme.getIcon("refresh")) self.tbRefresh.setIcon(self.mainTheme.getIcon("refresh"))
self.tbMore.setIcon(self.mainTheme.getIcon("menu")) self.tbMore.setIcon(self.mainTheme.getIcon("menu"))
@@ -271,6 +279,7 @@ class GuiNovelToolBar(QWidget):
"QToolButton:hover {{border: none; background: rgba({1},{2},{3},0.2);}}" "QToolButton:hover {{border: none; background: rgba({1},{2},{3},0.2);}}"
).format(self.mainConf.pxInt(2), fadeCol.red(), fadeCol.green(), fadeCol.blue()) ).format(self.mainConf.pxInt(2), fadeCol.red(), fadeCol.green(), fadeCol.blue())
self.tbNovel.setStyleSheet(buttonStyle)
self.tbRefresh.setStyleSheet(buttonStyle) self.tbRefresh.setStyleSheet(buttonStyle)
self.tbMore.setStyleSheet(buttonStyle) self.tbMore.setStyleSheet(buttonStyle)
@@ -279,10 +288,7 @@ class GuiNovelToolBar(QWidget):
"QComboBox::drop-down {border-style: none}" "QComboBox::drop-down {border-style: none}"
) )
self.novelValue.updateList(prefix=self.novelPrefix) self.novelValue.updateList(prefix=self.novelPrefix)
if self.novelValue.count() > 1: self.tbNovel.setVisible(self.novelValue.count() > 1)
self.novelValue.setToolTip(self.tr("Click to change root folder"))
else:
self.novelValue.setToolTip("")
return return
@@ -297,10 +303,7 @@ class GuiNovelToolBar(QWidget):
"""Build the novel root menu. """Build the novel root menu.
""" """
self.novelValue.updateList(prefix=self.novelPrefix) self.novelValue.updateList(prefix=self.novelPrefix)
if self.novelValue.count() > 1: self.tbNovel.setVisible(self.novelValue.count() > 1)
self.novelValue.setToolTip(self.tr("Click to change root folder"))
else:
self.novelValue.setToolTip("")
return return
def setCurrentRoot(self, rootHandle): def setCurrentRoot(self, rootHandle):
@@ -321,6 +324,13 @@ class GuiNovelToolBar(QWidget):
# Private Slots # Private Slots
## ##
@pyqtSlot()
def _openNovelSelector(self):
"""Trigger the dropdown list of the novel selector.
"""
self.novelValue.showPopup()
return
@pyqtSlot() @pyqtSlot()
def _refreshNovelTree(self): def _refreshNovelTree(self):
"""Rebuild the current tree. """Rebuild the current tree.
@@ -519,13 +529,14 @@ class GuiNovelTree(QTreeWidget):
return return
def getSelectedHandle(self): def getSelectedHandle(self):
"""Get the currently selected handle. If multiple items are """Get the currently selected or active handle. If multiple
selected, return the first. items are selected, return the first.
""" """
selItem = self.selectedItems() selList = self.selectedItems()
if selItem: trItem = selList[0] if selList else self.currentItem()
tHandle = selItem[0].data(self.C_TITLE, self.D_HANDLE) if isinstance(trItem, QTreeWidgetItem):
sTitle = selItem[0].data(self.C_TITLE, self.D_TITLE) tHandle = trItem.data(self.C_TITLE, self.D_HANDLE)
sTitle = trItem.data(self.C_TITLE, self.D_TITLE)
return tHandle, sTitle return tHandle, sTitle
return None, None return None, None
+1 -1
View File
@@ -234,7 +234,7 @@ class GuiOutlineToolBar(QToolBar):
self.novelLabel = QLabel(self.tr("Outline of")) self.novelLabel = QLabel(self.tr("Outline of"))
self.novelLabel.setContentsMargins(0, 0, mPx, 0) self.novelLabel.setContentsMargins(0, 0, mPx, 0)
self.novelValue = NovelSelector(self, self.theProject, self.mainTheme) self.novelValue = NovelSelector(self, self.theProject, self.mainGui)
self.novelValue.setMinimumWidth(self.mainConf.pxInt(200)) self.novelValue.setMinimumWidth(self.mainConf.pxInt(200))
self.novelValue.novelSelectionChanged.connect(self._novelValueChanged) self.novelValue.novelSelectionChanged.connect(self._novelValueChanged)
@@ -93,6 +93,11 @@ def testDlgProjDetails_Dialog(qtbot, nwGUI, nwLipsum):
assert tocTree.topLevelItem(i).text(tocTab.C_PAGES) == thePages[i] assert tocTree.topLevelItem(i).text(tocTab.C_PAGES) == thePages[i]
assert tocTree.topLevelItem(i).text(tocTab.C_PAGE) == thePage[i] assert tocTree.topLevelItem(i).text(tocTab.C_PAGE) == thePage[i]
# Re-populate
assert tocTab._currentRoot is None
tocTab._novelValueChanged("7a992350f3eb6") # Not a root
assert tocTab._currentRoot == "b3643d0f92e32" # The actual novel root
# qtbot.stop() # qtbot.stop()
# Clean Up # Clean Up