From 863dcf8b37d680a0aa8a1a6e151d95ccc858e496 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 10 Aug 2023 21:13:10 +0200 Subject: [PATCH] Move theme and project instances to new shared data class --- novelwriter/config.py | 21 +--- novelwriter/core/index.py | 2 +- novelwriter/dialogs/about.py | 16 +-- novelwriter/dialogs/docmerge.py | 21 ++-- novelwriter/dialogs/docsplit.py | 20 ++-- novelwriter/dialogs/preferences.py | 26 ++--- novelwriter/dialogs/projdetails.py | 55 ++++----- novelwriter/dialogs/projload.py | 12 +- novelwriter/dialogs/projsettings.py | 38 +++---- novelwriter/dialogs/updates.py | 4 +- novelwriter/dialogs/wordlist.py | 14 +-- novelwriter/extensions/novelselector.py | 14 +-- novelwriter/gui/doceditor.py | 104 ++++++++--------- novelwriter/gui/dochighlight.py | 37 +++--- novelwriter/gui/docviewer.py | 112 +++++++++--------- novelwriter/gui/itemdetails.py | 24 ++-- novelwriter/gui/mainmenu.py | 6 +- novelwriter/gui/noveltree.py | 52 ++++----- novelwriter/gui/outline.py | 62 +++++----- novelwriter/gui/projtree.py | 144 ++++++++++++------------ novelwriter/gui/sidebar.py | 20 ++-- novelwriter/gui/statusbar.py | 22 ++-- novelwriter/guimain.py | 91 ++++++++------- novelwriter/tools/lipsum.py | 4 +- novelwriter/tools/manusbuild.py | 26 ++--- novelwriter/tools/manuscript.py | 38 +++---- novelwriter/tools/manussettings.py | 71 ++++++------ novelwriter/tools/projwizard.py | 8 +- novelwriter/tools/writingstats.py | 34 +++--- tests/test_gui/test_gui_theme.py | 10 +- 30 files changed, 530 insertions(+), 578 deletions(-) diff --git a/novelwriter/config.py b/novelwriter/config.py index cafa3e36..d0bd7fc3 100644 --- a/novelwriter/config.py +++ b/novelwriter/config.py @@ -3,7 +3,8 @@ novelWriter – Config Class ========================== File History: -Created: 2018-09-22 [0.0.1] Config +Created: 2018-09-22 [0.0.1] Config +Created: 2022-11-09 [2.0rc2] RecentProjects This file is a part of novelWriter Copyright 2018–2023, Veronica Berglyd Olsen @@ -28,7 +29,6 @@ import json import logging from time import time -from typing import TYPE_CHECKING from pathlib import Path from PyQt5.QtGui import QFontDatabase @@ -42,9 +42,6 @@ from novelwriter.error import formatException, logException from novelwriter.common import NWConfigParser, checkInt, checkPath, formatTimeStamp from novelwriter.constants import nwFiles, nwUnicode -if TYPE_CHECKING: # pragma: no cover - from novelwriter.gui.theme import GuiTheme - logger = logging.getLogger(__name__) @@ -96,7 +93,6 @@ class Config: # User Settings # ============= - self._themeObj = None self._recentObj = RecentProjects(self) # General GUI Settings @@ -244,12 +240,6 @@ class Config: def recentProjects(self) -> RecentProjects: return self._recentObj - @property - def theme(self) -> GuiTheme: - if self._themeObj is None: - raise Exception("Cannot access GUI theme before it is initialised") - return self._themeObj - @property def mainWinSize(self) -> list[int]: return [int(x*self.guiScale) for x in self._mainWinSize] @@ -297,11 +287,6 @@ class Config: # Setters ## - def setThemeInstance(self, theme: GuiTheme) -> None: - """Set the applications theme instance.""" - self._themeObj = theme - return - def setMainWinSize(self, width: int, height: int) -> None: """Set the size of the main window, but only if the change is larger than 5 pixels. The OS window manager will sometimes @@ -499,7 +484,7 @@ class Config: self._recentObj.loadCache() self._checkOptionalPackages() - logger.debug("Config initialisation complete") + logger.debug("Config instance initialised") return diff --git a/novelwriter/core/index.py b/novelwriter/core/index.py index 4e815ed8..45b91487 100644 --- a/novelwriter/core/index.py +++ b/novelwriter/core/index.py @@ -533,7 +533,7 @@ class NWIndex: def getTableOfContents( self, rHandle: str, maxDepth: int, skipExcl: bool = True - ) -> list[tuple[str, str, str, int]]: + ) -> list[tuple[str, int, str, int]]: """Generate a table of contents up to a maximum depth.""" tOrder = [] tData = {} diff --git a/novelwriter/dialogs/about.py b/novelwriter/dialogs/about.py index 7907882f..c7640ec0 100644 --- a/novelwriter/dialogs/about.py +++ b/novelwriter/dialogs/about.py @@ -35,7 +35,7 @@ from PyQt5.QtWidgets import ( QTextBrowser, QVBoxLayout, QWidget ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.common import readTextFile from novelwriter.constants import nwConst @@ -60,7 +60,7 @@ class GuiAbout(QDialog): nPx = CONFIG.pxInt(96) self.nwIcon = QLabel() - self.nwIcon.setPixmap(CONFIG.theme.getPixmap("novelwriter", (nPx, nPx))) + self.nwIcon.setPixmap(SHARED.theme.getPixmap("novelwriter", (nPx, nPx))) self.lblName = QLabel("novelWriter") self.lblVers = QLabel(f"v{novelwriter.__version__}") self.lblDate = QLabel(datetime.strptime(novelwriter.__date__, "%Y-%m-%d").strftime("%x")) @@ -228,12 +228,12 @@ class GuiAbout(QDialog): " color: rgb({kColR},{kColG},{kColB});" "}}\n" ).format( - hColR=CONFIG.theme.colHead[0], - hColG=CONFIG.theme.colHead[1], - hColB=CONFIG.theme.colHead[2], - kColR=CONFIG.theme.colKey[0], - kColG=CONFIG.theme.colKey[1], - kColB=CONFIG.theme.colKey[2], + hColR=SHARED.theme.colHead[0], + hColG=SHARED.theme.colHead[1], + hColB=SHARED.theme.colHead[2], + kColR=SHARED.theme.colKey[0], + kColG=SHARED.theme.colKey[1], + kColB=SHARED.theme.colKey[2], ) self.pageAbout.document().setDefaultStyleSheet(styleSheet) self.pageNotes.document().setDefaultStyleSheet(styleSheet) diff --git a/novelwriter/dialogs/docmerge.py b/novelwriter/dialogs/docmerge.py index 0faf9dd9..9af0a168 100644 --- a/novelwriter/dialogs/docmerge.py +++ b/novelwriter/dialogs/docmerge.py @@ -29,10 +29,10 @@ import logging from PyQt5.QtCore import Qt, QSize from PyQt5.QtWidgets import ( QAbstractItemView, QDialog, QDialogButtonBox, QGridLayout, QLabel, - QListWidget, QListWidgetItem, QVBoxLayout, + QListWidget, QListWidgetItem, QVBoxLayout, QWidget ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.extensions.switch import NSwitch from novelwriter.extensions.configlayout import NHelpLabel @@ -43,24 +43,21 @@ class GuiDocMerge(QDialog): D_HANDLE = Qt.ItemDataRole.UserRole - def __init__(self, mainGui, sHandle, itemList): - super().__init__(parent=mainGui) + def __init__(self, parent: QWidget, sHandle: str, itemList: list[str]) -> None: + super().__init__(parent=parent) logger.debug("Create: GuiDocMerge") self.setObjectName("GuiDocMerge") - - self.mainGui = mainGui + self.setWindowTitle(self.tr("Merge Documents")) self._data = {} - self.setWindowTitle(self.tr("Merge Documents")) - self.headLabel = QLabel("{0}".format(self.tr("Documents to Merge"))) self.helpLabel = NHelpLabel(self.tr( "Drag and drop items to change the order, or uncheck to exclude." - ), CONFIG.theme.helpText) + ), SHARED.theme.helpText) - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize hSp = CONFIG.pxInt(12) vSp = CONFIG.pxInt(8) bSp = CONFIG.pxInt(12) @@ -155,11 +152,11 @@ class GuiDocMerge(QDialog): self.listBox.clear() for tHandle in itemList: - nwItem = self.mainGui.project.tree[tHandle] + nwItem = SHARED.project.tree[tHandle] if nwItem is None or not nwItem.isFileType(): continue - itemIcon = CONFIG.theme.getItemIcon( + itemIcon = SHARED.theme.getItemIcon( nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, nwItem.mainHeading ) diff --git a/novelwriter/dialogs/docsplit.py b/novelwriter/dialogs/docsplit.py index 9542268f..26b54f59 100644 --- a/novelwriter/dialogs/docsplit.py +++ b/novelwriter/dialogs/docsplit.py @@ -32,7 +32,7 @@ from PyQt5.QtWidgets import ( QListWidgetItem, QDialogButtonBox, QLabel, QGridLayout ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.extensions.switch import NSwitch from novelwriter.extensions.configlayout import NHelpLabel @@ -45,14 +45,12 @@ class GuiDocSplit(QDialog): LEVEL_ROLE = Qt.ItemDataRole.UserRole + 1 LABEL_ROLE = Qt.ItemDataRole.UserRole + 2 - def __init__(self, mainGui, sHandle): - super().__init__(parent=mainGui) + def __init__(self, parent, sHandle): + super().__init__(parent=parent) logger.debug("Create: GuiDocSplit") self.setObjectName("GuiDocSplit") - self.mainGui = mainGui - self._data = {} self._text = [] @@ -61,16 +59,16 @@ class GuiDocSplit(QDialog): self.headLabel = QLabel("{0}".format(self.tr("Document Headers"))) self.helpLabel = NHelpLabel( self.tr("Select the maximum level to split into files."), - CONFIG.theme.helpText + SHARED.theme.helpText ) # Values - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize hSp = CONFIG.pxInt(12) vSp = CONFIG.pxInt(8) bSp = CONFIG.pxInt(12) - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options spLevel = pOptions.getInt("GuiDocSplit", "spLevel", 3) intoFolder = pOptions.getBool("GuiDocSplit", "intoFolder", True) docHierarchy = pOptions.getBool("GuiDocSplit", "docHierarchy", True) @@ -169,7 +167,7 @@ class GuiDocSplit(QDialog): self._data["docHierarchy"] = docHierarchy self._data["moveToTrash"] = moveToTrash - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options pOptions.setValue("GuiDocSplit", "spLevel", spLevel) pOptions.setValue("GuiDocSplit", "intoFolder", intoFolder) pOptions.setValue("GuiDocSplit", "docHierarchy", docHierarchy) @@ -199,13 +197,13 @@ class GuiDocSplit(QDialog): self.listBox.clear() - nwItem = self.mainGui.project.tree[sHandle] + nwItem = SHARED.project.tree[sHandle] if nwItem is None or not nwItem.isFileType(): return spLevel = self.splitLevel.currentData() if not self._text: - inDoc = self.mainGui.project.storage.getDocument(sHandle) + inDoc = SHARED.project.storage.getDocument(sHandle) self._text = (inDoc.readDocument() or "").splitlines() for lineNo, aLine in enumerate(self._text): diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index 47d35b08..59004e3c 100644 --- a/novelwriter/dialogs/preferences.py +++ b/novelwriter/dialogs/preferences.py @@ -32,7 +32,7 @@ from PyQt5.QtWidgets import ( QLineEdit, QFileDialog, QFontDialog, QDoubleSpinBox ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.dialogs.quotes import GuiQuoteSelect from novelwriter.extensions.switch import NSwitch from novelwriter.extensions.pageddialog import NPagedDialog @@ -163,7 +163,7 @@ class GuiPreferencesGeneral(QWidget): # The Form self.mainForm = NConfigLayout() - self.mainForm.setHelpTextStyle(CONFIG.theme.helpText) + self.mainForm.setHelpTextStyle(SHARED.theme.helpText) self.setLayout(self.mainForm) # Look and Feel @@ -190,7 +190,7 @@ class GuiPreferencesGeneral(QWidget): # Select Theme self.guiTheme = QComboBox() self.guiTheme.setMinimumWidth(minWidth) - self.theThemes = CONFIG.theme.listThemes() + self.theThemes = SHARED.theme.listThemes() for themeDir, themeName in self.theThemes: self.guiTheme.addItem(themeName, themeDir) themeIdx = self.guiTheme.findData(CONFIG.guiTheme) @@ -206,7 +206,7 @@ class GuiPreferencesGeneral(QWidget): # Editor Theme self.guiSyntax = QComboBox() self.guiSyntax.setMinimumWidth(CONFIG.pxInt(200)) - self.theSyntaxes = CONFIG.theme.listSyntax() + self.theSyntaxes = SHARED.theme.listSyntax() for syntaxFile, syntaxName in self.theSyntaxes: self.guiSyntax.addItem(syntaxName, syntaxFile) syntaxIdx = self.guiSyntax.findData(CONFIG.guiSyntax) @@ -225,7 +225,7 @@ class GuiPreferencesGeneral(QWidget): self.guiFont.setFixedWidth(CONFIG.pxInt(162)) self.guiFont.setText(CONFIG.guiFont) self.fontButton = QPushButton("...") - self.fontButton.setMaximumWidth(int(2.5*CONFIG.theme.getTextWidth("..."))) + self.fontButton.setMaximumWidth(int(2.5*SHARED.theme.getTextWidth("..."))) self.fontButton.clicked.connect(self._selectFont) self.mainForm.addRow( self.tr("Font family"), @@ -341,7 +341,7 @@ class GuiPreferencesProjects(QWidget): # The Form self.mainForm = NConfigLayout() - self.mainForm.setHelpTextStyle(CONFIG.theme.helpText) + self.mainForm.setHelpTextStyle(SHARED.theme.helpText) self.setLayout(self.mainForm) # Automatic Save @@ -493,7 +493,7 @@ class GuiPreferencesDocuments(QWidget): # The Form self.mainForm = NConfigLayout() - self.mainForm.setHelpTextStyle(CONFIG.theme.helpText) + self.mainForm.setHelpTextStyle(SHARED.theme.helpText) self.setLayout(self.mainForm) # Text Style @@ -506,7 +506,7 @@ class GuiPreferencesDocuments(QWidget): self.textFont.setFixedWidth(CONFIG.pxInt(162)) self.textFont.setText(CONFIG.textFont) self.fontButton = QPushButton("...") - self.fontButton.setMaximumWidth(int(2.5*CONFIG.theme.getTextWidth("..."))) + self.fontButton.setMaximumWidth(int(2.5*SHARED.theme.getTextWidth("..."))) self.fontButton.clicked.connect(self._selectFont) self.mainForm.addRow( self.tr("Font family"), @@ -649,7 +649,7 @@ class GuiPreferencesEditor(QWidget): # The Form self.mainForm = NConfigLayout() - self.mainForm.setHelpTextStyle(CONFIG.theme.helpText) + self.mainForm.setHelpTextStyle(SHARED.theme.helpText) self.setLayout(self.mainForm) mW = CONFIG.pxInt(250) @@ -819,7 +819,7 @@ class GuiPreferencesSyntax(QWidget): # The Form self.mainForm = NConfigLayout() - self.mainForm.setHelpTextStyle(CONFIG.theme.helpText) + self.mainForm.setHelpTextStyle(SHARED.theme.helpText) self.setLayout(self.mainForm) # Quotes & Dialogue @@ -921,7 +921,7 @@ class GuiPreferencesAutomation(QWidget): # The Form self.mainForm = NConfigLayout() - self.mainForm.setHelpTextStyle(CONFIG.theme.helpText) + self.mainForm.setHelpTextStyle(SHARED.theme.helpText) self.setLayout(self.mainForm) # Automatic Features @@ -1072,7 +1072,7 @@ class GuiPreferencesQuotes(QWidget): # The Form self.mainForm = NConfigLayout() - self.mainForm.setHelpTextStyle(CONFIG.theme.helpText) + self.mainForm.setHelpTextStyle(SHARED.theme.helpText) self.setLayout(self.mainForm) # Quotation Style @@ -1080,7 +1080,7 @@ class GuiPreferencesQuotes(QWidget): self.mainForm.addGroupLabel(self.tr("Quotation Style")) qWidth = CONFIG.pxInt(40) - bWidth = int(2.5*CONFIG.theme.getTextWidth("...")) + bWidth = int(2.5*SHARED.theme.getTextWidth("...")) self.quoteSym = {} # Single Quote Style diff --git a/novelwriter/dialogs/projdetails.py b/novelwriter/dialogs/projdetails.py index 5544ec7d..c7ceacaf 100644 --- a/novelwriter/dialogs/projdetails.py +++ b/novelwriter/dialogs/projdetails.py @@ -33,7 +33,7 @@ from PyQt5.QtWidgets import ( QLineEdit, QSpinBox, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.common import formatTime, numberToRoman from novelwriter.constants import nwUnicode from novelwriter.extensions.switch import NSwitch @@ -45,19 +45,17 @@ logger = logging.getLogger(__name__) class GuiProjectDetails(NPagedDialog): - def __init__(self, mainGui): - super().__init__(parent=mainGui) + def __init__(self, parent): + super().__init__(parent=parent) logger.debug("Create: GuiProjectDetails") self.setObjectName("GuiProjectDetails") - self.mainGui = mainGui - self.setWindowTitle(self.tr("Project Details")) wW = CONFIG.pxInt(600) wH = CONFIG.pxInt(400) - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options self.setMinimumWidth(wW) self.setMinimumHeight(wH) @@ -66,8 +64,8 @@ class GuiProjectDetails(NPagedDialog): CONFIG.pxInt(pOptions.getInt("GuiProjectDetails", "winHeight", wH)) ) - self.tabMain = GuiProjectDetailsMain(self.mainGui) - self.tabContents = GuiProjectDetailsContents(self.mainGui) + self.tabMain = GuiProjectDetailsMain(self) + self.tabContents = GuiProjectDetailsContents(self) self.addTab(self.tabMain, self.tr("Overview")) self.addTab(self.tabContents, self.tr("Contents")) @@ -124,7 +122,7 @@ class GuiProjectDetails(NPagedDialog): countFrom = self.tabContents.poValue.value() clearDouble = self.tabContents.dblValue.isChecked() - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options pOptions.setValue("GuiProjectDetails", "winWidth", winWidth) pOptions.setValue("GuiProjectDetails", "winHeight", winHeight) pOptions.setValue("GuiProjectDetails", "widthCol0", widthCol0) @@ -143,13 +141,11 @@ class GuiProjectDetails(NPagedDialog): class GuiProjectDetailsMain(QWidget): - def __init__(self, mainGui): - super().__init__(parent=mainGui) + def __init__(self, parent): + super().__init__(parent=parent) - self.mainGui = mainGui - - fPx = CONFIG.theme.fontPixelSize - fPt = CONFIG.theme.fontPointSize + fPx = SHARED.theme.fontPixelSize + fPt = SHARED.theme.fontPointSize vPx = CONFIG.pxInt(4) hPx = CONFIG.pxInt(12) @@ -244,7 +240,7 @@ class GuiProjectDetailsMain(QWidget): def updateValues(self): """Set all the values. """ - project = self.mainGui.project + project = SHARED.project pIndex = project.index hCounts = pIndex.getNovelTitleCounts() nwCount = pIndex.getNovelWordCount() @@ -275,26 +271,24 @@ class GuiProjectDetailsContents(QWidget): C_PAGE = 3 C_PROG = 4 - def __init__(self, mainGui): - super().__init__(parent=mainGui) - - self.mainGui = mainGui + def __init__(self, parent): + super().__init__(parent=parent) # Internal self._theToC = [] self._currentRoot = None - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize hPx = CONFIG.pxInt(12) vPx = CONFIG.pxInt(4) - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options # Header # ====== self.tocLabel = QLabel("%s" % self.tr("Table of Contents")) - self.novelValue = NovelSelector(self, self.mainGui) + self.novelValue = NovelSelector(self) self.novelValue.setMinimumWidth(CONFIG.pxInt(200)) self.novelValue.novelSelectionChanged.connect(self._novelValueChanged) @@ -320,10 +314,11 @@ class GuiProjectDetailsContents(QWidget): ]) treeHeadItem = self.tocTree.headerItem() - treeHeadItem.setTextAlignment(self.C_WORDS, Qt.AlignRight) - treeHeadItem.setTextAlignment(self.C_PAGES, Qt.AlignRight) - treeHeadItem.setTextAlignment(self.C_PAGE, Qt.AlignRight) - treeHeadItem.setTextAlignment(self.C_PROG, Qt.AlignRight) + if treeHeadItem: + treeHeadItem.setTextAlignment(self.C_WORDS, Qt.AlignRight) + treeHeadItem.setTextAlignment(self.C_PAGES, Qt.AlignRight) + treeHeadItem.setTextAlignment(self.C_PAGE, Qt.AlignRight) + treeHeadItem.setTextAlignment(self.C_PROG, Qt.AlignRight) treeHeader = self.tocTree.header() treeHeader.setStretchLastSection(True) @@ -347,7 +342,7 @@ class GuiProjectDetailsContents(QWidget): wordsPerPage = pOptions.getInt("GuiProjectDetails", "wordsPerPage", 350) countFrom = pOptions.getInt("GuiProjectDetails", "countFrom", 1) - clearDouble = pOptions.getInt("GuiProjectDetails", "clearDouble", True) + clearDouble = pOptions.getBool("GuiProjectDetails", "clearDouble", True) wordsHelp = ( self.tr("Typical word count for a 5 by 8 inch book page with 11 pt font is 350.") @@ -443,7 +438,7 @@ class GuiProjectDetailsContents(QWidget): """Extract the information from the project index. """ logger.debug("Populating ToC from handle '%s'", rootHandle) - self._theToC = self.mainGui.project.index.getTableOfContents(rootHandle, 2) + self._theToC = SHARED.project.index.getTableOfContents(rootHandle, 2) self._theToC.append(("", 0, self.tr("END"), 0)) return @@ -496,7 +491,7 @@ class GuiProjectDetailsContents(QWidget): progPage = f"{cPage:n}" progText = f"{pgProg:.1f}{nwUnicode.U_THSP}%" - hDec = CONFIG.theme.getHeaderDecoration(tLevel) + hDec = SHARED.theme.getHeaderDecoration(tLevel) if tTitle.strip() == "": tTitle = self.tr("Untitled") diff --git a/novelwriter/dialogs/projload.py b/novelwriter/dialogs/projload.py index 09fabd4d..d2f0f7f6 100644 --- a/novelwriter/dialogs/projload.py +++ b/novelwriter/dialogs/projload.py @@ -36,7 +36,7 @@ from PyQt5.QtWidgets import ( QFileDialog, QLineEdit ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.common import formatInt from novelwriter.constants import nwFiles @@ -67,7 +67,7 @@ class GuiProjectLoad(QDialog): sPx = CONFIG.pxInt(16) nPx = CONFIG.pxInt(96) - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize self.outerBox = QVBoxLayout() self.innerBox = QHBoxLayout() @@ -79,7 +79,7 @@ class GuiProjectLoad(QDialog): self.setMinimumHeight(CONFIG.pxInt(400)) self.nwIcon = QLabel() - self.nwIcon.setPixmap(CONFIG.theme.getPixmap("novelwriter", (nPx, nPx))) + self.nwIcon.setPixmap(SHARED.theme.getPixmap("novelwriter", (nPx, nPx))) self.innerBox.addWidget(self.nwIcon, 0, Qt.AlignTop) self.projectForm = QGridLayout() @@ -110,7 +110,7 @@ class GuiProjectLoad(QDialog): self.selPath.setReadOnly(True) self.browseButton = QPushButton("...") - self.browseButton.setMaximumWidth(int(2.5*CONFIG.theme.getTextWidth("..."))) + self.browseButton.setMaximumWidth(int(2.5*SHARED.theme.getTextWidth("..."))) self.browseButton.clicked.connect(self._doBrowse) self.projectForm.addWidget(self.lblRecent, 0, 0, 1, 3) @@ -268,7 +268,7 @@ class GuiProjectLoad(QDialog): self.listBox.clear() dataList = CONFIG.recentProjects.listEntries() sortList = sorted(dataList, key=lambda x: x[3], reverse=True) - nwxIcon = CONFIG.theme.getIcon("proj_nwx") + nwxIcon = SHARED.theme.getIcon("proj_nwx") for path, title, words, time in sortList: newItem = QTreeWidgetItem([""]*4) newItem.setIcon(self.C_NAME, nwxIcon) @@ -279,7 +279,7 @@ class GuiProjectLoad(QDialog): newItem.setTextAlignment(self.C_NAME, Qt.AlignLeft | Qt.AlignVCenter) newItem.setTextAlignment(self.C_COUNT, Qt.AlignRight | Qt.AlignVCenter) newItem.setTextAlignment(self.C_TIME, Qt.AlignRight | Qt.AlignVCenter) - newItem.setFont(self.C_TIME, CONFIG.theme.guiFontFixed) + newItem.setFont(self.C_TIME, SHARED.theme.guiFontFixed) self.listBox.addTopLevelItem(newItem) self.listBox.setCurrentItem(self.listBox.topLevelItem(0)) diff --git a/novelwriter/dialogs/projsettings.py b/novelwriter/dialogs/projsettings.py index 92b22454..1680117d 100644 --- a/novelwriter/dialogs/projsettings.py +++ b/novelwriter/dialogs/projsettings.py @@ -34,7 +34,7 @@ from PyQt5.QtWidgets import ( QPushButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.enum import nwAlert from novelwriter.common import simplified from novelwriter.extensions.switch import NSwitch @@ -61,12 +61,12 @@ class GuiProjectSettings(NPagedDialog): self.setObjectName("GuiProjectSettings") self.mainGui = mainGui - self.mainGui.project.countStatus() + SHARED.project.countStatus() self.setWindowTitle(self.tr("Project Settings")) wW = CONFIG.pxInt(570) wH = CONFIG.pxInt(375) - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options self.setMinimumWidth(wW) self.setMinimumHeight(wH) @@ -115,7 +115,7 @@ class GuiProjectSettings(NPagedDialog): def _doSave(self): """Save settings and close dialog. """ - project = self.mainGui.project + project = SHARED.project projName = self.tabMain.editName.text() bookTitle = self.tabMain.editTitle.text() bookAuthor = self.tabMain.editAuthor.text() @@ -183,7 +183,7 @@ class GuiProjectSettings(NPagedDialog): statusColW = CONFIG.rpxInt(self.tabStatus.listBox.columnWidth(0)) importColW = CONFIG.rpxInt(self.tabImport.listBox.columnWidth(0)) - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options pOptions.setValue("GuiProjectSettings", "winWidth", winWidth) pOptions.setValue("GuiProjectSettings", "winHeight", winHeight) pOptions.setValue("GuiProjectSettings", "replaceColW", replaceColW) @@ -204,13 +204,13 @@ class GuiProjectEditMain(QWidget): # The Form self.mainForm = NConfigLayout() - self.mainForm.setHelpTextStyle(CONFIG.theme.helpText) + self.mainForm.setHelpTextStyle(SHARED.theme.helpText) self.setLayout(self.mainForm) self.mainForm.addGroupLabel(self.tr("Project Settings")) xW = CONFIG.pxInt(250) - pData = self.mainGui.project.data + pData = SHARED.project.data self.editName = QLineEdit() self.editName.setMaxLength(200) @@ -291,23 +291,23 @@ class GuiProjectEditStatus(QWidget): self.mainGui = projGui.mainGui if isStatus: - self.theStatus = self.mainGui.project.data.itemStatus + self.theStatus = SHARED.project.data.itemStatus pageLabel = self.tr("Novel File Status Levels") colSetting = "statusColW" else: - self.theStatus = self.mainGui.project.data.itemImport + self.theStatus = SHARED.project.data.itemImport pageLabel = self.tr("Note File Importance Levels") colSetting = "importColW" wCol0 = CONFIG.pxInt( - self.mainGui.project.options.getInt("GuiProjectSettings", colSetting, 130) + SHARED.project.options.getInt("GuiProjectSettings", colSetting, 130) ) self.colDeleted = [] self.colChanged = False self.selColour = QColor(100, 100, 100) - self.iPx = CONFIG.theme.baseIconSize + self.iPx = SHARED.theme.baseIconSize # The List # ======== @@ -326,16 +326,16 @@ class GuiProjectEditStatus(QWidget): # List Controls # ============= - self.addButton = QPushButton(CONFIG.theme.getIcon("add"), "") + self.addButton = QPushButton(SHARED.theme.getIcon("add"), "") self.addButton.clicked.connect(self._newItem) - self.delButton = QPushButton(CONFIG.theme.getIcon("remove"), "") + self.delButton = QPushButton(SHARED.theme.getIcon("remove"), "") self.delButton.clicked.connect(self._delItem) - self.upButton = QPushButton(CONFIG.theme.getIcon("up"), "") + self.upButton = QPushButton(SHARED.theme.getIcon("up"), "") self.upButton.clicked.connect(lambda: self._moveItem(-1)) - self.dnButton = QPushButton(CONFIG.theme.getIcon("down"), "") + self.dnButton = QPushButton(SHARED.theme.getIcon("down"), "") self.dnButton.clicked.connect(lambda: self._moveItem(1)) # Edit Form @@ -578,7 +578,7 @@ class GuiProjectEditReplace(QWidget): self.arChanged = False wCol0 = CONFIG.pxInt( - self.mainGui.project.options.getInt("GuiProjectSettings", "replaceColW", 130) + SHARED.project.options.getInt("GuiProjectSettings", "replaceColW", 130) ) pageLabel = self.tr("Text Replace List for Preview and Export") @@ -594,7 +594,7 @@ class GuiProjectEditReplace(QWidget): self.listBox.setColumnWidth(self.COL_KEY, wCol0) self.listBox.setIndentation(0) - for aKey, aVal in self.mainGui.project.data.autoReplace.items(): + for aKey, aVal in SHARED.project.data.autoReplace.items(): newItem = QTreeWidgetItem(["<%s>" % aKey, aVal]) self.listBox.addTopLevelItem(newItem) @@ -604,10 +604,10 @@ class GuiProjectEditReplace(QWidget): # List Controls # ============= - self.addButton = QPushButton(CONFIG.theme.getIcon("add"), "") + self.addButton = QPushButton(SHARED.theme.getIcon("add"), "") self.addButton.clicked.connect(self._addEntry) - self.delButton = QPushButton(CONFIG.theme.getIcon("remove"), "") + self.delButton = QPushButton(SHARED.theme.getIcon("remove"), "") self.delButton.clicked.connect(self._delEntry) # Edit Form diff --git a/novelwriter/dialogs/updates.py b/novelwriter/dialogs/updates.py index 9553fa8d..c39a31cc 100644 --- a/novelwriter/dialogs/updates.py +++ b/novelwriter/dialogs/updates.py @@ -35,7 +35,7 @@ from PyQt5.QtWidgets import ( qApp, QDialog, QHBoxLayout, QVBoxLayout, QDialogButtonBox, QLabel ) -from novelwriter import CONFIG, __version__, __date__ +from novelwriter import CONFIG, SHARED, __version__, __date__ from novelwriter.common import logException from novelwriter.constants import nwConst @@ -58,7 +58,7 @@ class GuiUpdates(QDialog): # Left Box self.nwIcon = QLabel() - self.nwIcon.setPixmap(CONFIG.theme.getPixmap("novelwriter", (nPx, nPx))) + self.nwIcon.setPixmap(SHARED.theme.getPixmap("novelwriter", (nPx, nPx))) self.leftBox = QVBoxLayout() self.leftBox.addWidget(self.nwIcon) diff --git a/novelwriter/dialogs/wordlist.py b/novelwriter/dialogs/wordlist.py index ad549298..e1f3704f 100644 --- a/novelwriter/dialogs/wordlist.py +++ b/novelwriter/dialogs/wordlist.py @@ -33,7 +33,7 @@ from PyQt5.QtWidgets import ( QLineEdit, QListWidget, QListWidgetItem, QPushButton, QVBoxLayout ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.enum import nwAlert from novelwriter.core.spellcheck import UserDictionary @@ -57,7 +57,7 @@ class GuiWordList(QDialog): mS = CONFIG.pxInt(250) wW = CONFIG.pxInt(320) wH = CONFIG.pxInt(340) - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options self.setMinimumWidth(mS) self.setMinimumHeight(mS) @@ -77,10 +77,10 @@ class GuiWordList(QDialog): self.newEntry = QLineEdit() - self.addButton = QPushButton(CONFIG.theme.getIcon("add"), "") + self.addButton = QPushButton(SHARED.theme.getIcon("add"), "") self.addButton.clicked.connect(self._doAdd) - self.delButton = QPushButton(CONFIG.theme.getIcon("remove"), "") + self.delButton = QPushButton(SHARED.theme.getIcon("remove"), "") self.delButton.clicked.connect(self._doDelete) self.editBox = QHBoxLayout() @@ -149,7 +149,7 @@ class GuiWordList(QDialog): def _doSave(self): """Save the new word list and close.""" self._saveGuiSettings() - userDict = UserDictionary(self.mainGui.project) + userDict = UserDictionary(SHARED.project) for i in range(self.listBox.count()): item = self.listBox.item(i) if isinstance(item, QListWidgetItem): @@ -172,7 +172,7 @@ class GuiWordList(QDialog): def _loadWordList(self): """Load the project's word list, if it exists.""" - userDict = UserDictionary(self.mainGui.project) + userDict = UserDictionary(SHARED.project) userDict.load() self.listBox.clear() for word in userDict: @@ -185,7 +185,7 @@ class GuiWordList(QDialog): winWidth = CONFIG.rpxInt(self.width()) winHeight = CONFIG.rpxInt(self.height()) - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options pOptions.setValue("GuiWordList", "winWidth", winWidth) pOptions.setValue("GuiWordList", "winHeight", winHeight) diff --git a/novelwriter/extensions/novelselector.py b/novelwriter/extensions/novelselector.py index 8bb2c4c2..c22012fc 100644 --- a/novelwriter/extensions/novelselector.py +++ b/novelwriter/extensions/novelselector.py @@ -25,18 +25,13 @@ from __future__ import annotations import logging -from typing import TYPE_CHECKING - from PyQt5.QtCore import pyqtSignal, pyqtSlot from PyQt5.QtWidgets import QComboBox, QWidget -from novelwriter import CONFIG +from novelwriter import SHARED from novelwriter.enum import nwItemClass from novelwriter.constants import nwLabels -if TYPE_CHECKING: # pragma: no cover - from novelwriter.guimain import GuiMain - logger = logging.getLogger(__name__) @@ -44,9 +39,8 @@ class NovelSelector(QComboBox): novelSelectionChanged = pyqtSignal(str) - def __init__(self, parent: QWidget, mainGui: GuiMain) -> None: + def __init__(self, parent: QWidget) -> None: super().__init__(parent=parent) - self._mainGui = mainGui self._blockSignal = False self._firstHandle = None self.currentIndexChanged.connect(self._indexChanged) @@ -86,9 +80,9 @@ class NovelSelector(QComboBox): self._firstHandle = None self.clear() - icon = CONFIG.theme.getIcon(nwLabels.CLASS_ICON[nwItemClass.NOVEL]) + icon = SHARED.theme.getIcon(nwLabels.CLASS_ICON[nwItemClass.NOVEL]) handle = self.currentData() - for tHandle, nwItem in self._mainGui.project.tree.iterRoots(nwItemClass.NOVEL): + for tHandle, nwItem in SHARED.project.tree.iterRoots(nwItemClass.NOVEL): if prefix: name = prefix.format(nwItem.itemName) self.addItem(name, tHandle) diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index 876172e1..0c4287b3 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -49,7 +49,7 @@ from PyQt5.QtWidgets import ( QPushButton, QShortcut, QTextEdit, QToolBar, QToolButton, QWidget ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.enum import nwAlert, nwDocAction, nwDocInsert, nwDocMode, nwItemClass from novelwriter.common import minmax, transferCase from novelwriter.constants import nwConst, nwKeyWords, nwUnicode @@ -132,8 +132,8 @@ class GuiDocEditor(QTextEdit): self.docSearch = GuiDocEditSearch(self) # Syntax - self.spEnchant = NWSpellEnchant(self.mainGui.project) - self.highLight = GuiDocHighlighter(qDoc, self.mainGui, self.spEnchant) + self.spEnchant = NWSpellEnchant(SHARED.project) + self.highLight = GuiDocHighlighter(qDoc, self.spEnchant) # Context Menu self.setContextMenuPolicy(Qt.CustomContextMenu) @@ -227,14 +227,14 @@ class GuiDocEditor(QTextEdit): """Update the syntax highlighting theme. """ mainPalette = self.palette() - mainPalette.setColor(QPalette.Window, QColor(*CONFIG.theme.colBack)) - mainPalette.setColor(QPalette.Base, QColor(*CONFIG.theme.colBack)) - mainPalette.setColor(QPalette.Text, QColor(*CONFIG.theme.colText)) + mainPalette.setColor(QPalette.Window, QColor(*SHARED.theme.colBack)) + mainPalette.setColor(QPalette.Base, QColor(*SHARED.theme.colBack)) + mainPalette.setColor(QPalette.Text, QColor(*SHARED.theme.colText)) self.setPalette(mainPalette) docPalette = self.viewport().palette() - docPalette.setColor(QPalette.Base, QColor(*CONFIG.theme.colBack)) - docPalette.setColor(QPalette.Text, QColor(*CONFIG.theme.colText)) + docPalette.setColor(QPalette.Base, QColor(*SHARED.theme.colBack)) + docPalette.setColor(QPalette.Text, QColor(*SHARED.theme.colText)) self.viewport().setPalette(docPalette) self.docHeader.matchColours() @@ -340,7 +340,7 @@ class GuiDocEditor(QTextEdit): document is new (empty string), we set up the editor for editing the file. """ - self._nwDocument = self.mainGui.project.storage.getDocument(tHandle) + self._nwDocument = SHARED.project.storage.getDocument(tHandle) self._nwItem = self._nwDocument.getCurrentItem() theDoc = self._nwDocument.readDocument() @@ -516,10 +516,10 @@ class GuiDocEditor(QTextEdit): self.setDocumentChanged(False) oldHeader = self._nwItem.mainHeading - oldCount = self.mainGui.project.index.getHandleHeaderCount(tHandle) - self.mainGui.project.index.scanText(tHandle, docText) + oldCount = SHARED.project.index.getHandleHeaderCount(tHandle) + SHARED.project.index.scanText(tHandle, docText) newHeader = self._nwItem.mainHeading - newCount = self.mainGui.project.index.getHandleHeaderCount(tHandle) + newCount = SHARED.project.index.getHandleHeaderCount(tHandle) if self._nwItem.itemClass == nwItemClass.NOVEL: if oldCount == newCount: @@ -698,10 +698,10 @@ class GuiDocEditor(QTextEdit): """Set the spell checker dictionary language, and emit the dictionary changed signal. """ - if self.mainGui.project.data.spellLang is None: + if SHARED.project.data.spellLang is None: theLang = CONFIG.spellLanguage else: - theLang = self.mainGui.project.data.spellLang + theLang = SHARED.project.data.spellLang self.spEnchant.setLanguage(theLang) _, theProvider = self.spEnchant.describeDict() @@ -734,7 +734,7 @@ class GuiDocEditor(QTextEdit): self._spellCheck = theMode self.mainGui.mainMenu.setSpellCheck(theMode) - self.mainGui.project.data.setSpellCheck(theMode) + SHARED.project.data.setSpellCheck(theMode) self.highLight.setSpellCheck(theMode) if not self._bigDoc or theMode is False: # We don't run the spell checker automatically on big docs @@ -1916,7 +1916,7 @@ class GuiDocEditor(QTextEdit): if theText.startswith("@"): - isGood, tBits, tPos = self.mainGui.project.index.scanThis(theText) + isGood, tBits, tPos = SHARED.project.index.scanThis(theText) if not isGood: return False @@ -2233,9 +2233,9 @@ class GuiDocEditSearch(QFrame): self.doMatchCap = CONFIG.searchMatchCap mPx = CONFIG.pxInt(6) - tPx = int(0.8*CONFIG.theme.fontPixelSize) - self.boxFont = CONFIG.theme.guiFont - self.boxFont.setPointSizeF(0.9*CONFIG.theme.fontPointSize) + tPx = int(0.8*SHARED.theme.fontPixelSize) + self.boxFont = SHARED.theme.guiFont + self.boxFont.setPointSizeF(0.9*SHARED.theme.fontPointSize) self.setContentsMargins(0, 0, 0, 0) self.setAutoFillBackground(True) @@ -2268,7 +2268,7 @@ class GuiDocEditSearch(QFrame): self.resultLabel = QLabel("?/?") self.resultLabel.setFont(self.boxFont) - self.resultLabel.setMinimumWidth(CONFIG.theme.getTextWidth("?/?", self.boxFont)) + self.resultLabel.setMinimumWidth(SHARED.theme.getTextWidth("?/?", self.boxFont)) self.toggleCase = QAction(self.tr("Case Sensitive"), self) self.toggleCase.setCheckable(True) @@ -2374,15 +2374,15 @@ class GuiDocEditSearch(QFrame): self.replaceBox.setPalette(qPalette) # Set icons - self.toggleCase.setIcon(CONFIG.theme.getIcon("search_case")) - self.toggleWord.setIcon(CONFIG.theme.getIcon("search_word")) - self.toggleRegEx.setIcon(CONFIG.theme.getIcon("search_regex")) - self.toggleLoop.setIcon(CONFIG.theme.getIcon("search_loop")) - self.toggleProject.setIcon(CONFIG.theme.getIcon("search_project")) - self.toggleMatchCap.setIcon(CONFIG.theme.getIcon("search_preserve")) - self.cancelSearch.setIcon(CONFIG.theme.getIcon("search_cancel")) - self.searchButton.setIcon(CONFIG.theme.getIcon("search")) - self.replaceButton.setIcon(CONFIG.theme.getIcon("search_replace")) + self.toggleCase.setIcon(SHARED.theme.getIcon("search_case")) + self.toggleWord.setIcon(SHARED.theme.getIcon("search_word")) + self.toggleRegEx.setIcon(SHARED.theme.getIcon("search_regex")) + self.toggleLoop.setIcon(SHARED.theme.getIcon("search_loop")) + self.toggleProject.setIcon(SHARED.theme.getIcon("search_project")) + self.toggleMatchCap.setIcon(SHARED.theme.getIcon("search_preserve")) + self.cancelSearch.setIcon(SHARED.theme.getIcon("search_cancel")) + self.searchButton.setIcon(SHARED.theme.getIcon("search")) + self.replaceButton.setIcon(SHARED.theme.getIcon("search_replace")) # Set stylesheets self.searchOpt.setStyleSheet("QToolBar {padding: 0;}") @@ -2474,7 +2474,7 @@ class GuiDocEditSearch(QFrame): """ currRes = "?" if currRes is None else currRes resCount = "?" if resCount is None else "1000+" if resCount > 1000 else resCount - minWidth = CONFIG.theme.getTextWidth(f"{resCount}//{resCount}", self.boxFont) + minWidth = SHARED.theme.getTextWidth(f"{resCount}//{resCount}", self.boxFont) self.resultLabel.setText(f"{currRes}/{resCount}") self.resultLabel.setMinimumWidth(minWidth) self.adjustSize() @@ -2639,7 +2639,7 @@ class GuiDocEditHeader(QWidget): self._docHandle = None - fPx = int(0.9*CONFIG.theme.fontPixelSize) + fPx = int(0.9*SHARED.theme.fontPixelSize) hSp = CONFIG.pxInt(6) # Main Widget Settings @@ -2656,7 +2656,7 @@ class GuiDocEditHeader(QWidget): self.theTitle.setFixedHeight(fPx) lblFont = self.theTitle.font() - lblFont.setPointSizeF(0.9*CONFIG.theme.fontPointSize) + lblFont.setPointSizeF(0.9*SHARED.theme.fontPointSize) self.theTitle.setFont(lblFont) # Buttons @@ -2726,15 +2726,15 @@ class GuiDocEditHeader(QWidget): def updateTheme(self): """Update theme elements. """ - self.editButton.setIcon(CONFIG.theme.getIcon("edit")) - self.searchButton.setIcon(CONFIG.theme.getIcon("search")) - self.minmaxButton.setIcon(CONFIG.theme.getIcon("maximise")) - self.closeButton.setIcon(CONFIG.theme.getIcon("close")) + self.editButton.setIcon(SHARED.theme.getIcon("edit")) + self.searchButton.setIcon(SHARED.theme.getIcon("search")) + self.minmaxButton.setIcon(SHARED.theme.getIcon("maximise")) + self.closeButton.setIcon(SHARED.theme.getIcon("close")) buttonStyle = ( "QToolButton {{border: none; background: transparent;}} " "QToolButton:hover {{border: none; background: rgba({0},{1},{2},0.2);}}" - ).format(*CONFIG.theme.colText) + ).format(*SHARED.theme.colText) self.editButton.setStyleSheet(buttonStyle) self.searchButton.setStyleSheet(buttonStyle) @@ -2750,9 +2750,9 @@ class GuiDocEditHeader(QWidget): theme rather than the main GUI. """ thePalette = QPalette() - thePalette.setColor(QPalette.Window, QColor(*CONFIG.theme.colBack)) - thePalette.setColor(QPalette.WindowText, QColor(*CONFIG.theme.colText)) - thePalette.setColor(QPalette.Text, QColor(*CONFIG.theme.colText)) + thePalette.setColor(QPalette.Window, QColor(*SHARED.theme.colBack)) + thePalette.setColor(QPalette.WindowText, QColor(*SHARED.theme.colText)) + thePalette.setColor(QPalette.Text, QColor(*SHARED.theme.colText)) self.setPalette(thePalette) self.theTitle.setPalette(thePalette) @@ -2772,7 +2772,7 @@ class GuiDocEditHeader(QWidget): self.minmaxButton.setVisible(False) return True - pTree = self.mainGui.project.tree + pTree = SHARED.project.tree if CONFIG.showFullPath: tTitle = [] tTree = pTree.getItemPath(tHandle) @@ -2801,9 +2801,9 @@ class GuiDocEditHeader(QWidget): toggleFocusMode function and should not be activated directly. """ if self.mainGui.isFocusMode: - self.minmaxButton.setIcon(CONFIG.theme.getIcon("minimise")) + self.minmaxButton.setIcon(SHARED.theme.getIcon("minimise")) else: - self.minmaxButton.setIcon(CONFIG.theme.getIcon("maximise")) + self.minmaxButton.setIcon(SHARED.theme.getIcon("maximise")) return ## @@ -2876,13 +2876,13 @@ class GuiDocEditFooter(QWidget): self._docSelection = False - self.sPx = int(round(0.9*CONFIG.theme.baseIconSize)) - fPx = int(0.9*CONFIG.theme.fontPixelSize) + self.sPx = int(round(0.9*SHARED.theme.baseIconSize)) + fPx = int(0.9*SHARED.theme.fontPixelSize) bSp = CONFIG.pxInt(4) hSp = CONFIG.pxInt(6) lblFont = self.font() - lblFont.setPointSizeF(0.9*CONFIG.theme.fontPointSize) + lblFont.setPointSizeF(0.9*SHARED.theme.fontPointSize) # Main Widget Settings self.setContentsMargins(0, 0, 0, 0) @@ -2969,8 +2969,8 @@ class GuiDocEditFooter(QWidget): def updateTheme(self): """Update theme elements. """ - self.linesIcon.setPixmap(CONFIG.theme.getPixmap("status_lines", (self.sPx, self.sPx))) - self.wordsIcon.setPixmap(CONFIG.theme.getPixmap("status_stats", (self.sPx, self.sPx))) + self.linesIcon.setPixmap(SHARED.theme.getPixmap("status_lines", (self.sPx, self.sPx))) + self.wordsIcon.setPixmap(SHARED.theme.getPixmap("status_stats", (self.sPx, self.sPx))) self.matchColours() @@ -2981,9 +2981,9 @@ class GuiDocEditFooter(QWidget): theme rather than the main GUI. """ thePalette = QPalette() - thePalette.setColor(QPalette.Window, QColor(*CONFIG.theme.colBack)) - thePalette.setColor(QPalette.WindowText, QColor(*CONFIG.theme.colText)) - thePalette.setColor(QPalette.Text, QColor(*CONFIG.theme.colText)) + thePalette.setColor(QPalette.Window, QColor(*SHARED.theme.colBack)) + thePalette.setColor(QPalette.WindowText, QColor(*SHARED.theme.colText)) + thePalette.setColor(QPalette.Text, QColor(*SHARED.theme.colText)) self.setPalette(thePalette) self.statusText.setPalette(thePalette) @@ -3000,7 +3000,7 @@ class GuiDocEditFooter(QWidget): logger.debug("No handle set, so clearing the editor footer") self._theItem = None else: - self._theItem = self.mainGui.project.tree[self._docHandle] + self._theItem = SHARED.project.tree[self._docHandle] self.setHasSelection(False) self.updateInfo() diff --git a/novelwriter/gui/dochighlight.py b/novelwriter/gui/dochighlight.py index 1032c886..9c9c1079 100644 --- a/novelwriter/gui/dochighlight.py +++ b/novelwriter/gui/dochighlight.py @@ -32,7 +32,7 @@ from PyQt5.QtGui import ( QColor, QTextCharFormat, QFont, QSyntaxHighlighter, QBrush ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.common import checkInt from novelwriter.constants import nwRegEx, nwUnicode @@ -46,14 +46,13 @@ class GuiDocHighlighter(QSyntaxHighlighter): BLOCK_META = 2 BLOCK_TITLE = 4 - def __init__(self, theDoc, mainGui, spEnchant): + def __init__(self, theDoc, spEnchant): super().__init__(theDoc) logger.debug("Create: GuiDocHighlighter") self.theDoc = theDoc self.spEnchant = spEnchant - self.mainGui = mainGui self.theHandle = None self.spellCheck = False self.spellRx = None @@ -85,24 +84,24 @@ class GuiDocHighlighter(QSyntaxHighlighter): """ logger.debug("Setting up highlighting rules") - self.colHead = QColor(*CONFIG.theme.colHead) - self.colHeadH = QColor(*CONFIG.theme.colHeadH) - self.colDialN = QColor(*CONFIG.theme.colDialN) - self.colDialD = QColor(*CONFIG.theme.colDialD) - self.colDialS = QColor(*CONFIG.theme.colDialS) - self.colHidden = QColor(*CONFIG.theme.colHidden) - self.colKey = QColor(*CONFIG.theme.colKey) - self.colVal = QColor(*CONFIG.theme.colVal) - self.colSpell = QColor(*CONFIG.theme.colSpell) - self.colError = QColor(*CONFIG.theme.colError) - self.colRepTag = QColor(*CONFIG.theme.colRepTag) - self.colMod = QColor(*CONFIG.theme.colMod) - self.colBreak = QColor(*CONFIG.theme.colEmph) + self.colHead = QColor(*SHARED.theme.colHead) + self.colHeadH = QColor(*SHARED.theme.colHeadH) + self.colDialN = QColor(*SHARED.theme.colDialN) + self.colDialD = QColor(*SHARED.theme.colDialD) + self.colDialS = QColor(*SHARED.theme.colDialS) + self.colHidden = QColor(*SHARED.theme.colHidden) + self.colKey = QColor(*SHARED.theme.colKey) + self.colVal = QColor(*SHARED.theme.colVal) + self.colSpell = QColor(*SHARED.theme.colSpell) + self.colError = QColor(*SHARED.theme.colError) + self.colRepTag = QColor(*SHARED.theme.colRepTag) + self.colMod = QColor(*SHARED.theme.colMod) + self.colBreak = QColor(*SHARED.theme.colEmph) self.colBreak.setAlpha(64) self.colEmph = None if CONFIG.highlightEmph: - self.colEmph = QColor(*CONFIG.theme.colEmph) + self.colEmph = QColor(*SHARED.theme.colEmph) self.hStyles = { "header1": self._makeFormat(self.colHead, "bold", 1.8), @@ -285,8 +284,8 @@ class GuiDocHighlighter(QSyntaxHighlighter): if theText.startswith("@"): # Keywords and commands self.setCurrentBlockState(self.BLOCK_META) - pIndex = self.mainGui.project.index - tItem = self.mainGui.project.tree[self.theHandle] + pIndex = SHARED.project.index + tItem = SHARED.project.tree[self.theHandle] isValid, theBits, thePos = pIndex.scanThis(theText) isGood = pIndex.checkThese(theBits, tItem) if isValid: diff --git a/novelwriter/gui/docviewer.py b/novelwriter/gui/docviewer.py index fdb5435f..8c1b143f 100644 --- a/novelwriter/gui/docviewer.py +++ b/novelwriter/gui/docviewer.py @@ -40,7 +40,7 @@ from PyQt5.QtWidgets import ( QAction, QMenu, QFrame ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.enum import nwItemType, nwDocAction, nwDocMode from novelwriter.error import logException from novelwriter.constants import nwUnicode @@ -119,14 +119,14 @@ class GuiDocViewer(QTextBrowser): # Set the widget colours to match syntax theme mainPalette = self.palette() - mainPalette.setColor(QPalette.Window, QColor(*CONFIG.theme.colBack)) - mainPalette.setColor(QPalette.Base, QColor(*CONFIG.theme.colBack)) - mainPalette.setColor(QPalette.Text, QColor(*CONFIG.theme.colText)) + mainPalette.setColor(QPalette.Window, QColor(*SHARED.theme.colBack)) + mainPalette.setColor(QPalette.Base, QColor(*SHARED.theme.colBack)) + mainPalette.setColor(QPalette.Text, QColor(*SHARED.theme.colText)) self.setPalette(mainPalette) docPalette = self.viewport().palette() - docPalette.setColor(QPalette.Base, QColor(*CONFIG.theme.colBack)) - docPalette.setColor(QPalette.Text, QColor(*CONFIG.theme.colText)) + docPalette.setColor(QPalette.Base, QColor(*SHARED.theme.colBack)) + docPalette.setColor(QPalette.Text, QColor(*SHARED.theme.colText)) self.viewport().setPalette(docPalette) self.docHeader.matchColours() @@ -162,7 +162,7 @@ class GuiDocViewer(QTextBrowser): def loadText(self, tHandle, updateHistory=True): """Load text into the viewer from an item handle. """ - if not self.mainGui.project.tree.checkType(tHandle, nwItemType.FILE): + if not SHARED.project.tree.checkType(tHandle, nwItemType.FILE): logger.warning("Item not found") return False @@ -170,7 +170,7 @@ class GuiDocViewer(QTextBrowser): qApp.setOverrideCursor(QCursor(Qt.WaitCursor)) sPos = self.verticalScrollBar().value() - aDoc = ToHtml(self.mainGui.project) + aDoc = ToHtml(SHARED.project) aDoc.setPreview(CONFIG.viewComments, CONFIG.viewSynopsis) aDoc.setLinkHeaders(True) @@ -210,7 +210,7 @@ class GuiDocViewer(QTextBrowser): self.verticalScrollBar().setValue(sPos) self._docHandle = tHandle - self.mainGui.project.data.setLastHandle(tHandle, "viewer") + SHARED.project.data.setLastHandle(tHandle, "viewer") self.docHeader.setTitleFromHandle(self._docHandle) self.updateDocMargins() @@ -506,27 +506,27 @@ class GuiDocViewer(QTextBrowser): " text-align: center;" "}}\n" ).format( - tColR=CONFIG.theme.colText[0], - tColG=CONFIG.theme.colText[1], - tColB=CONFIG.theme.colText[2], - hColR=CONFIG.theme.colHead[0], - hColG=CONFIG.theme.colHead[1], - hColB=CONFIG.theme.colHead[2], - aColR=CONFIG.theme.colVal[0], - aColG=CONFIG.theme.colVal[1], - aColB=CONFIG.theme.colVal[2], - eColR=CONFIG.theme.colEmph[0], - eColG=CONFIG.theme.colEmph[1], - eColB=CONFIG.theme.colEmph[2], - kColR=CONFIG.theme.colKey[0], - kColG=CONFIG.theme.colKey[1], - kColB=CONFIG.theme.colKey[2], - cColR=CONFIG.theme.colHidden[0], - cColG=CONFIG.theme.colHidden[1], - cColB=CONFIG.theme.colHidden[2], - mColR=CONFIG.theme.colMod[0], - mColG=CONFIG.theme.colMod[1], - mColB=CONFIG.theme.colMod[2], + tColR=SHARED.theme.colText[0], + tColG=SHARED.theme.colText[1], + tColB=SHARED.theme.colText[2], + hColR=SHARED.theme.colHead[0], + hColG=SHARED.theme.colHead[1], + hColB=SHARED.theme.colHead[2], + aColR=SHARED.theme.colVal[0], + aColG=SHARED.theme.colVal[1], + aColB=SHARED.theme.colVal[2], + eColR=SHARED.theme.colEmph[0], + eColG=SHARED.theme.colEmph[1], + eColB=SHARED.theme.colEmph[2], + kColR=SHARED.theme.colKey[0], + kColG=SHARED.theme.colKey[1], + kColB=SHARED.theme.colKey[2], + cColR=SHARED.theme.colHidden[0], + cColG=SHARED.theme.colHidden[1], + cColB=SHARED.theme.colHidden[2], + mColR=SHARED.theme.colMod[0], + mColG=SHARED.theme.colMod[1], + mColB=SHARED.theme.colMod[2], ) self.document().setDefaultStyleSheet(styleSheet) @@ -685,7 +685,7 @@ class GuiDocViewHeader(QWidget): # Internal Variables self._docHandle = None - fPx = int(0.9*CONFIG.theme.fontPixelSize) + fPx = int(0.9*SHARED.theme.fontPixelSize) hSp = CONFIG.pxInt(6) # Main Widget Settings @@ -702,7 +702,7 @@ class GuiDocViewHeader(QWidget): self.theTitle.setFixedHeight(fPx) lblFont = self.theTitle.font() - lblFont.setPointSizeF(0.9*CONFIG.theme.fontPointSize) + lblFont.setPointSizeF(0.9*SHARED.theme.fontPointSize) self.theTitle.setFont(lblFont) # Buttons @@ -773,15 +773,15 @@ class GuiDocViewHeader(QWidget): def updateTheme(self): """Update theme elements. """ - self.backButton.setIcon(CONFIG.theme.getIcon("backward")) - self.forwardButton.setIcon(CONFIG.theme.getIcon("forward")) - self.refreshButton.setIcon(CONFIG.theme.getIcon("refresh")) - self.closeButton.setIcon(CONFIG.theme.getIcon("close")) + self.backButton.setIcon(SHARED.theme.getIcon("backward")) + self.forwardButton.setIcon(SHARED.theme.getIcon("forward")) + self.refreshButton.setIcon(SHARED.theme.getIcon("refresh")) + self.closeButton.setIcon(SHARED.theme.getIcon("close")) buttonStyle = ( "QToolButton {{border: none; background: transparent;}} " "QToolButton:hover {{border: none; background: rgba({0},{1},{2},0.2);}}" - ).format(*CONFIG.theme.colText) + ).format(*SHARED.theme.colText) self.backButton.setStyleSheet(buttonStyle) self.forwardButton.setStyleSheet(buttonStyle) @@ -797,9 +797,9 @@ class GuiDocViewHeader(QWidget): theme rather than the main GUI. """ thePalette = QPalette() - thePalette.setColor(QPalette.Window, QColor(*CONFIG.theme.colBack)) - thePalette.setColor(QPalette.WindowText, QColor(*CONFIG.theme.colText)) - thePalette.setColor(QPalette.Text, QColor(*CONFIG.theme.colText)) + thePalette.setColor(QPalette.Window, QColor(*SHARED.theme.colBack)) + thePalette.setColor(QPalette.WindowText, QColor(*SHARED.theme.colText)) + thePalette.setColor(QPalette.Text, QColor(*SHARED.theme.colText)) self.setPalette(thePalette) self.theTitle.setPalette(thePalette) @@ -819,7 +819,7 @@ class GuiDocViewHeader(QWidget): self.refreshButton.setVisible(False) return True - pTree = self.mainGui.project.tree + pTree = SHARED.project.tree if CONFIG.showFullPath: tTitle = [] tTree = pTree.getItemPath(tHandle) @@ -902,7 +902,7 @@ class GuiDocViewFooter(QWidget): # Internal Variables self._docHandle = None - fPx = int(0.9*CONFIG.theme.fontPixelSize) + fPx = int(0.9*SHARED.theme.fontPixelSize) bSp = CONFIG.pxInt(2) hSp = CONFIG.pxInt(8) @@ -987,7 +987,7 @@ class GuiDocViewFooter(QWidget): self.lblSynopsis.setAlignment(Qt.AlignLeft | Qt.AlignTop) lblFont = self.font() - lblFont.setPointSizeF(0.9*CONFIG.theme.fontPointSize) + lblFont.setPointSizeF(0.9*SHARED.theme.fontPointSize) self.lblRefs.setFont(lblFont) self.lblSticky.setFont(lblFont) self.lblComments.setFont(lblFont) @@ -1032,21 +1032,21 @@ class GuiDocViewFooter(QWidget): """ # Icons - fPx = int(0.9*CONFIG.theme.fontPixelSize) + fPx = int(0.9*SHARED.theme.fontPixelSize) - stickyOn = CONFIG.theme.getPixmap("sticky-on", (fPx, fPx)) - stickyOff = CONFIG.theme.getPixmap("sticky-off", (fPx, fPx)) + stickyOn = SHARED.theme.getPixmap("sticky-on", (fPx, fPx)) + stickyOff = SHARED.theme.getPixmap("sticky-off", (fPx, fPx)) stickyIcon = QIcon() stickyIcon.addPixmap(stickyOn, QIcon.Normal, QIcon.On) stickyIcon.addPixmap(stickyOff, QIcon.Normal, QIcon.Off) - bulletOn = CONFIG.theme.getPixmap("bullet-on", (fPx, fPx)) - bulletOff = CONFIG.theme.getPixmap("bullet-off", (fPx, fPx)) + bulletOn = SHARED.theme.getPixmap("bullet-on", (fPx, fPx)) + bulletOff = SHARED.theme.getPixmap("bullet-off", (fPx, fPx)) bulletIcon = QIcon() bulletIcon.addPixmap(bulletOn, QIcon.Normal, QIcon.On) bulletIcon.addPixmap(bulletOff, QIcon.Normal, QIcon.Off) - self.showHide.setIcon(CONFIG.theme.getIcon("reference")) + self.showHide.setIcon(SHARED.theme.getIcon("reference")) self.stickyRefs.setIcon(stickyIcon) self.showComments.setIcon(bulletIcon) self.showSynopsis.setIcon(bulletIcon) @@ -1056,7 +1056,7 @@ class GuiDocViewFooter(QWidget): buttonStyle = ( "QToolButton {{border: none; background: transparent;}} " "QToolButton:hover {{border: none; background: rgba({0},{1},{2},0.2);}}" - ).format(*CONFIG.theme.colText) + ).format(*SHARED.theme.colText) self.showHide.setStyleSheet(buttonStyle) self.stickyRefs.setStyleSheet(buttonStyle) @@ -1072,9 +1072,9 @@ class GuiDocViewFooter(QWidget): theme rather than the main GUI. """ thePalette = QPalette() - thePalette.setColor(QPalette.Window, QColor(*CONFIG.theme.colBack)) - thePalette.setColor(QPalette.WindowText, QColor(*CONFIG.theme.colText)) - thePalette.setColor(QPalette.Text, QColor(*CONFIG.theme.colText)) + thePalette.setColor(QPalette.Window, QColor(*SHARED.theme.colBack)) + thePalette.setColor(QPalette.WindowText, QColor(*SHARED.theme.colText)) + thePalette.setColor(QPalette.Text, QColor(*SHARED.theme.colText)) self.setPalette(thePalette) self.lblRefs.setPalette(thePalette) @@ -1145,7 +1145,7 @@ class GuiDocViewDetails(QScrollArea): self.refList.setScaledContents(True) self.refList.linkActivated.connect(self._linkClicked) - self.linkStyle = "style='color: rgb({0},{1},{2})'".format(*CONFIG.theme.colLink) + self.linkStyle = "style='color: rgb({0},{1},{2})'".format(*SHARED.theme.colLink) # Assemble self.outerWidget = QWidget() @@ -1172,10 +1172,10 @@ class GuiDocViewDetails(QScrollArea): if self.mainGui.docViewer.stickyRef: return - theRefs = self.mainGui.project.index.getBackReferenceList(tHandle) + theRefs = SHARED.project.index.getBackReferenceList(tHandle) theList = [] for tHandle in theRefs: - tItem = self.mainGui.project.tree[tHandle] + tItem = SHARED.project.tree[tHandle] if tItem is not None: theList.append("%s" % ( tHandle, theRefs[tHandle], self.linkStyle, tItem.itemName diff --git a/novelwriter/gui/itemdetails.py b/novelwriter/gui/itemdetails.py index df11ce2c..24c1fa93 100644 --- a/novelwriter/gui/itemdetails.py +++ b/novelwriter/gui/itemdetails.py @@ -29,7 +29,7 @@ from PyQt5.QtCore import Qt, pyqtSlot from PyQt5.QtGui import QFont, QPixmap from PyQt5.QtWidgets import QWidget, QGridLayout, QLabel -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.constants import trConst, nwLabels logger = logging.getLogger(__name__) @@ -42,8 +42,6 @@ class GuiItemDetails(QWidget): logger.debug("Create: GuiItemDetails") - self.mainGui = mainGui - # Internal Variables self._itemHandle = None @@ -51,7 +49,7 @@ class GuiItemDetails(QWidget): hSp = CONFIG.pxInt(6) vSp = CONFIG.pxInt(1) mPx = CONFIG.pxInt(6) - fPt = CONFIG.theme.fontPointSize + fPt = SHARED.theme.fontPointSize fntLabel = QFont() fntLabel.setBold(True) @@ -176,8 +174,8 @@ class GuiItemDetails(QWidget): self.updateTheme() # Make sure the columns for flags and counts don't resize too often - flagWidth = CONFIG.theme.getTextWidth("Mm", fntValue) - countWidth = CONFIG.theme.getTextWidth("99,999", fntValue) + flagWidth = SHARED.theme.getTextWidth("Mm", fntValue) + countWidth = SHARED.theme.getTextWidth("99,999", fntValue) self.mainBox.setColumnMinimumWidth(1, flagWidth) self.mainBox.setColumnMinimumWidth(4, countWidth) @@ -233,13 +231,13 @@ class GuiItemDetails(QWidget): self.clearDetails() return - nwItem = self.mainGui.project.tree[tHandle] + nwItem = SHARED.project.tree[tHandle] if nwItem is None: self.clearDetails() return self._itemHandle = tHandle - iPx = int(round(0.8*CONFIG.theme.baseIconSize)) + iPx = int(round(0.8*SHARED.theme.baseIconSize)) # Label # ===== @@ -250,11 +248,11 @@ class GuiItemDetails(QWidget): if nwItem.isFileType(): if nwItem.isActive: - self.labelIcon.setPixmap(CONFIG.theme.getPixmap("checked", (iPx, iPx))) + self.labelIcon.setPixmap(SHARED.theme.getPixmap("checked", (iPx, iPx))) else: - self.labelIcon.setPixmap(CONFIG.theme.getPixmap("unchecked", (iPx, iPx))) + self.labelIcon.setPixmap(SHARED.theme.getPixmap("unchecked", (iPx, iPx))) else: - self.labelIcon.setPixmap(CONFIG.theme.getPixmap("noncheckable", (iPx, iPx))) + self.labelIcon.setPixmap(SHARED.theme.getPixmap("noncheckable", (iPx, iPx))) self.labelData.setText(theLabel) @@ -268,14 +266,14 @@ class GuiItemDetails(QWidget): # Class # ===== - classIcon = CONFIG.theme.getIcon(nwLabels.CLASS_ICON[nwItem.itemClass]) + classIcon = SHARED.theme.getIcon(nwLabels.CLASS_ICON[nwItem.itemClass]) self.classIcon.setPixmap(classIcon.pixmap(iPx, iPx)) self.classData.setText(trConst(nwLabels.CLASS_NAME[nwItem.itemClass])) # Layout # ====== - usageIcon = CONFIG.theme.getItemIcon( + usageIcon = SHARED.theme.getItemIcon( nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, nwItem.mainHeading ) self.usageIcon.setPixmap(usageIcon.pixmap(iPx, iPx)) diff --git a/novelwriter/gui/mainmenu.py b/novelwriter/gui/mainmenu.py index dce2ca55..21aa8bc3 100644 --- a/novelwriter/gui/mainmenu.py +++ b/novelwriter/gui/mainmenu.py @@ -33,7 +33,7 @@ from PyQt5.QtCore import QUrl from PyQt5.QtGui import QDesktopServices from PyQt5.QtWidgets import QMenuBar, QAction -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.enum import nwDocAction, nwDocInsert, nwWidget from novelwriter.constants import nwConst, trConst, nwKeyWords, nwLabels, nwUnicode @@ -795,7 +795,7 @@ class GuiMainMenu(QMenuBar): # Tools > Check Spelling self.aSpellCheck = QAction(self.tr("Check Spelling"), self) self.aSpellCheck.setCheckable(True) - self.aSpellCheck.setChecked(self.mainGui.project.data.spellCheck) + self.aSpellCheck.setChecked(SHARED.project.data.spellCheck) self.aSpellCheck.triggered.connect(self._toggleSpellCheck) # triggered, not toggled! self.aSpellCheck.setShortcut("Ctrl+F7") self.toolsMenu.addAction(self.aSpellCheck) @@ -825,7 +825,7 @@ class GuiMainMenu(QMenuBar): # Tools > Backup Project self.aBackupProject = QAction(self.tr("Backup Project"), self) - self.aBackupProject.triggered.connect(lambda: self.mainGui.project.backupProject(True)) + self.aBackupProject.triggered.connect(lambda: SHARED.project.backupProject(True)) self.toolsMenu.addAction(self.aBackupProject) # Tools > Build Manuscript diff --git a/novelwriter/gui/noveltree.py b/novelwriter/gui/noveltree.py index 98d36fe9..67bd8a5c 100644 --- a/novelwriter/gui/noveltree.py +++ b/novelwriter/gui/noveltree.py @@ -38,7 +38,7 @@ from PyQt5.QtWidgets import ( QTreeWidgetItem, QVBoxLayout, QWidget ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.enum import nwDocMode, nwItemClass, nwOutline from novelwriter.common import minmax from novelwriter.constants import nwHeaders, nwKeyWords, nwLabels, trConst @@ -117,16 +117,16 @@ class GuiNovelView(QWidget): def openProjectTasks(self): """Run open project tasks. """ - lastNovel = self.mainGui.project.data.getLastHandle("novelTree") - if lastNovel not in self.mainGui.project.tree: - lastNovel = self.mainGui.project.tree.findRoot(nwItemClass.NOVEL) + lastNovel = SHARED.project.data.getLastHandle("novelTree") + if lastNovel not in SHARED.project.tree: + lastNovel = SHARED.project.tree.findRoot(nwItemClass.NOVEL) logger.debug("Setting novel tree to root item '%s'", lastNovel) - lastCol = self.mainGui.project.options.getEnum( + lastCol = SHARED.project.options.getEnum( "GuiNovelView", "lastCol", NovelTreeColumn, NovelTreeColumn.HIDDEN ) - lastColSize = self.mainGui.project.options.getInt( + lastColSize = SHARED.project.options.getInt( "GuiNovelView", "lastColSize", 25 ) @@ -146,7 +146,7 @@ class GuiNovelView(QWidget): """ lastColType = self.novelTree.lastColType lastColSize = self.novelTree.lastColSize - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options pOptions.setValue("GuiNovelView", "lastCol", lastColType) pOptions.setValue("GuiNovelView", "lastColSize", lastColSize) return @@ -170,7 +170,7 @@ class GuiNovelView(QWidget): def refreshTree(self): """Refresh the current tree. """ - self.novelTree.refreshTree(rootHandle=self.mainGui.project.data.getLastHandle("novelTree")) + self.novelTree.refreshTree(rootHandle=SHARED.project.data.getLastHandle("novelTree")) return @pyqtSlot(str) @@ -201,7 +201,7 @@ class GuiNovelToolBar(QWidget): self.novelView = novelView self.mainGui = novelView.mainGui - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize mPx = CONFIG.pxInt(2) self.setContentsMargins(0, 0, 0, 0) @@ -211,7 +211,7 @@ class GuiNovelToolBar(QWidget): selFont = self.font() selFont.setWeight(QFont.Bold) self.novelPrefix = self.tr("Outline of {0}") - self.novelValue = NovelSelector(self, self.mainGui) + self.novelValue = NovelSelector(self) self.novelValue.setFont(selFont) self.novelValue.setMinimumWidth(CONFIG.pxInt(150)) self.novelValue.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) @@ -274,9 +274,9 @@ class GuiNovelToolBar(QWidget): """Update theme elements. """ # Icons - self.tbNovel.setIcon(CONFIG.theme.getIcon("cls_novel")) - self.tbRefresh.setIcon(CONFIG.theme.getIcon("refresh")) - self.tbMore.setIcon(CONFIG.theme.getIcon("menu")) + self.tbNovel.setIcon(SHARED.theme.getIcon("cls_novel")) + self.tbRefresh.setIcon(SHARED.theme.getIcon("refresh")) + self.tbMore.setIcon(SHARED.theme.getIcon("menu")) qPalette = self.palette() qPalette.setBrush(QPalette.Window, qPalette.base()) @@ -345,7 +345,7 @@ class GuiNovelToolBar(QWidget): def _refreshNovelTree(self): """Rebuild the current tree. """ - rootHandle = self.mainGui.project.data.getLastHandle("novelTree") + rootHandle = SHARED.project.data.getLastHandle("novelTree") self.novelView.novelTree.refreshTree(rootHandle=rootHandle, overRide=True) return @@ -415,7 +415,7 @@ class GuiNovelTree(QTreeWidget): # Build GUI # ========= - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize cMg = CONFIG.pxInt(6) self.setIconSize(QSize(iPx, iPx)) @@ -481,8 +481,8 @@ class GuiNovelTree(QTreeWidget): def updateTheme(self): """Update theme elements. """ - iPx = CONFIG.theme.baseIconSize - self._pMore = CONFIG.theme.loadDecoration("deco_doc_more", pxH=iPx) + iPx = SHARED.theme.baseIconSize + self._pMore = SHARED.theme.loadDecoration("deco_doc_more", pxH=iPx) return ## @@ -514,10 +514,10 @@ class GuiNovelTree(QTreeWidget): """ logger.debug("Requesting refresh of the novel tree") if rootHandle is None: - rootHandle = self.mainGui.project.tree.findRoot(nwItemClass.NOVEL) + rootHandle = SHARED.project.tree.findRoot(nwItemClass.NOVEL) treeChanged = self.mainGui.projView.changedSince(self._lastBuild) - indexChanged = self.mainGui.project.index.rootChangedSince(rootHandle, self._lastBuild) + indexChanged = SHARED.project.index.rootChangedSince(rootHandle, self._lastBuild) if not (treeChanged or indexChanged or overRide): logger.debug("No changes have been made to the novel index") return @@ -528,7 +528,7 @@ class GuiNovelTree(QTreeWidget): titleKey = selItem[0].data(self.C_DATA, self.D_KEY) self._populateTree(rootHandle) - self.mainGui.project.data.setLastHandle(rootHandle, "novelTree") + SHARED.project.data.setLastHandle(rootHandle, "novelTree") if titleKey is not None and titleKey in self._treeMap: self._treeMap[titleKey].setSelected(True) @@ -538,7 +538,7 @@ class GuiNovelTree(QTreeWidget): def refreshHandle(self, tHandle): """Refresh the data for a given handle. """ - idxData = self.mainGui.project.index.getItemData(tHandle) + idxData = SHARED.project.index.getItemData(tHandle) if idxData is None: return @@ -575,7 +575,7 @@ class GuiNovelTree(QTreeWidget): self._lastCol = colType self.setColumnHidden(self.C_EXTRA, colType == NovelTreeColumn.HIDDEN) if doRefresh: - lastNovel = self.mainGui.project.data.getLastHandle("novelTree") + lastNovel = SHARED.project.data.getLastHandle("novelTree") self.refreshTree(rootHandle=lastNovel, overRide=True) return @@ -707,7 +707,7 @@ class GuiNovelTree(QTreeWidget): tStart = time() logger.debug("Building novel tree for root item '%s'", rootHandle) - novStruct = self.mainGui.project.index.novelStructure(rootHandle=rootHandle, skipExcl=True) + novStruct = SHARED.project.index.novelStructure(rootHandle=rootHandle, skipExcl=True) for tKey, tHandle, sTitle, novIdx in novStruct: if novIdx.level == "H0": continue @@ -733,7 +733,7 @@ class GuiNovelTree(QTreeWidget): """Set the tree item values from the index entry. """ iLevel = nwHeaders.H_LEVEL.get(idxItem.level, 0) - hDec = CONFIG.theme.getHeaderDecoration(iLevel) + hDec = SHARED.theme.getHeaderDecoration(iLevel) trItem.setData(self.C_TITLE, Qt.DecorationRole, hDec) trItem.setText(self.C_TITLE, idxItem.title) @@ -759,7 +759,7 @@ class GuiNovelTree(QTreeWidget): refData = [] refName = "" - theRefs = self.mainGui.project.index.getReferences(tHandle, sTitle) + theRefs = SHARED.project.index.getReferences(tHandle, sTitle) if self._lastCol == NovelTreeColumn.POV: refData = theRefs[nwKeyWords.POV_KEY] refName = self._povLabel @@ -783,7 +783,7 @@ class GuiNovelTree(QTreeWidget): """ logger.debug("Generating meta data tooltip for '%s:%s'", tHandle, sTitle) - pIndex = self.mainGui.project.index + pIndex = SHARED.project.index novIdx = pIndex.getItemHeader(tHandle, sTitle) refTags = pIndex.getReferences(tHandle, sTitle) diff --git a/novelwriter/gui/outline.py b/novelwriter/gui/outline.py index 73440f1f..d61adad8 100644 --- a/novelwriter/gui/outline.py +++ b/novelwriter/gui/outline.py @@ -41,7 +41,7 @@ from PyQt5.QtWidgets import ( QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.enum import ( nwDocMode, nwItemClass, nwItemLayout, nwItemType, nwOutline ) @@ -62,8 +62,6 @@ class GuiOutlineView(QWidget): def __init__(self, mainGui): super().__init__(parent=mainGui) - self.mainGui = mainGui - # Build GUI self.outlineTree = GuiOutlineTree(self) self.outlineData = GuiOutlineDetails(self) @@ -117,7 +115,7 @@ class GuiOutlineView(QWidget): def refreshTree(self): """Refresh the current tree. """ - self.outlineTree.refreshTree(rootHandle=self.mainGui.project.data.getLastHandle("outline")) + self.outlineTree.refreshTree(rootHandle=SHARED.project.data.getLastHandle("outline")) return def clearProject(self): @@ -130,9 +128,9 @@ class GuiOutlineView(QWidget): def openProjectTasks(self): """Run open project tasks. """ - lastOutline = self.mainGui.project.data.getLastHandle("outline") - if not (lastOutline in self.mainGui.project.tree or lastOutline is None): - lastOutline = self.mainGui.project.tree.findRoot(nwItemClass.NOVEL) + lastOutline = SHARED.project.data.getLastHandle("outline") + if not (lastOutline in SHARED.project.tree or lastOutline is None): + lastOutline = SHARED.project.tree.findRoot(nwItemClass.NOVEL) logger.debug("Setting outline tree to root item '%s'", lastOutline) @@ -214,8 +212,6 @@ class GuiOutlineToolBar(QToolBar): logger.debug("Create: GuiOutlineToolBar") - self.mainGui = theOutline.mainGui - iPx = CONFIG.pxInt(22) mPx = CONFIG.pxInt(12) @@ -230,7 +226,7 @@ class GuiOutlineToolBar(QToolBar): self.novelLabel = QLabel(self.tr("Outline of")) self.novelLabel.setContentsMargins(0, 0, mPx, 0) - self.novelValue = NovelSelector(self, self.mainGui) + self.novelValue = NovelSelector(self) self.novelValue.setMinimumWidth(CONFIG.pxInt(200)) self.novelValue.novelSelectionChanged.connect(self._novelValueChanged) @@ -272,8 +268,8 @@ class GuiOutlineToolBar(QToolBar): self.setStyleSheet("QToolBar {border: 0px;}") self.novelValue.updateList(includeAll=True) - self.aRefresh.setIcon(CONFIG.theme.getIcon("refresh")) - self.tbColumns.setIcon(CONFIG.theme.getIcon("menu")) + self.aRefresh.setIcon(SHARED.theme.getIcon("refresh")) + self.tbColumns.setIcon(SHARED.theme.getIcon("menu")) return @@ -370,7 +366,6 @@ class GuiOutlineTree(QTreeWidget): logger.debug("Create: GuiOutlineTree") self.outlineView = outlineView - self.mainGui = outlineView.mainGui self.setUniformRowHeights(True) self.setFrameStyle(QFrame.NoFrame) @@ -381,7 +376,7 @@ class GuiOutlineTree(QTreeWidget): self.itemDoubleClicked.connect(self._treeDoubleClick) self.itemSelectionChanged.connect(self._itemSelected) - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize self.setIconSize(QSize(iPx, iPx)) self.setIndentation(0) @@ -398,11 +393,11 @@ class GuiOutlineTree(QTreeWidget): self._hFonts = [self.font(), fH1, fH2, self.font(), self.font()] self._dIcon = { - "H0": CONFIG.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H0"), - "H1": CONFIG.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H1"), - "H2": CONFIG.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H2"), - "H3": CONFIG.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H3"), - "H4": CONFIG.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H4"), + "H0": SHARED.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H0"), + "H1": SHARED.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H1"), + "H2": SHARED.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H2"), + "H3": SHARED.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H3"), + "H4": SHARED.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H4"), } # Internals @@ -488,13 +483,13 @@ class GuiOutlineTree(QTreeWidget): # If the novel index or novel tree has changed since the tree # was last built, we rebuild the tree from the updated index. - indexChanged = self.mainGui.project.index.rootChangedSince(rootHandle, self._lastBuild) + indexChanged = SHARED.project.index.rootChangedSince(rootHandle, self._lastBuild) if not (novelChanged or indexChanged or overRide): logger.debug("No changes have been made to the novel index") return self._populateTree(rootHandle) - self.mainGui.project.data.setLastHandle(rootHandle or None, "outline") + SHARED.project.data.setLastHandle(rootHandle or None, "outline") return @@ -574,7 +569,7 @@ class GuiOutlineTree(QTreeWidget): """ # Load whatever we saved last time, regardless of wether it # contains the correct names or number of columns. - colState = self.mainGui.project.options.getValue("GuiOutline", "columnState", {}) + colState = SHARED.project.options.getValue("GuiOutline", "columnState", {}) tmpOrder = [] tmpHidden = {} @@ -625,7 +620,7 @@ class GuiOutlineTree(QTreeWidget): logHidden, orgWidth if logHidden and logWidth == 0 else logWidth ] - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options pOptions.setValue("GuiOutline", "columnState", colState) pOptions.saveSettings() @@ -661,7 +656,7 @@ class GuiOutlineTree(QTreeWidget): headItem.setTextAlignment(self._colIdx[nwOutline.WCOUNT], Qt.AlignRight) headItem.setTextAlignment(self._colIdx[nwOutline.PCOUNT], Qt.AlignRight) - novStruct = self.mainGui.project.index.novelStructure(rootHandle=rootHandle, skipExcl=True) + novStruct = SHARED.project.index.novelStructure(rootHandle=rootHandle, skipExcl=True) for _, tHandle, sTitle, novIdx in novStruct: iLevel = nwHeaders.H_LEVEL.get(novIdx.level, 0) @@ -669,8 +664,8 @@ class GuiOutlineTree(QTreeWidget): continue trItem = QTreeWidgetItem() - nwItem = self.mainGui.project.tree[tHandle] - hDec = CONFIG.theme.getHeaderDecoration(iLevel) + nwItem = SHARED.project.tree[tHandle] + hDec = SHARED.theme.getHeaderDecoration(iLevel) trItem.setData(self._colIdx[nwOutline.TITLE], Qt.DecorationRole, hDec) trItem.setText(self._colIdx[nwOutline.TITLE], novIdx.title) @@ -689,7 +684,7 @@ class GuiOutlineTree(QTreeWidget): trItem.setTextAlignment(self._colIdx[nwOutline.WCOUNT], Qt.AlignRight) trItem.setTextAlignment(self._colIdx[nwOutline.PCOUNT], Qt.AlignRight) - refs = self.mainGui.project.index.getReferences(tHandle, sTitle) + refs = SHARED.project.index.getReferences(tHandle, sTitle) trItem.setText(self._colIdx[nwOutline.POV], ", ".join(refs[nwKeyWords.POV_KEY])) trItem.setText(self._colIdx[nwOutline.FOCUS], ", ".join(refs[nwKeyWords.FOCUS_KEY])) trItem.setText(self._colIdx[nwOutline.CHAR], ", ".join(refs[nwKeyWords.CHAR_KEY])) @@ -770,12 +765,11 @@ class GuiOutlineDetails(QScrollArea): logger.debug("Create: GuiOutlineDetails") self.theOutline = theOutline - self.mainGui = theOutline.mainGui # Sizes - minTitle = 30*CONFIG.theme.textNWidth - maxTitle = 40*CONFIG.theme.textNWidth - wCount = CONFIG.theme.getTextWidth("999,999") + minTitle = 30*SHARED.theme.textNWidth + maxTitle = 40*SHARED.theme.textNWidth + wCount = SHARED.theme.getTextWidth("999,999") hSpace = int(CONFIG.pxInt(10)) vSpace = int(CONFIG.pxInt(4)) @@ -1005,8 +999,8 @@ class GuiOutlineDetails(QScrollArea): """Update the content of the tree with the given handle and line number pointing to a header. """ - pIndex = self.mainGui.project.index - nwItem = self.mainGui.project.tree[tHandle] + pIndex = SHARED.project.index + nwItem = SHARED.project.tree[tHandle] novIdx = pIndex.getItemHeader(tHandle, sTitle) theRefs = pIndex.getReferences(tHandle, sTitle) if nwItem is None or novIdx is None: @@ -1049,7 +1043,7 @@ class GuiOutlineDetails(QScrollArea): def updateClasses(self): """Update the visibility status of class details. """ - usedClasses = self.mainGui.project.tree.rootClasses() + usedClasses = SHARED.project.tree.rootClasses() pltVisible = nwItemClass.PLOT in usedClasses timVisible = nwItemClass.TIMELINE in usedClasses diff --git a/novelwriter/gui/projtree.py b/novelwriter/gui/projtree.py index a4dedd46..8974d602 100644 --- a/novelwriter/gui/projtree.py +++ b/novelwriter/gui/projtree.py @@ -39,7 +39,7 @@ from PyQt5.QtWidgets import ( QVBoxLayout, QWidget ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.common import minmax from novelwriter.constants import nwHeaders, nwUnicode, trConst, nwLabels from novelwriter.core.item import NWItem @@ -236,7 +236,7 @@ class GuiProjectToolBar(QWidget): self.projTree = projView.projTree self.mainGui = projView.mainGui - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize mPx = CONFIG.pxInt(2) self.setContentsMargins(0, 0, 0, 0) @@ -367,16 +367,16 @@ class GuiProjectToolBar(QWidget): self.tbAdd.setStyleSheet(buttonStyle) self.tbMore.setStyleSheet(buttonStyle) - self.tbQuick.setIcon(CONFIG.theme.getIcon("bookmark")) - self.tbMoveU.setIcon(CONFIG.theme.getIcon("up")) - self.tbMoveD.setIcon(CONFIG.theme.getIcon("down")) - self.aAddEmpty.setIcon(CONFIG.theme.getIcon("proj_document")) - self.aAddChap.setIcon(CONFIG.theme.getIcon("proj_chapter")) - self.aAddScene.setIcon(CONFIG.theme.getIcon("proj_scene")) - self.aAddNote.setIcon(CONFIG.theme.getIcon("proj_note")) - self.aAddFolder.setIcon(CONFIG.theme.getIcon("proj_folder")) - self.tbAdd.setIcon(CONFIG.theme.getIcon("add")) - self.tbMore.setIcon(CONFIG.theme.getIcon("menu")) + self.tbQuick.setIcon(SHARED.theme.getIcon("bookmark")) + self.tbMoveU.setIcon(SHARED.theme.getIcon("up")) + self.tbMoveD.setIcon(SHARED.theme.getIcon("down")) + self.aAddEmpty.setIcon(SHARED.theme.getIcon("proj_document")) + self.aAddChap.setIcon(SHARED.theme.getIcon("proj_chapter")) + self.aAddScene.setIcon(SHARED.theme.getIcon("proj_scene")) + self.aAddNote.setIcon(SHARED.theme.getIcon("proj_note")) + self.aAddFolder.setIcon(SHARED.theme.getIcon("proj_folder")) + self.tbAdd.setIcon(SHARED.theme.getIcon("add")) + self.tbMore.setIcon(SHARED.theme.getIcon("menu")) self.buildQuickLinkMenu() self._buildRootMenu() @@ -392,10 +392,10 @@ class GuiProjectToolBar(QWidget): """Build the quick link menu.""" logger.debug("Rebuilding quick links menu") self.mQuick.clear() - for n, (tHandle, nwItem) in enumerate(self.mainGui.project.tree.iterRoots(None)): + for n, (tHandle, nwItem) in enumerate(SHARED.project.tree.iterRoots(None)): aRoot = self.mQuick.addAction(nwItem.itemName) aRoot.setData(tHandle) - aRoot.setIcon(CONFIG.theme.getIcon(nwLabels.CLASS_ICON[nwItem.itemClass])) + aRoot.setIcon(SHARED.theme.getIcon(nwLabels.CLASS_ICON[nwItem.itemClass])) aRoot.triggered.connect( lambda n, tHandle=tHandle: self.projView.setSelectedHandle(tHandle, doScroll=True) ) @@ -409,7 +409,7 @@ class GuiProjectToolBar(QWidget): """Build the rood folder menu.""" def addClass(itemClass): aNew = self.mAddRoot.addAction(trConst(nwLabels.CLASS_NAME[itemClass])) - aNew.setIcon(CONFIG.theme.getIcon(nwLabels.CLASS_ICON[itemClass])) + aNew.setIcon(SHARED.theme.getIcon(nwLabels.CLASS_ICON[itemClass])) aNew.triggered.connect(lambda: self.projTree.newTreeItem(nwItemType.ROOT, itemClass)) self.mAddRoot.addAction(aNew) return @@ -438,7 +438,7 @@ class GuiProjectToolBar(QWidget): documents. They should only be visible if novel documents can actually be added. """ - nwItem = self.mainGui.project.tree[tHandle] + nwItem = SHARED.project.tree[tHandle] allowDoc = isinstance(nwItem, NWItem) and nwItem.documentAllowed() self.aAddEmpty.setVisible(allowDoc) self.aAddChap.setVisible(allowDoc) @@ -480,7 +480,7 @@ class GuiProjectTree(QTreeWidget): self.customContextMenuRequested.connect(self._openContextMenu) # Tree Settings - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize cMg = CONFIG.pxInt(6) self.setIconSize(QSize(iPx, iPx)) @@ -572,15 +572,15 @@ class GuiProjectTree(QTreeWidget): if itemType == nwItemType.ROOT and isinstance(itemClass, nwItemClass): - tHandle = self.mainGui.project.newRoot(itemClass) + tHandle = SHARED.project.newRoot(itemClass) sHandle = self.getSelectedHandle() - pItem = self.mainGui.project.tree[sHandle] if sHandle else None + pItem = SHARED.project.tree[sHandle] if sHandle else None nHandle = pItem.itemRoot if pItem else None elif itemType in (nwItemType.FILE, nwItemType.FOLDER): sHandle = self.getSelectedHandle() - pItem = self.mainGui.project.tree[sHandle] if sHandle else None + pItem = SHARED.project.tree[sHandle] if sHandle else None if sHandle is None or pItem is None: self.mainGui.makeAlert(self.tr( "Did not find anywhere to add the file or folder!" @@ -592,7 +592,7 @@ class GuiProjectTree(QTreeWidget): sLevel = nwHeaders.H_LEVEL.get(pItem.mainHeading, 0) sIsParent = False if qItem is None else qItem.childCount() > 0 - if self.mainGui.project.tree.isTrash(sHandle): + if SHARED.project.tree.isTrash(sHandle): self.mainGui.makeAlert(self.tr( "Cannot add new files or folders to the Trash folder." ), level=nwAlert.ERROR) @@ -635,9 +635,9 @@ class GuiProjectTree(QTreeWidget): # Add the file or folder if itemType == nwItemType.FILE: - tHandle = self.mainGui.project.newFile(newLabel, sHandle) + tHandle = SHARED.project.newFile(newLabel, sHandle) else: - tHandle = self.mainGui.project.newFolder(newLabel, sHandle) + tHandle = SHARED.project.newFolder(newLabel, sHandle) else: logger.error("Failed to add new item") @@ -650,7 +650,7 @@ class GuiProjectTree(QTreeWidget): # Handle new file creation if itemType == nwItemType.FILE and hLevel > 0: - self.mainGui.project.writeNewFile(tHandle, hLevel, not isNote) + SHARED.project.writeNewFile(tHandle, hLevel, not isNote) # Add the new item to the project tree self.revealNewTreeItem(tHandle, nHandle=nHandle, wordCount=True) @@ -661,7 +661,7 @@ class GuiProjectTree(QTreeWidget): def revealNewTreeItem(self, tHandle: str | None, nHandle: str | None = None, wordCount: bool = False) -> bool: """Reveal a newly added project item in the project tree.""" - nwItem = self.mainGui.project.tree[tHandle] if tHandle else None + nwItem = SHARED.project.tree[tHandle] if tHandle else None if tHandle is None or nwItem is None: return False @@ -670,7 +670,7 @@ class GuiProjectTree(QTreeWidget): return False if nwItem.isFileType() and wordCount: - wC = self.mainGui.project.index.getCounts(tHandle)[1] + wC = SHARED.project.index.getCounts(tHandle)[1] self.propagateCount(tHandle, wC) self.projView.wordCountsChanged.emit() @@ -745,7 +745,7 @@ class GuiProjectTree(QTreeWidget): def renameTreeItem(self, tHandle: str) -> bool: """Open a dialog to edit the label of an item.""" - tItem = self.mainGui.project.tree[tHandle] + tItem = SHARED.project.tree[tHandle] if tItem is None: return False @@ -769,7 +769,7 @@ class GuiProjectTree(QTreeWidget): if isinstance(item, QTreeWidgetItem): theList = self._scanChildren(theList, item, i) logger.debug("Saving project tree item order") - self.mainGui.project.setTreeOrder(theList) + SHARED.project.setTreeOrder(theList) return def getTreeFromHandle(self, tHandle: str) -> list[str]: @@ -802,16 +802,16 @@ class GuiProjectTree(QTreeWidget): logger.error("There is no item to delete") return False - trashHandle = self.mainGui.project.tree.trashRoot() + trashHandle = SHARED.project.tree.trashRoot() if tHandle == trashHandle: logger.error("Cannot delete the Trash folder") return False - nwItem = self.mainGui.project.tree[tHandle] + nwItem = SHARED.project.tree[tHandle] if nwItem is None: return False - if self.mainGui.project.tree.isTrash(tHandle) or nwItem.isRootType(): + if SHARED.project.tree.isTrash(tHandle) or nwItem.isRootType(): status = self.permDeleteItem(tHandle) else: status = self.moveItemToTrash(tHandle) @@ -827,7 +827,7 @@ class GuiProjectTree(QTreeWidget): logger.error("No project open") return False - trashHandle = self.mainGui.project.tree.trashRoot() + trashHandle = SHARED.project.tree.trashRoot() logger.debug("Emptying Trash folder") if trashHandle is None: @@ -870,13 +870,13 @@ class GuiProjectTree(QTreeWidget): so such a request is cancelled. """ trItemS = self._getTreeItem(tHandle) - nwItemS = self.mainGui.project.tree[tHandle] + nwItemS = SHARED.project.tree[tHandle] if trItemS is None or nwItemS is None: logger.error("Could not find tree item for deletion") return False - if self.mainGui.project.tree.isTrash(tHandle): + if SHARED.project.tree.isTrash(tHandle): logger.error("Item is already in the Trash folder") return False @@ -920,7 +920,7 @@ class GuiProjectTree(QTreeWidget): Root items are handled a little different than other items. """ trItemS = self._getTreeItem(tHandle) - nwItemS = self.mainGui.project.tree[tHandle] + nwItemS = SHARED.project.tree[tHandle] if trItemS is None or nwItemS is None: logger.error("Could not find tree item for deletion") return False @@ -937,7 +937,7 @@ class GuiProjectTree(QTreeWidget): tIndex = self.indexOfTopLevelItem(trItemS) self.takeTopLevelItem(tIndex) - self.mainGui.project.removeItem(tHandle) + SHARED.project.removeItem(tHandle) self._treeMap.pop(tHandle, None) self._alertTreeChange(tHandle, flush=True) @@ -966,7 +966,7 @@ class GuiProjectTree(QTreeWidget): for dHandle in reversed(self.getTreeFromHandle(tHandle)): if self.mainGui.docEditor.docHandle() == dHandle: self.mainGui.closeDocument() - self.mainGui.project.removeItem(dHandle) + SHARED.project.removeItem(dHandle) self._treeMap.pop(dHandle, None) self._alertTreeChange(tHandle, flush=flush) @@ -984,13 +984,13 @@ class GuiProjectTree(QTreeWidget): already coming from the project tree. """ trItem = self._getTreeItem(tHandle) - nwItem = self.mainGui.project.tree[tHandle] + nwItem = SHARED.project.tree[tHandle] if trItem is None or nwItem is None: return itemStatus, statusIcon = nwItem.getImportStatus(incIcon=True) hLevel = nwItem.mainHeading - itemIcon = CONFIG.theme.getItemIcon( + itemIcon = SHARED.theme.getItemIcon( nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, hLevel ) @@ -1006,7 +1006,7 @@ class GuiProjectTree(QTreeWidget): else: iconName = "noncheckable" - trItem.setIcon(self.C_ACTIVE, CONFIG.theme.getIcon(iconName)) + trItem.setIcon(self.C_ACTIVE, SHARED.theme.getIcon(iconName)) if CONFIG.emphLabels and nwItem.isDocumentLayout(): trFont = trItem.font(self.C_NAME) @@ -1046,10 +1046,10 @@ class GuiProjectTree(QTreeWidget): pHandle = pItem.data(self.C_DATA, self.D_HANDLE) if pHandle: - if self.mainGui.project.tree.checkType(pHandle, nwItemType.FILE): + if SHARED.project.tree.checkType(pHandle, nwItemType.FILE): # A file has an internal word count we need to account # for, but a folder always has 0 words on its own. - pCount += self.mainGui.project.index.getCounts(pHandle)[1] + pCount += SHARED.project.index.getCounts(pHandle)[1] self.propagateCount(pHandle, pCount, countChildren=False) @@ -1064,7 +1064,7 @@ class GuiProjectTree(QTreeWidget): logger.debug("Building the project tree ...") self.clearTree() count = 0 - for nwItem in self.mainGui.project.getProjectItems(): + for nwItem in SHARED.project.getProjectItems(): count += 1 self._addTreeItem(nwItem) if count > 0: @@ -1177,7 +1177,7 @@ class GuiProjectTree(QTreeWidget): if tHandle is None: return - tItem = self.mainGui.project.tree[tHandle] + tItem = SHARED.project.tree[tHandle] if tItem is None: return @@ -1199,7 +1199,7 @@ class GuiProjectTree(QTreeWidget): selItem = self.itemAt(clickPos) if isinstance(selItem, QTreeWidgetItem): tHandle = selItem.data(self.C_DATA, self.D_HANDLE) - tItem = self.mainGui.project.tree[tHandle] + tItem = SHARED.project.tree[tHandle] hasChild = selItem.childCount() > 0 if tItem is None or tHandle is None: @@ -1211,7 +1211,7 @@ class GuiProjectTree(QTreeWidget): # Trash Folder # ============ - trashHandle = self.mainGui.project.tree.trashRoot() + trashHandle = SHARED.project.tree.trashRoot() if tItem.itemHandle == trashHandle and trashHandle is not None: # The trash folder only has one option aEmptyTrash = ctxMenu.addAction(self.tr("Empty Trash")) @@ -1250,7 +1250,7 @@ class GuiProjectTree(QTreeWidget): checkMark = f" ({nwUnicode.U_CHECK})" if tItem.isNovelLike(): mStatus = ctxMenu.addMenu(self.tr("Set Status to ...")) - for n, (key, entry) in enumerate(self.mainGui.project.data.itemStatus.items()): + for n, (key, entry) in enumerate(SHARED.project.data.itemStatus.items()): entryName = entry["name"] + (checkMark if tItem.itemStatus == key else "") aStatus = mStatus.addAction(entry["icon"], entryName) aStatus.triggered.connect( @@ -1263,7 +1263,7 @@ class GuiProjectTree(QTreeWidget): ) else: mImport = ctxMenu.addMenu(self.tr("Set Importance to ...")) - for n, (key, entry) in enumerate(self.mainGui.project.data.itemImport.items()): + for n, (key, entry) in enumerate(SHARED.project.data.itemImport.items()): entryName = entry["name"] + (checkMark if tItem.itemImport == key else "") aImport = mImport.addAction(entry["icon"], entryName) aImport.triggered.connect( @@ -1375,7 +1375,7 @@ class GuiProjectTree(QTreeWidget): return tHandle = selItem.data(self.C_DATA, self.D_HANDLE) - tItem = self.mainGui.project.tree[tHandle] + tItem = SHARED.project.tree[tHandle] if tItem is None: return @@ -1419,7 +1419,7 @@ class GuiProjectTree(QTreeWidget): def _postItemMove(self, tHandle: str, wCount: int) -> bool: """Run various maintenance tasks for a moved item.""" trItemS = self._getTreeItem(tHandle) - nwItemS = self.mainGui.project.tree[tHandle] + nwItemS = SHARED.project.tree[tHandle] trItemP = trItemS.parent() if trItemS else None if trItemP is None or nwItemS is None: logger.error("Failed to find new parent item of '%s'", tHandle) @@ -1436,13 +1436,13 @@ class GuiProjectTree(QTreeWidget): logger.debug("A total of %d item(s) were moved", len(mHandles)) for mHandle in mHandles: logger.debug("Updating item '%s'", mHandle) - self.mainGui.project.tree.updateItemData(mHandle) + SHARED.project.tree.updateItemData(mHandle) # Update the index if nwItemS.isInactiveClass(): - self.mainGui.project.index.deleteHandle(mHandle) + SHARED.project.index.deleteHandle(mHandle) else: - self.mainGui.project.index.reIndexHandle(mHandle) + SHARED.project.index.reIndexHandle(mHandle) self.setTreeItemValues(mHandle) @@ -1462,7 +1462,7 @@ class GuiProjectTree(QTreeWidget): def _toggleItemActive(self, tHandle: str) -> None: """Toggle the active status of an item.""" - tItem = self.mainGui.project.tree[tHandle] + tItem = SHARED.project.tree[tHandle] if tItem is not None: tItem.setActive(not tItem.isActive) self.setTreeItemValues(tItem.itemHandle) @@ -1483,7 +1483,7 @@ class GuiProjectTree(QTreeWidget): def _changeItemStatus(self, tHandle: str, tStatus: str) -> None: """Set a new status value of an item.""" - tItem = self.mainGui.project.tree[tHandle] + tItem = SHARED.project.tree[tHandle] if tItem is not None: tItem.setStatus(tStatus) self.setTreeItemValues(tItem.itemHandle) @@ -1492,7 +1492,7 @@ class GuiProjectTree(QTreeWidget): def _changeItemImport(self, tHandle: str, tImport: str) -> None: """Set a new importance value of an item.""" - tItem = self.mainGui.project.tree[tHandle] + tItem = SHARED.project.tree[tHandle] if tItem is not None: tItem.setImport(tImport) self.setTreeItemValues(tItem.itemHandle) @@ -1501,7 +1501,7 @@ class GuiProjectTree(QTreeWidget): def _changeItemLayout(self, tHandle: str, itemLayout: nwItemLayout) -> None: """Set a new item layout value of an item.""" - tItem = self.mainGui.project.tree[tHandle] + tItem = SHARED.project.tree[tHandle] if tItem is not None: if itemLayout == nwItemLayout.DOCUMENT and tItem.documentAllowed(): tItem.setLayout(nwItemLayout.DOCUMENT) @@ -1515,7 +1515,7 @@ class GuiProjectTree(QTreeWidget): def _covertFolderToFile(self, tHandle: str, itemLayout: nwItemLayout) -> None: """Convert a folder to a note or document.""" - tItem = self.mainGui.project.tree[tHandle] + tItem = SHARED.project.tree[tHandle] if tItem is not None and tItem.isFolderType(): msgYes = self.mainGui.askQuestion(self.tr( "Do you want to convert the folder to a {0}? " @@ -1540,7 +1540,7 @@ class GuiProjectTree(QTreeWidget): logger.info("Request to merge items under handle '%s'", tHandle) itemList = self.getTreeFromHandle(tHandle) - tItem = self.mainGui.project.tree[tHandle] + tItem = SHARED.project.tree[tHandle] if tItem is None: return False @@ -1566,7 +1566,7 @@ class GuiProjectTree(QTreeWidget): self.mainGui.saveDocument() # Create merge object, and append docs - docMerger = DocMerger(self.mainGui.project) + docMerger = DocMerger(SHARED.project) mLabel = self.tr("Merged") if newFile: @@ -1588,7 +1588,7 @@ class GuiProjectTree(QTreeWidget): ) return False - self.mainGui.project.index.reIndexHandle(mHandle) + SHARED.project.index.reIndexHandle(mHandle) if newFile: self.revealNewTreeItem(mHandle, nHandle=tHandle, wordCount=True) @@ -1613,7 +1613,7 @@ class GuiProjectTree(QTreeWidget): """Split a document into multiple documents.""" logger.info("Request to split items with handle '%s'", tHandle) - tItem = self.mainGui.project.tree[tHandle] + tItem = SHARED.project.tree[tHandle] if tItem is None: return False @@ -1632,7 +1632,7 @@ class GuiProjectTree(QTreeWidget): intoFolder = splitData.get("intoFolder", False) docHierarchy = splitData.get("docHierarchy", False) - docSplit = DocSplitter(self.mainGui.project, tHandle) + docSplit = DocSplitter(SHARED.project, tHandle) if intoFolder: fHandle = docSplit.newParentFolder(tItem.itemParent, tItem.itemName) self.revealNewTreeItem(fHandle, nHandle=tHandle) @@ -1642,7 +1642,7 @@ class GuiProjectTree(QTreeWidget): docSplit.splitDocument(headerList, splitText) for writeOk, dHandle, nHandle in docSplit.writeDocuments(docHierarchy): - self.mainGui.project.index.reIndexHandle(dHandle) + SHARED.project.index.reIndexHandle(dHandle) self.revealNewTreeItem(dHandle, nHandle=nHandle, wordCount=True) self._alertTreeChange(dHandle, flush=False) if not writeOk: @@ -1676,10 +1676,10 @@ class GuiProjectTree(QTreeWidget): if not self.mainGui.askQuestion(question): return False - docDup = DocDuplicator(self.mainGui.project) + docDup = DocDuplicator(SHARED.project) dupCount = 0 for dHandle, nHandle in docDup.duplicate(itemTree): - self.mainGui.project.index.reIndexHandle(dHandle) + SHARED.project.index.reIndexHandle(dHandle) self.revealNewTreeItem(dHandle, nHandle=nHandle, wordCount=True) self._alertTreeChange(dHandle, flush=False) dupCount += 1 @@ -1699,7 +1699,7 @@ class GuiProjectTree(QTreeWidget): cCount = tItem.childCount() # Update tree-related meta data - nwItem = self.mainGui.project.tree[tHandle] + nwItem = SHARED.project.tree[tHandle] if nwItem is not None: nwItem.setExpanded(tItem.isExpanded() and cCount > 0) nwItem.setOrder(tIndex) @@ -1766,13 +1766,13 @@ class GuiProjectTree(QTreeWidget): """Adds the trash root folder if it doesn't already exist in the project tree. """ - trashHandle = self.mainGui.project.trashFolder() + trashHandle = SHARED.project.trashFolder() if trashHandle is None: return None trItem = self._getTreeItem(trashHandle) if trItem is None: - trItem = self._addTreeItem(self.mainGui.project.tree[trashHandle]) + trItem = self._addTreeItem(SHARED.project.tree[trashHandle]) if trItem is not None: trItem.setExpanded(True) self._alertTreeChange(trashHandle, flush=True) @@ -1785,14 +1785,14 @@ class GuiProjectTree(QTreeWidget): deleted. """ self._timeChanged = time() - self.mainGui.project.setProjectChanged(True) + SHARED.project.setProjectChanged(True) if flush: self.saveTreeOrder() - if tHandle is None or tHandle not in self.mainGui.project.tree: + if tHandle is None or tHandle not in SHARED.project.tree: return - tItem = self.mainGui.project.tree[tHandle] + tItem = SHARED.project.tree[tHandle] if tItem and tItem.isRootType(): self.projView.rootFolderChanged.emit(tHandle) diff --git a/novelwriter/gui/sidebar.py b/novelwriter/gui/sidebar.py index 6ec9f308..266d735a 100644 --- a/novelwriter/gui/sidebar.py +++ b/novelwriter/gui/sidebar.py @@ -30,7 +30,7 @@ from PyQt5.QtWidgets import ( QToolBar, QWidget, QSizePolicy, QAction, QMenu, QToolButton ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.enum import nwView logger = logging.getLogger(__name__) @@ -51,8 +51,8 @@ class GuiSideBar(QToolBar): iPx = CONFIG.pxInt(22) mPx = CONFIG.pxInt(60) - lblFont = CONFIG.theme.guiFont - lblFont.setPointSizeF(0.65*CONFIG.theme.fontPointSize) + lblFont = SHARED.theme.guiFont + lblFont.setPointSizeF(0.65*SHARED.theme.fontPointSize) self.setMovable(False) self.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) @@ -130,13 +130,13 @@ class GuiSideBar(QToolBar): """ self.setStyleSheet("QToolBar {border: 0px;}") - self.aProject.setIcon(CONFIG.theme.getIcon("view_editor")) - self.aNovel.setIcon(CONFIG.theme.getIcon("view_novel")) - self.aOutline.setIcon(CONFIG.theme.getIcon("view_outline")) - self.aBuild.setIcon(CONFIG.theme.getIcon("view_build")) - self.aDetails.setIcon(CONFIG.theme.getIcon("proj_details")) - self.aStats.setIcon(CONFIG.theme.getIcon("proj_stats")) - self.tbSettings.setIcon(CONFIG.theme.getIcon("settings")) + self.aProject.setIcon(SHARED.theme.getIcon("view_editor")) + self.aNovel.setIcon(SHARED.theme.getIcon("view_novel")) + self.aOutline.setIcon(SHARED.theme.getIcon("view_outline")) + self.aBuild.setIcon(SHARED.theme.getIcon("view_build")) + self.aDetails.setIcon(SHARED.theme.getIcon("proj_details")) + self.aStats.setIcon(SHARED.theme.getIcon("proj_stats")) + self.tbSettings.setIcon(SHARED.theme.getIcon("settings")) return diff --git a/novelwriter/gui/statusbar.py b/novelwriter/gui/statusbar.py index 138d1cd3..20152367 100644 --- a/novelwriter/gui/statusbar.py +++ b/novelwriter/gui/statusbar.py @@ -32,7 +32,7 @@ from PyQt5.QtCore import pyqtSlot, QLocale from PyQt5.QtGui import QColor from PyQt5.QtWidgets import qApp, QStatusBar, QLabel -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.common import formatTime from novelwriter.extensions.statusled import StatusLED @@ -50,11 +50,11 @@ class GuiMainStatus(QStatusBar): self.refTime = None self.userIdle = False - colNone = QColor(*CONFIG.theme.statNone) - colSaved = QColor(*CONFIG.theme.statSaved) - colUnsaved = QColor(*CONFIG.theme.statUnsaved) + colNone = QColor(*SHARED.theme.statNone) + colSaved = QColor(*SHARED.theme.statSaved) + colUnsaved = QColor(*SHARED.theme.statUnsaved) - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize # Permanent Widgets # ================= @@ -98,7 +98,7 @@ class GuiMainStatus(QStatusBar): self.timeIcon = QLabel() self.timeText = QLabel("") self.timeText.setToolTip(self.tr("Session Time")) - self.timeText.setMinimumWidth(CONFIG.theme.getTextWidth("00:00:00:")) + self.timeText.setMinimumWidth(SHARED.theme.getTextWidth("00:00:00:")) self.timeIcon.setContentsMargins(0, 0, 0, 0) self.timeText.setContentsMargins(0, 0, 0, 0) self.addPermanentWidget(self.timeIcon) @@ -128,13 +128,13 @@ class GuiMainStatus(QStatusBar): def updateTheme(self): """Update theme elements. """ - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize - self.langIcon.setPixmap(CONFIG.theme.getPixmap("status_lang", (iPx, iPx))) - self.statsIcon.setPixmap(CONFIG.theme.getPixmap("status_stats", (iPx, iPx))) + self.langIcon.setPixmap(SHARED.theme.getPixmap("status_lang", (iPx, iPx))) + self.statsIcon.setPixmap(SHARED.theme.getPixmap("status_stats", (iPx, iPx))) - self.timePixmap = CONFIG.theme.getPixmap("status_time", (iPx, iPx)) - self.idlePixmap = CONFIG.theme.getPixmap("status_idle", (iPx, iPx)) + self.timePixmap = SHARED.theme.getPixmap("status_time", (iPx, iPx)) + self.idlePixmap = SHARED.theme.getPixmap("status_idle", (iPx, iPx)) self.timeIcon.setPixmap(self.timePixmap) diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index ab728dfe..96d40473 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -37,7 +37,7 @@ from PyQt5.QtWidgets import ( QStackedWidget, QVBoxLayout, QWidget ) -from novelwriter import CONFIG, __hexversion__ +from novelwriter import CONFIG, SHARED, __hexversion__ from novelwriter.gui.theme import GuiTheme from novelwriter.gui.sidebar import GuiSideBar from novelwriter.gui.outline import GuiOutlineView @@ -112,9 +112,8 @@ class GuiMain(QMainWindow): # Core Classes # ============ - # Core Classes - CONFIG.setThemeInstance(GuiTheme()) - self._project = NWProject(self) + # Initialise UserData Instance + SHARED.initSharedData(self, GuiTheme()) # Core Settings self.hasProject = False @@ -135,7 +134,7 @@ class GuiMain(QMainWindow): # ============= # Sizes - iPx = CONFIG.theme.fontPixelSize + iPx = SHARED.theme.fontPixelSize mPx = CONFIG.pxInt(4) hWd = CONFIG.pxInt(4) @@ -238,7 +237,7 @@ class GuiMain(QMainWindow): # Connect Signals # =============== - self._project.projectStatusChanged.connect(self.mainStatus.doUpdateProjectStatus) + SHARED.project.projectStatusChanged.connect(self.mainStatus.doUpdateProjectStatus) self.viewsBar.viewChangeRequested.connect(self._changeView) @@ -307,10 +306,10 @@ class GuiMain(QMainWindow): # Cache Alert Pixmaps pxSize = (2*iPx, 2*iPx) self.alertPix: dict[nwAlert, QPixmap] = { - nwAlert.INFO: CONFIG.theme.getPixmap("alert_info", pxSize), - nwAlert.WARN: CONFIG.theme.getPixmap("alert_warn", pxSize), - nwAlert.ERROR: CONFIG.theme.getPixmap("alert_error", pxSize), - nwAlert.ASK: CONFIG.theme.getPixmap("alert_question", pxSize), + nwAlert.INFO: SHARED.theme.getPixmap("alert_info", pxSize), + nwAlert.WARN: SHARED.theme.getPixmap("alert_warn", pxSize), + nwAlert.ERROR: SHARED.theme.getPixmap("alert_error", pxSize), + nwAlert.ASK: SHARED.theme.getPixmap("alert_question", pxSize), } # Check that config loaded fine @@ -389,7 +388,7 @@ class GuiMain(QMainWindow): @property def project(self) -> NWProject: """The project instance.""" - return self._project + return SHARED.project ## # Project Actions @@ -453,7 +452,7 @@ class GuiMain(QMainWindow): saveOK = self.saveProject() doBackup = False - if self._project.data.doBackup and CONFIG.backupOnClose: + if SHARED.project.data.doBackup and CONFIG.backupOnClose: doBackup = True if CONFIG.askBeforeBackup: msgYes = self.askQuestion(self.tr("Backup the current project?")) @@ -461,7 +460,7 @@ class GuiMain(QMainWindow): doBackup = False if doBackup: - self._project.backupProject(False) + SHARED.project.backupProject(False) if saveOK: self.closeDocument() @@ -469,7 +468,7 @@ class GuiMain(QMainWindow): self.outlineView.closeProjectTasks() self.novelView.closeProjectTasks() - self._project.closeProject(self.idleTime) + SHARED.project.closeProject(self.idleTime) self.idleRefTime = time() self.idleTime = 0.0 @@ -493,9 +492,9 @@ class GuiMain(QMainWindow): self._changeView(nwView.PROJECT) # Try to open the project - if not self._project.openProject(projFile): + if not SHARED.project.openProject(projFile): # The project open failed. - lockStatus = self._project.getLockStatus() + lockStatus = SHARED.project.getLockStatus() if lockStatus is None: # The project is not locked, so failed for some other # reason handled by the project class. @@ -525,7 +524,7 @@ class GuiMain(QMainWindow): lockDetails = "" if self.askQuestion(lockText, info=lockInfo, details=lockDetails, level=nwAlert.WARN): - if not self._project.openProject(projFile, overrideLock=True): + if not SHARED.project.openProject(projFile, overrideLock=True): return False else: return False @@ -536,11 +535,11 @@ class GuiMain(QMainWindow): self.idleTime = 0.0 # Update GUI - self._updateWindowTitle(self._project.data.name) + self._updateWindowTitle(SHARED.project.data.name) self.rebuildTrees() self.docEditor.setDictionaries() - self.docEditor.toggleSpellCheck(self._project.data.spellCheck) - self.mainStatus.setRefTime(self._project.projOpened) + self.docEditor.toggleSpellCheck(SHARED.project.data.spellCheck) + self.mainStatus.setRefTime(SHARED.project.projOpened) self.projView.openProjectTasks() self.novelView.openProjectTasks() self.outlineView.openProjectTasks() @@ -548,9 +547,9 @@ class GuiMain(QMainWindow): # Restore previously open documents, if any # If none was recorded, open the first document found - lastEdited = self._project.data.getLastHandle("editor") + lastEdited = SHARED.project.data.getLastHandle("editor") if lastEdited is None: - for nwItem in self._project.tree: + for nwItem in SHARED.project.tree: if nwItem and nwItem.isFileType(): lastEdited = nwItem.itemHandle break @@ -558,19 +557,19 @@ class GuiMain(QMainWindow): if lastEdited is not None: self.openDocument(lastEdited, doScroll=True) - lastViewed = self._project.data.getLastHandle("viewer") + lastViewed = SHARED.project.data.getLastHandle("viewer") if lastViewed is not None: self.viewDocument(lastViewed) # Check if we need to rebuild the index - if self._project.index.indexBroken: + if SHARED.project.index.indexBroken: self.makeAlert(self.tr("The project index is outdated or broken. Rebuilding index.")) self.rebuildIndex() # Make sure the changed status is set to false on things opened qApp.processEvents() self.docEditor.setDocumentChanged(False) - self._project.setProjectChanged(False) + SHARED.project.setProjectChanged(False) logger.debug("Project load complete") @@ -582,7 +581,7 @@ class GuiMain(QMainWindow): logger.error("No project open") return False self.projView.saveProjectTasks() - self._project.saveProject(autoSave=autoSave) + SHARED.project.saveProject(autoSave=autoSave) return True ## @@ -615,7 +614,7 @@ class GuiMain(QMainWindow): logger.error("No project open") return False - if not tHandle or not self._project.tree.checkType(tHandle, nwItemType.FILE): + if not tHandle or not SHARED.project.tree.checkType(tHandle, nwItemType.FILE): logger.debug("Requested item '%s' is not a document", tHandle) return False @@ -629,7 +628,7 @@ class GuiMain(QMainWindow): self.closeDocument(beforeOpen=True) if self.docEditor.loadText(tHandle, tLine): - self._project.data.setLastHandle(tHandle, "editor") + SHARED.project.data.setLastHandle(tHandle, "editor") self.projView.setSelectedHandle(tHandle, doScroll=doScroll) self.novelView.setActiveHandle(tHandle) if changeFocus: @@ -650,7 +649,7 @@ class GuiMain(QMainWindow): nHandle = None # The next handle after tHandle fHandle = None # The first file handle we encounter foundIt = False # We've found tHandle, pick the next we see - for tItem in self._project.tree: + for tItem in SHARED.project.tree: if not tItem.isFileType(): continue if fHandle is None: @@ -696,7 +695,7 @@ class GuiMain(QMainWindow): tHandle = self.projView.getSelectedHandle() if tHandle is None: - tHandle = self._project.data.getLastHandle("viewer") + tHandle = SHARED.project.data.getLastHandle("viewer") if tHandle is None: logger.debug("No document to view, giving up") @@ -815,7 +814,7 @@ class GuiMain(QMainWindow): return False if tHandle is not None and sTitle is not None: - hItem = self._project.index.getItemHeader(tHandle, sTitle) + hItem = SHARED.project.index.getItemHeader(tHandle, sTitle) if hItem is not None: tLine = hItem.line @@ -852,7 +851,7 @@ class GuiMain(QMainWindow): tStart = time() self.projView.saveProjectTasks() - self._project.index.rebuildIndex() + SHARED.project.index.rebuildIndex() self.projView.populateTree() self.novelView.refreshTree() @@ -921,7 +920,7 @@ class GuiMain(QMainWindow): if dlgConf.updateTheme: # We are doing this manually instead of connecting to # qApp.paletteChanged since the processing order matters - CONFIG.theme.loadTheme() + SHARED.theme.loadTheme() self.docEditor.updateTheme() self.docViewer.updateTheme() self.viewsBar.updateTheme() @@ -932,7 +931,7 @@ class GuiMain(QMainWindow): self.mainStatus.updateTheme() if dlgConf.updateSyntax: - CONFIG.theme.loadSyntax() + SHARED.theme.loadSyntax() self.docEditor.updateSyntaxColours() self.docEditor.initEditor() @@ -960,7 +959,7 @@ class GuiMain(QMainWindow): if dlgProj.spellChanged: self.docEditor.setDictionaries() self.itemDetails.refreshDetails() - self._updateWindowTitle(self._project.data.name) + self._updateWindowTitle(SHARED.project.data.name) return True @@ -1206,7 +1205,7 @@ class GuiMain(QMainWindow): def closeDocEditor(self) -> None: """Close the document editor. This does not hide the editor.""" self.closeDocument() - self._project.data.setLastHandle(None, "editor") + SHARED.project.data.setLastHandle(None, "editor") return def closeDocViewer(self, byUser: bool = True) -> bool: @@ -1214,7 +1213,7 @@ class GuiMain(QMainWindow): self.docViewer.clearViewer() if byUser: # Only reset the last handle if the user called this - self._project.data.setLastHandle(None, "viewer") + SHARED.project.data.setLastHandle(None, "viewer") # Hide the panel bPos = self.splitMain.sizes() @@ -1400,7 +1399,7 @@ class GuiMain(QMainWindow): """Handle the index lookup of a tag and display an alert if the tag cannot be found. """ - tHandle, sTitle = self._project.index.getTagSource(tag) + tHandle, sTitle = SHARED.project.index.getTagSource(tag) if tHandle is None: self.makeAlert(self.tr( "Could not find the reference for tag '{0}'. It either doesn't " @@ -1447,7 +1446,7 @@ class GuiMain(QMainWindow): if tHandle is not None: if mode == nwDocMode.EDIT: tLine = None - hItem = self._project.index.getItemHeader(tHandle, sTitle) + hItem = SHARED.project.index.getItemHeader(tHandle, sTitle) if hItem is not None: tLine = hItem.line self.openDocument(tHandle, tLine=tLine, changeFocus=setFocus) @@ -1500,8 +1499,8 @@ class GuiMain(QMainWindow): def _autoSaveProject(self) -> None: """Autosave of the project. This is a timer-activated slot.""" doSave = self.hasProject - doSave &= self._project.projChanged - doSave &= self._project.storage.isOpen() + doSave &= SHARED.project.projChanged + doSave &= SHARED.project.storage.isOpen() if doSave: logger.debug("Autosaving project") self.saveProject(autoSave=True) @@ -1521,14 +1520,14 @@ class GuiMain(QMainWindow): if not self.hasProject: self.mainStatus.setProjectStats(0, 0) - self._project.updateWordCounts() + SHARED.project.updateWordCounts() if CONFIG.incNotesWCount: - iTotal = sum(self._project.data.initCounts) - cTotal = sum(self._project.data.currCounts) + iTotal = sum(SHARED.project.data.initCounts) + cTotal = sum(SHARED.project.data.currCounts) self.mainStatus.setProjectStats(cTotal, cTotal - iTotal) else: - iNovel, _ = self._project.data.initCounts - cNovel, _ = self._project.data.currCounts + iNovel, _ = SHARED.project.data.initCounts + cNovel, _ = SHARED.project.data.currCounts self.mainStatus.setProjectStats(cNovel, cNovel - iNovel) return diff --git a/novelwriter/tools/lipsum.py b/novelwriter/tools/lipsum.py index d7aa9d51..d5febc2b 100644 --- a/novelwriter/tools/lipsum.py +++ b/novelwriter/tools/lipsum.py @@ -32,7 +32,7 @@ from PyQt5.QtWidgets import ( QSpinBox ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.common import readTextFile from novelwriter.extensions.switch import NSwitch @@ -60,7 +60,7 @@ class GuiLipsum(QDialog): nPx = CONFIG.pxInt(64) vSp = CONFIG.pxInt(4) self.docIcon = QLabel() - self.docIcon.setPixmap(CONFIG.theme.getPixmap("proj_document", (nPx, nPx))) + self.docIcon.setPixmap(SHARED.theme.getPixmap("proj_document", (nPx, nPx))) self.leftBox = QVBoxLayout() self.leftBox.setSpacing(vSp) diff --git a/novelwriter/tools/manusbuild.py b/novelwriter/tools/manusbuild.py index 2fb91269..9aafaac0 100644 --- a/novelwriter/tools/manusbuild.py +++ b/novelwriter/tools/manusbuild.py @@ -35,7 +35,7 @@ from PyQt5.QtWidgets import ( QPushButton, QSplitter, QVBoxLayout, QWidget ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.enum import nwAlert, nwBuildFmt from novelwriter.common import makeFileNameSafe from novelwriter.constants import nwLabels @@ -74,14 +74,14 @@ class GuiManuscriptBuild(QDialog): self.setMinimumWidth(CONFIG.pxInt(500)) self.setMinimumHeight(CONFIG.pxInt(300)) - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize sp4 = CONFIG.pxInt(4) sp8 = CONFIG.pxInt(8) sp16 = CONFIG.pxInt(16) wWin = CONFIG.pxInt(620) hWin = CONFIG.pxInt(360) - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options self.resize( CONFIG.pxInt(pOptions.getInt("GuiManuscriptBuild", "winWidth", wWin)), CONFIG.pxInt(pOptions.getInt("GuiManuscriptBuild", "winHeight", hWin)) @@ -146,7 +146,7 @@ class GuiManuscriptBuild(QDialog): # Build Path self.lblPath = QLabel(self.tr("Path")) self.buildPath = QLineEdit(self) - self.btnBrowse = QPushButton(CONFIG.theme.getIcon("browse"), "") + self.btnBrowse = QPushButton(SHARED.theme.getIcon("browse"), "") self.pathBox = QHBoxLayout() self.pathBox.addWidget(self.buildPath) @@ -156,7 +156,7 @@ class GuiManuscriptBuild(QDialog): # Build Name self.lblName = QLabel(self.tr("File Name")) self.buildName = QLineEdit(self) - self.btnReset = QPushButton(CONFIG.theme.getIcon("revert"), "") + self.btnReset = QPushButton(SHARED.theme.getIcon("revert"), "") self.btnReset.setToolTip(self.tr("Reset file name to default")) self.nameBox = QHBoxLayout() @@ -181,7 +181,7 @@ class GuiManuscriptBuild(QDialog): self.buildBox.setVerticalSpacing(sp4) # Dialog Buttons - self.btnBuild = QPushButton(CONFIG.theme.getIcon("export"), self.tr("&Build")) + self.btnBuild = QPushButton(SHARED.theme.getIcon("export"), self.tr("&Build")) self.dlgButtons = QDialogButtonBox(QDialogButtonBox.Close) self.dlgButtons.addButton(self.btnBuild, QDialogButtonBox.ActionRole) @@ -279,7 +279,7 @@ class GuiManuscriptBuild(QDialog): @pyqtSlot() def _doResetBuildName(self): """Generate a default build name.""" - bName = f"{self.mainGui.project.data.name} - {self._build.name}" + bName = f"{SHARED.project.data.name} - {self._build.name}" self.buildName.setText(bName) self._build.setLastBuildName(bName) return @@ -320,7 +320,7 @@ class GuiManuscriptBuild(QDialog): ): return False - docBuild = NWBuildDocument(self.mainGui.project, self._build) + docBuild = NWBuildDocument(SHARED.project, self._build) docBuild.queueAll() self.buildProgress.setMaximum(len(docBuild)) @@ -353,7 +353,7 @@ class GuiManuscriptBuild(QDialog): fmtWidth = CONFIG.rpxInt(mainSplit[0]) sumWidth = CONFIG.rpxInt(mainSplit[1]) - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options pOptions.setValue("GuiManuscriptBuild", "winWidth", winWidth) pOptions.setValue("GuiManuscriptBuild", "winHeight", winHeight) pOptions.setValue("GuiManuscriptBuild", "fmtWidth", fmtWidth) @@ -365,9 +365,9 @@ class GuiManuscriptBuild(QDialog): def _populateContentList(self): """Build the content list.""" rootMap = {} - filtered = self._build.buildItemFilter(self.mainGui.project) + filtered = self._build.buildItemFilter(SHARED.project) self.listContent.clear() - for nwItem in self.mainGui.project.tree: + for nwItem in SHARED.project.tree: tHandle = nwItem.itemHandle rHandle = nwItem.itemRoot @@ -376,11 +376,11 @@ class GuiManuscriptBuild(QDialog): if filtered.get(tHandle, (False, 0))[0]: if rHandle not in rootMap: - rItem = self.mainGui.project.tree[rHandle] + rItem = SHARED.project.tree[rHandle] if isinstance(rItem, NWItem): rootMap[rHandle] = rItem.itemName - itemIcon = CONFIG.theme.getItemIcon( + itemIcon = SHARED.theme.getItemIcon( nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, nwItem.mainHeading ) diff --git a/novelwriter/tools/manuscript.py b/novelwriter/tools/manuscript.py index 8666e47d..13b6f089 100644 --- a/novelwriter/tools/manuscript.py +++ b/novelwriter/tools/manuscript.py @@ -38,7 +38,7 @@ from PyQt5.QtWidgets import ( ) from PyQt5.QtPrintSupport import QPrintPreviewDialog, QPrinter -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.error import logException from novelwriter.common import checkInt, fuzzyTime from novelwriter.core.tohtml import ToHtml @@ -74,18 +74,18 @@ class GuiManuscript(QDialog): self.mainGui = mainGui - self._builds = BuildCollection(self.mainGui.project) + self._builds = BuildCollection(SHARED.project) self._buildMap: dict[str, QListWidgetItem] = {} self.setWindowTitle(self.tr("Build Manuscript")) self.setMinimumWidth(CONFIG.pxInt(600)) self.setMinimumHeight(CONFIG.pxInt(500)) - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize wWin = CONFIG.pxInt(900) hWin = CONFIG.pxInt(600) - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options self.resize( CONFIG.pxInt(pOptions.getInt("GuiManuscript", "winWidth", wWin)), CONFIG.pxInt(pOptions.getInt("GuiManuscript", "winHeight", hWin)) @@ -105,21 +105,21 @@ class GuiManuscript(QDialog): ).format(CONFIG.pxInt(2), fadeCol.red(), fadeCol.green(), fadeCol.blue()) self.tbAdd = QToolButton(self) - self.tbAdd.setIcon(CONFIG.theme.getIcon("add")) + self.tbAdd.setIcon(SHARED.theme.getIcon("add")) self.tbAdd.setIconSize(QSize(iPx, iPx)) self.tbAdd.setToolTip(self.tr("Add New Build")) self.tbAdd.setStyleSheet(buttonStyle) self.tbAdd.clicked.connect(self._createNewBuild) self.tbDel = QToolButton(self) - self.tbDel.setIcon(CONFIG.theme.getIcon("remove")) + self.tbDel.setIcon(SHARED.theme.getIcon("remove")) self.tbDel.setIconSize(QSize(iPx, iPx)) self.tbDel.setToolTip(self.tr("Delete Selected Build")) self.tbDel.setStyleSheet(buttonStyle) self.tbDel.clicked.connect(self._deleteSelectedBuild) self.tbEdit = QToolButton(self) - self.tbEdit.setIcon(CONFIG.theme.getIcon("edit")) + self.tbEdit.setIcon(SHARED.theme.getIcon("edit")) self.tbEdit.setIconSize(QSize(iPx, iPx)) self.tbEdit.setToolTip(self.tr("Edit Selected Build")) self.tbEdit.setStyleSheet(buttonStyle) @@ -163,7 +163,7 @@ class GuiManuscript(QDialog): # Assemble GUI # ============ - self.docPreview = _PreviewWidget(self.mainGui) + self.docPreview = _PreviewWidget(self) self.controlBox = QVBoxLayout() self.controlBox.addLayout(self.listToolBox, 0) @@ -210,7 +210,7 @@ class GuiManuscript(QDialog): self._updateBuildsList() logger.debug("Loading build cache") - cache = CONFIG.dataPath("cache") / f"build_{self.mainGui.project.data.uuid}.json" + cache = CONFIG.dataPath("cache") / f"build_{SHARED.project.data.uuid}.json" if cache.is_file(): try: with open(cache, mode="r", encoding="utf-8") as fObj: @@ -289,7 +289,7 @@ class GuiManuscript(QDialog): if build is None: return - docBuild = NWBuildDocument(self.mainGui.project, build) + docBuild = NWBuildDocument(SHARED.project, build) docBuild.queueAll() self.docPreview.beginNewBuild(len(docBuild)) @@ -309,7 +309,7 @@ class GuiManuscript(QDialog): self._updatePreview(result, build) logger.debug("Saving build cache") - cache = CONFIG.dataPath("cache") / f"build_{self.mainGui.project.data.uuid}.json" + cache = CONFIG.dataPath("cache") / f"build_{SHARED.project.data.uuid}.json" try: with open(cache, mode="w+", encoding="utf-8") as outFile: outFile.write(json.dumps(result, indent=2)) @@ -390,7 +390,7 @@ class GuiManuscript(QDialog): optsWidth = CONFIG.rpxInt(mainSplit[0]) viewWidth = CONFIG.rpxInt(mainSplit[1]) - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options pOptions.setValue("GuiManuscript", "winWidth", winWidth) pOptions.setValue("GuiManuscript", "winHeight", winHeight) pOptions.setValue("GuiManuscript", "optsWidth", optsWidth) @@ -426,7 +426,7 @@ class GuiManuscript(QDialog): for key, name in self._builds.builds(): bItem = QListWidgetItem() bItem.setText(name) - bItem.setIcon(CONFIG.theme.getIcon("export")) + bItem.setIcon(SHARED.theme.getIcon("export")) bItem.setData(self.D_KEY, key) self.buildList.addItem(bItem) self._buildMap[key] = bItem @@ -446,10 +446,8 @@ class GuiManuscript(QDialog): class _PreviewWidget(QTextBrowser): - def __init__(self, mainGui: GuiMain): - super().__init__(parent=mainGui) - - self.mainGui = mainGui + def __init__(self, parent: QWidget): + super().__init__(parent=parent) self._docTime = 0 self._buildName = "" @@ -460,7 +458,7 @@ class _PreviewWidget(QTextBrowser): dPalette.setColor(QPalette.Text, QColor(0, 0, 0)) self.setPalette(dPalette) - self.setMinimumWidth(40*CONFIG.theme.textNWidth) + self.setMinimumWidth(40*SHARED.theme.textNWidth) self.setTextFont(CONFIG.textFont, CONFIG.textSize) self.setTabStopDistance(CONFIG.getTabWidth()) self.setOpenExternalLinks(False) @@ -478,7 +476,7 @@ class _PreviewWidget(QTextBrowser): aPalette.setColor(QPalette.Foreground, aPalette.toolTipText().color()) aFont = self.font() - aFont.setPointSizeF(0.9*CONFIG.theme.fontPointSize) + aFont.setPointSizeF(0.9*SHARED.theme.fontPointSize) self.ageLabel = QLabel("", self) self.ageLabel.setIndent(0) @@ -486,7 +484,7 @@ class _PreviewWidget(QTextBrowser): self.ageLabel.setPalette(aPalette) self.ageLabel.setAutoFillBackground(True) self.ageLabel.setAlignment(Qt.AlignCenter) - self.ageLabel.setFixedHeight(int(2.1*CONFIG.theme.fontPixelSize)) + self.ageLabel.setFixedHeight(int(2.1*SHARED.theme.fontPixelSize)) # Progress self.buildProgress = NProgressCircle(self, CONFIG.pxInt(160), CONFIG.pxInt(16)) diff --git a/novelwriter/tools/manussettings.py b/novelwriter/tools/manussettings.py index 62eaba27..44ac3fce 100644 --- a/novelwriter/tools/manussettings.py +++ b/novelwriter/tools/manussettings.py @@ -39,7 +39,7 @@ from PyQt5.QtWidgets import ( QWidget ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.constants import nwHeadFmt, nwLabels, trConst from novelwriter.core.buildsettings import BuildSettings, FilterMode from novelwriter.extensions.switch import NSwitch @@ -88,7 +88,7 @@ class GuiBuildSettings(QDialog): wWin = CONFIG.pxInt(750) hWin = CONFIG.pxInt(550) - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options self.resize( CONFIG.pxInt(pOptions.getInt("GuiBuildSettings", "winWidth", wWin)), CONFIG.pxInt(pOptions.getInt("GuiBuildSettings", "winHeight", hWin)) @@ -100,7 +100,7 @@ class GuiBuildSettings(QDialog): self.optSideBar = NPagedSideBar(self) self.optSideBar.setMinimumWidth(mPx) self.optSideBar.setMaximumWidth(mPx) - self.optSideBar.setLabelColor(CONFIG.theme.helpText) + self.optSideBar.setLabelColor(SHARED.theme.helpText) self.optSideBar.addLabel(self.tr("Options")) self.optSideBar.addButton(self.tr("Selection"), self.OPT_FILTERS) @@ -262,7 +262,7 @@ class GuiBuildSettings(QDialog): treeWidth, filterWidth = self.optTabSelect.mainSplitSizes() - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options pOptions.setValue("GuiBuildSettings", "winWidth", winWidth) pOptions.setValue("GuiBuildSettings", "winHeight", winHeight) pOptions.setValue("GuiBuildSettings", "treeWidth", treeWidth) @@ -303,16 +303,14 @@ class _FilterTab(QWidget): def __init__(self, buildMain: GuiBuildSettings, build: BuildSettings) -> None: super().__init__(parent=buildMain) - self.mainGui = buildMain.mainGui - self._treeMap: dict[str, QTreeWidgetItem] = {} self._build = build self._statusFlags: dict[int, QIcon] = { self.F_NONE: QIcon(), - self.F_FILTERED: CONFIG.theme.getIcon("build_filtered"), - self.F_INCLUDED: CONFIG.theme.getIcon("build_included"), - self.F_EXCLUDED: CONFIG.theme.getIcon("build_excluded"), + self.F_FILTERED: SHARED.theme.getIcon("build_filtered"), + self.F_INCLUDED: SHARED.theme.getIcon("build_included"), + self.F_EXCLUDED: SHARED.theme.getIcon("build_excluded"), } self._trIncluded = self.tr("Included in manuscript") @@ -322,7 +320,7 @@ class _FilterTab(QWidget): # ============ # Tree Settings - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize cMg = CONFIG.pxInt(6) # Tree Widget @@ -360,7 +358,7 @@ class _FilterTab(QWidget): self.resetButton = QToolButton(self) self.resetButton.setToolTip(self.tr("Reset to default")) - self.resetButton.setIcon(CONFIG.theme.getIcon("revert")) + self.resetButton.setIcon(SHARED.theme.getIcon("revert")) self.resetButton.clicked.connect(lambda: self._setSelectedMode(self.F_FILTERED)) self.modeBox = QHBoxLayout() @@ -379,7 +377,7 @@ class _FilterTab(QWidget): # Assemble GUI # ============ - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options self.selectionBox = QVBoxLayout() self.selectionBox.addWidget(self.optTree) @@ -445,7 +443,7 @@ class _FilterTab(QWidget): logger.debug("Building project tree") self._treeMap = {} self.optTree.clear() - for nwItem in self.mainGui.project.getProjectItems(): + for nwItem in SHARED.project.getProjectItems(): tHandle = nwItem.itemHandle pHandle = nwItem.itemParent @@ -461,7 +459,7 @@ class _FilterTab(QWidget): continue hLevel = nwItem.mainHeading - itemIcon = CONFIG.theme.getItemIcon( + itemIcon = SHARED.theme.getItemIcon( nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, hLevel ) @@ -475,7 +473,7 @@ class _FilterTab(QWidget): trItem.setText(self.C_NAME, nwItem.itemName) trItem.setData(self.C_DATA, self.D_HANDLE, tHandle) trItem.setData(self.C_DATA, self.D_FILE, isFile) - trItem.setIcon(self.C_ACTIVE, CONFIG.theme.getIcon(iconName)) + trItem.setIcon(self.C_ACTIVE, SHARED.theme.getIcon(iconName)) trItem.setTextAlignment(self.C_NAME, Qt.AlignLeft) @@ -499,19 +497,19 @@ class _FilterTab(QWidget): self.filterOpt.clear() self.filterOpt.addLabel(self._build.getLabel("filter")) self.filterOpt.addItem( - CONFIG.theme.getIcon("proj_scene"), + SHARED.theme.getIcon("proj_scene"), self._build.getLabel("filter.includeNovel"), "doc:filter.includeNovel", default=self._build.getBool("filter.includeNovel") ) self.filterOpt.addItem( - CONFIG.theme.getIcon("proj_note"), + SHARED.theme.getIcon("proj_note"), self._build.getLabel("filter.includeNotes"), "doc:filter.includeNotes", default=self._build.getBool("filter.includeNotes") ) self.filterOpt.addItem( - CONFIG.theme.getIcon("unchecked"), + SHARED.theme.getIcon("unchecked"), self._build.getLabel("filter.includeInactive"), "doc:filter.includeInactive", default=self._build.getBool("filter.includeInactive") @@ -521,9 +519,9 @@ class _FilterTab(QWidget): # Root Classes self.filterOpt.addLabel(self.tr("Select Root Folders")) - for tHandle, nwItem in self.mainGui.project.tree.iterRoots(None): + for tHandle, nwItem in SHARED.project.tree.iterRoots(None): if not nwItem.isInactiveClass(): - itemIcon = CONFIG.theme.getItemIcon( + itemIcon = SHARED.theme.getItemIcon( nwItem.itemType, nwItem.itemClass, nwItem.itemLayout ) self.filterOpt.addItem( @@ -557,7 +555,7 @@ class _FilterTab(QWidget): def _setTreeItemMode(self) -> None: """Update the filtered mode icon on all items.""" - filtered = self._build.buildItemFilter(self.mainGui.project) + filtered = self._build.buildItemFilter(SHARED.project) for tHandle, item in self._treeMap.items(): allow, mode = filtered.get(tHandle, (False, FilterMode.UNKNOWN)) if mode == FilterMode.INCLUDED: @@ -597,12 +595,10 @@ class _HeadingsTab(QWidget): def __init__(self, buildMain: GuiBuildSettings, build: BuildSettings) -> None: super().__init__(parent=buildMain) - self.mainGui = buildMain.mainGui - self._build = build self._editing = 0 - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize vSp = CONFIG.pxInt(12) bSp = CONFIG.pxInt(6) @@ -616,7 +612,7 @@ class _HeadingsTab(QWidget): self.fmtTitle = QLineEdit("") self.fmtTitle.setReadOnly(True) self.btnTitle = QToolButton() - self.btnTitle.setIcon(CONFIG.theme.getIcon("edit")) + self.btnTitle.setIcon(SHARED.theme.getIcon("edit")) self.btnTitle.clicked.connect(lambda: self._editHeading(self.EDIT_TITLE)) wrapTitle = QHBoxLayout() @@ -632,7 +628,7 @@ class _HeadingsTab(QWidget): self.fmtChapter = QLineEdit("") self.fmtChapter.setReadOnly(True) self.btnChapter = QToolButton() - self.btnChapter.setIcon(CONFIG.theme.getIcon("edit")) + self.btnChapter.setIcon(SHARED.theme.getIcon("edit")) self.btnChapter.clicked.connect(lambda: self._editHeading(self.EDIT_CHAPTER)) wrapChapter = QHBoxLayout() @@ -648,7 +644,7 @@ class _HeadingsTab(QWidget): self.fmtUnnumbered = QLineEdit("") self.fmtUnnumbered.setReadOnly(True) self.btnUnnumbered = QToolButton() - self.btnUnnumbered.setIcon(CONFIG.theme.getIcon("edit")) + self.btnUnnumbered.setIcon(SHARED.theme.getIcon("edit")) self.btnUnnumbered.clicked.connect(lambda: self._editHeading(self.EDIT_UNNUM)) wrapUnnumbered = QHBoxLayout() @@ -665,7 +661,7 @@ class _HeadingsTab(QWidget): self.fmtScene = QLineEdit("") self.fmtScene.setReadOnly(True) self.btnScene = QToolButton() - self.btnScene.setIcon(CONFIG.theme.getIcon("edit")) + self.btnScene.setIcon(SHARED.theme.getIcon("edit")) self.btnScene.clicked.connect(lambda: self._editHeading(self.EDIT_SCENE)) self.hdeScene = QLabel(self.tr("Hide")) self.hdeScene.setToolTip(sceneHideTip) @@ -692,7 +688,7 @@ class _HeadingsTab(QWidget): self.fmtSection = QLineEdit("") self.fmtSection.setReadOnly(True) self.btnSection = QToolButton() - self.btnSection.setIcon(CONFIG.theme.getIcon("edit")) + self.btnSection.setIcon(SHARED.theme.getIcon("edit")) self.btnSection.clicked.connect(lambda: self._editHeading(self.EDIT_SECTION)) self.hdeSection = QLabel(self.tr("Hide")) self.hdeSection.setToolTip(sectionHideTip) @@ -868,9 +864,9 @@ class _HeadingSyntaxHighlighter(QSyntaxHighlighter): def __init__(self, document: QTextDocument) -> None: super().__init__(document) self._fmtSymbol = QTextCharFormat() - self._fmtSymbol.setForeground(QColor(*CONFIG.theme.colHead)) + self._fmtSymbol.setForeground(QColor(*SHARED.theme.colHead)) self._fmtFormat = QTextCharFormat() - self._fmtFormat.setForeground(QColor(*CONFIG.theme.colEmph)) + self._fmtFormat.setForeground(QColor(*SHARED.theme.colEmph)) return def highlightBlock(self, text: str) -> None: @@ -896,7 +892,7 @@ class _ContentTab(QWidget): self._build = build - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize # Left Form # ========= @@ -964,14 +960,13 @@ class _FormatTab(QWidget): super().__init__(parent=buildMain) self.buildMain = buildMain - self.mainGui = buildMain.mainGui self._build = build self._unitScale = 1.0 - iPx = CONFIG.theme.baseIconSize - spW = 6*CONFIG.theme.textNWidth - dbW = 8*CONFIG.theme.textNWidth + iPx = SHARED.theme.baseIconSize + spW = 6*SHARED.theme.textNWidth + dbW = 8*SHARED.theme.textNWidth # Text Format Form # ================ @@ -992,7 +987,7 @@ class _FormatTab(QWidget): self.textFont = QLineEdit() self.textFont.setReadOnly(True) self.btnTextFont = QPushButton("...") - self.btnTextFont.setMaximumWidth(int(2.5*CONFIG.theme.getTextWidth("..."))) + self.btnTextFont.setMaximumWidth(int(2.5*SHARED.theme.getTextWidth("..."))) self.btnTextFont.clicked.connect(self._selectFont) self.formFormat.addRow( self._build.getLabel("format.textFont"), self.textFont, button=self.btnTextFont @@ -1278,7 +1273,7 @@ class _OutputTab(QWidget): self._build = build - iPx = CONFIG.theme.baseIconSize + iPx = SHARED.theme.baseIconSize # Left Form # ========= diff --git a/novelwriter/tools/projwizard.py b/novelwriter/tools/projwizard.py index 6564320a..ef715847 100644 --- a/novelwriter/tools/projwizard.py +++ b/novelwriter/tools/projwizard.py @@ -32,7 +32,7 @@ from PyQt5.QtWidgets import ( QPushButton, QRadioButton, QSpinBox, QVBoxLayout, QWizard, QWizardPage ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.common import makeFileNameSafe from novelwriter.extensions.switch import NSwitch @@ -55,7 +55,7 @@ class GuiProjectWizard(QWizard): self.mainGui = mainGui - self.sideImage = CONFIG.theme.loadDecoration( + self.sideImage = SHARED.theme.loadDecoration( "wiz-back", None, CONFIG.pxInt(370) ) self.setWizardStyle(QWizard.ModernStyle) @@ -104,7 +104,7 @@ class ProjWizardIntroPage(QWizardPage): "Peter Mitterhofer", "CC BY-SA 4.0" )) lblFont = self.imgCredit.font() - lblFont.setPointSizeF(0.6*CONFIG.theme.fontPointSize) + lblFont.setPointSizeF(0.6*SHARED.theme.fontPointSize) self.imgCredit.setFont(lblFont) xW = CONFIG.pxInt(300) @@ -172,7 +172,7 @@ class ProjWizardFolderPage(QWizardPage): self.projPath.setPlaceholderText(self.tr("Required")) self.browseButton = QPushButton("...") - self.browseButton.setMaximumWidth(int(2.5*CONFIG.theme.getTextWidth("..."))) + self.browseButton.setMaximumWidth(int(2.5*SHARED.theme.getTextWidth("..."))) self.browseButton.clicked.connect(self._doBrowse) self.errLabel = QLabel("") diff --git a/novelwriter/tools/writingstats.py b/novelwriter/tools/writingstats.py index fb995ef2..83da4cb7 100644 --- a/novelwriter/tools/writingstats.py +++ b/novelwriter/tools/writingstats.py @@ -36,7 +36,7 @@ from PyQt5.QtWidgets import ( QLabel, QGroupBox, QMenu, QAction, QFileDialog, QSpinBox, QHBoxLayout ) -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.enum import nwAlert from novelwriter.error import formatException from novelwriter.common import formatTime, checkInt, checkIntTuple, minmax @@ -79,7 +79,7 @@ class GuiWritingStats(QDialog): self.timeFilter = 0.0 self.wordOffset = 0 - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options self.setWindowTitle(self.tr("Writing Statistics")) self.setMinimumWidth(CONFIG.pxInt(420)) @@ -132,7 +132,7 @@ class GuiWritingStats(QDialog): self.listBox.setSortingEnabled(True) # Word Bar - self.barHeight = int(round(0.5*CONFIG.theme.fontPixelSize)) + self.barHeight = int(round(0.5*SHARED.theme.fontPixelSize)) self.barWidth = CONFIG.pxInt(200) self.barImage = QPixmap(self.barHeight, self.barHeight) self.barImage.fill(self.palette().highlight().color()) @@ -143,27 +143,27 @@ class GuiWritingStats(QDialog): self.infoBox.setLayout(self.infoForm) self.labelTotal = QLabel(formatTime(0)) - self.labelTotal.setFont(CONFIG.theme.guiFontFixed) + self.labelTotal.setFont(SHARED.theme.guiFontFixed) self.labelTotal.setAlignment(Qt.AlignVCenter | Qt.AlignRight) self.labelIdleT = QLabel(formatTime(0)) - self.labelIdleT.setFont(CONFIG.theme.guiFontFixed) + self.labelIdleT.setFont(SHARED.theme.guiFontFixed) self.labelIdleT.setAlignment(Qt.AlignVCenter | Qt.AlignRight) self.labelFilter = QLabel(formatTime(0)) - self.labelFilter.setFont(CONFIG.theme.guiFontFixed) + self.labelFilter.setFont(SHARED.theme.guiFontFixed) self.labelFilter.setAlignment(Qt.AlignVCenter | Qt.AlignRight) self.novelWords = QLabel("0") - self.novelWords.setFont(CONFIG.theme.guiFontFixed) + self.novelWords.setFont(SHARED.theme.guiFontFixed) self.novelWords.setAlignment(Qt.AlignVCenter | Qt.AlignRight) self.notesWords = QLabel("0") - self.notesWords.setFont(CONFIG.theme.guiFontFixed) + self.notesWords.setFont(SHARED.theme.guiFontFixed) self.notesWords.setAlignment(Qt.AlignVCenter | Qt.AlignRight) self.totalWords = QLabel("0") - self.totalWords.setFont(CONFIG.theme.guiFontFixed) + self.totalWords.setFont(SHARED.theme.guiFontFixed) self.totalWords.setAlignment(Qt.AlignVCenter | Qt.AlignRight) lblTTime = QLabel(self.tr("Total Time:")) @@ -190,7 +190,7 @@ class GuiWritingStats(QDialog): self.infoForm.setRowStretch(6, 1) # Filter Options - sPx = CONFIG.theme.baseIconSize + sPx = SHARED.theme.baseIconSize self.filterBox = QGroupBox(self.tr("Filters"), self) self.filterForm = QGridLayout(self) @@ -333,7 +333,7 @@ class GuiWritingStats(QDialog): showIdleTime = self.showIdleTime.isChecked() histMax = self.histMax.value() - pOptions = self.mainGui.project.options + pOptions = SHARED.project.options pOptions.setValue("GuiWritingStats", "winWidth", winWidth) pOptions.setValue("GuiWritingStats", "winHeight", winHeight) pOptions.setValue("GuiWritingStats", "widthCol0", widthCol0) @@ -441,7 +441,7 @@ class GuiWritingStats(QDialog): ttTime = 0 ttIdle = 0 - for record in self.mainGui.project.session.iterRecords(): + for record in SHARED.project.session.iterRecords(): rType = record.get("type") if rType == "initial": self.wordOffset = checkInt(record.get("offset"), 0) @@ -587,13 +587,13 @@ class GuiWritingStats(QDialog): newItem.setTextAlignment(self.C_COUNT, Qt.AlignRight) newItem.setTextAlignment(self.C_BAR, Qt.AlignLeft | Qt.AlignVCenter) - newItem.setFont(self.C_TIME, CONFIG.theme.guiFontFixed) - newItem.setFont(self.C_LENGTH, CONFIG.theme.guiFontFixed) - newItem.setFont(self.C_COUNT, CONFIG.theme.guiFontFixed) + newItem.setFont(self.C_TIME, SHARED.theme.guiFontFixed) + newItem.setFont(self.C_LENGTH, SHARED.theme.guiFontFixed) + newItem.setFont(self.C_COUNT, SHARED.theme.guiFontFixed) if showIdleTime: - newItem.setFont(self.C_IDLE, CONFIG.theme.guiFontFixed) + newItem.setFont(self.C_IDLE, SHARED.theme.guiFontFixed) else: - newItem.setFont(self.C_IDLE, CONFIG.theme.guiFont) + newItem.setFont(self.C_IDLE, SHARED.theme.guiFont) self.listBox.addTopLevelItem(newItem) self.timeFilter += sDiff diff --git a/tests/test_gui/test_gui_theme.py b/tests/test_gui/test_gui_theme.py index 2f012229..f476ca94 100644 --- a/tests/test_gui/test_gui_theme.py +++ b/tests/test_gui/test_gui_theme.py @@ -30,7 +30,7 @@ from tools import writeFile from PyQt5.QtGui import QIcon, QPalette, QPixmap from PyQt5.QtWidgets import QApplication -from novelwriter import CONFIG +from novelwriter import CONFIG, SHARED from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType from novelwriter.constants import nwLabels @@ -38,7 +38,7 @@ from novelwriter.constants import nwLabels @pytest.mark.gui def testGuiTheme_Main(qtbot, nwGUI, tstPaths): """Test the theme class init.""" - mainTheme = CONFIG.theme + mainTheme = SHARED.theme # Methods # ======= @@ -121,7 +121,7 @@ def testGuiTheme_Main(qtbot, nwGUI, tstPaths): @pytest.mark.gui def testGuiTheme_Theme(qtbot, monkeypatch, nwGUI): """Test the theme part of the class.""" - mainTheme = CONFIG.theme + mainTheme = SHARED.theme # List Themes # =========== @@ -199,7 +199,7 @@ def testGuiTheme_Theme(qtbot, monkeypatch, nwGUI): @pytest.mark.gui def testGuiTheme_Syntax(qtbot, monkeypatch, nwGUI): """Test the syntax part of the class.""" - mainTheme = CONFIG.theme + mainTheme = SHARED.theme # List Themes # =========== @@ -264,7 +264,7 @@ def testGuiTheme_Syntax(qtbot, monkeypatch, nwGUI): @pytest.mark.gui def testGuiTheme_Icons(qtbot, caplog, monkeypatch, nwGUI, tstPaths): """Test the icon cache class.""" - iconCache = CONFIG.theme.iconCache + iconCache = SHARED.theme.iconCache # Load Theme # ==========