novelWriter 2.7.4__py3-none-any.whl → 2.8b1__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.
- novelwriter/__init__.py +8 -7
 - novelwriter/assets/icons/font_awesome.icons +22 -4
 - novelwriter/assets/icons/material_filled_normal.icons +20 -2
 - novelwriter/assets/icons/material_filled_thin.icons +20 -2
 - novelwriter/assets/icons/material_rounded_normal.icons +20 -2
 - novelwriter/assets/icons/material_rounded_thin.icons +20 -2
 - novelwriter/assets/icons/material_sharp_normal.icons +20 -2
 - novelwriter/assets/icons/material_sharp_thin.icons +20 -2
 - novelwriter/assets/icons/remix_filled.icons +20 -2
 - novelwriter/assets/icons/remix_outline.icons +20 -2
 - novelwriter/assets/images/welcome.webp +0 -0
 - novelwriter/assets/manual.pdf +0 -0
 - novelwriter/assets/manual_fr.pdf +0 -0
 - novelwriter/assets/sample.zip +0 -0
 - novelwriter/assets/text/credits_en.htm +61 -11
 - novelwriter/assets/themes/aura.conf +97 -0
 - novelwriter/assets/themes/aura_bright.conf +95 -0
 - novelwriter/assets/themes/aura_soft.conf +97 -0
 - novelwriter/assets/themes/b2t_garden_dark.conf +97 -0
 - novelwriter/assets/themes/b2t_garden_light.conf +97 -0
 - novelwriter/assets/themes/b2t_suburb_dark.conf +97 -0
 - novelwriter/assets/themes/b2t_suburb_light.conf +97 -0
 - novelwriter/assets/themes/b4t_classic_o_dark.conf +97 -0
 - novelwriter/assets/themes/b4t_classic_o_light.conf +97 -0
 - novelwriter/assets/themes/b4t_modern_c_dark.conf +97 -0
 - novelwriter/assets/themes/b4t_modern_c_light.conf +97 -0
 - novelwriter/assets/themes/blue_streak_dark.conf +97 -0
 - novelwriter/assets/themes/blue_streak_light.conf +97 -0
 - novelwriter/assets/themes/castle_day.conf +95 -0
 - novelwriter/assets/themes/castle_night.conf +95 -0
 - novelwriter/assets/themes/catppuccin_latte.conf +97 -0
 - novelwriter/assets/themes/catppuccin_mocha.conf +97 -0
 - novelwriter/assets/themes/chalky_soil.conf +95 -0
 - novelwriter/assets/themes/chernozem.conf +95 -0
 - novelwriter/assets/themes/cyberpunk_night.conf +88 -40
 - novelwriter/assets/themes/default_dark.conf +89 -41
 - novelwriter/assets/themes/default_light.conf +89 -41
 - novelwriter/assets/themes/dracula.conf +91 -42
 - novelwriter/assets/themes/espresso.conf +97 -0
 - novelwriter/assets/themes/everforest_dark.conf +97 -0
 - novelwriter/assets/themes/everforest_light.conf +97 -0
 - novelwriter/assets/themes/floral_daydream.conf +95 -0
 - novelwriter/assets/themes/floral_midnight.conf +95 -0
 - novelwriter/assets/themes/full_moon.conf +95 -0
 - novelwriter/assets/themes/grey_dark.conf +97 -0
 - novelwriter/assets/themes/grey_light.conf +97 -0
 - novelwriter/assets/themes/horizon_dark.conf +97 -0
 - novelwriter/assets/themes/horizon_light.conf +97 -0
 - novelwriter/assets/themes/jewel_case_dark.conf +95 -0
 - novelwriter/assets/themes/jewel_case_light.conf +95 -0
 - novelwriter/assets/themes/lcars.conf +97 -0
 - novelwriter/assets/themes/light_owl.conf +117 -0
 - novelwriter/assets/themes/new_moon.conf +97 -0
 - novelwriter/assets/themes/night_owl.conf +117 -0
 - novelwriter/assets/themes/noctis.conf +129 -0
 - novelwriter/assets/themes/noctis_lux.conf +129 -0
 - novelwriter/assets/themes/nord.conf +97 -0
 - novelwriter/assets/themes/nordlicht.conf +95 -0
 - novelwriter/assets/themes/otium_dark.conf +95 -0
 - novelwriter/assets/themes/otium_light.conf +95 -0
 - novelwriter/assets/themes/paragon.conf +96 -0
 - novelwriter/assets/themes/primer_light.conf +97 -0
 - novelwriter/assets/themes/primer_night.conf +97 -0
 - novelwriter/assets/themes/rose_pine.conf +97 -0
 - novelwriter/assets/themes/rose_pine_dawn.conf +97 -0
 - novelwriter/assets/themes/ruby_day.conf +95 -0
 - novelwriter/assets/themes/ruby_night.conf +95 -0
 - novelwriter/assets/themes/selenium_dark.conf +95 -0
 - novelwriter/assets/themes/selenium_light.conf +95 -0
 - novelwriter/assets/themes/sepia_dark.conf +95 -0
 - novelwriter/assets/themes/sepia_light.conf +95 -0
 - novelwriter/assets/themes/snazzy.conf +102 -40
 - novelwriter/assets/themes/solarized_dark.conf +108 -40
 - novelwriter/assets/themes/solarized_light.conf +108 -40
 - novelwriter/assets/themes/sultana_light.conf +95 -0
 - novelwriter/assets/themes/sultana_night.conf +95 -0
 - novelwriter/assets/themes/tango_dark.conf +111 -0
 - novelwriter/assets/themes/tango_light.conf +111 -0
 - novelwriter/assets/themes/tomorrow.conf +117 -0
 - novelwriter/assets/themes/tomorrow_night.conf +117 -0
 - novelwriter/assets/themes/tomorrow_night_blue.conf +117 -0
 - novelwriter/assets/themes/tomorrow_night_bright.conf +117 -0
 - novelwriter/assets/themes/tomorrow_night_eighties.conf +117 -0
 - novelwriter/assets/themes/vivid_black_green.conf +97 -0
 - novelwriter/assets/themes/vivid_black_red.conf +97 -0
 - novelwriter/assets/themes/vivid_white_green.conf +97 -0
 - novelwriter/assets/themes/vivid_white_red.conf +97 -0
 - novelwriter/assets/themes/warpgate.conf +96 -0
 - novelwriter/assets/themes/waterlily_dark.conf +95 -0
 - novelwriter/assets/themes/waterlily_light.conf +95 -0
 - novelwriter/common.py +47 -17
 - novelwriter/config.py +57 -62
 - novelwriter/constants.py +32 -6
 - novelwriter/core/buildsettings.py +3 -23
 - novelwriter/core/coretools.py +21 -25
 - novelwriter/core/docbuild.py +4 -9
 - novelwriter/core/document.py +2 -6
 - novelwriter/core/index.py +33 -53
 - novelwriter/core/indexdata.py +17 -22
 - novelwriter/core/item.py +11 -35
 - novelwriter/core/itemmodel.py +5 -21
 - novelwriter/core/novelmodel.py +3 -7
 - novelwriter/core/options.py +3 -4
 - novelwriter/core/project.py +31 -21
 - novelwriter/core/projectdata.py +2 -21
 - novelwriter/core/projectxml.py +13 -21
 - novelwriter/core/sessions.py +2 -4
 - novelwriter/core/spellcheck.py +12 -13
 - novelwriter/core/status.py +27 -20
 - novelwriter/core/storage.py +5 -10
 - novelwriter/core/tree.py +6 -15
 - novelwriter/dialogs/about.py +9 -10
 - novelwriter/dialogs/docmerge.py +17 -14
 - novelwriter/dialogs/docsplit.py +18 -14
 - novelwriter/dialogs/editlabel.py +15 -9
 - novelwriter/dialogs/preferences.py +69 -68
 - novelwriter/dialogs/projectsettings.py +88 -67
 - novelwriter/dialogs/quotes.py +15 -10
 - novelwriter/dialogs/wordlist.py +18 -21
 - novelwriter/enum.py +75 -30
 - novelwriter/error.py +6 -11
 - novelwriter/extensions/configlayout.py +8 -34
 - novelwriter/extensions/eventfilters.py +3 -3
 - novelwriter/extensions/modified.py +87 -32
 - novelwriter/extensions/novelselector.py +13 -12
 - novelwriter/extensions/pagedsidebar.py +10 -18
 - novelwriter/extensions/progressbars.py +5 -11
 - novelwriter/extensions/statusled.py +3 -6
 - novelwriter/extensions/switch.py +8 -11
 - novelwriter/extensions/switchbox.py +2 -11
 - novelwriter/extensions/versioninfo.py +6 -7
 - novelwriter/formats/shared.py +10 -2
 - novelwriter/formats/todocx.py +15 -37
 - novelwriter/formats/tohtml.py +52 -61
 - novelwriter/formats/tokenizer.py +33 -64
 - novelwriter/formats/tomarkdown.py +4 -11
 - novelwriter/formats/toodt.py +12 -71
 - novelwriter/formats/toqdoc.py +11 -21
 - novelwriter/formats/toraw.py +2 -6
 - novelwriter/gui/doceditor.py +207 -245
 - novelwriter/gui/dochighlight.py +142 -101
 - novelwriter/gui/docviewer.py +53 -84
 - novelwriter/gui/docviewerpanel.py +18 -41
 - novelwriter/gui/editordocument.py +12 -17
 - novelwriter/gui/itemdetails.py +5 -14
 - novelwriter/gui/mainmenu.py +24 -32
 - novelwriter/gui/noveltree.py +13 -51
 - novelwriter/gui/outline.py +20 -61
 - novelwriter/gui/projtree.py +40 -96
 - novelwriter/gui/search.py +9 -24
 - novelwriter/gui/sidebar.py +54 -22
 - novelwriter/gui/statusbar.py +7 -22
 - novelwriter/gui/theme.py +482 -368
 - novelwriter/guimain.py +87 -101
 - novelwriter/shared.py +79 -48
 - novelwriter/splash.py +9 -5
 - novelwriter/text/comments.py +1 -1
 - novelwriter/text/counting.py +9 -5
 - novelwriter/text/patterns.py +20 -15
 - novelwriter/tools/dictionaries.py +18 -16
 - novelwriter/tools/lipsum.py +15 -17
 - novelwriter/tools/manusbuild.py +25 -45
 - novelwriter/tools/manuscript.py +94 -95
 - novelwriter/tools/manussettings.py +149 -104
 - novelwriter/tools/noveldetails.py +10 -24
 - novelwriter/tools/welcome.py +24 -72
 - novelwriter/tools/writingstats.py +17 -26
 - novelwriter/types.py +25 -13
 - {novelwriter-2.7.4.dist-info → novelwriter-2.8b1.dist-info}/METADATA +7 -7
 - novelwriter-2.8b1.dist-info/RECORD +212 -0
 - novelwriter/assets/images/welcome-dark.jpg +0 -0
 - novelwriter/assets/images/welcome-light.jpg +0 -0
 - novelwriter/assets/syntax/cyberpunk_night.conf +0 -28
 - novelwriter/assets/syntax/default_dark.conf +0 -42
 - novelwriter/assets/syntax/default_light.conf +0 -42
 - novelwriter/assets/syntax/dracula.conf +0 -44
 - novelwriter/assets/syntax/grey_dark.conf +0 -29
 - novelwriter/assets/syntax/grey_light.conf +0 -29
 - novelwriter/assets/syntax/light_owl.conf +0 -49
 - novelwriter/assets/syntax/night_owl.conf +0 -49
 - novelwriter/assets/syntax/snazzy.conf +0 -42
 - novelwriter/assets/syntax/solarized_dark.conf +0 -29
 - novelwriter/assets/syntax/solarized_light.conf +0 -29
 - novelwriter/assets/syntax/tango.conf +0 -39
 - novelwriter/assets/syntax/tomorrow.conf +0 -49
 - novelwriter/assets/syntax/tomorrow_night.conf +0 -49
 - novelwriter/assets/syntax/tomorrow_night_blue.conf +0 -49
 - novelwriter/assets/syntax/tomorrow_night_bright.conf +0 -49
 - novelwriter/assets/syntax/tomorrow_night_eighties.conf +0 -49
 - novelwriter/assets/themes/default.conf +0 -3
 - novelwriter-2.7.4.dist-info/RECORD +0 -163
 - {novelwriter-2.7.4.dist-info → novelwriter-2.8b1.dist-info}/WHEEL +0 -0
 - {novelwriter-2.7.4.dist-info → novelwriter-2.8b1.dist-info}/entry_points.txt +0 -0
 - {novelwriter-2.7.4.dist-info → novelwriter-2.8b1.dist-info}/licenses/LICENSE.md +0 -0
 - {novelwriter-2.7.4.dist-info → novelwriter-2.8b1.dist-info}/licenses/setup/LICENSE-Apache-2.0.txt +0 -0
 - {novelwriter-2.7.4.dist-info → novelwriter-2.8b1.dist-info}/top_level.txt +0 -0
 
