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
 
    
        novelwriter/gui/outline.py
    CHANGED
    
    | 
         @@ -24,7 +24,7 @@ General Public License for more details. 
     | 
|
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
            You should have received a copy of the GNU General Public License
         
     | 
| 
       26 
26 
     | 
    
         
             
            along with this program. If not, see <https://www.gnu.org/licenses/>.
         
     | 
| 
       27 
     | 
    
         
            -
            """
         
     | 
| 
      
 27 
     | 
    
         
            +
            """  # noqa
         
     | 
| 
       28 
28 
     | 
    
         
             
            from __future__ import annotations
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
       30 
30 
     | 
    
         
             
            import csv
         
     | 
| 
         @@ -58,6 +58,7 @@ logger = logging.getLogger(__name__) 
     | 
|
| 
       58 
58 
     | 
    
         | 
| 
       59 
59 
     | 
    
         | 
| 
       60 
60 
     | 
    
         
             
            class GuiOutlineView(QWidget):
         
     | 
| 
      
 61 
     | 
    
         
            +
                """GUI: Project Outline Panel."""
         
     | 
| 
       61 
62 
     | 
    
         | 
| 
       62 
63 
     | 
    
         
             
                loadDocumentTagRequest = pyqtSignal(str, Enum)
         
     | 
| 
       63 
64 
     | 
    
         
             
                openDocumentRequest = pyqtSignal(str, Enum, str, bool)
         
     | 
| 
         @@ -96,37 +97,33 @@ class GuiOutlineView(QWidget): 
     | 
|
| 
       96 
97 
     | 
    
         
             
                    # Function Mappings
         
     | 
| 
       97 
98 
     | 
    
         
             
                    self.getSelectedHandle = self.outlineTree.getSelectedHandle
         
     | 
| 
       98 
99 
     | 
    
         | 
| 
       99 
     | 
    
         
            -
                    return
         
     | 
| 
       100 
     | 
    
         
            -
             
     | 
| 
       101 
100 
     | 
    
         
             
                ##
         
     | 
| 
       102 
101 
     | 
    
         
             
                #  Methods
         
     | 
| 
       103 
102 
     | 
    
         
             
                ##
         
     | 
| 
       104 
103 
     | 
    
         | 
| 
       105 
104 
     | 
    
         
             
                def updateTheme(self) -> None:
         
     | 
| 
       106 
105 
     | 
    
         
             
                    """Update theme elements."""
         
     | 
| 
      
 106 
     | 
    
         
            +
                    logger.debug("Theme Update: GuiOutlineView")
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
       107 
108 
     | 
    
         
             
                    self.outlineBar.updateTheme()
         
     | 
| 
       108 
109 
     | 
    
         
             
                    self.outlineTree.updateTheme()
         
     | 
| 
       109 
110 
     | 
    
         
             
                    self.outlineTree.refreshTree(
         
     | 
| 
       110 
111 
     | 
    
         
             
                        rootHandle=SHARED.project.data.getLastHandle("outline"), overRide=True
         
     | 
| 
       111 
112 
     | 
    
         
             
                    )
         
     | 
| 
       112 
     | 
    
         
            -
                    return
         
     | 
| 
       113 
113 
     | 
    
         | 
| 
       114 
114 
     | 
    
         
             
                def initSettings(self) -> None:
         
     | 
| 
       115 
115 
     | 
    
         
             
                    """Initialise GUI elements that depend on specific settings."""
         
     | 
| 
       116 
116 
     | 
    
         
             
                    self.outlineTree.initSettings()
         
     | 
| 
       117 
117 
     | 
    
         
             
                    self.outlineData.initSettings()
         
     | 
| 
       118 
     | 
    
         
            -
                    return
         
     | 
| 
       119 
118 
     | 
    
         | 
| 
       120 
119 
     | 
    
         
             
                def refreshTree(self) -> None:
         
     | 
| 
       121 
120 
     | 
    
         
             
                    """Refresh the current tree."""
         
     | 
| 
       122 
121 
     | 
    
         
             
                    self.outlineTree.refreshTree(rootHandle=SHARED.project.data.getLastHandle("outline"))
         
     | 
| 
       123 
     | 
    
         
            -
                    return
         
     | 
| 
       124 
122 
     | 
    
         | 
| 
       125 
123 
     | 
    
         
             
                def clearOutline(self) -> None:
         
     | 
| 
       126 
124 
     | 
    
         
             
                    """Clear project-related GUI content."""
         
     | 
| 
       127 
125 
     | 
    
         
             
                    self.outlineData.clearDetails()
         
     | 
| 
       128 
126 
     | 
    
         
             
                    self.outlineBar.setEnabled(False)
         
     | 
