diff --git a/novelwriter/core/coretools.py b/novelwriter/core/coretools.py index 92226df4..f4d3d54b 100644 --- a/novelwriter/core/coretools.py +++ b/novelwriter/core/coretools.py @@ -333,7 +333,8 @@ class ProjectBuilder: self._path = Path(path).resolve() if data.get("sample", False): return self._extractSampleProject(self._path) - elif data.get("template"): + elif data.get("template"): # pragma: no cover + # Not implemented yet return True else: return self._buildAndPopulate(self._path, data) diff --git a/novelwriter/shared.py b/novelwriter/shared.py index 3afe10b0..df8ca498 100644 --- a/novelwriter/shared.py +++ b/novelwriter/shared.py @@ -216,16 +216,17 @@ class SharedData(QObject): QThreadPool.globalInstance().start(runnable, priority=priority) return - def getProjectPath(self, parent: QWidget, allowZip: bool = False) -> Path | None: + def getProjectPath(self, parent: QWidget, path: str | Path | None = None, + allowZip: bool = False) -> Path | None: """Open the file dialog and select a novelWriter project file.""" - ext = [] - ext.append(self.tr("novelWriter Project File ({0})").format(nwFiles.PROJ_FILE)) + ext = [ + self.tr("novelWriter Project File ({0})").format(nwFiles.PROJ_FILE), + self.tr("All files ({0})").format("*"), + ] if allowZip: - ext.append(self.tr("Zip Archives ({0})").format("*.zip")) - ext.append(self.tr("All files ({0})").format("*")) - + ext.insert(1, self.tr("Zip Archives ({0})").format("*.zip")) projFile, _ = QFileDialog.getOpenFileName( - parent, self.tr("Open Project"), "", filter=";;".join(ext) + parent, self.tr("Open Project"), str(path or ""), filter=";;".join(ext) ) return Path(projFile) if projFile else None diff --git a/novelwriter/tools/welcome.py b/novelwriter/tools/welcome.py index 44235f9e..89c803e2 100644 --- a/novelwriter/tools/welcome.py +++ b/novelwriter/tools/welcome.py @@ -189,7 +189,8 @@ class GuiWelcome(QDialog): @pyqtSlot() def _browseForProject(self) -> None: """Browse for a project to open.""" - if path := SHARED.getProjectPath(self, allowZip=False): + if path := SHARED.getProjectPath(self, path=CONFIG.lastPath(), allowZip=False): + CONFIG.setLastPath(path) self._openProjectPath(path) return diff --git a/tests/test_base/test_base_shared.py b/tests/test_base/test_base_shared.py index 0f105284..8b67844e 100644 --- a/tests/test_base/test_base_shared.py +++ b/tests/test_base/test_base_shared.py @@ -25,7 +25,7 @@ import pytest from tools import buildTestProject from mocked import MockGuiMain, MockTheme -from PyQt5.QtWidgets import QMessageBox +from PyQt5.QtWidgets import QFileDialog, QMessageBox, QWidget from novelwriter.shared import SharedData from novelwriter.core.project import NWProject @@ -66,7 +66,7 @@ def testBaseSharedData_Init(): @pytest.mark.base -def testBaseSharedData_Projects(fncPath, caplog): +def testBaseSharedData_Projects(monkeypatch, caplog, fncPath): """Test SharedData handling of projects.""" project = NWProject() buildTestProject(project, fncPath) @@ -118,6 +118,11 @@ def testBaseSharedData_Projects(fncPath, caplog): assert shared.hasProject is False assert isinstance(shared.projectLock, list) + # Test browsing for projects + with monkeypatch.context() as mp: + mp.setattr(QFileDialog, "getOpenFileName", lambda *a, **k: (a[2], "")) + assert shared.getProjectPath(QWidget(), fncPath, allowZip=True) == fncPath + # END Test testBaseSharedData_Projects diff --git a/tests/test_tools/test_tools_welcome.py b/tests/test_tools/test_tools_welcome.py index 27c326fe..518a7104 100644 --- a/tests/test_tools/test_tools_welcome.py +++ b/tests/test_tools/test_tools_welcome.py @@ -30,8 +30,8 @@ from PyQt5.QtCore import QPoint, Qt from PyQt5.QtWidgets import QAction, QFileDialog, QMenu from novelwriter import CONFIG, SHARED -from novelwriter.constants import nwFiles from novelwriter.enum import nwItemClass +from novelwriter.constants import nwFiles from novelwriter.tools.welcome import GuiWelcome