From 5b200616076b8c1a924e0899d87bbc41927a58be Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 10 Feb 2023 20:01:46 +0100 Subject: [PATCH 1/6] Only insert line break for block formats if the block already has text (#1349, #1350) --- novelwriter/gui/doceditor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index 99104c00..87c9e7cc 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -1750,6 +1750,7 @@ class GuiDocEditor(QTextEdit): # Remove existing format first, if any theText = theBlock.text() + hasText = len(theText) > 0 if theText.startswith("@"): logger.error("Cannot apply block format to keyword/value line") return False @@ -1855,7 +1856,7 @@ class GuiDocEditor(QTextEdit): posS = theCursor.selectionStart() theCursor.removeSelectedText() theCursor.setPosition(posS) - if posS > 0: + if posS > 0 and hasText: theCursor.insertBlock() theCursor.insertText(theText) if posO - cOffset >= 0: From aa3fe961589477f97d74a833cc7635d7a38760b4 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 10 Feb 2023 20:07:52 +0100 Subject: [PATCH 2/6] Add some comments to explain what's going on in the block formatting --- novelwriter/gui/doceditor.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index 87c9e7cc..361b236e 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -1856,11 +1856,17 @@ class GuiDocEditor(QTextEdit): posS = theCursor.selectionStart() theCursor.removeSelectedText() theCursor.setPosition(posS) + if posS > 0 and hasText: + # If the block already had text, we must insert a new block + # first before we can add back the text to it. theCursor.insertBlock() + theCursor.insertText(theText) + if posO - cOffset >= 0: theCursor.setPosition(posO - cOffset) + theCursor.endEditBlock() self.setTextCursor(theCursor) From fd14c682a9e2d97e5ef2b7ee9784541d7ef44f49 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 10 Feb 2023 20:16:49 +0100 Subject: [PATCH 3/6] Allow more than one item in extra column --- novelwriter/gui/noveltree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/novelwriter/gui/noveltree.py b/novelwriter/gui/noveltree.py index eae204c1..34db4f54 100644 --- a/novelwriter/gui/noveltree.py +++ b/novelwriter/gui/noveltree.py @@ -741,7 +741,7 @@ class GuiNovelTree(QTreeWidget): if refData: toolText = ", ".join(refData) - return refData[0], f"{refName}: {toolText}" + return toolText, f"{refName}: {toolText}" return "", "" From cf742a89c04ecdc375397343a0b265da73ec7014 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 10 Feb 2023 20:49:47 +0100 Subject: [PATCH 4/6] Add a menu entry to change column size for last column in novel tree --- novelwriter/core/options.py | 2 +- novelwriter/gui/noveltree.py | 55 ++++++++++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 10 deletions(-) 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 34db4f54..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) From c1f1013cfda3070cc1ca40e8aa5bca757dc2591f Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 10 Feb 2023 20:55:37 +0100 Subject: [PATCH 5/6] Improve test coverage --- tests/test_gui/test_gui_noveltree.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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 # ========= From 7fe85ddfde94cc648781b3586bef8ff17b07c921 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 10 Feb 2023 20:59:26 +0100 Subject: [PATCH 6/6] Update base translation file --- i18n/nw_base.ts | 75 ++++++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 32 deletions(-) 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