| 
       129 
     | 
    
         
            -
                    return
         
     | 
| 
       130 
127 
     | 
    
         | 
| 
       131 
128 
     | 
    
         
             
                def openProjectTasks(self) -> None:
         
     | 
| 
       132 
129 
     | 
    
         
             
                    """Run open project tasks."""
         
     | 
| 
         @@ -142,8 +139,6 @@ class GuiOutlineView(QWidget): 
     | 
|
| 
       142 
139 
     | 
    
         
             
                    self.outlineBar.setEnabled(True)
         
     | 
| 
       143 
140 
     | 
    
         
             
                    self.outlineData.loadGuiSettings()
         
     | 
| 
       144 
141 
     | 
    
         | 
| 
       145 
     | 
    
         
            -
                    return
         
     | 
| 
       146 
     | 
    
         
            -
             
     | 
| 
       147 
142 
     | 
    
         
             
                def closeProjectTasks(self) -> None:
         
     | 
| 
       148 
143 
     | 
    
         
             
                    """Run closing project tasks."""
         
     | 
| 
       149 
144 
     | 
    
         
             
                    if self.outlineTree.wasRendered:
         
     | 
| 
         @@ -152,7 +147,6 @@ class GuiOutlineView(QWidget): 
     | 
|
| 
       152 
147 
     | 
    
         
             
                    self.outlineTree.closeProjectTasks()
         
     | 
| 
       153 
148 
     | 
    
         
             
                    self.outlineData.updateClasses()
         
     | 
| 
       154 
149 
     | 
    
         
             
                    self.clearOutline()
         
     | 
| 
       155 
     | 
    
         
            -
                    return
         
     | 
| 
       156 
150 
     | 
    
         | 
| 
       157 
151 
     | 
    
         
             
                def splitSizes(self) -> list[int]:
         
     | 
| 
       158 
152 
     | 
    
         
             
                    """Get the sizes of the splitter widget."""
         
     | 
| 
         @@ -175,7 +169,6 @@ class GuiOutlineView(QWidget): 
     | 
|
| 
       175 
169 
     | 
    
         
             
                    """Handle tasks whenever a root folders changes."""
         
     | 
| 
       176 
170 
     | 
    
         
             
                    self.outlineBar.populateNovelList()
         
     | 
| 
       177 
171 
     | 
    
         
             
                    self.outlineData.updateClasses()
         
     | 
| 
       178 
     | 
    
         
            -
                    return
         
     | 
| 
       179 
172 
     | 
    
         | 
| 
       180 
173 
     | 
    
         
             
                ##
         
     | 
| 
       181 
174 
     | 
    
         
             
                #  Private Slots
         
     | 
| 
         @@ -188,23 +181,21 @@ class GuiOutlineView(QWidget): 
     | 
|
| 
       188 
181 
     | 
    
         
             
                    of columns has changed.
         
     | 
| 
       189 
