From c8dccbe438a374405be5683fe2687b36c09e37a8 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 8 Jun 2024 23:34:12 +0200 Subject: [PATCH 1/5] Fix typo in predefined type --- novelwriter/gui/doceditor.py | 4 ++-- novelwriter/types.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index 6b16f021a..a10558020 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -64,7 +64,7 @@ from novelwriter.tools.lipsum import GuiLipsum from novelwriter.types import ( QtAlignCenterTop, QtAlignJustify, QtAlignLeft, QtAlignLeftTop, - QtAlignRight, QtKeepAnchor, QtModCtrl, QtModeNone, QtModShift, QtMouseLeft, + QtAlignRight, QtKeepAnchor, QtModCtrl, QtModNone, QtModShift, QtMouseLeft, QtMoveAnchor, QtMoveLeft, QtMoveRight ) @@ -956,7 +956,7 @@ def keyPressEvent(self, event: QKeyEvent) -> None: super().keyPressEvent(event) nPos = self.cursorRect().topLeft().y() kMod = event.modifiers() - okMod = kMod in (QtModeNone, QtModShift) + okMod = kMod in (QtModNone, QtModShift) okKey = event.key() not in self.MOVE_KEYS if nPos != cPos and okMod and okKey: mPos = CONFIG.autoScrollPos*0.01 * self.viewport().height() diff --git a/novelwriter/types.py b/novelwriter/types.py index e235c2a46..1c47e9a13 100644 --- a/novelwriter/types.py +++ b/novelwriter/types.py @@ -73,7 +73,7 @@ # Keyboard and Mouse Buttons QtModCtrl = Qt.KeyboardModifier.ControlModifier -QtModeNone = Qt.KeyboardModifier.NoModifier +QtModNone = Qt.KeyboardModifier.NoModifier QtModShift = Qt.KeyboardModifier.ShiftModifier QtMouseLeft = Qt.MouseButton.LeftButton QtMouseMiddle = Qt.MouseButton.MiddleButton From 57ee88059d589e23aba9326f5a09fc56b29c1efe Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 8 Jun 2024 23:34:31 +0200 Subject: [PATCH 2/5] Remove lambda slots in preferences dialog that blocked freeing memory --- novelwriter/constants.py | 3 - novelwriter/dialogs/preferences.py | 135 +++++++++++++++++------------ 2 files changed, 78 insertions(+), 60 deletions(-) diff --git a/novelwriter/constants.py b/novelwriter/constants.py index ebaef80c0..f7b027e2d 100644 --- a/novelwriter/constants.py +++ b/novelwriter/constants.py @@ -57,9 +57,6 @@ class nwConst: STATUS_MSG_TIMEOUT = 15000 # milliseconds MAX_SEARCH_RESULT = 1000 - # Dialogs - DLG_FINISHED = 2 - class nwRegEx: diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index c723ba66a..4395c5bcd 100644 --- a/novelwriter/dialogs/preferences.py +++ b/novelwriter/dialogs/preferences.py @@ -29,13 +29,13 @@ from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot from PyQt5.QtGui import QCloseEvent from PyQt5.QtWidgets import ( - QAbstractButton, QApplication, QCompleter, QDialogButtonBox, QFileDialog, - QHBoxLayout, QLineEdit, QPushButton, QVBoxLayout, QWidget + QAbstractButton, QCompleter, QDialogButtonBox, QFileDialog, QHBoxLayout, + QLineEdit, QPushButton, QVBoxLayout, QWidget ) from novelwriter import CONFIG, SHARED from novelwriter.common import describeFont -from novelwriter.constants import nwConst, nwUnicode +from novelwriter.constants import nwUnicode from novelwriter.dialogs.quotes import GuiQuoteSelect from novelwriter.extensions.configlayout import NColourLabel, NScrollableForm from novelwriter.extensions.modified import ( @@ -695,64 +695,62 @@ def buildForm(self) -> None: self.sidebar.addButton(title, section) self.mainForm.addGroupLabel(title, section) - self.quoteSym = {} - # Single Quote Style - self.quoteSym["SO"] = QLineEdit(self) - self.quoteSym["SO"].setMaxLength(1) - self.quoteSym["SO"].setReadOnly(True) - self.quoteSym["SO"].setFixedWidth(boxFixed) - self.quoteSym["SO"].setAlignment(QtAlignCenter) - self.quoteSym["SO"].setText(CONFIG.fmtSQuoteOpen) - self.btnSingleStyleO = NIconToolButton(self, iSz, "quote") - self.btnSingleStyleO.clicked.connect(lambda: self._getQuote("SO")) - self.mainForm.addRow( - self.tr("Single quote open style"), self.quoteSym["SO"], + self.fmtSQuoteOpen = QLineEdit(self) + self.fmtSQuoteOpen.setMaxLength(1) + self.fmtSQuoteOpen.setReadOnly(True) + self.fmtSQuoteOpen.setFixedWidth(boxFixed) + self.fmtSQuoteOpen.setAlignment(QtAlignCenter) + self.fmtSQuoteOpen.setText(CONFIG.fmtSQuoteOpen) + self.btnSQuoteOpen = NIconToolButton(self, iSz, "quote") + self.btnSQuoteOpen.clicked.connect(self._changeSingleQuoteOpen) + self.mainForm.addRow( + self.tr("Single quote open style"), self.fmtSQuoteOpen, self.tr("The symbol to use for a leading single quote."), - button=self.btnSingleStyleO + button=self.btnSQuoteOpen ) - self.quoteSym["SC"] = QLineEdit(self) - self.quoteSym["SC"].setMaxLength(1) - self.quoteSym["SC"].setReadOnly(True) - self.quoteSym["SC"].setFixedWidth(boxFixed) - self.quoteSym["SC"].setAlignment(QtAlignCenter) - self.quoteSym["SC"].setText(CONFIG.fmtSQuoteClose) - self.btnSingleStyleC = NIconToolButton(self, iSz, "quote") - self.btnSingleStyleC.clicked.connect(lambda: self._getQuote("SC")) + self.fmtSQuoteClose = QLineEdit(self) + self.fmtSQuoteClose.setMaxLength(1) + self.fmtSQuoteClose.setReadOnly(True) + self.fmtSQuoteClose.setFixedWidth(boxFixed) + self.fmtSQuoteClose.setAlignment(QtAlignCenter) + self.fmtSQuoteClose.setText(CONFIG.fmtSQuoteClose) + self.btnSQuoteClose = NIconToolButton(self, iSz, "quote") + self.btnSQuoteClose.clicked.connect(self._changeSingleQuoteClose) self.mainForm.addRow( - self.tr("Single quote close style"), self.quoteSym["SC"], + self.tr("Single quote close style"), self.fmtSQuoteClose, self.tr("The symbol to use for a trailing single quote."), - button=self.btnSingleStyleC + button=self.btnSQuoteClose ) # Double Quote Style - self.quoteSym["DO"] = QLineEdit(self) - self.quoteSym["DO"].setMaxLength(1) - self.quoteSym["DO"].setReadOnly(True) - self.quoteSym["DO"].setFixedWidth(boxFixed) - self.quoteSym["DO"].setAlignment(QtAlignCenter) - self.quoteSym["DO"].setText(CONFIG.fmtDQuoteOpen) - self.btnDoubleStyleO = NIconToolButton(self, iSz, "quote") - self.btnDoubleStyleO.clicked.connect(lambda: self._getQuote("DO")) - self.mainForm.addRow( - self.tr("Double quote open style"), self.quoteSym["DO"], + self.fmtDQuoteOpen = QLineEdit(self) + self.fmtDQuoteOpen.setMaxLength(1) + self.fmtDQuoteOpen.setReadOnly(True) + self.fmtDQuoteOpen.setFixedWidth(boxFixed) + self.fmtDQuoteOpen.setAlignment(QtAlignCenter) + self.fmtDQuoteOpen.setText(CONFIG.fmtDQuoteOpen) + self.btnDQuoteOpen = NIconToolButton(self, iSz, "quote") + self.btnDQuoteOpen.clicked.connect(self._changeDoubleQuoteOpen) + self.mainForm.addRow( + self.tr("Double quote open style"), self.fmtDQuoteOpen, self.tr("The symbol to use for a leading double quote."), - button=self.btnDoubleStyleO + button=self.btnDQuoteOpen ) - self.quoteSym["DC"] = QLineEdit(self) - self.quoteSym["DC"].setMaxLength(1) - self.quoteSym["DC"].setReadOnly(True) - self.quoteSym["DC"].setFixedWidth(boxFixed) - self.quoteSym["DC"].setAlignment(QtAlignCenter) - self.quoteSym["DC"].setText(CONFIG.fmtDQuoteClose) - self.btnDoubleStyleC = NIconToolButton(self, iSz, "quote") - self.btnDoubleStyleC.clicked.connect(lambda: self._getQuote("DC")) + self.fmtDQuoteClose = QLineEdit(self) + self.fmtDQuoteClose.setMaxLength(1) + self.fmtDQuoteClose.setReadOnly(True) + self.fmtDQuoteClose.setFixedWidth(boxFixed) + self.fmtDQuoteClose.setAlignment(QtAlignCenter) + self.fmtDQuoteClose.setText(CONFIG.fmtDQuoteClose) + self.btnDQuoteClose = NIconToolButton(self, iSz, "quote") + self.btnDQuoteClose.clicked.connect(self._changeDoubleQuoteClose) self.mainForm.addRow( - self.tr("Double quote close style"), self.quoteSym["DC"], + self.tr("Double quote close style"), self.fmtDQuoteClose, self.tr("The symbol to use for a trailing double quote."), - button=self.btnDoubleStyleC + button=self.btnDQuoteClose ) self.mainForm.finalise() @@ -769,8 +767,6 @@ def closeEvent(self, event: QCloseEvent) -> None: logger.debug("Close: GuiPreferences") self._saveWindowSize() event.accept() - QApplication.processEvents() - self.done(nwConst.DLG_FINISHED) self.softDelete() return @@ -850,11 +846,36 @@ def _toggleAutoReplaceMain(self, state: bool) -> None: self.fmtPadThin.setEnabled(state) return - def _getQuote(self, qType: str) -> None: - """Dialog for single quote open.""" - quote, status = GuiQuoteSelect.getQuote(self, current=self.quoteSym[qType].text()) + @pyqtSlot() + def _changeSingleQuoteOpen(self) -> None: + """Change single quote open style.""" + quote, status = GuiQuoteSelect.getQuote(self, current=self.fmtSQuoteOpen.text()) + if status: + self.fmtSQuoteOpen.setText(quote) + return + + @pyqtSlot() + def _changeSingleQuoteClose(self) -> None: + """Change single quote close style.""" + quote, status = GuiQuoteSelect.getQuote(self, current=self.fmtSQuoteClose.text()) + if status: + self.fmtSQuoteClose.setText(quote) + return + + @pyqtSlot() + def _changeDoubleQuoteOpen(self) -> None: + """Change double quote open style.""" + quote, status = GuiQuoteSelect.getQuote(self, current=self.fmtDQuoteOpen.text()) + if status: + self.fmtDQuoteOpen.setText(quote) + return + + @pyqtSlot() + def _changeDoubleQuoteClose(self) -> None: + """Change double quote close style.""" + quote, status = GuiQuoteSelect.getQuote(self, current=self.fmtDQuoteClose.text()) if status: - self.quoteSym[qType].setText(quote) + self.fmtDQuoteClose.setText(quote) return ## @@ -972,10 +993,10 @@ def _saveValues(self) -> None: CONFIG.fmtPadThin = self.fmtPadThin.isChecked() # Quotation Style - CONFIG.fmtSQuoteOpen = self.quoteSym["SO"].text() - CONFIG.fmtSQuoteClose = self.quoteSym["SC"].text() - CONFIG.fmtDQuoteOpen = self.quoteSym["DO"].text() - CONFIG.fmtDQuoteClose = self.quoteSym["DC"].text() + CONFIG.fmtSQuoteOpen = self.fmtSQuoteOpen.text() + CONFIG.fmtSQuoteClose = self.fmtSQuoteClose.text() + CONFIG.fmtDQuoteOpen = self.fmtDQuoteOpen.text() + CONFIG.fmtDQuoteClose = self.fmtDQuoteClose.text() # Finalise CONFIG.saveConfig() From aed4ba4310f8cdd69d5a673cb8db00e94b714a7f Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 8 Jun 2024 23:35:20 +0200 Subject: [PATCH 3/5] Rename the modifier apostrophe constants --- novelwriter/constants.py | 6 +++--- novelwriter/core/tokenizer.py | 2 +- novelwriter/gui/mainmenu.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/novelwriter/constants.py b/novelwriter/constants.py index f7b027e2d..ea6254659 100644 --- a/novelwriter/constants.py +++ b/novelwriter/constants.py @@ -411,7 +411,7 @@ class nwUnicode: U_EMDASH = "\u2014" # Long dash U_HBAR = "\u2015" # Horizontal bar U_HELLIP = "\u2026" # Ellipsis - U_MAPOSS = "\u02bc" # Modifier letter single apostrophe + U_MAPOS = "\u02bc" # Modifier letter single apostrophe U_PRIME = "\u2032" # Prime U_DPRIME = "\u2033" # Double prime @@ -478,7 +478,7 @@ class nwUnicode: H_EMDASH = "—" H_HBAR = "―" H_HELLIP = "…" - H_MAPOSS = "ʼ" + H_MAPOS = "ʼ" H_PRIME = "′" H_DPRIME = "″" @@ -543,7 +543,7 @@ class nwHtmlUnicode(): nwUnicode.U_EMDASH: nwUnicode.H_EMDASH, nwUnicode.U_HBAR: nwUnicode.H_HBAR, nwUnicode.U_HELLIP: nwUnicode.H_HELLIP, - nwUnicode.U_MAPOSS: nwUnicode.H_MAPOSS, + nwUnicode.U_MAPOS: nwUnicode.H_MAPOS, nwUnicode.U_PRIME: nwUnicode.H_PRIME, nwUnicode.U_DPRIME: nwUnicode.H_DPRIME, diff --git a/novelwriter/core/tokenizer.py b/novelwriter/core/tokenizer.py index 314d14a86..93b967f55 100644 --- a/novelwriter/core/tokenizer.py +++ b/novelwriter/core/tokenizer.py @@ -485,7 +485,7 @@ def doPreProcessing(self) -> None: self._text = xRep.sub(lambda x: repDict[x.group(0)], self._text) # Process the character translation map - trDict = {nwUnicode.U_MAPOSS: nwUnicode.U_RSQUO} + trDict = {nwUnicode.U_MAPOS: nwUnicode.U_RSQUO} self._text = self._text.translate(str.maketrans(trDict)) return diff --git a/novelwriter/gui/mainmenu.py b/novelwriter/gui/mainmenu.py index 348d7b4d7..56dc45d79 100644 --- a/novelwriter/gui/mainmenu.py +++ b/novelwriter/gui/mainmenu.py @@ -422,7 +422,7 @@ def _buildInsertMenu(self) -> None: self.aInsMSApos = self.mInsQuotes.addAction(self.tr("Alternative Apostrophe")) self.aInsMSApos.setShortcut("Ctrl+K, '") self.aInsMSApos.triggered.connect( - lambda: self.requestDocInsertText.emit(nwUnicode.U_MAPOSS) + lambda: self.requestDocInsertText.emit(nwUnicode.U_MAPOS) ) # Insert > Symbols From a48fde95a3ab21a188ca8e2405a64d787dfbfe8d Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 8 Jun 2024 23:35:29 +0200 Subject: [PATCH 4/5] Update tests --- tests/test_dialogs/test_dlg_preferences.py | 30 ++++++++++------------ tests/test_gui/test_gui_docviewer.py | 4 +-- tests/test_gui/test_gui_mainmenu.py | 2 +- tests/test_gui/test_gui_projtree.py | 8 +++--- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/tests/test_dialogs/test_dlg_preferences.py b/tests/test_dialogs/test_dlg_preferences.py index 48fd08b79..7a27490a6 100644 --- a/tests/test_dialogs/test_dlg_preferences.py +++ b/tests/test_dialogs/test_dlg_preferences.py @@ -27,10 +27,10 @@ from PyQt5.QtWidgets import QAction, QFileDialog, QFontDialog from novelwriter import CONFIG, SHARED -from novelwriter.constants import nwConst, nwUnicode +from novelwriter.constants import nwUnicode from novelwriter.dialogs.preferences import GuiPreferences from novelwriter.dialogs.quotes import GuiQuoteSelect -from novelwriter.types import QtDialogApply, QtDialogClose, QtDialogSave, QtModeNone +from novelwriter.types import QtDialogApply, QtDialogClose, QtDialogSave, QtModNone KEY_DELAY = 1 @@ -125,23 +125,19 @@ def testDlgPreferences_Actions(qtbot, monkeypatch, nwGUI): # Check Save Button prefs.show() with qtbot.waitSignal(prefs.newPreferencesReady) as signal: - with qtbot.waitSignal(prefs.finished) as status: - prefs.buttonBox.button(QtDialogSave).click() - assert signal.args == [False, False, False, False] - assert status.args == [nwConst.DLG_FINISHED] + prefs.buttonBox.button(QtDialogSave).click() + assert signal.args == [False, False, False, False] # Check Close Button prefs.show() - with qtbot.waitSignal(prefs.finished) as status: - prefs.buttonBox.button(QtDialogClose).click() - assert status.args == [nwConst.DLG_FINISHED] + prefs.buttonBox.button(QtDialogClose).click() + assert prefs.isHidden() is True # Close Using Escape Key prefs.show() - with qtbot.waitSignal(prefs.finished) as status: - event = QKeyEvent(QEvent.Type.KeyPress, Qt.Key.Key_Escape, QtModeNone) - prefs.keyPressEvent(event) - assert status.args == [nwConst.DLG_FINISHED] + event = QKeyEvent(QEvent.Type.KeyPress, Qt.Key.Key_Escape, QtModNone) + prefs.keyPressEvent(event) + assert prefs.isHidden() is True # qtbot.stop() @@ -299,16 +295,16 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, tstPaths): # Quotation Style with monkeypatch.context() as mp: mp.setattr(GuiQuoteSelect, "getQuote", lambda *a, **k: (nwUnicode.U_LSAQUO, True)) - prefs.btnSingleStyleO.click() + prefs.btnSQuoteOpen.click() with monkeypatch.context() as mp: mp.setattr(GuiQuoteSelect, "getQuote", lambda *a, **k: (nwUnicode.U_RSAQUO, True)) - prefs.btnSingleStyleC.click() + prefs.btnSQuoteClose.click() with monkeypatch.context() as mp: mp.setattr(GuiQuoteSelect, "getQuote", lambda *a, **k: (nwUnicode.U_LAQUO, True)) - prefs.btnDoubleStyleO.click() + prefs.btnDQuoteOpen.click() with monkeypatch.context() as mp: mp.setattr(GuiQuoteSelect, "getQuote", lambda *a, **k: (nwUnicode.U_RAQUO, True)) - prefs.btnDoubleStyleC.click() + prefs.btnDQuoteClose.click() assert CONFIG.fmtSQuoteOpen == nwUnicode.U_LSQUO assert CONFIG.fmtSQuoteClose == nwUnicode.U_RSQUO diff --git a/tests/test_gui/test_gui_docviewer.py b/tests/test_gui/test_gui_docviewer.py index b5928209d..c82e83329 100644 --- a/tests/test_gui/test_gui_docviewer.py +++ b/tests/test_gui/test_gui_docviewer.py @@ -30,7 +30,7 @@ from novelwriter.core.toqdoc import ToQTextDocument from novelwriter.enum import nwDocAction from novelwriter.gui.docviewer import GuiDocViewer -from novelwriter.types import QtModeNone, QtMouseLeft +from novelwriter.types import QtModNone, QtMouseLeft from tests.mocked import causeException @@ -61,7 +61,7 @@ def testGuiViewer_Main(qtbot, monkeypatch, nwGUI, prjLipsum): # Re-select via header click button = QtMouseLeft - modifier = QtModeNone + modifier = QtModNone event = QMouseEvent(QEvent.Type.MouseButtonPress, QPoint(), button, button, modifier) docViewer.docHeader.mousePressEvent(event) assert nwGUI.projView.projTree.getSelectedHandle() == "88243afbe5ed8" diff --git a/tests/test_gui/test_gui_mainmenu.py b/tests/test_gui/test_gui_mainmenu.py index 84b01b920..a8072cb95 100644 --- a/tests/test_gui/test_gui_mainmenu.py +++ b/tests/test_gui/test_gui_mainmenu.py @@ -400,7 +400,7 @@ def testGuiMainMenu_Insert(qtbot, monkeypatch, nwGUI, fncPath, projPath, mockRnd nwGUI.docEditor.clear() nwGUI.mainMenu.aInsMSApos.activate(QAction.Trigger) - assert nwGUI.docEditor.getText() == nwUnicode.U_MAPOSS + assert nwGUI.docEditor.getText() == nwUnicode.U_MAPOS nwGUI.docEditor.clear() nwGUI.mainMenu.aInsEllipsis.activate(QAction.Trigger) diff --git a/tests/test_gui/test_gui_projtree.py b/tests/test_gui/test_gui_projtree.py index c81a539b0..5d8b69234 100644 --- a/tests/test_gui/test_gui_projtree.py +++ b/tests/test_gui/test_gui_projtree.py @@ -37,7 +37,7 @@ from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType, nwWidget from novelwriter.gui.projtree import GuiProjectTree, GuiProjectView, _TreeContextMenu from novelwriter.guimain import GuiMain -from novelwriter.types import QtAccepted, QtModeNone, QtMouseLeft, QtMouseMiddle, QtRejected +from novelwriter.types import QtAccepted, QtModNone, QtMouseLeft, QtMouseMiddle, QtRejected from tests.mocked import causeOSError from tests.tools import C, buildTestProject @@ -807,7 +807,7 @@ def testGuiProjTree_AutoScroll(qtbot, monkeypatch, nwGUI: GuiMain, projPath, moc action = Qt.DropAction.MoveAction mime = QMimeData() mouse = QtMouseLeft - modifier = QtModeNone + modifier = QtModNone # Scroll Down h = projTree.height() @@ -864,7 +864,7 @@ def testGuiProjTree_DragAndDrop(qtbot, monkeypatch, caplog, nwGUI: GuiMain, proj action = Qt.DropAction.MoveAction mime = QMimeData() mouse = QtMouseLeft - modifier = QtModeNone + modifier = QtModNone projTree.saveTreeOrder() treeOrder = SHARED.project.tree._order @@ -1064,7 +1064,7 @@ def testGuiProjTree_Other(qtbot, monkeypatch, nwGUI: GuiMain, projPath, mockRnd) eType = QEvent.Type.MouseButtonPress pos = projTree.visualItemRect(projTree._getTreeItem(C.hChapterDoc)).center() button = QtMouseMiddle - modifier = QtModeNone + modifier = QtModNone # Trigger the viewer event = QMouseEvent(eType, pos, button, button, modifier) From ca91e6a677009079c247c407bc062d982256fcec Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 9 Jun 2024 00:05:45 +0200 Subject: [PATCH 5/5] Improve meminfo debug formatting --- novelwriter/dialogs/preferences.py | 4 ++-- novelwriter/gui/statusbar.py | 25 +++++++++---------------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index 4395c5bcd..fcd463b5c 100644 --- a/novelwriter/dialogs/preferences.py +++ b/novelwriter/dialogs/preferences.py @@ -895,8 +895,8 @@ def _saveValues(self) -> None: refreshTree = False # Appearance - guiLocale = self.guiLocale.currentData() - guiTheme = self.guiTheme.currentData() + guiLocale = self.guiLocale.currentData() + guiTheme = self.guiTheme.currentData() updateTheme |= CONFIG.guiTheme != guiTheme needsRestart |= CONFIG.guiLocale != guiLocale diff --git a/novelwriter/gui/statusbar.py b/novelwriter/gui/statusbar.py index 78e6e22c7..e7459c536 100644 --- a/novelwriter/gui/statusbar.py +++ b/novelwriter/gui/statusbar.py @@ -239,9 +239,7 @@ def memInfo(self) -> None: # pragma: no cover """ import tracemalloc - from collections import Counter - - widgets = QApplication.allWidgets() + count = len(QApplication.allWidgets()) if not self._debugInfo: if tracemalloc.is_tracing(): self._traceMallocRef = "Total" @@ -249,19 +247,14 @@ def memInfo(self) -> None: # pragma: no cover self._traceMallocRef = "Relative" tracemalloc.start() self._debugInfo = True - self._wCounts = Counter([type(x).__name__ for x in widgets]) - - if hasattr(self, "_wCounts"): - diff = Counter([type(x).__name__ for x in widgets]) - self._wCounts - for name, count in diff.items(): - logger.debug("Widget '%s': +%d", name, count) - mem = tracemalloc.get_traced_memory() + current, peak = tracemalloc.get_traced_memory() stamp = datetime.now().strftime("%H:%M:%S") - self.showMessage(( - f"Debug [{stamp}]" - f" \u2013 Widgets: {len(widgets)}" - f" \u2013 {self._traceMallocRef} Memory: {mem[0]:n}" - f" \u2013 Peak: {mem[1]:n}" - ), 6000) + message = ( + f"Widgets: {count} \u2013 " + f"{self._traceMallocRef} Memory: {current/1024:,.2f} kiB \u2013 " + f"Peak: {peak/1024:,.2f} kiB" + ) + self.showMessage(f"Debug [{stamp}] {message}", 6000) + logger.debug("[MEMINFO] %s", message) return