| 
         @@ -20,7 +20,7 @@ General Public License for more details. 
     | 
|
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
            You should have received a copy of the GNU General Public License
         
     | 
| 
       22 
22 
     | 
    
         
             
            along with this program. If not, see <https://www.gnu.org/licenses/>.
         
     | 
| 
       23 
     | 
    
         
            -
            """
         
     | 
| 
      
 23 
     | 
    
         
            +
            """  # noqa
         
     | 
| 
       24 
24 
     | 
    
         
             
            from __future__ import annotations
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
            import logging
         
     | 
| 
         @@ -40,6 +40,7 @@ from novelwriter import CONFIG, SHARED 
     | 
|
| 
       40 
40 
     | 
    
         
             
            from novelwriter.common import describeFont, fontMatcher, qtAddAction, qtLambda
         
     | 
| 
       41 
41 
     | 
    
         
             
            from novelwriter.constants import nwHeadFmt, nwKeyWords, nwLabels, nwUnicode, trConst
         
     | 
| 
       42 
42 
     | 
    
         
             
            from novelwriter.core.buildsettings import BuildSettings, FilterMode
         
     | 
| 
      
 43 
     | 
    
         
            +
            from novelwriter.enum import nwStandardButton
         
     | 
| 
       43 
44 
     | 
    
         
             
            from novelwriter.extensions.configlayout import (
         
     | 
| 
       44 
45 
     | 
    
         
             
                NColorLabel, NFixedPage, NScrollableForm, NScrollablePage
         
     | 
| 
       45 
46 
     | 
    
         
             
            )
         
     | 
| 
         @@ -50,9 +51,8 @@ from novelwriter.extensions.pagedsidebar import NPagedSideBar 
     | 
|
| 
       50 
51 
     | 
    
         
             
            from novelwriter.extensions.switch import NSwitch
         
     | 
| 
       51 
52 
     | 
    
         
             
            from novelwriter.extensions.switchbox import NSwitchBox
         
     | 
| 
       52 
53 
     | 
    
         
             
            from novelwriter.types import (
         
     | 
| 
       53 
     | 
    
         
            -
                QtAlignCenter, QtAlignLeft,  
     | 
| 
       54 
     | 
    
         
            -
                 
     | 
| 
       55 
     | 
    
         
            -
                QtUserRole
         
     | 
| 
      
 54 
     | 
    
         
            +
                QtAlignCenter, QtAlignLeft, QtHeaderFixed, QtHeaderStretch, QtRoleAccept,
         
     | 
| 
      
 55 
     | 
    
         
            +
                QtRoleApply, QtRoleDestruct, QtUserRole
         
     | 
| 
       56 
56 
     | 
    
         
             
            )
         
     | 
| 
       57 
57 
     | 
    
         | 
| 
       58 
58 
     | 
    
         
             
            if TYPE_CHECKING:
         
     | 
| 
         @@ -62,7 +62,7 @@ logger = logging.getLogger(__name__) 
     | 
|
| 
       62 
62 
     | 
    
         | 
| 
       63 
63 
     | 
    
         | 
| 
       64 
64 
     | 
    
         
             
            class GuiBuildSettings(NToolDialog):
         
     | 
| 
       65 
     | 
    
         
            -
                """GUI Tools: Manuscript Build Settings Dialog
         
     | 
| 
      
 65 
     | 
    
         
            +
                """GUI Tools: Manuscript Build Settings Dialog.
         
     | 
| 
       66 
66 
     | 
    
         | 
| 
       67 
67 
     | 
    
         
             
                The main tool for configuring manuscript builds. It's a GUI tool for
         
     | 
| 
       68 
68 
     | 
    
         
             
                editing JSON build definitions, wrapped as a BuildSettings object.
         
     | 
| 
         @@ -72,7 +72,7 @@ class GuiBuildSettings(NToolDialog): 
     | 
|
| 
       72 
72 
     | 
    
         
             
                OPT_HEADINGS   = 2
         
     | 
| 
       73 
73 
     | 
    
         
             
                OPT_FORMATTING = 10
         
     | 
| 
       74 
74 
     | 
    
         | 
| 
       75 
     | 
    
         
            -
                newSettingsReady = pyqtSignal(BuildSettings)
         
     | 
| 
      
 75 
     | 
    
         
            +
                newSettingsReady = pyqtSignal(BuildSettings, bool)
         
     | 
| 
       76 
76 
     | 
    
         | 
| 
       77 
77 
     | 
    
         
             
                def __init__(self, parent: GuiMain, build: BuildSettings) -> None:
         
     | 
| 
       78 
78 
     | 
    
         
             
                    super().__init__(parent=parent)
         
     | 
| 
         @@ -86,6 +86,7 @@ class GuiBuildSettings(NToolDialog): 
     | 
|
| 
       86 
86 
     | 
    
         
             
                    self.setWindowTitle(self.tr("Manuscript Build Settings"))
         
     | 
| 
       87 
87 
     | 
    
         
             
                    self.setMinimumSize(700, 400)
         
     | 
| 
       88 
88 
     | 
    
         | 
| 
      
 89 
     | 
    
         
            +
                    iPx = SHARED.theme.baseIconHeight
         
     | 
| 
       89 
90 
     | 
    
         
             
                    options = SHARED.project.options
         
     | 
| 
       90 