182 
     | 
    
         
             
                    """
         
     | 
| 
       190 
183 
     | 
    
         
             
                    self.outlineBar.setColumnHiddenState(self.outlineTree.hiddenColumns)
         
     | 
| 
       191 
     | 
    
         
            -
                    return
         
     | 
| 
       192 
184 
     | 
    
         | 
| 
       193 
185 
     | 
    
         
             
                @pyqtSlot(str)
         
     | 
| 
       194 
186 
     | 
    
         
             
                def _tagClicked(self, link: str) -> None:
         
     | 
| 
       195 
187 
     | 
    
         
             
                    """Capture the click of a tag in the details panel."""
         
     | 
| 
       196 
188 
     | 
    
         
             
                    if link:
         
     | 
| 
       197 
189 
     | 
    
         
             
                        self.loadDocumentTagRequest.emit(link, nwDocMode.VIEW)
         
     | 
| 
       198 
     | 
    
         
            -
                    return
         
     | 
| 
       199 
190 
     | 
    
         | 
| 
       200 
191 
     | 
    
         
             
                @pyqtSlot(str)
         
     | 
| 
       201 
192 
     | 
    
         
             
                def _rootItemChanged(self, tHandle: str) -> None:
         
     | 
| 
       202 
193 
     | 
    
         
             
                    """Handle root novel changed or needs to be refreshed."""
         
     | 
| 
       203 
194 
     | 
    
         
             
                    self.outlineTree.refreshTree(rootHandle=(tHandle or None), overRide=True)
         
     | 
| 
       204 
     | 
    
         
            -
                    return
         
     | 
| 
       205 
195 
     | 
    
         | 
| 
       206 
196 
     | 
    
         | 
| 
       207 
197 
     | 
    
         
             
            class GuiOutlineToolBar(QToolBar):
         
     | 
| 
      
 198 
     | 
    
         
            +
                """GUI: Project Outline Panel ToolBar."""
         
     | 
| 
       208 
199 
     | 
    
         | 
| 
       209 
200 
     | 
    
         
             
                loadNovelRootRequest = pyqtSignal(str)
         
     | 
| 
       210 
201 
     | 
    
         
             
                outlineExportRequest = pyqtSignal()
         
     | 
| 
         @@ -263,37 +254,33 @@ class GuiOutlineToolBar(QToolBar): 
     | 
|
| 
       263 
254 
     | 
    
         | 
| 
       264 
255 
     | 
    
         
             
                    logger.debug("Ready: GuiOutlineToolBar")
         
     | 
| 
       265 
256 
     | 
    
         | 
| 
       266 
     | 
    
         
            -
                    return
         
     | 
| 
       267 
     | 
    
         
            -
             
     | 
| 
       268 
257 
     | 
    
         
             
                ##
         
     | 
| 
       269 
258 
     | 
    
         
             
                #  Methods
         
     | 
| 
       270 
259 
     | 
    
         
             
                ##
         
     | 
| 
       271 
260 
     | 
    
         | 
| 
       272 
261 
     | 
    
         
             
                def updateTheme(self) -> None:
         
     | 
| 
       273 
262 
     | 
    
         
             
                    """Update theme elements."""
         
     | 
| 
      
 263 
     | 
    
         
            +
                    logger.debug("Theme Update: GuiOutlineToolBar")
         
     | 
| 
      
 264 
     | 
    
         
            +
             
     | 
| 
       274 
265 
     | 
    
         
             
                    self.setStyleSheet("QToolBar {border: 0px;}")
         
     | 
| 
       275 
266 
     | 
    
         
             
                    self.novelValue.refreshNovelList()
         
     | 
| 
       276 
     | 
    
         
            -
                    self.aRefresh.setIcon(SHARED.theme.getIcon("refresh", " 
     | 
| 
       277 
     | 
    
         
            -
                    self.aExport.setIcon(SHARED.theme.getIcon("export", " 
     | 
| 
       278 
     | 
    
         
            -
                    self.tbColumns.setIcon(SHARED.theme.getIcon("more_vertical"))
         
     | 
| 
      
 267 
     | 
    
         
            +
                    self.aRefresh.setIcon(SHARED.theme.getIcon("refresh", "change"))
         
     | 
| 
      
 268 
     | 
    
         
            +
                    self.aExport.setIcon(SHARED.theme.getIcon("export", "action"))
         
     | 
| 
      
 269 
     | 
    
         
            +
                    self.tbColumns.setIcon(SHARED.theme.getIcon("more_vertical", "default"))
         
     | 
| 
       279 
270 
     | 
    
         
             
                    self.tbColumns.setStyleSheet("QToolButton::menu-indicator {image: none;}")
         
     | 
| 
       280 
271 
     | 
    
         
             
                    self.novelLabel.setTextColors(color=self.palette().windowText().color())
         
     | 
| 
       281 
     | 
    
         
            -
                    return
         
     | 
| 
       282 
272 
     | 
    
         | 
| 
       283 
273 
     | 
    
         
             
                def populateNovelList(self) -> None:
         
     | 
| 
       284 
274 
     | 
    
         
             
                    """Reload the content of the novel list."""
         
     | 
| 
       285 
275 
     | 
    
         
             
                    self.novelValue.refreshNovelList()
         
     | 
| 
       286 
     | 
    
         
            -
                    return
         
     | 
| 
       287 
276 
     | 
    
         | 
| 
       288 
277 
     | 
    
         
             
                def setCurrentRoot(self, rootHandle: str | None) -> None:
         
     | 
| 
       289 
278 
     | 
    
         
             
                    """Set the current active root handle."""
         
     | 
| 
       290 
279 
     | 
    
         
             
                    self.novelValue.setHandle(rootHandle)
         
     | 
| 
       291 
     | 
    
         
            -
                    return
         
     | 
| 
       292 
280 
     | 
    
         | 
| 
       293 
281 
     | 
    
         
             
                def setColumnHiddenState(self, hiddenState: dict[nwOutline, bool]) -> None:
         
     | 
| 
       294 
282 
     | 
    
         
             
                    """Forward the change of column hidden states to the menu."""
         
     | 
| 
       295 
283 
     | 
    
         
             
                    self.mColumns.setHiddenState(hiddenState)
         
     | 
| 
       296 
     | 
    
         
            -
                    return
         
     | 
| 
       297 
284 
     | 
    
         | 
| 
       298 
285 
     | 
    
         
             
                ##
         
     | 
| 
       299 
286 
     | 
    
         
             
                #  Private Slots
         
     | 
| 
         @@ -303,22 +290,20 @@ class GuiOutlineToolBar(QToolBar): 
     | 
|
| 
       303 
290 
     | 
    
         
             
                def _novelValueChanged(self, tHandle: str) -> None:
         
     | 
| 
       304 
291 
     | 
    
         
             
                    """Emit a signal containing the handle of the selected item."""
         
     | 
| 
       305 
292 
     | 
    
         
             
                    self.loadNovelRootRequest.emit(tHandle)
         
     | 
| 
       306 
     | 
    
         
            -
                    return
         
     | 
| 
       307 
293 
     | 
    
         | 
| 
       308 
294 
     | 
    
         
             
                @pyqtSlot()
         
     | 
| 
       309 
295 
     | 
    
         
             
                def _refreshRequested(self) -> None:
         
     | 
| 
       310 
296 
     | 
    
         
             
                    """Emit a signal containing the handle of the selected item."""
         
     | 
| 
       311 
297 
     | 
    
         
             
                    self.loadNovelRootRequest.emit(self.novelValue.handle)
         
     | 
| 
       312 
     | 
    
         
            -
                    return
         
     | 
| 
       313 
298 
     | 
    
         | 
| 
       314 
299 
     | 
    
         
             
                @pyqtSlot()
         
     | 
| 
       315 
300 
     | 
    
         
             
                def _exportRequested(self) -> None:
         
     | 
| 
       316 
301 
     | 
    
         
             
                    """Emit a signal that an export of the outline was requested."""
         
     | 
| 
       317 
302 
     | 
    
         
             
                    self.outlineExportRequest.emit()
         
     | 
| 
       318 
     | 
    
         
            -
                    return
         
     | 
| 
       319 
303 
     | 
    
         | 
| 
       320 
304 
     | 
    
         | 
| 
       321 
305 
     | 
    
         
             
            class GuiOutlineTree(QTreeWidget):
         
     | 
| 
      
 306 
     | 
    
         
            +
                """GUI: Project Outline Panel Tree."""
         
     | 
| 
       322 
307 
     | 
    
         | 
| 
       323 
308 
     | 
    
         
             
                DEF_WIDTH: Final[dict[nwOutline, int]] = {
         
     | 
| 
       324 
309 
     | 
    
         
             
                    nwOutline.TITLE:   200,
         
     | 
| 
         @@ -422,8 +407,6 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       422 
407 
     | 
    
         | 
| 
       423 
408 
     | 
    
         
             
                    logger.debug("Ready: GuiOutlineTree")
         
     | 
| 
       424 
409 
     | 
    
         | 
| 
       425 
     | 
    
         
            -
                    return
         
     | 
| 
       426 
     | 
    
         
            -
             
     | 
| 
       427 
410 
     | 
    
         
             
                ##
         
     | 
| 
       428 
411 
     | 
    
         
             
                #  Properties
         
     | 
| 
       429 
412 
     | 
    
         
             
                ##
         
     | 
| 
         @@ -451,7 +434,6 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       451 
434 
     | 
    
         
             
                        self.setHorizontalScrollBarPolicy(QtScrollAlwaysOff)
         
     | 
| 
       452 
435 
     | 
    
         
             
                    else:
         
     | 
| 
       453 
436 
     | 
    
         
             
                        self.setHorizontalScrollBarPolicy(QtScrollAsNeeded)
         
     | 
| 
       454 
     | 
    
         
            -
                    return
         
     | 
| 
       455 
437 
     | 
    
         | 
| 
       456 
438 
     | 
    
         
             
                def clearContent(self) -> None:
         
     | 
| 
       457 
439 
     | 
    
         
             
                    """Clear the tree and header and set the default values for the
         
     | 
