From 39c072050b56c48d47a6504d5311b4f54327d939 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 11 May 2025 12:50:00 +0200 Subject: [PATCH 1/4] Add shapes to default status labels (#2332) --- novelwriter/core/project.py | 16 +++++----- .../coreProject_NewFileFolder_nwProject.nwx | 18 +++++------ .../coreProject_NewRoot_nwProject.nwx | 18 +++++------ .../coreTools_DocDuplicator_nwProject.nwx | 18 +++++------ .../coreTools_ProjectBuilderA_nwProject.nwx | 18 +++++------ .../coreTools_ProjectBuilderB_nwProject.nwx | 18 +++++------ .../guiEditor_Main_Final_nwProject.nwx | 20 ++++++------- .../guiEditor_Main_Initial_nwProject.nwx | 18 +++++------ .../test_dialogs/test_dlg_projectsettings.py | 30 +++++++++---------- 9 files changed, 87 insertions(+), 87 deletions(-) diff --git a/novelwriter/core/project.py b/novelwriter/core/project.py index 9ad46682..fb71e9ac 100644 --- a/novelwriter/core/project.py +++ b/novelwriter/core/project.py @@ -483,14 +483,14 @@ class NWProject: def setDefaultStatusImport(self) -> None: """Set the default status and importance values.""" - self._data.itemStatus.add(None, self.tr("New"), (100, 100, 100), "SQUARE", 0) - self._data.itemStatus.add(None, self.tr("Note"), (200, 50, 0), "SQUARE", 0) - self._data.itemStatus.add(None, self.tr("Draft"), (200, 150, 0), "SQUARE", 0) - self._data.itemStatus.add(None, self.tr("Finished"), (50, 200, 0), "SQUARE", 0) - self._data.itemImport.add(None, self.tr("New"), (100, 100, 100), "SQUARE", 0) - self._data.itemImport.add(None, self.tr("Minor"), (200, 50, 0), "SQUARE", 0) - self._data.itemImport.add(None, self.tr("Major"), (200, 150, 0), "SQUARE", 0) - self._data.itemImport.add(None, self.tr("Main"), (50, 200, 0), "SQUARE", 0) + self._data.itemStatus.add(None, self.tr("New"), (120, 120, 120), "STAR", 0) + self._data.itemStatus.add(None, self.tr("Note"), (205, 171, 143), "TRIANGLE", 0) + self._data.itemStatus.add(None, self.tr("Draft"), (143, 240, 164), "CIRCLE_T", 0) + self._data.itemStatus.add(None, self.tr("Finished"), (249, 240, 107), "STAR", 0) + self._data.itemImport.add(None, self.tr("New"), (120, 120, 120), "SQUARE", 0) + self._data.itemImport.add(None, self.tr("Minor"), (220, 138, 221), "BLOCK_2", 0) + self._data.itemImport.add(None, self.tr("Major"), (220, 138, 221), "BLOCK_3", 0) + self._data.itemImport.add(None, self.tr("Main"), (220, 138, 221), "BLOCK_4", 0) return def setProjectLang(self, language: str | None) -> None: diff --git a/tests/reference/coreProject_NewFileFolder_nwProject.nwx b/tests/reference/coreProject_NewFileFolder_nwProject.nwx index 80142d13..6b5adc10 100644 --- a/tests/reference/coreProject_NewFileFolder_nwProject.nwx +++ b/tests/reference/coreProject_NewFileFolder_nwProject.nwx @@ -1,5 +1,5 @@ - + New Project Jane Doe @@ -16,16 +16,16 @@ - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/reference/coreProject_NewRoot_nwProject.nwx b/tests/reference/coreProject_NewRoot_nwProject.nwx index 5d583362..bb72469a 100644 --- a/tests/reference/coreProject_NewRoot_nwProject.nwx +++ b/tests/reference/coreProject_NewRoot_nwProject.nwx @@ -1,5 +1,5 @@ - + New Project Jane Doe @@ -16,16 +16,16 @@ - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/reference/coreTools_DocDuplicator_nwProject.nwx b/tests/reference/coreTools_DocDuplicator_nwProject.nwx index 2f571386..1405e3e9 100644 --- a/tests/reference/coreTools_DocDuplicator_nwProject.nwx +++ b/tests/reference/coreTools_DocDuplicator_nwProject.nwx @@ -1,5 +1,5 @@ - + New Project Jane Doe @@ -16,16 +16,16 @@ - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/reference/coreTools_ProjectBuilderA_nwProject.nwx b/tests/reference/coreTools_ProjectBuilderA_nwProject.nwx index a35421d0..fbe4eb4c 100644 --- a/tests/reference/coreTools_ProjectBuilderA_nwProject.nwx +++ b/tests/reference/coreTools_ProjectBuilderA_nwProject.nwx @@ -1,5 +1,5 @@ - + Test Project A Jane Doe @@ -16,16 +16,16 @@ - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/reference/coreTools_ProjectBuilderB_nwProject.nwx b/tests/reference/coreTools_ProjectBuilderB_nwProject.nwx index 0185bc6a..203e7fbf 100644 --- a/tests/reference/coreTools_ProjectBuilderB_nwProject.nwx +++ b/tests/reference/coreTools_ProjectBuilderB_nwProject.nwx @@ -1,5 +1,5 @@ - + Test Project B Jane Doe @@ -16,16 +16,16 @@ - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/reference/guiEditor_Main_Final_nwProject.nwx b/tests/reference/guiEditor_Main_Final_nwProject.nwx index e90fa531..ac0d929b 100644 --- a/tests/reference/guiEditor_Main_Final_nwProject.nwx +++ b/tests/reference/guiEditor_Main_Final_nwProject.nwx @@ -1,6 +1,6 @@ - - + + New Project Jane Doe @@ -16,16 +16,16 @@ - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/reference/guiEditor_Main_Initial_nwProject.nwx b/tests/reference/guiEditor_Main_Initial_nwProject.nwx index 27e64dac..1c94d8c6 100644 --- a/tests/reference/guiEditor_Main_Initial_nwProject.nwx +++ b/tests/reference/guiEditor_Main_Initial_nwProject.nwx @@ -1,5 +1,5 @@ - + New Project Jane Doe @@ -16,16 +16,16 @@ - New - Note - Draft - Finished + New + Note + Draft + Finished - New - Minor - Major - Main + New + Minor + Major + Main diff --git a/tests/test_dialogs/test_dlg_projectsettings.py b/tests/test_dialogs/test_dlg_projectsettings.py index d28322d4..edd0cebe 100644 --- a/tests/test_dialogs/test_dlg_projectsettings.py +++ b/tests/test_dialogs/test_dlg_projectsettings.py @@ -214,18 +214,18 @@ def testDlgProjSettings_StatusImport(qtbot, monkeypatch, nwGUI, projPath, mockRn assert update[0][0] == C.sNew assert update[0][1].name == "New" - assert update[0][1].color == QColor(100, 100, 100) - assert update[0][1].shape == nwStatusShape.SQUARE + assert update[0][1].color == QColor(120, 120, 120) + assert update[0][1].shape == nwStatusShape.STAR assert update[1][0] == C.sDraft assert update[1][1].name == "Draft" - assert update[1][1].color == QColor(200, 150, 0) - assert update[1][1].shape == nwStatusShape.SQUARE + assert update[1][1].color == QColor(143, 240, 164) + assert update[1][1].shape == nwStatusShape.CIRCLE_T assert update[2][0] == C.sFinished assert update[2][1].name == "Finished" - assert update[2][1].color == QColor(50, 200, 0) - assert update[2][1].shape == nwStatusShape.SQUARE + assert update[2][1].color == QColor(249, 240, 107) + assert update[2][1].shape == nwStatusShape.STAR assert update[3][0] is None assert update[3][1].name == "Final" @@ -289,18 +289,18 @@ def testDlgProjSettings_StatusImport(qtbot, monkeypatch, nwGUI, projPath, mockRn assert update[0][0] == C.iNew assert update[0][1].name == "New" - assert update[0][1].color == QColor(100, 100, 100) + assert update[0][1].color == QColor(120, 120, 120) assert update[0][1].shape == nwStatusShape.SQUARE assert update[1][0] == C.iMajor assert update[1][1].name == "Major" - assert update[1][1].color == QColor(200, 150, 0) - assert update[1][1].shape == nwStatusShape.SQUARE + assert update[1][1].color == QColor(220, 138, 221) + assert update[1][1].shape == nwStatusShape.BLOCK_3 assert update[2][0] == C.iMain assert update[2][1].name == "Main" - assert update[2][1].color == QColor(50, 200, 0) - assert update[2][1].shape == nwStatusShape.SQUARE + assert update[2][1].color == QColor(220, 138, 221) + assert update[2][1].shape == nwStatusShape.BLOCK_4 assert update[3][0] is None assert update[3][1].name == "Final" @@ -354,10 +354,10 @@ def testDlgProjSettings_StatusImportExport(qtbot, monkeypatch, nwGUI, projPath, assert expFile.is_file() is True assert expFile.read_text().split() == [ - "SQUARE,#646464,New", - "SQUARE,#c83200,Note", - "SQUARE,#c89600,Draft", - "SQUARE,#32c800,Finished", + "STAR,#787878,New", + "TRIANGLE,#cdab8f,Note", + "CIRCLE_T,#8ff0a4,Draft", + "STAR,#f9f06b,Finished", ] # Import Error From 699c27e3dc801b7c8609df3a78ebaec3ffb77bfc Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 11 May 2025 13:07:55 +0200 Subject: [PATCH 2/4] Improve new project creation, and generate new id for sample projects --- novelwriter/core/coretools.py | 53 ++++++++++--------- .../coreTools_ProjectBuilderA_Project.md | 6 +-- .../coreTools_ProjectBuilderB_Project.md | 6 +-- 3 files changed, 35 insertions(+), 30 deletions(-) diff --git a/novelwriter/core/coretools.py b/novelwriter/core/coretools.py index 815504e2..8c7b7195 100644 --- a/novelwriter/core/coretools.py +++ b/novelwriter/core/coretools.py @@ -416,13 +416,14 @@ class ProjectBuilder: self._path = project.storage.storagePath - lblNewProject = self.tr("New Project") - lblTitlePage = self.tr("Title Page") + lblName = self.tr("New Project") + lblAuthor = self.tr("Author") + lblTitlePage = self.tr("Title Page") # Settings project.data.setUuid(None) - project.data.setName(data.get("name", lblNewProject)) - project.data.setAuthor(data.get("author", "")) + project.data.setName(data.get("name", lblName)) + project.data.setAuthor(data.get("author", lblAuthor)) project.data.setLanguage(CONFIG.guiLocale) project.setDefaultStatusImport() project.session.startSession() @@ -446,18 +447,14 @@ class ProjectBuilder: "\n" ">> {count}: [field:{field}] <<\n" ).format( - author=project.data.author or "None", - address=self.tr("Address"), - title=project.data.name or "None", + author=project.data.author or lblAuthor, + address=self.tr("Address Line"), + title=project.data.name or lblName, by=self.tr("By"), count=self.tr("Word Count"), field=nwStats.WORDS_TEXT, )) - # Create a project structure based on selected root folders - # and a number of chapters and scenes selected in the - # wizard's custom page. - # Create chapters and scenes numChapters = data.get("chapters", 0) numScenes = data.get("scenes", 0) @@ -563,19 +560,7 @@ class ProjectBuilder: return False # Open the copied project and update settings - project = NWProject() - project.openProject(dstPath) - project.data.setUuid("") # Creates a fresh uuid - project.data.setName(data.get("name", "None")) - project.data.setAuthor(data.get("author", "")) - project.data.setSpellCheck(True) - project.data.setSpellLang(None) - project.data.setDoBackup(True) - project.data.setSaveCount(0) - project.data.setAutoCount(0) - project.data.setEditTime(0) - project.saveProject() - project.closeProject() + self._resetProject(dstPath, data.get("name", ""), data.get("author", "")) return True @@ -593,6 +578,7 @@ class ProjectBuilder: if (sample := CONFIG.assetPath("sample.zip")).is_file(): try: shutil.unpack_archive(sample, path) + self._resetProject(path) except Exception as exc: SHARED.error(self.tr("Failed to create a new example project."), exc=exc) return False @@ -605,3 +591,22 @@ class ProjectBuilder: return False return True + + def _resetProject(self, path: Path, name: str = "", author: str = "") -> None: + """Open a project and reset/update its settings.""" + project = NWProject() + project.openProject(path) + project.data.setUuid("") # Creates a fresh uuid + if name: + project.data.setName(name) + if author: + project.data.setAuthor(author) + project.data.setSpellCheck(True) + project.data.setSpellLang(None) + project.data.setDoBackup(True) + project.data.setSaveCount(0) + project.data.setAutoCount(0) + project.data.setEditTime(0) + project.saveProject() + project.closeProject() + return diff --git a/tests/reference/coreTools_ProjectBuilderA_Project.md b/tests/reference/coreTools_ProjectBuilderA_Project.md index d608ae09..359ed670 100644 --- a/tests/reference/coreTools_ProjectBuilderA_Project.md +++ b/tests/reference/coreTools_ProjectBuilderA_Project.md @@ -1,6 +1,6 @@ Jane Doe -Address 1 -Address 2 +Address Line 1 +Address Line 2   @@ -17,7 +17,7 @@ Test Project A **By Jane Doe** -Word Count: 11 +Word Count: 13 # Chapter 1 diff --git a/tests/reference/coreTools_ProjectBuilderB_Project.md b/tests/reference/coreTools_ProjectBuilderB_Project.md index 7f6329f2..e41c9b5d 100644 --- a/tests/reference/coreTools_ProjectBuilderB_Project.md +++ b/tests/reference/coreTools_ProjectBuilderB_Project.md @@ -1,6 +1,6 @@ Jane Doe -Address 1 -Address 2 +Address Line 1 +Address Line 2   @@ -17,7 +17,7 @@ Test Project B **By Jane Doe** -Word Count: 11 +Word Count: 13 * * * From c90929750441c21ef598d3f53ad3f299ce97d3da Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 11 May 2025 13:32:32 +0200 Subject: [PATCH 3/4] Remember last used author name --- novelwriter/config.py | 35 ++++++++++++++------- novelwriter/core/coretools.py | 32 ++++++++++--------- novelwriter/tools/welcome.py | 1 + tests/reference/baseConfig_novelwriter.conf | 3 +- tests/test_base/test_base_config.py | 5 +++ 5 files changed, 49 insertions(+), 27 deletions(-) diff --git a/novelwriter/config.py b/novelwriter/config.py index d820c66a..1d2e47d8 100644 --- a/novelwriter/config.py +++ b/novelwriter/config.py @@ -42,7 +42,7 @@ from PyQt6.QtWidgets import QApplication from novelwriter.common import ( NWConfigParser, checkInt, checkPath, describeFont, fontMatcher, - formatTimeStamp, processDialogSymbols + formatTimeStamp, processDialogSymbols, simplified ) from novelwriter.constants import nwFiles, nwHtmlUnicode, nwQuotes, nwUnicode from novelwriter.error import formatException, logException @@ -65,16 +65,16 @@ class Config: __slots__ = ( "_appPath", "_appRoot", "_backPath", "_backupPath", "_confPath", "_dLocale", "_dShortDate", - "_dShortDateTime", "_dataPath", "_errData", "_hasError", "_homePath", "_manuals", - "_nwLangPath", "_qLocale", "_qtLangPath", "_qtTrans", "_recentPaths", "_recentProjects", - "_splash", "allowOpenDial", "altDialogClose", "altDialogOpen", "appHandle", "appName", - "askBeforeBackup", "askBeforeExit", "autoSaveDoc", "autoSaveProj", "autoScroll", - "autoScrollPos", "autoSelect", "backupOnClose", "cursorWidth", "dialogLine", "dialogStyle", - "doJustify", "doReplace", "doReplaceDQuote", "doReplaceDash", "doReplaceDots", - "doReplaceSQuote", "emphLabels", "fmtApostrophe", "fmtDQuoteClose", "fmtDQuoteOpen", - "fmtPadAfter", "fmtPadBefore", "fmtPadThin", "fmtSQuoteClose", "fmtSQuoteOpen", - "focusWidth", "guiFont", "guiLocale", "guiSyntax", "guiTheme", "hasEnchant", - "hideFocusFooter", "hideHScroll", "hideVScroll", "highlightEmph", "hostName", + "_dShortDateTime", "_dataPath", "_errData", "_hasError", "_homePath", "_lastAuthor", + "_manuals", "_nwLangPath", "_qLocale", "_qtLangPath", "_qtTrans", "_recentPaths", + "_recentProjects", "_splash", "allowOpenDial", "altDialogClose", "altDialogOpen", + "appHandle", "appName", "askBeforeBackup", "askBeforeExit", "autoSaveDoc", "autoSaveProj", + "autoScroll", "autoScrollPos", "autoSelect", "backupOnClose", "cursorWidth", "dialogLine", + "dialogStyle", "doJustify", "doReplace", "doReplaceDQuote", "doReplaceDash", + "doReplaceDots", "doReplaceSQuote", "emphLabels", "fmtApostrophe", "fmtDQuoteClose", + "fmtDQuoteOpen", "fmtPadAfter", "fmtPadBefore", "fmtPadThin", "fmtSQuoteClose", + "fmtSQuoteOpen", "focusWidth", "guiFont", "guiLocale", "guiSyntax", "guiTheme", + "hasEnchant", "hideFocusFooter", "hideHScroll", "hideVScroll", "highlightEmph", "hostName", "iconColDocs", "iconColTree", "iconTheme", "incNotesWCount", "isDebug", "kernelVer", "lastNotes", "mainPanePos", "mainWinSize", "memInfo", "narratorBreak", "narratorDialog", "nativeFont", "osDarwin", "osLinux", "osType", "osUnknown", "osWindows", "outlinePanePos", @@ -149,6 +149,7 @@ class Config: self._recentProjects = RecentProjects(self) self._recentPaths = RecentPaths(self) + self._lastAuthor = "" # General GUI Settings self.guiLocale = self._qLocale.name() @@ -321,6 +322,11 @@ class Config: def recentProjects(self) -> RecentProjects: return self._recentProjects + @property + def lastAuthor(self) -> str: + """Return the last author name used.""" + return simplified(self._lastAuthor) + ## # Getters ## @@ -336,6 +342,11 @@ class Config: # Setters ## + def setLastAuthor(self, value: str) -> None: + """Set tle last used author name.""" + self._lastAuthor = simplified(value) + 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 @@ -645,6 +656,7 @@ class Config: self.backupOnClose = conf.rdBool(sec, "backuponclose", self.backupOnClose) self.askBeforeBackup = conf.rdBool(sec, "askbeforebackup", self.askBeforeBackup) self.askBeforeExit = conf.rdBool(sec, "askbeforeexit", self.askBeforeExit) + self._lastAuthor = conf.rdStr(sec, "lastauthor", self._lastAuthor) # Editor sec = "Editor" @@ -769,6 +781,7 @@ class Config: "backuponclose": str(self.backupOnClose), "askbeforebackup": str(self.askBeforeBackup), "askbeforeexit": str(self.askBeforeExit), + "lastauthor": str(self._lastAuthor), } conf["Editor"] = { diff --git a/novelwriter/core/coretools.py b/novelwriter/core/coretools.py index 8c7b7195..4c8d6004 100644 --- a/novelwriter/core/coretools.py +++ b/novelwriter/core/coretools.py @@ -383,6 +383,8 @@ class ProjectBuilder: """Build or copy a project from a data dictionary.""" if isinstance(data, dict): path = data.get("path", None) or None + if author := data.get("author"): + CONFIG.setLastAuthor(author) if isinstance(path, str | Path): self._path = Path(path).resolve() if data.get("sample"): @@ -416,21 +418,21 @@ class ProjectBuilder: self._path = project.storage.storagePath - lblName = self.tr("New Project") - lblAuthor = self.tr("Author") - lblTitlePage = self.tr("Title Page") + trName = self.tr("New Project") + trAuthor = self.tr("Author Name") + trTitlePage = self.tr("Title Page") # Settings project.data.setUuid(None) - project.data.setName(data.get("name", lblName)) - project.data.setAuthor(data.get("author", lblAuthor)) + project.data.setName(data.get("name", trName)) + project.data.setAuthor(data.get("author", trAuthor)) project.data.setLanguage(CONFIG.guiLocale) project.setDefaultStatusImport() project.session.startSession() # Add Root Folders hNovelRoot = project.newRoot(nwItemClass.NOVEL) - hTitlePage = project.newFile(lblTitlePage, hNovelRoot) + hTitlePage = project.newFile(trTitlePage, hNovelRoot) # Generate Title Page aDoc = project.storage.getDocument(hTitlePage) @@ -447,9 +449,9 @@ class ProjectBuilder: "\n" ">> {count}: [field:{field}] <<\n" ).format( - author=project.data.author or lblAuthor, + author=project.data.author or trAuthor, address=self.tr("Address Line"), - title=project.data.name or lblName, + title=project.data.name or trName, by=self.tr("By"), count=self.tr("Word Count"), field=nwStats.WORDS_TEXT, @@ -459,9 +461,9 @@ class ProjectBuilder: numChapters = data.get("chapters", 0) numScenes = data.get("scenes", 0) - chSynop = self.tr("Summary of the chapter.") - scSynop = self.tr("Summary of the scene.") - bfNote = self.tr("A short description.") + trChSynop = self.tr("Summary of the chapter.") + trScSynop = self.tr("Summary of the scene.") + trNoteDesc = self.tr("A short description.") # Create chapters if numChapters > 0: @@ -469,7 +471,7 @@ class ProjectBuilder: chTitle = self.tr("Chapter {0}").format(f"{ch+1:d}") cHandle = project.newFile(chTitle, hNovelRoot) aDoc = project.storage.getDocument(cHandle) - aDoc.writeDocument(f"## {chTitle}\n\n%Synopsis: {chSynop}\n\n") + aDoc.writeDocument(f"## {chTitle}\n\n%Synopsis: {trChSynop}\n\n") # Create chapter scenes if numScenes > 0 and cHandle: @@ -477,7 +479,7 @@ class ProjectBuilder: scTitle = self.tr("Scene {0}").format(f"{ch+1:d}.{sc+1:d}") sHandle = project.newFile(scTitle, cHandle) aDoc = project.storage.getDocument(sHandle) - aDoc.writeDocument(f"### {scTitle}\n\n%Synopsis: {scSynop}\n\n") + aDoc.writeDocument(f"### {scTitle}\n\n%Synopsis: {trScSynop}\n\n") # Create scenes (no chapters) elif numScenes > 0: @@ -485,7 +487,7 @@ class ProjectBuilder: scTitle = self.tr("Scene {0}").format(f"{sc+1:d}") sHandle = project.newFile(scTitle, hNovelRoot) aDoc = project.storage.getDocument(sHandle) - aDoc.writeDocument(f"### {scTitle}\n\n%Synopsis: {scSynop}\n\n") + aDoc.writeDocument(f"### {scTitle}\n\n%Synopsis: {trScSynop}\n\n") # Create notes folders noteTitles = { @@ -505,7 +507,7 @@ class ProjectBuilder: aDoc.writeDocument( f"# {noteTitles[newRoot]}\n\n" f"@tag: {ntTag}\n\n" - f"%Short: {bfNote}\n\n" + f"%Short: {trNoteDesc}\n\n" ) # Also add the archive and trash folders diff --git a/novelwriter/tools/welcome.py b/novelwriter/tools/welcome.py index 3638c18d..9b0abe33 100644 --- a/novelwriter/tools/welcome.py +++ b/novelwriter/tools/welcome.py @@ -565,6 +565,7 @@ class _NewProjectForm(QWidget): self.projAuthor = QLineEdit(self) self.projAuthor.setMaxLength(200) self.projAuthor.setPlaceholderText(self.tr("Optional")) + self.projAuthor.setText(CONFIG.lastAuthor) # Project Path self.projPath = QLineEdit(self) diff --git a/tests/reference/baseConfig_novelwriter.conf b/tests/reference/baseConfig_novelwriter.conf index fb701405..78441636 100644 --- a/tests/reference/baseConfig_novelwriter.conf +++ b/tests/reference/baseConfig_novelwriter.conf @@ -1,5 +1,5 @@ [Meta] -timestamp = 2025-02-22 19:57:47 +timestamp = 2025-05-11 13:28:11 [Main] font = @@ -31,6 +31,7 @@ backuppath = backuponclose = False askbeforebackup = True askbeforeexit = True +lastauthor = [Editor] textfont = diff --git a/tests/test_base/test_base_config.py b/tests/test_base/test_base_config.py index ee43b86a..81b03831 100644 --- a/tests/test_base/test_base_config.py +++ b/tests/test_base/test_base_config.py @@ -242,6 +242,11 @@ def testBaseConfig_Methods(fncPath): # Recent Projects assert isinstance(tstConf.recentProjects, RecentProjects) + # Last Author + assert CONFIG.lastAuthor == "" + CONFIG.setLastAuthor(" Jane Doe ") + assert CONFIG.lastAuthor == "Jane Doe" + @pytest.mark.base def testBaseConfig_SettersGetters(fncPath): From 08dda5d58b5de45c62a824c8a3257425d57ced7d Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 11 May 2025 13:42:05 +0200 Subject: [PATCH 4/4] Apply title and author also to sample projects --- novelwriter/core/coretools.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/novelwriter/core/coretools.py b/novelwriter/core/coretools.py index 4c8d6004..a4b2a0b1 100644 --- a/novelwriter/core/coretools.py +++ b/novelwriter/core/coretools.py @@ -388,7 +388,7 @@ class ProjectBuilder: if isinstance(path, str | Path): self._path = Path(path).resolve() if data.get("sample"): - return self._extractSampleProject(self._path) + return self._extractSampleProject(self._path, data) elif data.get("template"): return self._copyProject(self._path, data) else: @@ -562,11 +562,11 @@ class ProjectBuilder: return False # Open the copied project and update settings - self._resetProject(dstPath, data.get("name", ""), data.get("author", "")) + self._resetProject(dstPath, data) return True - def _extractSampleProject(self, path: Path) -> bool: + def _extractSampleProject(self, path: Path, data: dict) -> bool: """Make a copy of the sample project by extracting the sample.zip file to the new path. """ @@ -580,7 +580,7 @@ class ProjectBuilder: if (sample := CONFIG.assetPath("sample.zip")).is_file(): try: shutil.unpack_archive(sample, path) - self._resetProject(path) + self._resetProject(path, data) except Exception as exc: SHARED.error(self.tr("Failed to create a new example project."), exc=exc) return False @@ -594,14 +594,14 @@ class ProjectBuilder: return True - def _resetProject(self, path: Path, name: str = "", author: str = "") -> None: + def _resetProject(self, path: Path, data: dict) -> None: """Open a project and reset/update its settings.""" project = NWProject() project.openProject(path) project.data.setUuid("") # Creates a fresh uuid - if name: + if name := data.get("name", ""): project.data.setName(name) - if author: + if author := data.get("author", ""): project.data.setAuthor(author) project.data.setSpellCheck(True) project.data.setSpellLang(None)