91 
     | 
    
         
             
                    self.resize(
         
     | 
| 
       91 
92 
     | 
    
         
             
                        options.getInt("GuiBuildSettings", "winWidth", 750),
         
     | 
| 
         @@ -124,9 +125,23 @@ class GuiBuildSettings(NToolDialog): 
     | 
|
| 
       124 
125 
     | 
    
         
             
                    self.toolStack.addWidget(self.optTabHeadings)
         
     | 
| 
       125 
126 
     | 
    
         
             
                    self.toolStack.addWidget(self.optTabFormatting)
         
     | 
| 
       126 
127 
     | 
    
         | 
| 
      
 128 
     | 
    
         
            +
                    # Preview
         
     | 
| 
      
 129 
     | 
    
         
            +
                    self.swtAutoPreview = NSwitch(self, height=iPx)
         
     | 
| 
      
 130 
     | 
    
         
            +
                    self.swtAutoPreview.setChecked(options.getBool("GuiBuildSettings", "autoPreview", True))
         
     | 
| 
      
 131 
     | 
    
         
            +
             
     | 
| 
      
 132 
     | 
    
         
            +
                    self.lblAutoPreview = QLabel(self.tr("Auro-Update Preview"), self)
         
     | 
| 
      
 133 
     | 
    
         
            +
                    self.lblAutoPreview.setBuddy(self.swtAutoPreview)
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
       127 
135 
     | 
    
         
             
                    # Buttons
         
     | 
| 
       128 
     | 
    
         
            -
                    self. 
     | 
| 
       129 
     | 
    
         
            -
                    self. 
     | 
| 
      
 136 
     | 
    
         
            +
                    self.btnApply = SHARED.theme.getStandardButton(nwStandardButton.APPLY, self)
         
     | 
| 
      
 137 
     | 
    
         
            +
                    self.btnSave = SHARED.theme.getStandardButton(nwStandardButton.SAVE, self)
         
     | 
| 
      
 138 
     | 
    
         
            +
                    self.btnClose = SHARED.theme.getStandardButton(nwStandardButton.CLOSE, self)
         
     | 
| 
      
 139 
     | 
    
         
            +
             
     | 
| 
      
 140 
     | 
    
         
            +
                    self.btnBox = QDialogButtonBox(self)
         
     | 
| 
      
 141 
     | 
    
         
            +
                    self.btnBox.addButton(self.btnApply, QtRoleApply)
         
     | 
| 
      
 142 
     | 
    
         
            +
                    self.btnBox.addButton(self.btnSave, QtRoleAccept)
         
     | 
| 
      
 143 
     | 
    
         
            +
                    self.btnBox.addButton(self.btnClose, QtRoleDestruct)
         
     | 
| 
      
 144 
     | 
    
         
            +
                    self.btnBox.clicked.connect(self._dialogButtonClicked)
         
     | 
| 
       130 
145 
     | 
    
         | 
| 
       131 
146 
     | 
    
         
             
                    # Assemble
         
     | 
| 
       132 
147 
     | 
    
         
             
                    self.topBox = QHBoxLayout()
         
     | 
| 
         @@ -140,24 +155,29 @@ class GuiBuildSettings(NToolDialog): 
     | 
|
| 
       140 
155 
     | 
    
         
             
                    self.mainBox.addWidget(self.toolStack)
         
     | 
| 
       141 
156 
     | 
    
         
             
                    self.mainBox.setContentsMargins(0, 0, 0, 0)
         
     | 
| 
       142 
157 
     | 
    
         | 
| 
      
 158 
     | 
    
         
            +
                    self.bottomBox = QHBoxLayout()
         
     | 
| 
      
 159 
     | 
    
         
            +
                    self.bottomBox.addWidget(self.lblAutoPreview, 0)
         
     | 
| 
      
 160 
     | 
    
         
            +
                    self.bottomBox.addWidget(self.swtAutoPreview, 0)
         
     | 
| 
      
 161 
     | 
    
         
            +
                    self.bottomBox.addSpacing(8)
         
     | 
| 
      
 162 
     | 
    
         
            +
                    self.bottomBox.addWidget(self.btnBox, 1)
         
     | 
| 
      
 163 
     | 
    
         
            +
                    self.bottomBox.setContentsMargins(0, 0, 0, 0)
         
     | 
| 
      
 164 
     | 
    
         
            +
             
     | 
| 
       143 
165 
     | 
    
         
             
                    self.outerBox = QVBoxLayout()
         
     | 
| 
       144 
166 
     | 
    
         
             
                    self.outerBox.addLayout(self.topBox)
         
     | 
| 
       145 
167 
     | 
    
         
             
                    self.outerBox.addLayout(self.mainBox)
         
     | 
| 
       146 
     | 
    
         
            -
                    self.outerBox. 
     | 
| 
      
 168 
     | 
    
         
            +
                    self.outerBox.addLayout(self.bottomBox)
         
     | 
| 
       147 
169 
     | 
    
         
             
                    self.outerBox.setSpacing(12)
         
     | 
| 
       148 
170 
     | 
    
         | 
| 
       149 
171 
     | 
    
         
             
                    self.setLayout(self.outerBox)
         
     | 
| 
      
 172 
     | 
    
         
            +
                    self.updateTheme(init=True)
         
     | 
| 
       150 
173 
     | 
    
         | 
| 
       151 
174 
     | 
    
         
             
                    # Set Default Tab
         
     | 
| 
       152 
175 
     | 
    
         
             
                    self.sidebar.setSelected(self.OPT_FILTERS)
         
     | 
| 
       153 
176 
     | 
    
         | 
| 
       154 
177 
     | 
    
         
             
                    logger.debug("Ready: GuiBuildSettings")
         
     | 
| 
       155 
178 
     | 
    
         | 
| 
       156 
     | 
    
         
            -
                    return
         
     | 
| 
       157 
     | 
    
         
            -
             
     | 
| 
       158 
179 
     | 
    
         
             
                def __del__(self) -> None:  # pragma: no cover
         
     | 
| 
       159 
180 
     | 
    
         
             
                    logger.debug("Delete: GuiBuildSettings")
         
     | 
| 
       160 
     | 
    
         
            -
                    return
         
     | 
| 
       161 
181 
     | 
    
         | 
| 
       162 
182 
     | 
    
         
             
                def loadContent(self) -> None:
         
     | 
| 
       163 
183 
     | 
    
         
             
                    """Populate the child widgets."""
         
     | 
| 
         @@ -165,7 +185,22 @@ class GuiBuildSettings(NToolDialog): 
     | 
|
| 
       165 
185 
     | 
    
         
             
                    self.optTabSelect.loadContent()
         
     | 
| 
       166 
186 
     | 
    
         
             
                    self.optTabHeadings.loadContent()
         
     | 
| 
       167 
187 
     | 
    
         
             
                    self.optTabFormatting.loadContent()
         
     | 
| 
       168 
     | 
    
         
            -
             
     | 
| 
      
 188 
     | 
    
         
            +
             
     | 
| 
      
 189 
     | 
    
         
            +
                def updateTheme(self, *, init: bool = False) -> None:
         
     | 
| 
      
 190 
     | 
    
         
            +
                    """Update theme elements."""
         
     | 
| 
      
 191 
     | 
    
         
            +
                    logger.debug("Theme Update: GuiBuildSettings, init=%s", init)
         
     | 
| 
      
 192 
     | 
    
         
            +
             
     | 
| 
      
 193 
     | 
    
         
            +
                    if not init:
         
     | 
| 
      
 194 
     | 
    
         
            +
                        self.btnApply.updateIcon()
         
     | 
| 
      
 195 
     | 
    
         
            +
                        self.btnSave.updateIcon()
         
     | 
| 
      
 196 
     | 
    
         
            +
                        self.btnClose.updateIcon()
         
     | 
| 
      
 197 
     | 
    
         
            +
             
     | 
| 
      
 198 
     | 
    
         
            +
                        self.optTabSelect.updateTheme()
         
     | 
| 
      
 199 
     | 
    
         
            +
                        self.optTabHeadings.updateTheme()
         
     | 
| 
      
 200 
     | 
    
         
            +
                        self.optTabFormatting.updateTheme()
         
     | 
| 
      
 201 
     | 
    
         
            +
             
     | 
| 
      
 202 
     | 
    
         
            +
                    self.titleLabel.setTextColors(color=SHARED.theme.helpText)
         
     | 
| 
      
 203 
     | 
    
         
            +
                    self.sidebar.setLabelColor(SHARED.theme.helpText)
         
     | 
| 
       169 
204 
     | 
    
         | 
| 
       170 
205 
     | 
    
         
             
                ##
         
     | 
| 
       171 
206 
     | 
    
         
             
                #  Properties
         
     | 
| 
         @@ -190,7 +225,6 @@ class GuiBuildSettings(NToolDialog): 
     | 
|
| 
       190 
225 
     | 
    
         
             
                    self._saveSettings()
         
     | 
| 
       191 
226 
     | 
    
         
             
                    event.accept()
         
     | 
| 
       192 
227 
     | 
    
         
             
                    self.softDelete()
         
     | 
| 
       193 
     | 
    
         
            -
                    return
         
     | 
| 
       194 
228 
     | 
    
         | 
| 
       195 
229 
     | 
    
         
             
                ##
         
     | 
| 
       196 
230 
     | 
    
         
             
                #  Private Slots
         
     | 
| 
         @@ -206,23 +240,20 @@ class GuiBuildSettings(NToolDialog): 
     | 
|
| 
       206 
240 
     | 
    
         
             
                    elif pageId >= self.OPT_FORMATTING:
         
     | 
| 
       207 
241 
     | 
    
         
             
                        self.toolStack.setCurrentWidget(self.optTabFormatting)
         
     | 
| 
       208 
242 
     | 
    
         
             
                        self.optTabFormatting.scrollToSection(pageId)
         
     | 
| 
       209 
     | 
    
         
            -
                    return
         
     | 
| 
       210 
243 
     | 
    
         | 
| 
       211 
244 
     | 
    
         
             
                @pyqtSlot("QAbstractButton*")
         
     | 
| 
       212 
245 
     | 
    
         
             
                def _dialogButtonClicked(self, button: QAbstractButton) -> None:
         
     | 
| 
       213 
246 
     | 
    
         
             
                    """Handle button clicks from the dialog button box."""
         
     | 
| 
       214 
     | 
    
         
            -
                     
     | 
| 
       215 
     | 
    
         
            -
                    if role == QtRoleApply:
         
     | 
| 
      
 247 
     | 
    
         
            +
                    if button == self.btnApply:
         
     | 
| 
       216 
248 
     | 
    
         
             
                        self._applyChanges()
         
     | 
| 
       217 
249 
     | 
    
         
             
                        self._emitBuildData()
         
     | 
| 
       218 
     | 
    
         
            -
                    elif  
     | 
| 
      
 250 
     | 
    
         
            +
                    elif button == self.btnSave:
         
     | 
| 
       219 
251 
     | 
    
         
             
                        self._applyChanges()
         
     | 
| 
       220 
252 
     | 
    
         
             
                        self._emitBuildData()
         
     | 
| 
       221 
253 
     | 
    
         
             
                        self.close()
         
     | 
| 
       222 
     | 
    
         
            -
                    elif  
     | 
| 
      
 254 
     | 
    
         
            +
                    elif button == self.btnClose:
         
     | 
| 
       223 
255 
     | 
    
         
             
                        self._build.resetChangedState()
         
     | 
| 
       224 
256 
     | 
    
         
             
                        self.close()
         
     | 
| 
       225 
     | 
    
         
            -
                    return
         
     | 
| 
       226 
257 
     | 
    
         | 
| 
       227 
258 
     | 
    
         
             
                ##
         
     | 
| 
       228 
259 
     | 
    
         
             
                #  Internal Functions
         
     | 
| 
         @@ -238,32 +269,29 @@ class GuiBuildSettings(NToolDialog): 
     | 
|
| 
       238 
269 
     | 
    
         
             
                        ).format(self._build.name)):
         
     | 
| 
       239 
270 
     | 
    
         
             
                            self._emitBuildData()
         
     | 
| 
       240 
271 
     | 
    
         
             
                        self._build.resetChangedState()
         
     | 
| 
       241 
     | 
    
         
            -
                    return
         
     | 
| 
       242 
272 
     | 
    
         | 
| 
       243 
273 
     | 
    
         
             
                def _saveSettings(self) -> None:
         
     | 
| 
       244 
274 
     | 
    
         
             
                    """Save the various user settings."""
         
     | 
| 
       245 
275 
     | 
    
         
             
                    treeWidth, filterWidth = self.optTabSelect.mainSplitSizes()
         
     | 
| 
       246 
276 
     | 
    
         
             
                    logger.debug("Saving State: GuiBuildSettings")
         
     | 
| 
       247 
     | 
    
         
            -
                     
     | 
| 
       248 
     | 
    
         
            -
                     
     | 
| 
       249 
     | 
    
         
            -
                     
     | 
| 
       250 
     | 
    
         
            -
                     
     | 
| 
       251 
     | 
    
         
            -
                     
     | 
| 
       252 
     | 
    
         
            -
                     
     | 
| 
       253 
     | 
    
         
            -
                     
     | 
| 
      
 277 
     | 
    
         
            +
                    options = SHARED.project.options
         
     | 
| 
      
 278 
     | 
    
         
            +
                    options.setValue("GuiBuildSettings", "winWidth", self.width())
         
     | 
| 
      
 279 
     | 
    
         
            +
                    options.setValue("GuiBuildSettings", "winHeight", self.height())
         
     | 
| 
      
 280 
     | 
    
         
            +
                    options.setValue("GuiBuildSettings", "treeWidth", treeWidth)
         
     | 
| 
      
 281 
     | 
    
         
            +
                    options.setValue("GuiBuildSettings", "filterWidth", filterWidth)
         
     | 