| 
         @@ -474,10 +456,10 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       474 
456 
     | 
    
         | 
| 
       475 
457 
     | 
    
         
             
                    self._treeNCols = len(self._treeOrder)
         
     | 
| 
       476 
458 
     | 
    
         | 
| 
       477 
     | 
    
         
            -
                    return
         
     | 
| 
       478 
     | 
    
         
            -
             
     | 
| 
       479 
459 
     | 
    
         
             
                def updateTheme(self) -> None:
         
     | 
| 
       480 
460 
     | 
    
         
             
                    """Update theme elements."""
         
     | 
| 
      
 461 
     | 
    
         
            +
                    logger.debug("Theme Update: GuiOutlineTree")
         
     | 
| 
      
 462 
     | 
    
         
            +
             
     | 
| 
       481 
463 
     | 
    
         
             
                    iType = nwItemType.FILE
         
     | 
| 
       482 
464 
     | 
    
         
             
                    iClass = nwItemClass.NO_CLASS
         
     | 
| 
       483 
465 
     | 
    
         
             
                    iLayout = nwItemLayout.DOCUMENT
         
     | 
| 
         @@ -488,15 +470,14 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       488 
470 
     | 
    
         
             
                        "H3": SHARED.theme.getItemIcon(iType, iClass, iLayout, "H3"),
         
     | 
