novelWriter 2.2rc1__py3-none-any.whl → 2.3b1__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 (153) hide show
  1. {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/METADATA +1 -1
  2. {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/RECORD +141 -129
  3. {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/WHEEL +1 -1
  4. novelwriter/__init__.py +11 -6
  5. novelwriter/assets/i18n/nw_de_DE.qm +0 -0
  6. novelwriter/assets/i18n/nw_en_US.qm +0 -0
  7. novelwriter/assets/i18n/nw_es_419.qm +0 -0
  8. novelwriter/assets/i18n/nw_fr_FR.qm +0 -0
  9. novelwriter/assets/i18n/nw_it_IT.qm +0 -0
  10. novelwriter/assets/i18n/nw_ja_JP.qm +0 -0
  11. novelwriter/assets/i18n/nw_nb_NO.qm +0 -0
  12. novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
  13. novelwriter/assets/i18n/project_de_DE.json +1 -0
  14. novelwriter/assets/i18n/project_en_US.json +1 -0
  15. novelwriter/assets/i18n/project_es_419.json +11 -0
  16. novelwriter/assets/i18n/project_fr_FR.json +11 -0
  17. novelwriter/assets/i18n/project_it_IT.json +11 -0
  18. novelwriter/assets/i18n/project_ja_JP.json +2 -1
  19. novelwriter/assets/i18n/project_nb_NO.json +1 -0
  20. novelwriter/assets/i18n/project_zh_CN.json +11 -0
  21. novelwriter/assets/icons/typicons_dark/icons.conf +9 -2
  22. novelwriter/assets/icons/typicons_dark/mixed_import.svg +5 -0
  23. novelwriter/assets/icons/typicons_dark/nw_tb-bold-md.svg +4 -0
  24. novelwriter/assets/icons/typicons_dark/nw_tb-bold.svg +3 -1
  25. novelwriter/assets/icons/typicons_dark/nw_tb-italic-md.svg +4 -0
  26. novelwriter/assets/icons/typicons_dark/nw_tb-italic.svg +3 -1
  27. novelwriter/assets/icons/typicons_dark/nw_tb-strike-md.svg +4 -0
  28. novelwriter/assets/icons/typicons_dark/nw_tb-strike.svg +3 -1
  29. novelwriter/assets/icons/typicons_dark/nw_tb-subscript.svg +4 -2
  30. novelwriter/assets/icons/typicons_dark/nw_tb-superscript.svg +4 -2
  31. novelwriter/assets/icons/typicons_dark/nw_tb-underline.svg +4 -2
  32. novelwriter/assets/icons/typicons_dark/typ_document-add-col.svg +8 -0
  33. novelwriter/assets/icons/typicons_dark/typ_document-add.svg +4 -0
  34. novelwriter/assets/icons/typicons_dark/typ_document.svg +4 -0
  35. novelwriter/assets/icons/typicons_dark/typ_th-dot-more.svg +4 -0
  36. novelwriter/assets/icons/typicons_light/icons.conf +9 -2
  37. novelwriter/assets/icons/typicons_light/mixed_import.svg +5 -0
  38. novelwriter/assets/icons/typicons_light/nw_tb-bold-md.svg +4 -0
  39. novelwriter/assets/icons/typicons_light/nw_tb-bold.svg +3 -1
  40. novelwriter/assets/icons/typicons_light/nw_tb-italic-md.svg +4 -0
  41. novelwriter/assets/icons/typicons_light/nw_tb-italic.svg +3 -1
  42. novelwriter/assets/icons/typicons_light/nw_tb-strike-md.svg +4 -0
  43. novelwriter/assets/icons/typicons_light/nw_tb-strike.svg +3 -1
  44. novelwriter/assets/icons/typicons_light/nw_tb-subscript.svg +4 -2
  45. novelwriter/assets/icons/typicons_light/nw_tb-superscript.svg +4 -2
  46. novelwriter/assets/icons/typicons_light/nw_tb-underline.svg +4 -2
  47. novelwriter/assets/icons/typicons_light/typ_document-add-col.svg +8 -0
  48. novelwriter/assets/icons/typicons_light/typ_document-add.svg +4 -0
  49. novelwriter/assets/icons/typicons_light/typ_document.svg +4 -0
  50. novelwriter/assets/icons/typicons_light/typ_th-dot-more.svg +4 -0
  51. novelwriter/assets/images/novelwriter-text-dark.svg +4 -0
  52. novelwriter/assets/images/novelwriter-text-light.svg +4 -0
  53. novelwriter/assets/images/welcome-dark.jpg +0 -0
  54. novelwriter/assets/images/welcome-light.jpg +0 -0
  55. novelwriter/assets/manual.pdf +0 -0
  56. novelwriter/assets/sample.zip +0 -0
  57. novelwriter/assets/syntax/default_dark.conf +1 -0
  58. novelwriter/assets/syntax/default_light.conf +1 -0
  59. novelwriter/assets/syntax/grey_dark.conf +1 -0
  60. novelwriter/assets/syntax/grey_light.conf +1 -0
  61. novelwriter/assets/syntax/light_owl.conf +1 -0
  62. novelwriter/assets/syntax/night_owl.conf +1 -0
  63. novelwriter/assets/syntax/solarized_dark.conf +1 -0
  64. novelwriter/assets/syntax/solarized_light.conf +1 -0
  65. novelwriter/assets/syntax/tomorrow.conf +1 -0
  66. novelwriter/assets/syntax/tomorrow_night.conf +1 -0
  67. novelwriter/assets/syntax/tomorrow_night_blue.conf +1 -0
  68. novelwriter/assets/syntax/tomorrow_night_bright.conf +1 -0
  69. novelwriter/assets/syntax/tomorrow_night_eighties.conf +1 -0
  70. novelwriter/assets/text/credits_en.htm +4 -2
  71. novelwriter/assets/themes/default_dark.conf +2 -2
  72. novelwriter/assets/themes/default_light.conf +2 -2
  73. novelwriter/common.py +64 -66
  74. novelwriter/config.py +39 -44
  75. novelwriter/constants.py +39 -17
  76. novelwriter/core/buildsettings.py +8 -8
  77. novelwriter/core/coretools.py +194 -155
  78. novelwriter/core/docbuild.py +7 -4
  79. novelwriter/core/document.py +7 -7
  80. novelwriter/core/index.py +90 -57
  81. novelwriter/core/item.py +23 -5
  82. novelwriter/core/options.py +11 -10
  83. novelwriter/core/project.py +72 -47
  84. novelwriter/core/projectdata.py +3 -16
  85. novelwriter/core/projectxml.py +14 -42
  86. novelwriter/core/sessions.py +4 -3
  87. novelwriter/core/spellcheck.py +6 -4
  88. novelwriter/core/status.py +5 -4
  89. novelwriter/core/storage.py +179 -141
  90. novelwriter/core/tohtml.py +6 -4
  91. novelwriter/core/tokenizer.py +74 -46
  92. novelwriter/core/tomd.py +2 -2
  93. novelwriter/core/toodt.py +41 -31
  94. novelwriter/core/tree.py +5 -4
  95. novelwriter/dialogs/about.py +88 -179
  96. novelwriter/dialogs/docmerge.py +30 -20
  97. novelwriter/dialogs/docsplit.py +33 -22
  98. novelwriter/dialogs/editlabel.py +20 -8
  99. novelwriter/dialogs/preferences.py +562 -725
  100. novelwriter/dialogs/{projsettings.py → projectsettings.py} +301 -270
  101. novelwriter/dialogs/quotes.py +47 -36
  102. novelwriter/dialogs/wordlist.py +128 -59
  103. novelwriter/enum.py +25 -22
  104. novelwriter/error.py +2 -2
  105. novelwriter/extensions/circularprogress.py +12 -12
  106. novelwriter/extensions/configlayout.py +185 -146
  107. novelwriter/extensions/{wheeleventfilter.py → eventfilters.py} +15 -5
  108. novelwriter/extensions/modified.py +81 -0
  109. novelwriter/extensions/novelselector.py +27 -13
  110. novelwriter/extensions/pagedsidebar.py +15 -20
  111. novelwriter/extensions/simpleprogress.py +8 -9
  112. novelwriter/extensions/statusled.py +9 -9
  113. novelwriter/extensions/switch.py +32 -64
  114. novelwriter/extensions/switchbox.py +2 -7
  115. novelwriter/extensions/versioninfo.py +153 -0
  116. novelwriter/gui/doceditor.py +250 -214
  117. novelwriter/gui/dochighlight.py +66 -94
  118. novelwriter/gui/docviewer.py +71 -98
  119. novelwriter/gui/docviewerpanel.py +140 -47
  120. novelwriter/gui/editordocument.py +3 -3
  121. novelwriter/gui/itemdetails.py +9 -9
  122. novelwriter/gui/mainmenu.py +47 -46
  123. novelwriter/gui/noveltree.py +53 -61
  124. novelwriter/gui/outline.py +100 -76
  125. novelwriter/gui/projtree.py +193 -67
  126. novelwriter/gui/sidebar.py +9 -8
  127. novelwriter/gui/statusbar.py +49 -7
  128. novelwriter/gui/theme.py +65 -74
  129. novelwriter/guimain.py +173 -330
  130. novelwriter/shared.py +68 -30
  131. novelwriter/tools/dictionaries.py +7 -8
  132. novelwriter/tools/lipsum.py +34 -28
  133. novelwriter/tools/manusbuild.py +3 -4
  134. novelwriter/tools/manuscript.py +25 -32
  135. novelwriter/tools/manussettings.py +194 -225
  136. novelwriter/tools/noveldetails.py +525 -0
  137. novelwriter/tools/welcome.py +802 -0
  138. novelwriter/tools/writingstats.py +26 -13
  139. novelwriter/assets/icons/typicons_dark/nw_tb-markdown.svg +0 -8
  140. novelwriter/assets/icons/typicons_dark/nw_tb-shortcode.svg +0 -8
  141. novelwriter/assets/icons/typicons_light/nw_tb-markdown.svg +0 -8
  142. novelwriter/assets/icons/typicons_light/nw_tb-shortcode.svg +0 -8
  143. novelwriter/assets/images/wizard-back.jpg +0 -0
  144. novelwriter/assets/text/gplv3_en.htm +0 -641
  145. novelwriter/assets/text/release_notes.htm +0 -17
  146. novelwriter/dialogs/projdetails.py +0 -525
  147. novelwriter/dialogs/projload.py +0 -298
  148. novelwriter/dialogs/updates.py +0 -182
  149. novelwriter/extensions/pageddialog.py +0 -130
  150. novelwriter/tools/projwizard.py +0 -478
  151. {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/LICENSE.md +0 -0
  152. {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/entry_points.txt +0 -0
  153. {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/top_level.txt +0 -0
novelwriter/gui/theme.py CHANGED
@@ -7,7 +7,7 @@ Created: 2019-05-18 [0.1.3] GuiTheme
7
7
  Created: 2019-11-08 [0.4] GuiIcons
8
8
 
9
9
  This file is a part of novelWriter
10
- Copyright 2018–2023, Veronica Berglyd Olsen
10
+ Copyright 2018–2024, Veronica Berglyd Olsen
11
11
 
12
12
  This program is free software: you can redistribute it and/or modify
13
13
  it under the terms of the GNU General Public License as published by
@@ -67,12 +67,13 @@ class GuiTheme:
67
67
  self.themeLicense = ""
68
68
  self.themeLicenseUrl = ""
69
69
  self.themeIcons = ""
70
+ self.isLightTheme = True
70
71
 
71
72
  # GUI
72
- self.statNone = [120, 120, 120]
73
- self.statUnsaved = [200, 15, 39]
74
- self.statSaved = [2, 133, 37]
75
- self.helpText = [0, 0, 0]
73
+ self.statNone = QColor(120, 120, 120)
74
+ self.statUnsaved = QColor(200, 15, 39)
75
+ self.statSaved = QColor(2, 133, 37)
76
+ self.helpText = QColor(0, 0, 0)
76
77
 
77
78
  # Loaded Syntax Settings
78
79
  # ======================
@@ -87,23 +88,24 @@ class GuiTheme:
87
88
  self.syntaxLicenseUrl = ""
88
89
 
89
90
  # Colours
90
- self.colBack = [255, 255, 255]
91
- self.colText = [0, 0, 0]
92
- self.colLink = [0, 0, 0]
93
- self.colHead = [0, 0, 0]
94
- self.colHeadH = [0, 0, 0]
95
- self.colEmph = [0, 0, 0]
96
- self.colDialN = [0, 0, 0]
97
- self.colDialD = [0, 0, 0]
98
- self.colDialS = [0, 0, 0]
99
- self.colHidden = [0, 0, 0]
100
- self.colCode = [0, 0, 0]
101
- self.colKey = [0, 0, 0]
102
- self.colVal = [0, 0, 0]
103
- self.colSpell = [0, 0, 0]
104
- self.colError = [0, 0, 0]
105
- self.colRepTag = [0, 0, 0]
106
- self.colMod = [0, 0, 0]
91
+ self.colBack = QColor(255, 255, 255)
92
+ self.colText = QColor(0, 0, 0)
93
+ self.colLink = QColor(0, 0, 0)
94
+ self.colHead = QColor(0, 0, 0)
95
+ self.colHeadH = QColor(0, 0, 0)
96
+ self.colEmph = QColor(0, 0, 0)
97
+ self.colDialN = QColor(0, 0, 0)
98
+ self.colDialD = QColor(0, 0, 0)
99
+ self.colDialS = QColor(0, 0, 0)
100
+ self.colHidden = QColor(0, 0, 0)
101
+ self.colCode = QColor(0, 0, 0)
102
+ self.colKey = QColor(0, 0, 0)
103
+ self.colVal = QColor(0, 0, 0)
104
+ self.colOpt = QColor(0, 0, 0)
105
+ self.colSpell = QColor(0, 0, 0)
106
+ self.colError = QColor(0, 0, 0)
107
+ self.colRepTag = QColor(0, 0, 0)
108
+ self.colMod = QColor(0, 0, 0)
107
109
 
108
110
  # Class Setup
109
111
  # ===========
@@ -112,7 +114,7 @@ class GuiTheme:
112
114
  self._setGuiFont()
113
115
 
114
116
  # Load Themes
115
- self._guiPalette = QPalette()
117
+ self._guiPalette = QPalette()
116
118
  self._themeList: list[tuple[str, str]] = []
117
119
  self._syntaxList: list[tuple[str, str]] = []
118
120
  self._availThemes: dict[str, Path] = {}
@@ -254,13 +256,13 @@ class GuiTheme:
254
256
 
255
257
  backLNess = backCol.lightnessF()
256
258
  textLNess = textCol.lightnessF()
257
-
258
- if self.helpText == [0, 0, 0]:
259
- if backLNess > textLNess:
259
+ self.isLightTheme = backLNess > textLNess
260
+ if self.helpText == QColor(0, 0, 0):
261
+ if self.isLightTheme:
260
262
  helpLCol = textLNess + 0.35*(backLNess - textLNess)
261
263
  else:
262
264
  helpLCol = backLNess + 0.65*(textLNess - backLNess)
263
- self.helpText = [int(255*helpLCol)]*3
265
+ self.helpText = QColor.fromHsl(0, 0, int(255*helpLCol))
264
266
 
265
267
  # Icons
266
268
  defaultIcons = "typicons_light" if backLNess >= 0.5 else "typicons_dark"
@@ -322,6 +324,7 @@ class GuiTheme:
322
324
  self.colCode = self._parseColour(confParser, cnfSec, "shortcode")
323
325
  self.colKey = self._parseColour(confParser, cnfSec, "keyword")
324
326
  self.colVal = self._parseColour(confParser, cnfSec, "value")
327
+ self.colOpt = self._parseColour(confParser, cnfSec, "optional")
325
328
  self.colSpell = self._parseColour(confParser, cnfSec, "spellcheckline")
326
329
  self.colError = self._parseColour(confParser, cnfSec, "errorline")
327
330
  self.colRepTag = self._parseColour(confParser, cnfSec, "replacetag")
@@ -367,22 +370,22 @@ class GuiTheme:
367
370
 
368
371
  def _setGuiFont(self) -> None:
369
372
  """Update the GUI's font style from settings."""
370
- theFont = QFont()
373
+ font = QFont()
371
374
  fontDB = QFontDatabase()
372
375
  if CONFIG.guiFont not in fontDB.families():
373
376
  if CONFIG.osWindows and "Arial" in fontDB.families():
374
377
  # On Windows we default to Arial if possible
375
- theFont.setFamily("Arial")
376
- theFont.setPointSize(10)
378
+ font.setFamily("Arial")
379
+ font.setPointSize(10)
377
380
  else:
378
- theFont = fontDB.systemFont(QFontDatabase.GeneralFont)
379
- CONFIG.guiFont = theFont.family()
380
- CONFIG.guiFontSize = theFont.pointSize()
381
+ font = fontDB.systemFont(QFontDatabase.GeneralFont)
382
+ CONFIG.guiFont = font.family()
383
+ CONFIG.guiFontSize = font.pointSize()
381
384
  else:
382
- theFont.setFamily(CONFIG.guiFont)
383
- theFont.setPointSize(CONFIG.guiFontSize)
385
+ font.setFamily(CONFIG.guiFont)
386
+ font.setPointSize(CONFIG.guiFontSize)
384
387
 
385
- qApp.setFont(theFont)
388
+ qApp.setFont(font)
386
389
 
387
390
  return
388
391
 
@@ -397,29 +400,14 @@ class GuiTheme:
397
400
 
398
401
  return True
399
402
 
400
- def _parseColour(self, parser: NWConfigParser, section: str, name: str) -> list[int]:
403
+ def _parseColour(self, parser: NWConfigParser, section: str, name: str) -> QColor:
401
404
  """Parse a colour value from a config string."""
402
- if parser.has_option(section, name):
403
- values = parser.get(section, name).split(",")
404
- result = []
405
- try:
406
- result.append(minmax(int(values[0]), 0, 255))
407
- result.append(minmax(int(values[1]), 0, 255))
408
- result.append(minmax(int(values[2]), 0, 255))
409
- except Exception:
410
- logger.error("Could not load theme colours for '%s' from config file", name)
411
- result = [0, 0, 0]
412
- else:
413
- logger.warning("Could not find theme colours for '%s' in config file", name)
414
- result = [0, 0, 0]
415
- return result
405
+ return QColor(*parser.rdIntList(section, name, [0, 0, 0, 255]))
416
406
 
417
407
  def _setPalette(self, parser: NWConfigParser, section: str,
418
408
  name: str, value: QPalette.ColorRole) -> None:
419
409
  """Set a palette colour value from a config string."""
420
- self._guiPalette.setColor(
421
- value, QColor(*self._parseColour(parser, section, name))
422
- )
410
+ self._guiPalette.setColor(value, self._parseColour(parser, section, name))
423
411
  return
424
412
 
425
413
  # End Class GuiTheme
@@ -443,7 +431,7 @@ class GuiIcons:
443
431
  missing, a blank icon is returned and a warning issued.
444
432
  """
445
433
 
446
- ICON_KEYS = {
434
+ ICON_KEYS: set[str] = {
447
435
  # Project and GUI Icons
448
436
  "novelwriter", "alert_error", "alert_info", "alert_question", "alert_warn",
449
437
  "build_excluded", "build_filtered", "build_included", "proj_chapter", "proj_details",
@@ -453,20 +441,21 @@ class GuiIcons:
453
441
 
454
442
  # Class Icons
455
443
  "cls_archive", "cls_character", "cls_custom", "cls_entity", "cls_none", "cls_novel",
456
- "cls_object", "cls_plot", "cls_timeline", "cls_trash", "cls_world",
444
+ "cls_object", "cls_plot", "cls_template", "cls_timeline", "cls_trash", "cls_world",
457
445
 
458
446
  # Search Icons
459
447
  "search_cancel", "search_case", "search_loop", "search_preserve", "search_project",
460
448
  "search_regex", "search_word",
461
449
 
462
450
  # Format Icons
463
- "fmt_bold", "fmt_italic", "fmt_mode-md", "fmt_mode-sc", "fmt_strike", "fmt_subscript",
464
- "fmt_superscript", "fmt_underline",
451
+ "fmt_bold", "fmt_bold-md", "fmt_italic", "fmt_italic-md", "fmt_strike", "fmt_strike-md",
452
+ "fmt_subscript", "fmt_superscript", "fmt_underline",
465
453
 
466
454
  # General Button Icons
467
- "add", "backward", "bookmark", "browse", "checked", "close", "cross", "down", "edit",
468
- "export", "forward", "maximise", "menu", "minimise", "noncheckable", "panel", "refresh",
469
- "remove", "revert", "search_replace", "search", "settings", "unchecked", "up", "view",
455
+ "add", "add_document", "backward", "bookmark", "browse", "checked", "close", "cross",
456
+ "document", "down", "edit", "export", "forward", "import", "maximise", "menu", "minimise",
457
+ "more", "noncheckable", "panel", "refresh", "remove", "revert", "search_replace", "search",
458
+ "settings", "star", "unchecked", "up", "view",
470
459
 
471
460
  # Switches
472
461
  "sticky-on", "sticky-off",
@@ -478,14 +467,14 @@ class GuiIcons:
478
467
  "deco_doc_nt_n",
479
468
  }
480
469
 
481
- TOGGLE_ICON_KEYS = {
482
- "sticky": ("sticky-on", "sticky-off"),
483
- "bullet": ("bullet-on", "bullet-off"),
484
- "fmt_mode": ("fmt_mode-sc", "fmt_mode-md"),
470
+ TOGGLE_ICON_KEYS: dict[str, tuple[str, str]] = {
471
+ "sticky": ("sticky-on", "sticky-off"),
472
+ "bullet": ("bullet-on", "bullet-off"),
485
473
  }
486
474
 
487
- IMAGE_MAP = {
488
- "wiz-back": "wizard-back.jpg",
475
+ IMAGE_MAP: dict[str, tuple[str, str]] = {
476
+ "welcome": ("welcome-light.jpg", "welcome-dark.jpg"),
477
+ "nw-text": ("novelwriter-text-light.svg", "novelwriter-text-dark.svg"),
489
478
  }
490
479
 
491
480
  def __init__(self, mainTheme: GuiTheme) -> None:
@@ -599,7 +588,8 @@ class GuiIcons:
599
588
  if name in self._themeMap:
600
589
  imgPath = self._themeMap[name]
601
590
  elif name in self.IMAGE_MAP:
602
- imgPath = CONFIG.assetPath("images") / self.IMAGE_MAP[name]
591
+ idx = 0 if self.mainTheme.isLightTheme else 1
592
+ imgPath = CONFIG.assetPath("images") / self.IMAGE_MAP[name][idx]
603
593
  else:
604
594
  logger.error("Decoration with name '%s' does not exist", name)
605
595
  return QPixmap()
@@ -609,12 +599,13 @@ class GuiIcons:
609
599
  return QPixmap()
610
600
 
611
601
  pixmap = QPixmap(str(imgPath))
602
+ tMode = Qt.TransformationMode.SmoothTransformation
612
603
  if w is not None and h is not None:
613
- return pixmap.scaled(w, h, Qt.IgnoreAspectRatio, Qt.SmoothTransformation)
604
+ return pixmap.scaled(w, h, Qt.AspectRatioMode.IgnoreAspectRatio, tMode)
614
605
  elif w is None and h is not None:
615
- return pixmap.scaledToHeight(h, Qt.SmoothTransformation)
606
+ return pixmap.scaledToHeight(h, tMode)
616
607
  elif w is not None and h is None:
617
- return pixmap.scaledToWidth(w, Qt.SmoothTransformation)
608
+ return pixmap.scaledToWidth(w, tMode)
618
609
 
619
610
  return pixmap
620
611
 
@@ -633,8 +624,8 @@ class GuiIcons:
633
624
  pOne = self.getPixmap(self.TOGGLE_ICON_KEYS[name][0], size)
634
625
  pTwo = self.getPixmap(self.TOGGLE_ICON_KEYS[name][1], size)
635
626
  icon = QIcon()
636
- icon.addPixmap(pOne, QIcon.Normal, QIcon.On)
637
- icon.addPixmap(pTwo, QIcon.Normal, QIcon.Off)
627
+ icon.addPixmap(pOne, QIcon.Mode.Normal, QIcon.State.On)
628
+ icon.addPixmap(pTwo, QIcon.Mode.Normal, QIcon.State.Off)
638
629
  return icon
639
630
  return QIcon()
640
631
 
@@ -642,7 +633,7 @@ class GuiIcons:
642
633
  """Return an icon from the icon buffer as a QPixmap. If it
643
634
  doesn't exist, return an empty QPixmap.
644
635
  """
645
- return self.getIcon(name).pixmap(size[0], size[1], QIcon.Normal)
636
+ return self.getIcon(name).pixmap(size[0], size[1], QIcon.Mode.Normal)
646
637
 
647
638
  def getItemIcon(self, tType: nwItemType, tClass: nwItemClass,
648
639
  tLayout: nwItemLayout, hLevel: str = "H0") -> QIcon: