diff --git a/i18n/nw_base.ts b/i18n/nw_base.ts index 6b455964..6777e15d 100644 --- a/i18n/nw_base.ts +++ b/i18n/nw_base.ts @@ -757,32 +757,32 @@ GuiDocEditFooter - + Status - + Line: {0} ({1}) - + Words: {0} ({1}) - + Document size is {0} bytes - + Words: {0} selected - + Character count: {0} @@ -790,22 +790,22 @@ GuiDocEditHeader - + Edit document label - + Search document - + Toggle Focus Mode - + Close the document @@ -813,58 +813,58 @@ GuiDocEditSearch - - + + Search - + Replace - + Case Sensitive - + Whole Words Only - + RegEx Mode - + Loop Search - + Search Next File - + Preserve Case - + Close Search - + Find in current document - + Find and replace in current document @@ -2050,55 +2050,66 @@ GuiNovelToolBar - + Outline of {0} - + Novel Root - + Refresh - + Last Column - + Hidden - + Point of View Character - + Focus Character - + Novel Plot - + + + Column Size + + + + More Options + + + Maximum column size in % + + GuiNovelTree - + No meta data diff --git a/novelwriter/core/options.py b/novelwriter/core/options.py index 2432e0c9..900701f6 100644 --- a/novelwriter/core/options.py +++ b/novelwriter/core/options.py @@ -59,7 +59,7 @@ VALID_MAP = { "widthCol3", "widthCol4", "wordsPerPage", "countFrom", "clearDouble", }, "GuiWordList": {"winWidth", "winHeight"}, - "GuiNovelView": {"lastCol"}, + "GuiNovelView": {"lastCol", "lastColSize"}, } diff --git a/novelwriter/gui/noveltree.py b/novelwriter/gui/noveltree.py index eae204c1..920dccf2 100644 --- a/novelwriter/gui/noveltree.py +++ b/novelwriter/gui/noveltree.py @@ -34,12 +34,13 @@ from time import time from PyQt5.QtGui import QFont, QPalette from PyQt5.QtCore import Qt, QSize, pyqtSlot, pyqtSignal from PyQt5.QtWidgets import ( - QAbstractItemView, QActionGroup, QFrame, QHBoxLayout, QHeaderView, QMenu, - QSizePolicy, QToolButton, QToolTip, QTreeWidget, QTreeWidgetItem, - QVBoxLayout, QWidget + QAbstractItemView, QActionGroup, QFrame, QHBoxLayout, QHeaderView, + QInputDialog, QMenu, QSizePolicy, QToolButton, QToolTip, QTreeWidget, + QTreeWidgetItem, QVBoxLayout, QWidget ) from novelwriter.enum import nwDocMode, nwItemClass, nwOutline +from novelwriter.common import minmax from novelwriter.constants import nwHeaders, nwKeyWords, nwLabels, trConst from novelwriter.gui.components import NovelSelector @@ -126,20 +127,28 @@ class GuiNovelView(QWidget): lastCol = self.theProject.options.getEnum( "GuiNovelView", "lastCol", NovelTreeColumn, NovelTreeColumn.HIDDEN ) + lastColSize = self.theProject.options.getInt( + "GuiNovelView", "lastColSize", 25 + ) self.clearProject() + self.novelBar.buildNovelRootMenu() self.novelBar.setLastColType(lastCol, doRefresh=False) self.novelBar.setCurrentRoot(lastNovel) self.novelBar.setEnabled(True) + self.novelTree.setLastColSize(lastColSize) + return def closeProjectTasks(self): """Run closing project tasks. """ lastColType = self.novelTree.lastColType + lastColSize = self.novelTree.lastColSize self.theProject.options.setValue("GuiNovelView", "lastCol", lastColType) + self.theProject.options.setValue("GuiNovelView", "lastColSize", lastColSize) return def setTreeFocus(self): @@ -233,6 +242,10 @@ class GuiNovelToolBar(QWidget): self._addLastColAction(NovelTreeColumn.FOCUS, self.tr("Focus Character")) self._addLastColAction(NovelTreeColumn.PLOT, self.tr("Novel Plot")) + self.mLastCol.addSeparator() + self.aLastColSize = self.mLastCol.addAction(self.tr("Column Size")) + self.aLastColSize.triggered.connect(self._selectLastColumnSize) + self.tbMore = QToolButton(self) self.tbMore.setToolTip(self.tr("More Options")) self.tbMore.setIconSize(QSize(iPx, iPx)) @@ -339,6 +352,19 @@ class GuiNovelToolBar(QWidget): self.novelView.novelTree.refreshTree(rootHandle=rootHandle, overRide=True) return + @pyqtSlot() + def _selectLastColumnSize(self): + """Set the maximum width for the last column. + """ + oldSize = self.novelView.novelTree.lastColSize + newSize, isOk = QInputDialog.getInt( + self, self.tr("Column Size"), self.tr("Maximum column size in %"), oldSize, 15, 75, 5 + ) + if isOk: + self.novelView.novelTree.setLastColSize(newSize) + self._refreshNovelTree() + return + ## # Internal Functions ## @@ -379,10 +405,11 @@ class GuiNovelTree(QTreeWidget): self.theProject = novelView.mainGui.theProject # Internal Variables - self._treeMap = {} - self._lastBuild = 0 - self._lastCol = NovelTreeColumn.POV - self._actHandle = None + self._treeMap = {} + self._lastBuild = 0 + self._lastCol = NovelTreeColumn.POV + self._lastColSize = 0.25 + self._actHandle = None # Cached Strings self._povLabel = trConst(nwLabels.KEY_NAME[nwKeyWords.POV_KEY]) @@ -470,6 +497,10 @@ class GuiNovelTree(QTreeWidget): def lastColType(self): return self._lastCol + @property + def lastColSize(self): + return int(self._lastColSize * 100) + ## # Class Methods ## @@ -552,6 +583,12 @@ class GuiNovelTree(QTreeWidget): self.refreshTree(rootHandle=lastNovel, overRide=True) return + def setLastColSize(self, colSize): + """Set the column size in integer values between 15 and 75. + """ + self._lastColSize = minmax(colSize, 15, 75)/100.0 + return + def setActiveHandle(self, tHandle): """Highlight the rows associated with a given handle. """ @@ -619,7 +656,7 @@ class GuiNovelTree(QTreeWidget): newW = event.size().width() oldW = event.oldSize().width() if newW != oldW: - eliW = int(0.25 * newW) + eliW = int(self._lastColSize * newW) fMetric = self.fontMetrics() for i in range(self.topLevelItemCount()): trItem = self.topLevelItem(i) @@ -709,7 +746,7 @@ class GuiNovelTree(QTreeWidget): trItem.setData(self.C_MORE, Qt.DecorationRole, self._pMore) # Custom column - mW = int(0.25 * self.viewport().width()) + mW = int(self._lastColSize * self.viewport().width()) lastText, toolTip = self._getLastColumnText(tHandle, sTitle) elideText = self.fontMetrics().elidedText(lastText, Qt.ElideRight, mW) trItem.setText(self.C_EXTRA, elideText) @@ -741,7 +778,7 @@ class GuiNovelTree(QTreeWidget): if refData: toolText = ", ".join(refData) - return refData[0], f"{refName}: {toolText}" + return toolText, f"{refName}: {toolText}" return "", "" diff --git a/tests/test_gui/test_gui_noveltree.py b/tests/test_gui/test_gui_noveltree.py index 313d720e..e74e4ebb 100644 --- a/tests/test_gui/test_gui_noveltree.py +++ b/tests/test_gui/test_gui_noveltree.py @@ -27,7 +27,7 @@ from tools import C, buildTestProject from PyQt5.QtGui import QFocusEvent from PyQt5.QtCore import Qt, QEvent -from PyQt5.QtWidgets import QToolTip +from PyQt5.QtWidgets import QInputDialog, QToolTip from novelwriter.enum import nwWidget, nwItemType from novelwriter.gui.noveltree import NovelTreeColumn @@ -82,6 +82,8 @@ def testGuiNovelTree_TreeItems(qtbot, monkeypatch, nwGUI, projPath, mockRnd): # Populate Tree # ============= + novelView.setTreeFocus() + nwGUI.projStack.setCurrentIndex(nwGUI.idxNovelView) nwGUI.rebuildIndex() novelTree._populateTree(rootHandle=None) @@ -172,6 +174,11 @@ def testGuiNovelTree_TreeItems(qtbot, monkeypatch, nwGUI, projPath, mockRnd): spSize = nwGUI.splitMain.sizes() nwGUI.splitMain.setSizes([spSize[0] + 10, spSize[1] - 10]) + # Resize the last column + with monkeypatch.context() as mp: + mp.setattr(QInputDialog, "getInt", lambda *a, **k: (40, True)) + novelBar._selectLastColumnSize() + # Item Meta # =========