| 
       489 
471 
     | 
    
         
             
                        "H4": SHARED.theme.getItemIcon(iType, iClass, iLayout, "H4"),
         
     | 
| 
       490 
472 
     | 
    
         
             
                    }
         
     | 
| 
       491 
     | 
    
         
            -
                    return
         
     | 
| 
       492 
473 
     | 
    
         | 
| 
       493 
474 
     | 
    
         
             
                def refreshTree(
         
     | 
| 
       494 
475 
     | 
    
         
             
                    self, rootHandle: str | None = None,
         
     | 
| 
       495 
476 
     | 
    
         
             
                    overRide: bool = False, novelChanged: bool = False
         
     | 
| 
       496 
477 
     | 
    
         
             
                ) -> None:
         
     | 
| 
       497 
     | 
    
         
            -
                    """Called whenever the Outline tab is 
     | 
| 
       498 
     | 
    
         
            -
                    what data to load, and if necessary, 
     | 
| 
       499 
     | 
    
         
            -
                    tree.
         
     | 
| 
      
 478 
     | 
    
         
            +
                    """Refresh the outline tree. Called whenever the Outline tab is
         
     | 
| 
      
 479 
     | 
    
         
            +
                    activated and controls what data to load, and if necessary,
         
     | 
| 
      
 480 
     | 
    
         
            +
                    force a rebuild of the tree.
         
     | 
| 
       500 
481 
     | 
    
         
             
                    """
         
     | 
| 
       501 
482 
     | 
    
         
             
                    # If it's the first time, we always build
         
     | 
| 
       502 
483 
     | 
    
         
             
                    if self._firstView or (self._firstView and overRide):
         
     | 
| 
         @@ -518,11 +499,10 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       518 
499 
     | 
    
         
             
                    return
         
     | 
| 
       519 
500 
     | 
    
         | 
| 
       520 
501 
     | 
    
         
             
                def closeProjectTasks(self) -> None:
         
     | 
| 
       521 
     | 
    
         
            -
                    """ 
     | 
| 
      
 502 
     | 
    
         
            +
                    """Call before a project is closed."""
         
     | 
| 
       522 
503 
     | 
    
         
             
                    self._saveHeaderState()
         
     | 
| 
       523 
504 
     | 
    
         
             
                    self.clearContent()
         
     | 
| 
       524 
505 
     | 
    
         
             
                    self._firstView = True
         
     | 
| 
       525 
     | 
    
         
            -
                    return
         
     | 
| 
       526 
506 
     | 
    
         | 
| 
       527 
507 
     | 
    
         
             
                def getSelectedHandle(self) -> tuple[str | None, str | None]:
         
     | 
| 
       528 
