novelWriter 2.5.1__py3-none-any.whl → 2.6b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/METADATA +2 -1
  2. {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/RECORD +61 -56
  3. {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/WHEEL +1 -1
  4. novelwriter/__init__.py +3 -3
  5. novelwriter/assets/i18n/project_en_GB.json +1 -0
  6. novelwriter/assets/icons/typicons_dark/icons.conf +1 -0
  7. novelwriter/assets/icons/typicons_dark/mixed_copy.svg +4 -0
  8. novelwriter/assets/icons/typicons_light/icons.conf +1 -0
  9. novelwriter/assets/icons/typicons_light/mixed_copy.svg +4 -0
  10. novelwriter/assets/manual.pdf +0 -0
  11. novelwriter/assets/sample.zip +0 -0
  12. novelwriter/assets/themes/default_light.conf +2 -2
  13. novelwriter/common.py +63 -0
  14. novelwriter/config.py +10 -3
  15. novelwriter/constants.py +153 -60
  16. novelwriter/core/buildsettings.py +66 -39
  17. novelwriter/core/coretools.py +34 -22
  18. novelwriter/core/docbuild.py +130 -169
  19. novelwriter/core/index.py +29 -18
  20. novelwriter/core/item.py +2 -2
  21. novelwriter/core/options.py +4 -1
  22. novelwriter/core/spellcheck.py +9 -14
  23. novelwriter/dialogs/preferences.py +45 -32
  24. novelwriter/dialogs/projectsettings.py +3 -3
  25. novelwriter/enum.py +29 -23
  26. novelwriter/extensions/configlayout.py +24 -11
  27. novelwriter/extensions/modified.py +13 -1
  28. novelwriter/extensions/pagedsidebar.py +5 -5
  29. novelwriter/formats/shared.py +155 -0
  30. novelwriter/formats/todocx.py +1195 -0
  31. novelwriter/formats/tohtml.py +452 -0
  32. novelwriter/{core → formats}/tokenizer.py +483 -485
  33. novelwriter/formats/tomarkdown.py +217 -0
  34. novelwriter/{core → formats}/toodt.py +270 -320
  35. novelwriter/formats/toqdoc.py +436 -0
  36. novelwriter/formats/toraw.py +91 -0
  37. novelwriter/gui/doceditor.py +240 -193
  38. novelwriter/gui/dochighlight.py +96 -84
  39. novelwriter/gui/docviewer.py +56 -30
  40. novelwriter/gui/docviewerpanel.py +3 -3
  41. novelwriter/gui/editordocument.py +17 -2
  42. novelwriter/gui/itemdetails.py +8 -4
  43. novelwriter/gui/mainmenu.py +121 -60
  44. novelwriter/gui/noveltree.py +35 -37
  45. novelwriter/gui/outline.py +186 -238
  46. novelwriter/gui/projtree.py +142 -131
  47. novelwriter/gui/sidebar.py +7 -6
  48. novelwriter/gui/theme.py +5 -4
  49. novelwriter/guimain.py +43 -155
  50. novelwriter/shared.py +14 -4
  51. novelwriter/text/counting.py +2 -0
  52. novelwriter/text/patterns.py +155 -59
  53. novelwriter/tools/manusbuild.py +1 -1
  54. novelwriter/tools/manuscript.py +121 -78
  55. novelwriter/tools/manussettings.py +403 -260
  56. novelwriter/tools/welcome.py +4 -4
  57. novelwriter/tools/writingstats.py +3 -3
  58. novelwriter/types.py +16 -6
  59. novelwriter/core/tohtml.py +0 -530
  60. novelwriter/core/tomarkdown.py +0 -252
  61. novelwriter/core/toqdoc.py +0 -419
  62. {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/LICENSE.md +0 -0
  63. {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/entry_points.txt +0 -0
  64. {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/top_level.txt +0 -0
@@ -39,16 +39,16 @@ from PyQt5.QtWidgets import (
39
39
  )
40
40
 
41
41
  from novelwriter import CONFIG, SHARED
42
- from novelwriter.common import minmax
43
- from novelwriter.constants import nwHeaders, nwKeyWords, nwLabels, trConst
42
+ from novelwriter.common import minmax, qtLambda
43
+ from novelwriter.constants import nwKeyWords, nwLabels, nwStyles, trConst
44
44
  from novelwriter.core.index import IndexHeading
45
45
  from novelwriter.enum import nwDocMode, nwItemClass, nwOutline
46
46
  from novelwriter.extensions.modified import NIconToolButton
47
47
  from novelwriter.extensions.novelselector import NovelSelector
48
48
  from novelwriter.gui.theme import STYLES_MIN_TOOLBUTTON
49
49
  from novelwriter.types import (
50
- QtAlignRight, QtDecoration, QtMouseLeft, QtMouseMiddle, QtSizeExpanding,
51
- QtUserRole
50
+ QtAlignRight, QtDecoration, QtMouseLeft, QtMouseMiddle, QtScrollAlwaysOff,
51
+ QtScrollAsNeeded, QtSizeExpanding, QtUserRole
52
52
  )
53
53
 
54
54
  logger = logging.getLogger(__name__)
@@ -87,7 +87,6 @@ class GuiNovelView(QWidget):
87
87
 
88
88
  # Function Mappings
89
89
  self.getSelectedHandle = self.novelTree.getSelectedHandle
90
- self.setActiveHandle = self.novelTree.setActiveHandle
91
90
 
92
91
  return
93
92
 
@@ -163,6 +162,12 @@ class GuiNovelView(QWidget):
163
162
  # Public Slots
164
163
  ##
165
164
 
165
+ @pyqtSlot(str)
166
+ def setActiveHandle(self, tHandle: str) -> None:
167
+ """Highlight the rows associated with a given handle."""
168
+ self.novelTree.setActiveHandle(tHandle)
169
+ return
170
+
166
171
  @pyqtSlot()
167
172
  def refreshTree(self) -> None:
168
173
  """Refresh the current tree."""
@@ -341,7 +346,7 @@ class GuiNovelToolBar(QWidget):
341
346
  aLast = self.mLastCol.addAction(actionLabel)
342
347
  aLast.setCheckable(True)
343
348
  aLast.setActionGroup(self.gLastCol)
344
- aLast.triggered.connect(lambda: self.setLastColType(colType))
349
+ aLast.triggered.connect(qtLambda(self.setLastColType, colType))
345
350
  self.aLastCol[colType] = aLast
346
351
  return
347
352
 
@@ -367,11 +372,11 @@ class GuiNovelTree(QTreeWidget):
367
372
  self.novelView = novelView
368
373
 
369
374
  # Internal Variables
370
- self._treeMap = {}
371
375
  self._lastBuild = 0
372
376
  self._lastCol = NovelTreeColumn.POV
373
377
  self._lastColSize = 0.25
374
378
  self._actHandle = None
379
+ self._treeMap: dict[str, QTreeWidgetItem] = {}
375
380
 
376
381
  # Cached Strings
377
382
  self._povLabel = trConst(nwLabels.KEY_NAME[nwKeyWords.POV_KEY])
@@ -433,14 +438,14 @@ class GuiNovelTree(QTreeWidget):
433
438
  """Set or update tree widget settings."""
434
439
  # Scroll bars
435
440
  if CONFIG.hideVScroll:
436
- self.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
441
+ self.setVerticalScrollBarPolicy(QtScrollAlwaysOff)
437
442
  else:
438
- self.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)
443
+ self.setVerticalScrollBarPolicy(QtScrollAsNeeded)
439
444
 
440
445
  if CONFIG.hideHScroll:
441
- self.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
446
+ self.setHorizontalScrollBarPolicy(QtScrollAlwaysOff)
442
447
  else:
443
- self.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)
448
+ self.setHorizontalScrollBarPolicy(QtScrollAsNeeded)
444
449
 
445
450
  return
446
451
 
@@ -479,16 +484,9 @@ class GuiNovelTree(QTreeWidget):
479
484
  if rootHandle is None:
480
485
  rootHandle = SHARED.project.tree.findRoot(nwItemClass.NOVEL)
481
486
 
482
- treeChanged = SHARED.mainGui.projView.changedSince(self._lastBuild)
483
- indexChanged = SHARED.project.index.rootChangedSince(rootHandle, self._lastBuild)
484
- if not (treeChanged or indexChanged or overRide):
485
- logger.debug("No changes have been made to the novel index")
486
- return
487
-
488
- selItem = self.selectedItems()
489
487
  titleKey = None
490
- if selItem:
491
- titleKey = selItem[0].data(self.C_DATA, self.D_KEY)
488
+ if selItems := self.selectedItems():
489
+ titleKey = selItems[0].data(self.C_DATA, self.D_KEY)
492
490
 
493
491
  self._populateTree(rootHandle)
494
492
  SHARED.project.data.setLastHandle(rootHandle, "novelTree")
@@ -540,25 +538,25 @@ class GuiNovelTree(QTreeWidget):
540
538
  self._lastColSize = minmax(colSize, 15, 75)/100.0
541
539
  return
542
540
 
543
- def setActiveHandle(self, tHandle: str | None, doScroll: bool = False) -> None:
541
+ def setActiveHandle(self, tHandle: str | None) -> None:
544
542
  """Highlight the rows associated with a given handle."""
545
543
  didScroll = False
546
- self._actHandle = tHandle
547
- for i in range(self.topLevelItemCount()):
548
- if tItem := self.topLevelItem(i):
549
- if tItem.data(self.C_DATA, self.D_HANDLE) == tHandle:
550
- tItem.setBackground(self.C_TITLE, self.palette().alternateBase())
551
- tItem.setBackground(self.C_WORDS, self.palette().alternateBase())
552
- tItem.setBackground(self.C_EXTRA, self.palette().alternateBase())
553
- tItem.setBackground(self.C_MORE, self.palette().alternateBase())
554
- if doScroll and not didScroll:
555
- self.scrollToItem(tItem, QAbstractItemView.ScrollHint.PositionAtCenter)
544
+ brushOn = self.palette().alternateBase()
545
+ brushOff = self.palette().base()
546
+ if pHandle := self._actHandle:
547
+ for key, item in self._treeMap.items():
548
+ if key.startswith(pHandle):
549
+ for i in range(self.columnCount()):
550
+ item.setBackground(i, brushOff)
551
+ if tHandle:
552
+ for key, item in self._treeMap.items():
553
+ if key.startswith(tHandle):
554
+ for i in range(self.columnCount()):
555
+ item.setBackground(i, brushOn)
556
+ if not didScroll:
557
+ self.scrollToItem(item, QAbstractItemView.ScrollHint.PositionAtCenter)
556
558
  didScroll = True
557
- else:
558
- tItem.setBackground(self.C_TITLE, self.palette().base())
559
- tItem.setBackground(self.C_WORDS, self.palette().base())
560
- tItem.setBackground(self.C_EXTRA, self.palette().base())
561
- tItem.setBackground(self.C_MORE, self.palette().base())
559
+ self._actHandle = tHandle or None
562
560
  return
563
561
 
564
562
  ##
@@ -683,7 +681,7 @@ class GuiNovelTree(QTreeWidget):
683
681
  def _updateTreeItemValues(self, trItem: QTreeWidgetItem, idxItem: IndexHeading,
684
682
  tHandle: str, sTitle: str) -> None:
685
683
  """Set the tree item values from the index entry."""
686
- iLevel = nwHeaders.H_LEVEL.get(idxItem.level, 0)
684
+ iLevel = nwStyles.H_LEVEL.get(idxItem.level, 0)
687
685
  hDec = SHARED.theme.getHeaderDecoration(iLevel)
688
686
 
689
687
  trItem.setData(self.C_TITLE, QtDecoration, hDec)