diff --git a/novelwriter/core/projectdata.py b/novelwriter/core/projectdata.py index 6d47b955..a7ea319b 100644 --- a/novelwriter/core/projectdata.py +++ b/novelwriter/core/projectdata.py @@ -29,7 +29,8 @@ import uuid from typing import TYPE_CHECKING, Any from novelwriter.common import ( - checkBool, checkInt, checkStringNone, checkUuid, isHandle, simplified + checkBool, checkInt, checkStringNone, checkUuid, isHandle, + makeFileNameSafe, simplified ) from novelwriter.core.status import NWStatus @@ -101,6 +102,11 @@ class NWProjectData: """Return the project name.""" return self._name + @property + def fileSafeName(self) -> str: + """Return the project name in a file name safe format.""" + return makeFileNameSafe(self._name) + @property def author(self) -> str: """Return the project author.""" diff --git a/novelwriter/dialogs/wordlist.py b/novelwriter/dialogs/wordlist.py index 8009d157..a89f0308 100644 --- a/novelwriter/dialogs/wordlist.py +++ b/novelwriter/dialogs/wordlist.py @@ -96,9 +96,11 @@ class GuiWordList(NDialog): self.newEntry = QLineEdit(self) self.addButton = NIconToolButton(self, iSz, "add") + self.addButton.setToolTip(self.tr("Add Word")) self.addButton.clicked.connect(self._doAdd) self.delButton = NIconToolButton(self, iSz, "remove") + self.delButton.setToolTip(self.tr("Remove Word")) self.delButton.clicked.connect(self._doDelete) self.editBox = QHBoxLayout() @@ -184,11 +186,10 @@ class GuiWordList(NDialog): SHARED.info(self.tr( "Note: The import file must be a plain text file with UTF-8 or ASCII encoding." )) - ffilter = formatFileFilter(["*.txt", "*"]) - path, _ = QFileDialog.getOpenFileName( - self, self.tr("Import File"), str(CONFIG.homePath()), filter=ffilter - ) - if path: + if path := QFileDialog.getOpenFileName( + self, self.tr("Import File"), str(CONFIG.homePath()), + filter=formatFileFilter(["*.txt", "*"]), + )[0]: try: with open(path, mode="r", encoding="utf-8") as fo: words = set(w.strip() for w in fo.read().split()) @@ -202,10 +203,10 @@ class GuiWordList(NDialog): @pyqtSlot() def _exportWords(self) -> None: """Export words to file.""" - path, _ = QFileDialog.getSaveFileName( - self, self.tr("Export File"), str(CONFIG.homePath()) - ) - if path: + name = f"{SHARED.project.data.fileSafeName} - {self.windowTitle()}.txt" + if path := QFileDialog.getSaveFileName( + self, self.tr("Export File"), str(CONFIG.homePath() / name), + )[0]: try: path = Path(path).with_suffix(".txt") with open(path, mode="w", encoding="utf-8") as fo: diff --git a/novelwriter/gui/outline.py b/novelwriter/gui/outline.py index e07f3c84..8678ebb6 100644 --- a/novelwriter/gui/outline.py +++ b/novelwriter/gui/outline.py @@ -41,7 +41,7 @@ from PyQt5.QtWidgets import ( ) from novelwriter import CONFIG, SHARED -from novelwriter.common import checkInt, formatFileFilter, makeFileNameSafe +from novelwriter.common import checkInt, formatFileFilter from novelwriter.constants import nwKeyWords, nwLabels, nwStats, nwStyles, trConst from novelwriter.enum import nwChange, nwDocMode, nwItemClass, nwItemLayout, nwItemType, nwOutline from novelwriter.error import logException @@ -541,11 +541,10 @@ class GuiOutlineTree(QTreeWidget): @pyqtSlot() def exportOutline(self) -> None: """Export the outline as a CSV file.""" - path = CONFIG.lastPath("outline") / f"{makeFileNameSafe(SHARED.project.data.name)}.csv" - path, _ = QFileDialog.getSaveFileName( - self, self.tr("Save Outline As"), str(path), formatFileFilter(["*.csv", "*"]) - ) - if path: + name = CONFIG.lastPath("outline") / f"{SHARED.project.data.fileSafeName}.csv" + if path := QFileDialog.getSaveFileName( + self, self.tr("Save Outline As"), str(name), formatFileFilter(["*.csv", "*"]) + )[0]: CONFIG.setLastPath("outline", path) logger.info("Writing CSV file: %s", path) cols = [col for col in self._treeOrder if not self._colHidden[col]]