508 
     | 
    
         
             
                    """Get the currently selected handle. If multiple items are
         
     | 
| 
         @@ -546,7 +526,6 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       546 
526 
     | 
    
         
             
                    if hItem in self._colIdx:
         
     | 
| 
       547 
527 
     | 
    
         
             
                        self.setColumnHidden(self._colIdx[hItem], not isChecked)
         
     | 
| 
       548 
528 
     | 
    
         
             
                        self._saveHeaderState()
         
     | 
| 
       549 
     | 
    
         
            -
                    return
         
     | 
| 
       550 
529 
     | 
    
         | 
| 
       551 
530 
     | 
    
         
             
                @pyqtSlot()
         
     | 
| 
       552 
531 
     | 
    
         
             
                def exportOutline(self) -> None:
         
     | 
| 
         @@ -562,7 +541,6 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       562 
541 
     | 
    
         
             
                            writer.writerows(
         
     | 
| 
       563 
542 
     | 
    
         
             
                                self._dumpNovelData(self.outlineView.outlineBar.novelValue.handle)
         
     | 
| 
       564 
543 
     | 
    
         
             
                            )
         
     | 
| 
       565 
     | 
    
         
            -
                    return
         
     | 
| 
       566 
544 
     | 
    
         | 
| 
       567 
545 
     | 
    
         
             
                ##
         
     | 
| 
       568 
546 
     | 
    
         
             
                #  Private Slots
         
     | 
| 
         @@ -577,7 +555,6 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       577 
555 
     | 
    
         
             
                    tHandle, sTitle = self.getSelectedHandle()
         
     | 
| 
       578 
556 
     | 
    
         
             
                    if tHandle:
         
     | 
| 
       579 
557 
     | 
    
         
             
                        self.outlineView.openDocumentRequest.emit(tHandle, nwDocMode.EDIT, sTitle or "", True)
         
     | 
| 
       580 
     | 
    
         
            -
                    return
         
     | 
| 
       581 
558 
     | 
    
         | 
| 
       582 
559 
     | 
    
         
             
                @pyqtSlot()
         
     | 
| 
       583 
560 
     | 
    
         
             
                def _onItemSelectionChanged(self) -> None:
         
     | 
| 
         @@ -588,7 +565,6 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       588 
565 
     | 
    
         
             
                        tHandle = items[0].data(self._colIdx[nwOutline.TITLE], self.D_HANDLE)
         
     | 
| 
       589 
566 
     | 
    
         
             
                        sTitle = items[0].data(self._colIdx[nwOutline.TITLE], self.D_TITLE)
         
     | 
| 
       590 
567 
     | 
    
         
             
                        self.activeItemChanged.emit(tHandle, sTitle)
         
     | 
| 
       591 
     | 
    
         
            -
                    return
         
     | 
| 
       592 
568 
     | 
    
         | 
| 
       593 
569 
     | 
    
         
             
                @pyqtSlot(int, int, int)
         
     | 
| 
       594 
570 
     | 
    
         
             
                def _columnMoved(self, logIdx: int, oldVisualIdx: int, newVisualIdx: int) -> None:
         
     | 
| 
         @@ -597,7 +573,6 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       597 
573 
     | 
    
         
             
                    """
         
     | 
| 
       598 
574 
     | 
    
         
             
                    self._treeOrder.insert(newVisualIdx, self._treeOrder.pop(oldVisualIdx))
         
     | 
| 
       599 
575 
     | 
    
         
             
                    self._saveHeaderState()
         
     | 
| 
       600 
     | 
    
         
            -
                    return
         
     | 
| 
       601 
576 
     | 
    
         | 
| 
       602 
577 
     | 
    
         
             
                ##
         
     | 
| 
       603 
578 
     | 
    
         
             
                #  Internal Functions
         
     | 
| 
         @@ -617,7 +592,7 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       617 
592 
     | 
    
         
             
                    try:
         
     | 
| 
       618 
593 
     | 
    
         
             
                        for name, (hidden, width) in colState.items():
         
     | 
| 
       619 
594 
     | 
    
         
             
                            if name not in nwOutline.__members__:
         
     | 
| 
       620 
     | 
    
         
            -
                                logger.warning("Ignored unknown outline column '%s'",  
     | 
| 
      
 595 
     | 
    
         
            +
                                logger.warning("Ignored unknown outline column '%s'", name)
         
     | 
| 
       621 
596 
     | 
    
         
             
                                continue
         
     | 
| 
       622 
597 
     | 
    
         
             
                            tmpOrder.append(nwOutline[name])
         
     | 
| 
       623 
598 
     | 
    
         
             
                            tmpHidden[nwOutline[name]] = hidden
         
     | 
| 
         @@ -637,8 +612,6 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       637 
612 
     | 
    
         | 
| 
       638 
613 
     | 
    
         
             
                    self.hiddenStateChanged.emit()
         
     | 
| 
       639 
614 
     | 
    
         | 
| 
       640 
     | 
    
         
            -
                    return
         
     | 
| 
       641 
     | 
    
         
            -
             
     | 
| 
       642 
615 
     | 
    
         
             
                def _saveHeaderState(self) -> None:
         
     | 
| 
       643 
616 
     | 
    
         
             
                    """Save the state of the main tree header, that is, column
         
     | 
| 
       644 
617 
     | 
    
         
             
                    order, column width and column hidden state. We don't want to
         
     | 
| 
         @@ -661,7 +634,6 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       661 
634 
     | 
    
         
             
                        pOptions = SHARED.project.options
         
     | 
| 
       662 
635 
     | 
    
         
             
                        pOptions.setValue("GuiOutline", "columnState", colState)
         
     | 
| 
       663 
636 
     | 
    
         
             
                        pOptions.saveSettings()
         
     | 
| 
       664 
     | 
    
         
            -
                    return
         
     | 
| 
       665 
637 
     | 
    
         | 
| 
       666 
638 
     | 
    
         
             
                def _populateTree(self, rootHandle: str | None) -> None:
         
     | 
| 
       667 
639 
     | 
    
         
             
                    """Build the tree based on the project index, and the header
         
     | 
| 
         @@ -746,8 +718,6 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       746 
718 
     | 
    
         
             
                    self._lastBuild = time()
         
     | 
| 
       747 
719 
     | 
    
         
             
                    logger.debug("Project outline built in %.3f ms", 1000.0*(time() - tStart))
         
     | 
| 
       748 
720 
     | 
    
         | 
| 
       749 
     | 
    
         
            -
                    return
         
     | 
| 
       750 
     | 
    
         
            -
             
     | 
| 
       751 
721 
     | 
    
         
             
                def _dumpNovelData(self, rootHandle: str | None) -> list[list[str | int]]:
         
     | 
| 
       752 
722 
     | 
    
         
             
                    """Dump all novel data into a table."""
         
     | 
| 
       753 
723 
     | 
    
         
             
                    sLabel = SHARED.project.localLookup("Story Structure")
         
     | 
| 
         @@ -821,6 +791,7 @@ class GuiOutlineTree(QTreeWidget): 
     | 
|
| 
       821 
791 
     | 
    
         | 
| 
       822 
792 
     | 
    
         | 
| 
       823 
793 
     | 
    
         
             
            class GuiOutlineHeaderMenu(QMenu):
         
     | 
| 
      
 794 
     | 
    
         
            +
                """GUI: Project Outline Panel Header Selection Menu."""
         
     | 
| 
       824 
795 
     | 
    
         | 
| 
       825 
796 
     | 
    
         
             
                columnToggled = pyqtSignal(bool, Enum)
         
     | 
| 
       826 
797 
     | 
    
         | 
| 
         @@ -844,8 +815,6 @@ class GuiOutlineHeaderMenu(QMenu): 
     | 
|
| 
       844 
815 
     | 
    
         
             
                        )
         
     | 