| 
      
 282 
     | 
    
         
            +
                    options.setValue("GuiBuildSettings", "autoPreview", self.swtAutoPreview.isChecked())
         
     | 
| 
      
 283 
     | 
    
         
            +
                    options.saveSettings()
         
     | 
| 
       254 
284 
     | 
    
         | 
| 
       255 
285 
     | 
    
         
             
                def _applyChanges(self) -> None:
         
     | 
| 
       256 
286 
     | 
    
         
             
                    """Apply all settings changes to the build object."""
         
     | 
| 
       257 
287 
     | 
    
         
             
                    self._build.setName(self.editBuildName.text())
         
     | 
| 
       258 
288 
     | 
    
         
             
                    self.optTabHeadings.saveContent()
         
     | 
| 
       259 
289 
     | 
    
         
             
                    self.optTabFormatting.saveContent()
         
     | 
| 
       260 
     | 
    
         
            -
                    return
         
     | 
| 
       261 
290 
     | 
    
         | 
| 
       262 
291 
     | 
    
         
             
                def _emitBuildData(self) -> None:
         
     | 
| 
       263 
292 
     | 
    
         
             
                    """Assemble the build data and emit the signal."""
         
     | 
| 
       264 
     | 
    
         
            -
                    self.newSettingsReady.emit(self._build)
         
     | 
| 
      
 293 
     | 
    
         
            +
                    self.newSettingsReady.emit(self._build, self.swtAutoPreview.isChecked())
         
     | 
| 
       265 
294 
     | 
    
         
             
                    self._build.resetChangedState()
         
     | 
| 
       266 
     | 
    
         
            -
                    return
         
     | 
| 
       267 
295 
     | 
    
         | 
| 
       268 
296 
     | 
    
         | 
| 
       269 
297 
     | 
    
         
             
            class _FilterTab(NFixedPage):
         
     | 
| 
         @@ -289,9 +317,9 @@ class _FilterTab(NFixedPage): 
     | 
|
| 
       289 
317 
     | 
    
         | 
| 
       290 