| 
       845 
816 
     | 
    
         
             
                        self.addAction(self.actionMap[hItem])
         
     | 
| 
       846 
817 
     | 
    
         | 
| 
       847 
     | 
    
         
            -
                    return
         
     | 
| 
       848 
     | 
    
         
            -
             
     | 
| 
       849 
818 
     | 
    
         
             
                def setHiddenState(self, hiddenState: dict[nwOutline, bool]) -> None:
         
     | 
| 
       850 
819 
     | 
    
         
             
                    """Overwrite the checked state of the columns as the inverse of
         
     | 
| 
       851 
820 
     | 
    
         
             
                    the hidden state. Skip the TITLE column as it cannot be hidden.
         
     | 
| 
         @@ -859,10 +828,9 @@ class GuiOutlineHeaderMenu(QMenu): 
     | 
|
| 
       859 
828 
     | 
    
         | 
| 
       860 
829 
     | 
    
         
             
                    self.acceptToggle = True
         
     | 
| 
       861 
830 
     | 
    
         | 
| 
       862 
     | 
    
         
            -
                    return
         
     | 
| 
       863 
     | 
    
         
            -
             
     | 
| 
       864 
831 
     | 
    
         | 
| 
       865 
832 
     | 
    
         
             
            class GuiOutlineDetails(QScrollArea):
         
     | 
| 
      
 833 
     | 
    
         
            +
                """GUI: Project Outline Panel Details View."""
         
     | 
| 
       866 
834 
     | 
    
         | 
| 
       867 
835 
     | 
    
         
             
                LVL_MAP: Final[dict[str, str]] = {
         
     | 
| 
       868 
836 
     | 
    
         
             
                    "H1": QT_TRANSLATE_NOOP("GuiOutlineDetails", "Title"),
         
     | 
| 
         @@ -1007,8 +975,6 @@ class GuiOutlineDetails(QScrollArea): 
     | 
|
| 
       1007 
975 
     | 
    
         | 
| 
       1008 
976 
     | 
    
         
             
                    logger.debug("Ready: GuiOutlineDetails")
         
     | 
| 
       1009 
977 
     | 
    
         | 
| 
       1010 
     | 
    
         
            -
                    return
         
     | 
| 
       1011 
     | 
    
         
            -
             
     | 
| 
       1012 
978 
     | 
    
         
             
                def initSettings(self) -> None:
         
     | 
| 
       1013 
979 
     | 
    
         
             
                    """Set or update outline settings."""
         
     | 
| 
       1014 
980 
     | 
    
         
             
                    if CONFIG.hideVScroll:
         
     | 
| 
         @@ -1020,7 +986,6 @@ class GuiOutlineDetails(QScrollArea): 
     | 
|
| 
       1020 
986 
     | 
    
         
             
                    else:
         
     | 
| 
       1021 
987 
     | 
    
         
             
                        self.setHorizontalScrollBarPolicy(QtScrollAsNeeded)
         
     | 
| 
       1022 
988 
     | 
    
         
             
                    self.updateClasses()
         
     | 
| 
       1023 
     | 
    
         
            -
                    return
         
     | 
| 
       1024 
989 
     | 
    
         | 
| 
       1025 
990 
     | 
    
         
             
                def loadGuiSettings(self) -> None:
         
     | 
| 
       1026 
991 
     | 
    
         
             
                    """Run open project tasks."""
         
     | 
| 
         @@ -1031,7 +996,6 @@ class GuiOutlineDetails(QScrollArea): 
     | 
|
| 
       1031 
996 
     | 
    
         
             
                        pOptions.getInt("GuiOutlineDetails", "detailsWidth", width//3),
         
     | 
| 
       1032 
997 
     | 
    
         
             
                        pOptions.getInt("GuiOutlineDetails", "tagsWidth", 2*width//3),
         
     | 
| 
       1033 
998 
     | 
    
         
             
                    ])
         
     | 
| 
       1034 
     | 
    
         
            -
                    return
         
     | 
| 
       1035 
999 
     | 
    
         | 
| 
       1036 
1000 
     | 
    
         
             
                def saveGuiSettings(self) -> None:
         
     | 
| 
       1037 
1001 
     | 
    
         
             
                    """Run close project tasks."""
         
     | 
| 
         @@ -1040,7 +1004,6 @@ class GuiOutlineDetails(QScrollArea): 
     | 
|
| 
       1040 
1004 
     | 
    
         
             
                    pOptions = SHARED.project.options
         
     | 
| 
       1041 
1005 
     | 
    
         
             
                    pOptions.setValue("GuiOutlineDetails", "detailsWidth", mainSplit[0])
         
     | 
| 
       1042 
1006 
     | 
    
         
             
                    pOptions.setValue("GuiOutlineDetails", "tagsWidth", mainSplit[1])
         
     | 
| 
       1043 
     | 
    
         
            -
                    return
         
     | 
| 
       1044 
1007 
     | 
    
         | 
| 
       1045 
1008 
     | 
    
         
             
                def clearDetails(self) -> None:
         
     | 
| 
       1046 
1009 
     | 
    
         
             
                    """Clear all the data labels."""
         
     | 
| 
         @@ -1057,7 +1020,6 @@ class GuiOutlineDetails(QScrollArea): 
     | 
|
| 
       1057 
1020 
     | 
    
         
             
                        value.clear()
         
     | 
| 
       1058 
1021 
     | 
    
         | 
| 
       1059 
1022 
     | 
    
         
             
                    self.updateClasses()
         
     | 
| 
       1060 
     | 
    
         
            -
                    return
         
     | 
| 
       1061 
1023 
     | 
    
         | 
| 
       1062 
1024 
     | 
    
         
             
                ##
         
     | 
| 
       1063 
1025 
     | 
    
         
             
                #  Slots
         
     | 
| 
         @@ -1090,8 +1052,6 @@ class GuiOutlineDetails(QScrollArea): 
     | 
|
| 
       1090 
1052 
     | 
    
         
             
                        for key, (_, value) in self.tagValues.items():
         
     | 
| 
       1091 
1053 
     | 
    
         
             
                            value.setText(self._formatTags(novRefs, key))
         
     | 
| 
       1092 
1054 
     | 
    
         | 
| 
       1093 
     | 
    
         
            -
                    return
         
     | 
| 
       1094 
     | 
    
         
            -
             
     | 
| 
       1095 
1055 
     | 
    
         
             
                @pyqtSlot()
         
     | 
| 
       1096 
1056 
     | 
    
         
             
                def updateClasses(self) -> None:
         
     | 
| 
       1097 
1057 
     | 
    
         
             
                    """Update the visibility status of class details."""
         
     | 
| 
         @@ -1102,7 +1062,6 @@ class GuiOutlineDetails(QScrollArea): 
     | 
|
| 
       1102 
1062 
     | 
    
         
             
                            label, value = self.tagValues[key]
         
     | 
| 
       1103 
1063 
     | 
    
         
             
                            label.setVisible(visible)
         
     | 
| 
       1104 
1064 
     | 
    
         
             
                            value.setVisible(visible)
         
     | 
| 
       1105 
     | 
    
         
            -
                    return
         
     | 
| 
       1106 
1065 
     | 
    
         | 
| 
       1107 
1066 
     | 
    
         
             
                @staticmethod
         
     | 
| 
       1108 
1067 
     | 
    
         
             
                def _formatTags(refs: dict[str, list[str]], key: str) -> str:
         
     |