318 
     | 
    
         
             
                    self._statusFlags: dict[int, QIcon] = {
         
     | 
| 
       291 
319 
     | 
    
         
             
                        self.F_NONE:     QIcon(),
         
     | 
| 
       292 
     | 
    
         
            -
                        self.F_FILTERED: SHARED.theme.getIcon("filter", " 
     | 
| 
       293 
     | 
    
         
            -
                        self.F_INCLUDED: SHARED.theme.getIcon("pin", " 
     | 
| 
       294 
     | 
    
         
            -
                        self.F_EXCLUDED: SHARED.theme.getIcon("exclude", " 
     | 
| 
      
 320 
     | 
    
         
            +
                        self.F_FILTERED: SHARED.theme.getIcon("filter", "altaction"),
         
     | 
| 
      
 321 
     | 
    
         
            +
                        self.F_INCLUDED: SHARED.theme.getIcon("pin", "action"),
         
     | 
| 
      
 322 
     | 
    
         
            +
                        self.F_EXCLUDED: SHARED.theme.getIcon("exclude", "reject"),
         
     | 
| 
       295 
323 
     | 
    
         
             
                    }
         
     | 
| 
       296 
324 
     | 
    
         | 
| 
       297 
325 
     | 
    
         
             
                    self._trIncluded = self.tr("Included in manuscript")
         
     | 
| 
         @@ -330,15 +358,13 @@ class _FilterTab(NFixedPage): 
     | 
|
| 
       330 
358 
     | 
    
         | 
| 
       331 
359 
     | 
    
         
             
                    self.includedButton = NIconToolButton(self, iSz)
         
     | 
| 
       332 
360 
     | 
    
         
             
                    self.includedButton.setToolTip(self.tr("Always included"))
         
     | 
| 
       333 
     | 
    
         
            -
                    self.includedButton.setIcon(self._statusFlags[self.F_INCLUDED])
         
     | 
| 
       334 
361 
     | 
    
         
             
                    self.includedButton.clicked.connect(qtLambda(self._setSelectedMode, self.F_INCLUDED))
         
     | 
| 
       335 
362 
     | 
    
         | 
| 
       336 
363 
     | 
    
         
             
                    self.excludedButton = NIconToolButton(self, iSz)
         
     | 
| 
       337 
364 
     | 
    
         
             
                    self.excludedButton.setToolTip(self.tr("Always excluded"))
         
     | 
| 
       338 
     | 
    
         
            -
                    self.excludedButton.setIcon(self._statusFlags[self.F_EXCLUDED])
         
     | 
| 
       339 
365 
     | 
    
         
             
                    self.excludedButton.clicked.connect(qtLambda(self._setSelectedMode, self.F_EXCLUDED))
         
     | 
| 
       340 
366 
     | 
    
         | 
| 
       341 
     | 
    
         
            -
                    self.resetButton = NIconToolButton(self, iSz 
     | 
| 
      
 367 
     | 
    
         
            +
                    self.resetButton = NIconToolButton(self, iSz)
         
     | 
| 
       342 
368 
     | 
    
         
             
                    self.resetButton.setToolTip(self.tr("Reset to default"))
         
     | 
| 
       343 
369 
     | 
    
         
             
                    self.resetButton.clicked.connect(qtLambda(self._setSelectedMode, self.F_FILTERED))
         
     | 
| 
       344 
370 
     | 
    
         | 
| 
         @@ -380,15 +406,13 @@ class _FilterTab(NFixedPage): 
     | 
|
| 
       380 
406 
     | 
    
         
             
                        pOptions.getInt("GuiBuildSettings", "filterWidth", 300),
         
     | 
| 
       381 
407 
     | 
    
         
             
                    ])
         
     | 
| 
       382 
408 
     | 
    
         | 
| 
      
 409 
     | 
    
         
            +
                    self.updateTheme(init=True)
         
     | 
| 
       383 
410 
     | 
    
         
             
                    self.setCentralWidget(self.mainSplit)
         
     | 
| 
       384 
411 
     | 
    
         | 
| 
       385 
     | 
    
         
            -
                    return
         
     | 
| 
       386 
     | 
    
         
            -
             
     | 
| 
       387 
412 
     | 
    
         
             
                def loadContent(self) -> None:
         
     | 
| 
       388 
413 
     | 
    
         
             
                    """Populate the widgets."""
         
     | 
| 
       389 
414 
     | 
    
         
             
                    self._populateTree()
         
     | 
| 
       390 
415 
     | 
    
         
             
                    self._populateFilters()
         
     | 
| 
       391 
     | 
    
         
            -
                    return
         
     | 
| 
       392 
416 
     | 
    
         | 
| 
       393 
417 
     | 
    
         
             
                def mainSplitSizes(self) -> tuple[int, int]:
         
     | 
| 
       394 
418 
     | 
    
         
             
                    """Extract the sizes of the main splitter."""
         
     | 
| 
         @@ -396,6 +420,20 @@ class _FilterTab(NFixedPage): 
     | 
|
| 
       396 
420 
     | 
    
         
             
                    m, n = (sizes[0], sizes[1]) if len(sizes) >= 2 else (0, 0)
         
     | 
| 
       397 
421 
     | 
    
         
             
                    return m, n
         
     | 
| 
       398 
422 
     | 
    
         | 
| 
      
 423 
     | 
    
         
            +
                def updateTheme(self, *, init: bool = False) -> None:
         
     | 
| 
      
 424 
     | 
    
         
            +
                    """Update theme elements."""
         
     | 
| 
      
 425 
     | 
    
         
            +
                    logger.debug("Theme Update: _FilterTab, init=%s", init)
         
     | 
| 
      
 426 
     | 
    
         
            +
             
     | 
| 
      
 427 
     | 
    
         
            +
                    if not init:
         
     | 
| 
      
 428 
     | 
    
         
            +
                        self._statusFlags[self.F_FILTERED] = SHARED.theme.getIcon("filter", "altaction")
         
     | 
| 
      
 429 
     | 
    
         
            +
                        self._statusFlags[self.F_INCLUDED] = SHARED.theme.getIcon("pin", "action")
         
     | 
| 
      
 430 
     | 
    
         
            +
                        self._statusFlags[self.F_EXCLUDED] = SHARED.theme.getIcon("exclude", "reject")
         
     | 
| 
      
 431 
     | 
    
         
            +
                        self.loadContent()
         
     | 
| 
      
 432 
     | 
    
         
            +
             
     | 
| 
      
 433 
     | 
    
         
            +
                    self.includedButton.setIcon(self._statusFlags[self.F_INCLUDED])
         
     | 
| 
      
 434 
     | 
    
         
            +
                    self.excludedButton.setIcon(self._statusFlags[self.F_EXCLUDED])
         
     | 
| 
      
 435 
     | 
    
         
            +
                    self.resetButton.setThemeIcon("revert", "reset")
         
     | 
| 
      
 436 
     | 
    
         
            +
             
     | 
| 
       399 
437 
     | 
    
         
             
                ##
         
     | 
| 
       400 
438 
     | 
    
         
             
                #  Slots
         
     | 
| 
       401 
439 
     | 
    
         
             
                ##
         
     | 
| 
         @@ -409,7 +447,6 @@ class _FilterTab(NFixedPage): 
     | 
|
| 
       409 
447 
     | 
    
         
             
                    elif key.startswith("root:"):
         
     | 
| 
       410 
448 
     | 
    
         
             
                        self._build.setAllowRoot(key[5:], state)
         
     | 
| 
       411 
449 
     | 
    
         
             
                        self._populateTree()
         
     | 
| 
       412 
     | 
    
         
            -
                    return
         
     | 
| 
       413 
450 
     | 
    
         | 
| 
       414 
451 
     | 
    
         
             
                ##
         
     | 
| 
       415 
452 
     | 
    
         
             
                #  Internal Functions
         
     | 
| 
         @@ -453,8 +490,6 @@ class _FilterTab(NFixedPage): 
     | 
|
| 
       453 
490 
     | 
    
         | 
| 
       454 
491 
     | 
    
         
             
                    self._setTreeItemMode()
         
     | 
| 
       455 
492 
     | 
    
         | 
| 
       456 
     | 
    
         
            -
                    return
         
     | 
| 
       457 
     | 
    
         
            -
             
     | 
| 
       458 
493 
     | 
    
         
             
                def _populateFilters(self) -> None:
         
     | 
| 
       459 
494 
     | 
    
         
             
                    """Populate the filter options switches."""
         
     | 
| 
       460 
495 
     | 
    
         
             
                    self.filterOpt.clear()
         
     | 
| 
         @@ -472,7 +507,7 @@ class _FilterTab(NFixedPage): 
     | 
|
| 
       472 
507 
     | 
    
         
             
                        default=self._build.getBool("filter.includeNotes")
         
     | 
| 
       473 
508 
     | 
    
         
             
                    )
         
     | 
| 
       474 
509 
     | 
    
         
             
                    self.filterOpt.addItem(
         
     | 
| 
       475 
     | 
    
         
            -
                        SHARED.theme.getIcon("unchecked", " 
     | 
| 
      
 510 
     | 
    
         
            +
                        SHARED.theme.getIcon("unchecked", "reject"),
         
     | 
| 
       476 
511 
     | 
    
         
             
                        self._build.getLabel("filter.includeInactive"),
         
     | 
| 
       477 
512 
     | 
    
         
             
                        "doc:filter.includeInactive",
         
     | 
| 
       478 
513 
     | 
    
         
             
                        default=self._build.getBool("filter.includeInactive")
         
     | 
| 
         @@ -489,8 +524,6 @@ class _FilterTab(NFixedPage): 
     | 
|
| 
       489 
524 
     | 
    
         
             
                                default=self._build.isRootAllowed(tHandle)
         
     | 
| 
       490 
525 
     | 
    
         
             
                            )
         
     | 
| 
       491 
526 
     | 
    
         | 
| 
       492 
     | 
    
         
            -
                    return
         
     | 
| 
       493 
     | 
    
         
            -
             
     | 
| 
       494 
527 
     | 
    
         
             
                def _setSelectedMode(self, mode: int) -> None:
         
     | 
| 
       495 
528 
     | 
    
         
             
                    """Set the mode for the selected items."""
         
     | 
| 
       496 
529 
     | 
    
         
             
                    items = self.optTree.selectedItems()
         
     | 
| 
         @@ -511,8 +544,6 @@ class _FilterTab(NFixedPage): 
     | 
|
| 
       511 
544 
     | 
    
         | 
| 
       512 
545 
     | 
    
         
             
                    self._setTreeItemMode()
         
     | 
| 
       513 
546 
     | 
    
         | 
| 
       514 
     | 
    
         
            -
                    return
         
     | 
| 
       515 
     | 
    
         
            -
             
     | 
| 
       516 
547 
     | 
    
         
             
                def _setTreeItemMode(self) -> None:
         
     | 
| 
       517 
548 
     | 
    
         
             
                    """Update the filtered mode icon on all items."""
         
     | 
| 
       518 
549 
     | 
    
         
             
                    filtered = self._build.buildItemFilter(SHARED.project)
         
     | 
| 
         @@ -529,11 +560,10 @@ class _FilterTab(NFixedPage): 
     | 
|
| 
       529 
560 
     | 
    
         
             
                            item.setToolTip(self.C_STATUS, self._trIncluded)
         
     | 
| 
       530 
561 
     | 
    
         
             
                        else:
         
     | 
| 
       531 
562 
     | 
    
         
             
                            item.setIcon(self.C_STATUS, self._statusFlags[self.F_NONE])
         
     | 
| 
       532 
     | 
    
         
            -
                    return
         
     | 
| 
       533 
563 
     | 
    
         | 
| 
       534 
564 
     | 
    
         
             
                def _scanChildren(self, item: QTreeWidgetItem | None, items: list) -> list[QTreeWidgetItem]:
         
     | 
| 
       535 
     | 
    
         
            -
                    """ 
     | 
| 
       536 
     | 
    
         
            -
                     
     | 
| 
      
 565 
     | 
    
         
            +
                    """Recursively return all items in a tree starting at a given
         
     | 
| 
      
 566 
     | 
    
         
            +
                    QTreeWidgetItem.
         
     | 
| 
       537 
567 
     | 
    
         
             
                    """
         
     | 
| 
       538 
568 
     | 
    
         
             
                    if isinstance(item, QTreeWidgetItem):
         
     | 
| 
       539 
569 
     | 
    
         
             
                        items.append(item)
         
     | 
| 
         @@ -570,7 +600,7 @@ class _HeadingsTab(NScrollablePage): 
     | 
|
| 
       570 
600 
     | 
    
         
             
                    self.lblPart = QLabel(self._build.getLabel("headings.fmtPart"), self)
         
     | 
| 
       571 
601 
     | 
    
         
             
                    self.fmtPart = QLineEdit("", self)
         
     | 
| 
       572 
602 
     | 
    
         
             
                    self.fmtPart.setReadOnly(True)
         
     | 
| 
       573 
     | 
    
         
            -
                    self.btnPart = NIconToolButton(self, iSz 
     | 
| 
      
 603 
     | 
    
         
            +
                    self.btnPart = NIconToolButton(self, iSz)
         
     | 
| 
       574 
604 
     | 
    
         
             
                    self.btnPart.clicked.connect(qtLambda(self._editHeading, self.EDIT_TITLE))
         
     | 
| 
       575 
605 
     | 
    
         
             
                    self.swtPart = NSwitch(self, height=iPx)
         
     | 
| 
       576 
606 
     | 
    
         
             
                    self.hdePart = QLabel(trHide, self)
         
     | 
| 
         @@ -587,7 +617,7 @@ class _HeadingsTab(NScrollablePage): 
     | 
|
| 
       587 
617 
     | 
    
         
             
                    self.lblChapter = QLabel(self._build.getLabel("headings.fmtChapter"), self)
         
     | 
| 
       588 
618 
     | 
    
         
             
                    self.fmtChapter = QLineEdit("", self)
         
     | 
| 
       589 
619 
     | 
    
         
             
                    self.fmtChapter.setReadOnly(True)
         
     | 
| 
       590 
     | 
    
         
            -
                    self.btnChapter = NIconToolButton(self, iSz 
     | 
| 
      
 620 
     | 
    
         
            +
                    self.btnChapter = NIconToolButton(self, iSz)
         
     | 
| 
       591 
621 
     | 
    
         
             
                    self.btnChapter.clicked.connect(qtLambda(self._editHeading, self.EDIT_CHAPTER))
         
     | 
| 
       592 
622 
     | 
    
         
             
                    self.swtChapter = NSwitch(self, height=iPx)
         
     | 
| 
       593 
623 
     | 
    
         
             
                    self.hdeChapter = QLabel(trHide, self)
         
     | 
| 
         @@ -604,7 +634,7 @@ class _HeadingsTab(NScrollablePage): 
     | 
|
| 
       604 
634 
     | 
    
         
             
                    self.lblUnnumbered = QLabel(self._build.getLabel("headings.fmtUnnumbered"), self)
         
     | 
| 
       605 
635 
     | 
    
         
             
                    self.fmtUnnumbered = QLineEdit("", self)
         
     | 
| 
       606 
636 
     | 
    
         
             
                    self.fmtUnnumbered.setReadOnly(True)
         
     | 
| 
       607 
     | 
    
         
            -
                    self.btnUnnumbered = NIconToolButton(self, iSz 
     | 
| 
      
 637 
     | 
    
         
            +
                    self.btnUnnumbered = NIconToolButton(self, iSz)
         
     | 
| 
       608 
638 
     | 
    
         
             
                    self.btnUnnumbered.clicked.connect(qtLambda(self._editHeading, self.EDIT_UNNUM))
         
     | 
| 
       609 
639 
     | 
    
         
             
                    self.swtUnnumbered = NSwitch(self, height=iPx)
         
     | 
| 
       610 
640 
     | 
    
         
             
                    self.hdeUnnumbered = QLabel(trHide, self)
         
     | 
| 
         @@ -621,7 +651,7 @@ class _HeadingsTab(NScrollablePage): 
     | 
|
| 
       621 
651 
     | 
    
         
             
                    self.lblScene = QLabel(self._build.getLabel("headings.fmtScene"), self)
         
     | 
| 
       622 
652 
     | 
    
         
             
                    self.fmtScene = QLineEdit("", self)
         
     | 
| 
       623 
653 
     | 
    
         
             
                    self.fmtScene.setReadOnly(True)
         
     | 
| 
       624 
     | 
    
         
            -
                    self.btnScene = NIconToolButton(self, iSz 
     | 
| 
      
 654 
     | 
    
         
            +
                    self.btnScene = NIconToolButton(self, iSz)
         
     | 
| 
       625 
655 
     | 
    
         
             
                    self.btnScene.clicked.connect(qtLambda(self._editHeading, self.EDIT_SCENE))
         
     | 
| 
       626 
656 
     | 
    
         
             
                    self.swtScene = NSwitch(self, height=iPx)
         
     | 
| 
       627 
657 
     | 
    
         
             
                    self.hdeScene = QLabel(trHide, self)
         
     | 
| 
         @@ -638,7 +668,7 @@ class _HeadingsTab(NScrollablePage): 
     | 
|
| 
       638 
668 
     | 
    
         
             
                    self.lblAScene = QLabel(self._build.getLabel("headings.fmtAltScene"), self)
         
     | 
| 
       639 
669 
     | 
    
         
             
                    self.fmtAScene = QLineEdit("", self)
         
     | 
| 
       640 
670 
     | 
    
         
             
                    self.fmtAScene.setReadOnly(True)
         
     | 
| 
       641 
     | 
    
         
            -
                    self.btnAScene = NIconToolButton(self, iSz 
     | 
| 
      
 671 
     | 
    
         
            +
                    self.btnAScene = NIconToolButton(self, iSz)
         
     | 
| 
       642 
672 
     | 
    
         
             
                    self.btnAScene.clicked.connect(qtLambda(self._editHeading, self.EDIT_HSCENE))
         
     | 
| 
       643 
673 
     | 
    
         
             
                    self.swtAScene = NSwitch(self, height=iPx)
         
     | 
| 
       644 
674 
     | 
    
         
             
                    self.hdeAScene = QLabel(trHide, self)
         
     | 
| 
         @@ -655,7 +685,7 @@ class _HeadingsTab(NScrollablePage): 
     | 
|
| 
       655 
685 
     | 
    
         
             
                    self.lblSection = QLabel(self._build.getLabel("headings.fmtSection"), self)
         
     | 
| 
       656 
686 
     | 
    
         
             
                    self.fmtSection = QLineEdit("", self)
         
     | 
| 
       657 
687 
     | 
    
         
             
                    self.fmtSection.setReadOnly(True)
         
     | 
| 
       658 
     | 
    
         
            -
                    self.btnSection = NIconToolButton(self, iSz 
     | 
| 
      
 688 
     | 
    
         
            +
                    self.btnSection = NIconToolButton(self, iSz)
         
     | 
| 
       659 
689 
     | 
    
         
             
                    self.btnSection.clicked.connect(qtLambda(self._editHeading, self.EDIT_SECTION))
         
     | 
| 
       660 
690 
     | 
    
         
             
                    self.swtSection = NSwitch(self, height=iPx)
         
     | 
| 
       661 
691 
     | 
    
         
             
                    self.hdeSection = QLabel(trHide, self)
         
     | 
| 
         @@ -789,9 +819,22 @@ class _HeadingsTab(NScrollablePage): 
     | 
|
| 
       789 
819 
     | 
    
         
             
                    self.outerBox.addLayout(self.layoutMatrix)
         
     | 
| 
       790 
820 
     | 
    
         
             
                    self.outerBox.addStretch(1)
         
     | 
| 
       791 
821 
     | 
    
         | 
| 
      
 822 
     | 
    
         
            +
                    self.updateTheme()
         
     | 
| 
       792 
823 
     | 
    
         
             
                    self.setCentralLayout(self.outerBox)
         
     | 
| 
       793 
824 
     | 
    
         | 
| 
       794 
     | 
    
         
            -
             
     | 
| 
      
 825 
     | 
    
         
            +
                def updateTheme(self) -> None:
         
     | 
| 
      
 826 
     | 
    
         
            +
                    """Update theme elements."""
         
     | 
| 
      
 827 
     | 
    
         
            +
                    logger.debug("Theme Update: _HeadingsTab")
         
     | 
| 
      
 828 
     | 
    
         
            +
             
     | 
| 
      
 829 
     | 
    
         
            +
                    self.btnPart.setThemeIcon("edit", "change")
         
     | 
| 
      
 830 
     | 
    
         
            +
                    self.btnChapter.setThemeIcon("edit", "change")
         
     | 
| 
      
 831 
     | 
    
         
            +
                    self.btnUnnumbered.setThemeIcon("edit", "change")
         
     | 
| 
      
 832 
     | 
    
         
            +
                    self.btnScene.setThemeIcon("edit", "change")
         
     | 
| 
      
 833 
     | 
    
         
            +
                    self.btnAScene.setThemeIcon("edit", "change")
         
     | 
| 
      
 834 
     | 
    
         
            +
                    self.btnSection.setThemeIcon("edit", "change")
         
     | 
| 
      
 835 
     | 
    
         
            +
             
     | 
| 
      
 836 
     | 
    
         
            +
                    self.formSyntax.initHighlighter()
         
     | 
| 
      
 837 
     | 
    
         
            +
                    self.formSyntax.rehighlight()
         
     | 
| 
       795 
838 
     | 
    
         | 
| 
       796 
839 
     | 
    
         
             
                def loadContent(self) -> None:
         
     | 
| 
       797 
840 
     | 
    
         
             
                    """Populate the widgets."""
         
     | 
| 
         @@ -821,7 +864,6 @@ class _HeadingsTab(NScrollablePage): 
     | 
|
| 
       821 
864 
     | 
    
         
             
                    self.breakPart.setChecked(self._build.getBool("headings.breakPart"))
         
     | 
| 
       822 
865 
     | 
    
         
             
                    self.breakChapter.setChecked(self._build.getBool("headings.breakChapter"))
         
     | 
| 
       823 
866 
     | 
    
         
             
                    self.breakScene.setChecked(self._build.getBool("headings.breakScene"))
         
     | 
| 
       824 
     | 
    
         
            -
                    return
         
     | 
| 
       825 
867 
     | 
    
         | 
| 
       826 
868 
     | 
    
         
             
                def saveContent(self) -> None:
         
     | 
| 
       827 
869 
     | 
    
         
             
                    """Save choices back into build object."""
         
     | 
| 
         @@ -841,7 +883,6 @@ class _HeadingsTab(NScrollablePage): 
     | 
|
| 
       841 
883 
     | 
    
         
             
                    self._build.setValue("headings.breakPart", self.breakPart.isChecked())
         
     | 
| 
       842 
884 
     | 
    
         
             
                    self._build.setValue("headings.breakChapter", self.breakChapter.isChecked())
         
     | 
| 
       843 
885 
     | 
    
         
             
                    self._build.setValue("headings.breakScene", self.breakScene.isChecked())
         
     | 
| 
       844 
     | 
    
         
            -
                    return
         
     | 
| 
       845 
886 
     | 
    
         | 
| 
       846 
887 
     | 
    
         
             
                ##
         
     | 
| 
       847 
888 
     | 
    
         
             
                #  Internal Functions
         
     | 
| 
         @@ -853,7 +894,6 @@ class _HeadingsTab(NScrollablePage): 
     | 
|
| 
       853 
894 
     | 
    
         
             
                        cursor = self.editTextBox.textCursor()
         
     | 
| 
       854 
895 
     | 
    
         
             
                        cursor.insertText(text)
         
     | 
| 
       855 
896 
     | 
    
         
             
                        self.editTextBox.setFocus()
         
     | 
| 
       856 
     | 
    
         
            -
                    return
         
     | 
| 
       857 
897 
     | 
    
         | 
| 
       858 
898 
     | 
    
         
             
                def _editHeading(self, heading: int) -> None:
         
     | 
| 
       859 
899 
     | 
    
         
             
                    """Populate the form with a specific heading format."""
         
     | 
| 
         @@ -886,8 +926,6 @@ class _HeadingsTab(NScrollablePage): 
     | 
|
| 
       886 
926 
     | 
    
         
             
                    self.editTextBox.setPlainText(text.replace(nwUnicode.U_LBREAK, "\n"))
         
     | 
| 
       887 
927 
     | 
    
         
             
                    self.lblEditForm.setText(self.tr("Editing: {0}").format(label))
         
     | 
| 
       888 
928 
     | 
    
         | 
| 
       889 
     | 
    
         
            -
                    return
         
     | 
| 
       890 
     | 
    
         
            -
             
     | 
| 
       891 
929 
     | 
    
         
             
                ##
         
     | 
| 
       892 
930 
     | 
    
         
             
                #  Private Slots
         
     | 
| 
       893 
931 
     | 
    
         
             
                ##
         
     | 
| 
         @@ -929,12 +967,15 @@ class _HeadingSyntaxHighlighter(QSyntaxHighlighter): 
     | 
|
| 
       929 
967 
     | 
    
         | 
| 
       930 
968 
     | 
    
         
             
                def __init__(self, document: QTextDocument | None) -> None:
         
     | 
| 
       931 
969 
     | 
    
         
             
                    super().__init__(document)
         
     | 
| 
       932 
     | 
    
         
            -
                    syntax = SHARED.theme.syntaxTheme
         
     | 
| 
       933 
970 
     | 
    
         
             
                    self._fmtSymbol = QTextCharFormat()
         
     | 
| 
       934 
     | 
    
         
            -
                    self._fmtSymbol.setForeground(syntax.head)
         
     | 
| 
       935 
971 
     | 
    
         
             
                    self._fmtFormat = QTextCharFormat()
         
     | 
| 
      
 972 
     | 
    
         
            +
                    self.initHighlighter()
         
     | 
| 
      
 973 
     | 
    
         
            +
             
     | 
| 
      
 974 
     | 
    
         
            +
                def initHighlighter(self) -> None:
         
     | 
| 
      
 975 
     | 
    
         
            +
                    """Update theme elements."""
         
     | 
| 
      
 976 
     | 
    
         
            +
                    syntax = SHARED.theme.syntaxTheme
         
     | 
| 
      
 977 
     | 
    
         
            +
                    self._fmtSymbol.setForeground(syntax.head)
         
     | 
| 
       936 
978 
     | 
    
         
             
                    self._fmtFormat.setForeground(syntax.emph)
         
     | 
| 
       937 
     | 
    
         
            -
                    return
         
     | 
| 
       938 
979 
     | 
    
         | 
| 
       939 
980 
     | 
    
         
             
                def highlightBlock(self, text: str) -> None:
         
     | 
| 
       940 
981 
     | 
    
         
             
                    """Add syntax highlighting to the text block."""
         
     | 
| 
         @@ -947,7 +988,6 @@ class _HeadingSyntaxHighlighter(QSyntaxHighlighter): 
     | 
|
| 
       947 
988 
     | 
    
         
             
                            ddots = heading.find(":")
         
     | 
| 
       948 
989 
     | 
    
         
             
                            if ddots > 0:
         
     | 
| 
       949 
990 
     | 
    
         
             
                                self.setFormat(pos + ddots, 1, self._fmtSymbol)
         
     | 
| 
       950 
     | 
    
         
            -
                    return
         
     | 
| 
       951 
991 
     | 
    
         | 
| 
       952 
992 
     | 
    
         | 
| 
       953 
993 
     | 
    
         
             
            class _FormattingTab(NScrollableForm):
         
     | 
| 
         @@ -960,8 +1000,7 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       960 
1000 
     | 
    
         | 
| 
       961 
1001 
     | 
    
         
             
                    self.setHelpTextStyle(SHARED.theme.helpText)
         
     | 
| 
       962 
1002 
     | 
    
         
             
                    self.buildForm()
         
     | 
| 
       963 
     | 
    
         
            -
             
     | 
| 
       964 
     | 
    
         
            -
                    return
         
     | 
| 
      
 1003 
     | 
    
         
            +
                    self.updateTheme()
         
     | 
| 
       965 
1004 
     | 
    
         | 
| 
       966 
1005 
     | 
    
         
             
                def buildForm(self) -> None:
         
     | 
| 
       967 
1006 
     | 
    
         
             
                    """Build the formatting form."""
         
     | 
| 
         @@ -1005,7 +1044,7 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1005 
1044 
     | 
    
         
             
                            lambda keyword=keyword: self._updateIgnoredKeywords(keyword)
         
     | 
| 
       1006 
1045 
     | 
    
         
             
                        )
         
     | 
| 
       1007 
1046 
     | 
    
         | 
| 
       1008 
     | 
    
         
            -
                    self.ignoredKeywordsButton = NIconToolButton(self, iSz 
     | 
| 
      
 1047 
     | 
    
         
            +
                    self.ignoredKeywordsButton = NIconToolButton(self, iSz)
         
     | 
| 
       1009 
1048 
     | 
    
         
             
                    self.ignoredKeywordsButton.setMenu(self.mnKeywords)
         
     | 
| 
       1010 
1049 
     | 
    
         
             
                    self.addRow(
         
     | 
| 
       1011 
1050 
     | 
    
         
             
                        self._build.getLabel("text.ignoredKeywords"), self.ignoredKeywords,
         
     | 
| 
         @@ -1027,7 +1066,7 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1027 
1066 
     | 
    
         
             
                    # Text Font
         
     | 
| 
       1028 
1067 
     | 
    
         
             
                    self.textFont = QLineEdit(self)
         
     | 
| 
       1029 
1068 
     | 
    
         
             
                    self.textFont.setReadOnly(True)
         
     | 
| 
       1030 
     | 
    
         
            -
                    self.btnTextFont = NIconToolButton(self, iSz 
     | 
| 
      
 1069 
     | 
    
         
            +
                    self.btnTextFont = NIconToolButton(self, iSz)
         
     | 
| 
       1031 
1070 
     | 
    
         
             
                    self.btnTextFont.clicked.connect(self._selectFont)
         
     | 
| 
       1032 
1071 
     | 
    
         
             
                    self.addRow(
         
     | 
| 
       1033 
1072 
     | 
    
         
             
                        self._build.getLabel("format.textFont"), self.textFont,
         
     | 
| 
         @@ -1086,12 +1125,12 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1086 
1125 
     | 
    
         
             
                    self._sidebar.addButton(title, section)
         
     | 
| 
       1087 
1126 
     | 
    
         
             
                    self.addGroupLabel(title, section)
         
     | 
| 
       1088 
1127 
     | 
    
         | 
| 
       1089 
     | 
    
         
            -
                    pixT =  
     | 
| 
       1090 
     | 
    
         
            -
                    pixB =  
     | 
| 
       1091 
     | 
    
         
            -
                    pixL =  
     | 
| 
       1092 
     | 
    
         
            -
                    pixR =  
     | 
| 
       1093 
     | 
    
         
            -
                    pixH =  
     | 
| 
       1094 
     | 
    
         
            -
                    pixW =  
     | 
| 
      
 1128 
     | 
    
         
            +
                    self.pixT = QLabel(self)
         
     | 
| 
      
 1129 
     | 
    
         
            +
                    self.pixB = QLabel(self)
         
     | 
| 
      
 1130 
     | 
    
         
            +
                    self.pixL = QLabel(self)
         
     | 
| 
      
 1131 
     | 
    
         
            +
                    self.pixR = QLabel(self)
         
     | 
| 
      
 1132 
     | 
    
         
            +
                    self.pixH = QLabel(self)
         
     | 
| 
      
 1133 
     | 
    
         
            +
                    self.pixW = QLabel(self)
         
     | 
| 
       1095 
1134 
     | 
    
         | 
| 
       1096 
1135 
     | 
    
         
             
                    # Title
         
     | 
| 
       1097 
1136 
     | 
    
         
             
                    self.titleMarginT = NDoubleSpinBox(self)
         
     | 
| 
         @@ -1102,7 +1141,7 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1102 
1141 
     | 
    
         | 
| 
       1103 
1142 
     | 
    
         
             
                    self.addRow(
         
     | 
| 
       1104 
1143 
     | 
    
         
             
                        self._build.getLabel("format.titleMargin"),
         
     | 
| 
       1105 
     | 
    
         
            -
                        [pixT, self.titleMarginT, 6, pixB, self.titleMarginB],
         
     | 
| 
      
 1144 
     | 
    
         
            +
                        [self.pixT, self.titleMarginT, 6, self.pixB, self.titleMarginB],
         
     | 
| 
       1106 
1145 
     | 
    
         
             
                        unit="em",
         
     | 
| 
       1107 
1146 
     | 
    
         
             
                    )
         
     | 
| 
       1108 
1147 
     | 
    
         | 
| 
         @@ -1115,7 +1154,7 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1115 
1154 
     | 
    
         | 
| 
       1116 
1155 
     | 
    
         
             
                    self.addRow(
         
     | 
| 
       1117 
1156 
     | 
    
         
             
                        self._build.getLabel("format.h1Margin"),
         
     | 
| 
       1118 
     | 
    
         
            -
                        [pixT, self.h1MarginT, 6, pixB, self.h1MarginB],
         
     | 
| 
      
 1157 
     | 
    
         
            +
                        [self.pixT, self.h1MarginT, 6, self.pixB, self.h1MarginB],
         
     | 
| 
       1119 
1158 
     | 
    
         
             
                        unit="em",
         
     | 
| 
       1120 
1159 
     | 
    
         
             
                    )
         
     | 
| 
       1121 
1160 
     | 
    
         | 
| 
         @@ -1128,7 +1167,7 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1128 
1167 
     | 
    
         | 
| 
       1129 
1168 
     | 
    
         
             
                    self.addRow(
         
     | 
| 
       1130 
1169 
     | 
    
         
             
                        self._build.getLabel("format.h2Margin"),
         
     | 
| 
       1131 
     | 
    
         
            -
                        [pixT, self.h2MarginT, 6, pixB, self.h2MarginB],
         
     | 
| 
      
 1170 
     | 
    
         
            +
                        [self.pixT, self.h2MarginT, 6, self.pixB, self.h2MarginB],
         
     | 
| 
       1132 
1171 
     | 
    
         
             
                        unit="em",
         
     | 
| 
       1133 
1172 
     | 
    
         
             
                    )
         
     | 
| 
       1134 
1173 
     | 
    
         | 
| 
         @@ -1141,7 +1180,7 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1141 
1180 
     | 
    
         | 
| 
       1142 
1181 
     | 
    
         
             
                    self.addRow(
         
     | 
| 
       1143 
1182 
     | 
    
         
             
                        self._build.getLabel("format.h3Margin"),
         
     | 
| 
       1144 
     | 
    
         
            -
                        [pixT, self.h3MarginT, 6, pixB, self.h3MarginB],
         
     | 
| 
      
 1183 
     | 
    
         
            +
                        [self.pixT, self.h3MarginT, 6, self.pixB, self.h3MarginB],
         
     | 
| 
       1145 
1184 
     | 
    
         
             
                        unit="em",
         
     | 
| 
       1146 
1185 
     | 
    
         
             
                    )
         
     | 
| 
       1147 
1186 
     | 
    
         | 
| 
         @@ -1154,7 +1193,7 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1154 
1193 
     | 
    
         | 
| 
       1155 
1194 
     | 
    
         
             
                    self.addRow(
         
     | 
| 
       1156 
1195 
     | 
    
         
             
                        self._build.getLabel("format.h4Margin"),
         
     | 
| 
       1157 
     | 
    
         
            -
                        [pixT, self.h4MarginT, 6, pixB, self.h4MarginB],
         
     | 
| 
      
 1196 
     | 
    
         
            +
                        [self.pixT, self.h4MarginT, 6, self.pixB, self.h4MarginB],
         
     | 
| 
       1158 
1197 
     | 
    
         
             
                        unit="em",
         
     | 
| 
       1159 
1198 
     | 
    
         
             
                    )
         
     | 
| 
       1160 
1199 
     | 
    
         | 
| 
         @@ -1167,7 +1206,7 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1167 
1206 
     | 
    
         | 
| 
       1168 
1207 
     | 
    
         
             
                    self.addRow(
         
     | 
| 
       1169 
1208 
     | 
    
         
             
                        self._build.getLabel("format.textMargin"),
         
     | 
| 
       1170 
     | 
    
         
            -
                        [pixT, self.textMarginT, 6, pixB, self.textMarginB],
         
     | 
| 
      
 1209 
     | 
    
         
            +
                        [self.pixT, self.textMarginT, 6, self.pixB, self.textMarginB],
         
     | 
| 
       1171 
1210 
     | 
    
         
             
                        unit="em",
         
     | 
| 
       1172 
1211 
     | 
    
         
             
                    )
         
     | 
| 
       1173 
1212 
     | 
    
         | 
| 
         @@ -1180,7 +1219,7 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1180 
1219 
     | 
    
         | 
| 
       1181 
1220 
     | 
    
         
             
                    self.addRow(
         
     | 
| 
       1182 
1221 
     | 
    
         
             
                        self._build.getLabel("format.sepMargin"),
         
     | 
| 
       1183 
     | 
    
         
            -
                        [pixT, self.sepMarginT, 6, pixB, self.sepMarginB],
         
     | 
| 
      
 1222 
     | 
    
         
            +
                        [self.pixT, self.sepMarginT, 6, self.pixB, self.sepMarginB],
         
     | 
| 
       1184 
1223 
     | 
    
         
             
                        unit="em",
         
     | 
| 
       1185 
1224 
     | 
    
         
             
                    )
         
     | 
| 
       1186 
1225 
     | 
    
         | 
| 
         @@ -1214,7 +1253,7 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1214 
1253 
     | 
    
         | 
| 
       1215 
1254 
     | 
    
         
             
                    self.addRow(
         
     | 
| 
       1216 
1255 
     | 
    
         
             
                        self._build.getLabel("format.pageSize"),
         
     | 
| 
       1217 
     | 
    
         
            -
                        [self.pageSize, 6, pixW, self.pageWidth, 6, pixH, self.pageHeight],
         
     | 
| 
      
 1256 
     | 
    
         
            +
                        [self.pageSize, 6, self.pixW, self.pageWidth, 6, self.pixH, self.pageHeight],
         
     | 
| 
       1218 
1257 
     | 
    
         
             
                    )
         
     | 
| 
       1219 
1258 
     | 
    
         | 
| 
       1220 
1259 
     | 
    
         
             
                    # Page Margins
         
     | 
| 
         @@ -1232,11 +1271,11 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1232 
1271 
     | 
    
         | 
| 
       1233 
1272 
     | 
    
         
             
                    self.addRow(
         
     | 
| 
       1234 
1273 
     | 
    
         
             
                        self._build.getLabel("format.pageMargins"),
         
     | 
| 
       1235 
     | 
    
         
            -
                        [pixT, self.topMargin, 6, pixB, self.bottomMargin],
         
     | 
| 
      
 1274 
     | 
    
         
            +
                        [self.pixT, self.topMargin, 6, self.pixB, self.bottomMargin],
         
     | 
| 
       1236 
1275 
     | 
    
         
             
                    )
         
     | 
| 
       1237 
1276 
     | 
    
         
             
                    self.addRow(
         
     | 
| 
       1238 
1277 
     | 
    
         
             
                        "",
         
     | 
| 
       1239 
     | 
    
         
            -
                        [pixL, self.leftMargin, 6, pixR, self.rightMargin],
         
     | 
| 
      
 1278 
     | 
    
         
            +
                        [self.pixL, self.leftMargin, 6, self.pixR, self.rightMargin],
         
     | 
| 
       1240 
1279 
     | 
    
         
             
                    )
         
     | 
| 
       1241 
1280 
     | 
    
         | 
| 
       1242 
1281 
     | 
    
         
             
                    # Open Document
         
     | 
| 
         @@ -1250,7 +1289,7 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1250 
1289 
     | 
    
         
             
                    # Header
         
     | 
| 
       1251 
1290 
     | 
    
         
             
                    self.odtPageHeader = QLineEdit(self)
         
     | 
| 
       1252 
1291 
     | 
    
         
             
                    self.odtPageHeader.setMinimumWidth(200)
         
     | 
| 
       1253 
     | 
    
         
            -
                    self.btnPageHeader = NIconToolButton(self, iSz 
     | 
| 
      
 1292 
     | 
    
         
            +
                    self.btnPageHeader = NIconToolButton(self, iSz)
         
     | 
| 
       1254 
1293 
     | 
    
         
             
                    self.btnPageHeader.clicked.connect(self._resetPageHeader)
         
     | 
| 
       1255 
1294 
     | 
    
         
             
                    self.addRow(
         
     | 
| 
       1256 
1295 
     | 
    
         
             
                        self._build.getLabel("doc.pageHeader"), self.odtPageHeader,
         
     | 
| 
         @@ -1290,7 +1329,24 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1290 
1329 
     | 
    
         
             
                    # Finalise
         
     | 
| 
       1291 
1330 
     | 
    
         
             
                    self.finalise()
         
     | 
| 
       1292 
1331 
     | 
    
         | 
| 
       1293 
     | 
    
         
            -
             
     | 
| 
      
 1332 
     | 
    
         
            +
                def updateTheme(self) -> None:
         
     | 
| 
      
 1333 
     | 
    
         
            +
                    """Update theme elements."""
         
     | 
| 
      
 1334 
     | 
    
         
            +
                    logger.debug("Theme Update: _FormattingTab")
         
     | 
| 
      
 1335 
     | 
    
         
            +
             
     | 
| 
      
 1336 
     | 
    
         
            +
                    self.ignoredKeywordsButton.setThemeIcon("add", "add")
         
     | 
| 
      
 1337 
     | 
    
         
            +
                    self.btnTextFont.setThemeIcon("font", "tool")
         
     | 
| 
      
 1338 
     | 
    
         
            +
                    self.btnPageHeader.setThemeIcon("revert", "reset")
         
     | 
| 
      
 1339 
     | 
    
         
            +
             
     | 
| 
      
 1340 
     | 
    
         
            +
                    iPx = SHARED.theme.baseIconHeight
         
     | 
| 
      
 1341 
     | 
    
         
            +
                    self.pixT.setPixmap(SHARED.theme.getPixmap("margin_top", (iPx, iPx)))
         
     | 
| 
      
 1342 
     | 
    
         
            +
                    self.pixB.setPixmap(SHARED.theme.getPixmap("margin_bottom", (iPx, iPx)))
         
     | 
| 
      
 1343 
     | 
    
         
            +
                    self.pixL.setPixmap(SHARED.theme.getPixmap("margin_left", (iPx, iPx)))
         
     | 
| 
      
 1344 
     | 
    
         
            +
                    self.pixR.setPixmap(SHARED.theme.getPixmap("margin_right", (iPx, iPx)))
         
     | 
| 
      
 1345 
     | 
    
         
            +
                    self.pixH.setPixmap(SHARED.theme.getPixmap("fit_height", (iPx, iPx)))
         
     | 
| 
      
 1346 
     | 
    
         
            +
                    self.pixW.setPixmap(SHARED.theme.getPixmap("fit_width", (iPx, iPx)))
         
     | 
| 
      
 1347 
     | 
    
         
            +
             
     | 
| 
      
 1348 
     | 
    
         
            +
                    self.pageSize.updateStyle()
         
     | 
| 
      
 1349 
     | 
    
         
            +
                    self.pageUnit.updateStyle()
         
     | 
| 
       1294 
1350 
     | 
    
         | 
| 
       1295 
1351 
     | 
    
         
             
                def loadContent(self) -> None:
         
     | 
| 
       1296 
1352 
     | 
    
         
             
                    """Populate the widgets."""
         
     | 
| 
         @@ -1391,8 +1447,6 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1391 
1447 
     | 
    
         
             
                    self.htmlAddStyles.setChecked(self._build.getBool("html.addStyles"))
         
     | 
| 
       1392 
1448 
     | 
    
         
             
                    self.htmlPreserveTabs.setChecked(self._build.getBool("html.preserveTabs"))
         
     | 
| 
       1393 
1449 
     | 
    
         | 
| 
       1394 
     | 
    
         
            -
                    return
         
     | 
| 
       1395 
     | 
    
         
            -
             
     | 
| 
       1396 
1450 
     | 
    
         
             
                def saveContent(self) -> None:
         
     | 
| 
       1397 
1451 
     | 
    
         
             
                    """Save choices back into build object."""
         
     | 
| 
       1398 
1452 
     | 
    
         
             
                    # Text Content
         
     | 
| 
         @@ -1458,8 +1512,6 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1458 
1512 
     | 
    
         
             
                    self._build.setValue("html.addStyles", self.htmlAddStyles.isChecked())
         
     | 
| 
       1459 
1513 
     | 
    
         
             
                    self._build.setValue("html.preserveTabs", self.htmlPreserveTabs.isChecked())
         
     | 
| 
       1460 
1514 
     | 
    
         | 
| 
       1461 
     | 
    
         
            -
                    return
         
     | 
| 
       1462 
     | 
    
         
            -
             
     | 
| 
       1463 
1515 
     | 
    
         
             
                ##
         
     | 
| 
       1464 
1516 
     | 
    
         
             
                #  Private Slots
         
     | 
| 
       1465 
1517 
     | 
    
         
             
                ##
         
     | 
| 
         @@ -1472,11 +1524,10 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1472 
1524 
     | 
    
         
             
                        self._textFont = fontMatcher(font)
         
     | 
| 
       1473 
1525 
     | 
    
         
             
                        self.textFont.setText(describeFont(self._textFont))
         
     | 
| 
       1474 
1526 
     | 
    
         
             
                        self.textFont.setCursorPosition(0)
         
     | 
| 
       1475 
     | 
    
         
            -
                    return
         
     | 
| 
       1476 
1527 
     | 
    
         | 
| 
       1477 
1528 
     | 
    
         
             
                @pyqtSlot(int)
         
     | 
| 
       1478 
1529 
     | 
    
         
             
                def _changeUnit(self, index: int) -> None:
         
     | 
| 
       1479 
     | 
    
         
            -
                    """ 
     | 
| 
      
 1530 
     | 
    
         
            +
                    """Process current unit change to recalculate sizes."""
         
     | 
| 
       1480 
1531 
     | 
    
         
             
                    newUnit = self.pageUnit.itemData(index)
         
     | 
| 
       1481 
1532 
     | 
    
         
             
                    newScale = nwLabels.UNIT_SCALE.get(newUnit, 1.0)
         
     | 
| 
       1482 
1533 
     | 
    
         
             
                    reScale = self._unitScale/newScale
         
     | 
| 
         @@ -1531,11 +1582,9 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1531 
1582 
     | 
    
         
             
                    self._unitScale = newScale
         
     | 
| 
       1532 
1583 
     | 
    
         
             
                    self._changePageSize(self.pageSize.currentIndex())
         
     | 
| 
       1533 
1584 
     | 
    
         | 
| 
       1534 
     | 
    
         
            -
                    return
         
     | 
| 
       1535 
     | 
    
         
            -
             
     | 
| 
       1536 
1585 
     | 
    
         
             
                @pyqtSlot(int)
         
     | 
| 
       1537 
1586 
     | 
    
         
             
                def _changePageSize(self, index: int) -> None:
         
     | 
| 
       1538 
     | 
    
         
            -
                    """ 
     | 
| 
      
 1587 
     | 
    
         
            +
                    """Process page size change."""
         
     | 
| 
       1539 
1588 
     | 
    
         
             
                    w, h = nwLabels.PAPER_SIZE[self.pageSize.itemData(index)] if index >= 0 else (-1.0, -1.0)
         
     | 
| 
       1540 
1589 
     | 
    
         
             
                    if w > 0.0 and h > 0.0:
         
     | 
| 
       1541 
1590 
     | 
    
         
             
                        self.pageWidth.blockSignals(True)
         
     | 
| 
         @@ -1544,23 +1593,20 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1544 
1593 
     | 
    
         
             
                        self.pageHeight.blockSignals(True)
         
     | 
| 
       1545 
1594 
     | 
    
         
             
                        self.pageHeight.setValue(h/self._unitScale)
         
     | 
| 
       1546 
1595 
     | 
    
         
             
                        self.pageHeight.blockSignals(False)
         
     | 
| 
       1547 
     | 
    
         
            -
                    return
         
     | 
| 
       1548 
1596 
     | 
    
         | 
| 
       1549 
1597 
     | 
    
         
             
                @pyqtSlot()
         
     | 
| 
       1550 
1598 
     | 
    
         
             
                def _pageSizeValueChanged(self) -> None:
         
     | 
| 
       1551 
     | 
    
         
            -
                    """ 
     | 
| 
       1552 
     | 
    
         
            -
                    the page size box to Custom.
         
     | 
| 
      
 1599 
     | 
    
         
            +
                    """Process that the user has changed the page size spin boxes,
         
     | 
| 
      
 1600 
     | 
    
         
            +
                    so we flip the page size box to Custom.
         
     | 
| 
       1553 
1601 
     | 
    
         
             
                    """
         
     | 
| 
       1554 
1602 
     | 
    
         
             
                    index = self.pageSize.findData("Custom")
         
     | 
| 
       1555 
1603 
     | 
    
         
             
                    if index >= 0:
         
     | 
| 
       1556 
1604 
     | 
    
         
             
                        self.pageSize.setCurrentIndex(index)
         
     | 
| 
       1557 
     | 
    
         
            -
                    return
         
     | 
| 
       1558 
1605 
     | 
    
         | 
| 
       1559 
1606 
     | 
    
         
             
                def _resetPageHeader(self) -> None:
         
     | 
| 
       1560 
1607 
     | 
    
         
             
                    """Reset the ODT header format to default."""
         
     | 
| 
       1561 
1608 
     | 
    
         
             
                    self.odtPageHeader.setText(nwHeadFmt.DOC_AUTO)
         
     | 
| 
       1562 
1609 
     | 
    
         
             
                    self.odtPageHeader.setCursorPosition(0)
         
     | 
| 
       1563 
     | 
    
         
            -
                    return
         
     | 
| 
       1564 
1610 
     | 
    
         | 
| 
       1565 
1611 
     | 
    
         
             
                ##
         
     | 
| 
       1566 
1612 
     | 
    
         
             
                #  Internal Functions
         
     | 
| 
         @@ -1573,4 +1619,3 @@ class _FormattingTab(NScrollableForm): 
     | 
|
| 
       1573 
1619 
     | 
    
         
             
                        current.append(keyword)
         
     | 
| 
       1574 
1620 
     | 
    
         
             
                    verified = set(x for x in current if x in nwKeyWords.VALID_KEYS)
         
     | 
| 
       1575 
1621 
     | 
    
         
             
                    self.ignoredKeywords.setText(", ".join(verified))
         
     | 
| 
       1576 
     | 
    
         
            -
                    return
         
     |