From 5276ee81f19ec6842ce0eb5f3b370fe74c3f6e6e Mon Sep 17 00:00:00 2001 From: TheJackiMonster Date: Tue, 21 Mar 2023 22:36:36 +0100 Subject: [PATCH] Implement creation of new project via dialog Signed-off-by: TheJackiMonster --- manuskript/data/outline.py | 4 +++ manuskript/io/mskFile.py | 5 ++-- manuskript/ui/chooser/__init__.py | 43 ++++++++++++++++++++++++++--- manuskript/ui/chooser/fileFilter.py | 6 ++-- manuskript/ui/mainWindow.py | 2 +- manuskript/ui/startupWindow.py | 17 ++++++++++-- 6 files changed, 64 insertions(+), 13 deletions(-) diff --git a/manuskript/data/outline.py b/manuskript/data/outline.py index fc6b23bb..60dc8a69 100644 --- a/manuskript/data/outline.py +++ b/manuskript/data/outline.py @@ -317,6 +317,10 @@ class Outline(AbstractData): AbstractData.load(self) + if not os.path.isdir(self.dataPath): + self.complete(False) + return + names = os.listdir(self.dataPath) names.sort() diff --git a/manuskript/io/mskFile.py b/manuskript/io/mskFile.py index a6bbe9b7..ec0e40df 100644 --- a/manuskript/io/mskFile.py +++ b/manuskript/io/mskFile.py @@ -17,7 +17,7 @@ class MskFile(TextFile, ZipFile): try: _ZipFile(path) directoryPath = None - except BadZipFile: + except (BadZipFile, FileNotFoundError): directoryPath = os.path.splitext(path)[0] if not os.path.isdir(directoryPath): @@ -47,7 +47,8 @@ class MskFile(TextFile, ZipFile): if not os.path.isdir(self.directoryPath): os.mkdir(self.directoryPath) - ZipFile.load(self) + if os.path.exists(self.path): + ZipFile.load(self) self.zipFile = zipFile diff --git a/manuskript/ui/chooser/__init__.py b/manuskript/ui/chooser/__init__.py index 21e91343..8bdda90c 100644 --- a/manuskript/ui/chooser/__init__.py +++ b/manuskript/ui/chooser/__init__.py @@ -10,7 +10,7 @@ from gi.repository import GObject, Gtk from manuskript.ui.chooser.fileFilter import FileFilter -def openFileDialog(window, fileFilter: FileFilter = None) -> str | None: +def openFileDialog(window, fileFilter_: FileFilter = None, appendAllFilter: bool = True) -> str | None: dialog = Gtk.FileChooserDialog( "Please choose a file", window, @@ -19,9 +19,13 @@ def openFileDialog(window, fileFilter: FileFilter = None) -> str | None: Gtk.STOCK_OPEN, Gtk.ResponseType.OK) ) - if fileFilter is not None: - fileFilter.addToChooser(dialog) - FileFilter("All files", "*").addToChooser(dialog) + dialog.set_default_response(Gtk.ResponseType.OK) + + if fileFilter_ is not None: + fileFilter_.addToChooser(dialog) + + if appendAllFilter: + FileFilter("All files").addToChooser(dialog) response = dialog.run() result = None @@ -31,3 +35,34 @@ def openFileDialog(window, fileFilter: FileFilter = None) -> str | None: dialog.destroy() return result + + +def saveFileDialog(window, fileFilter_: FileFilter = None, appendAllFilter: bool = True) -> str | None: + dialog = Gtk.FileChooserDialog( + "Please choose a file", + window, + Gtk.FileChooserAction.SAVE, + (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_SAVE, Gtk.ResponseType.OK) + ) + + dialog.set_default_response(Gtk.ResponseType.OK) + + if fileFilter_ is not None: + fileFilter_.addToChooser(dialog) + + if appendAllFilter: + FileFilter("All files").addToChooser(dialog) + + response = dialog.run() + result = None + + if response == Gtk.ResponseType.OK: + result = dialog.get_filename() + + if ((fileFilter_ is not None) and (fileFilter_.name == dialog.get_filter().get_name()) and + (not result.endswith("." + fileFilter_.extension))): + result += "." + fileFilter_.extension + + dialog.destroy() + return result diff --git a/manuskript/ui/chooser/fileFilter.py b/manuskript/ui/chooser/fileFilter.py index a1b0cb73..192ee2ef 100644 --- a/manuskript/ui/chooser/fileFilter.py +++ b/manuskript/ui/chooser/fileFilter.py @@ -10,13 +10,13 @@ from gi.repository import GObject, Gtk class FileFilter: - def __init__(self, name: str, pattern: str): + def __init__(self, name: str, extension: str = ""): self.name = name - self.pattern = pattern + self.extension = extension def addToChooser(self, chooser: Gtk.FileChooser): fileFilter = Gtk.FileFilter() fileFilter.set_name(self.name) - fileFilter.add_pattern(self.pattern) + fileFilter.add_pattern("*.{}".format(self.extension) if len(self.extension) > 0 else "*") chooser.add_filter(fileFilter) diff --git a/manuskript/ui/mainWindow.py b/manuskript/ui/mainWindow.py index 82df0253..59e0942c 100644 --- a/manuskript/ui/mainWindow.py +++ b/manuskript/ui/mainWindow.py @@ -126,7 +126,7 @@ class MainWindow: self.startupWindow.show() def _openAction(self, menuItem: Gtk.MenuItem): - path = openFileDialog(self.window, FileFilter("Manuskript project", "*.msk")) + path = openFileDialog(self.window, FileFilter("Manuskript project", "msk")) if path is None: return diff --git a/manuskript/ui/startupWindow.py b/manuskript/ui/startupWindow.py index fe3b04a4..e185a06c 100644 --- a/manuskript/ui/startupWindow.py +++ b/manuskript/ui/startupWindow.py @@ -6,11 +6,11 @@ import gi gi.require_version("Gtk", "3.0") from gi.repository import GObject, Gtk, Handy -from manuskript.data import Template, TemplateKind +from manuskript.data import Project, Template, TemplateKind from manuskript.util import validInt, validString, parseFilenameFromURL from manuskript.ui.abstractDialog import AbstractDialog -from manuskript.ui.chooser import openFileDialog, FileFilter +from manuskript.ui.chooser import openFileDialog, saveFileDialog, FileFilter from manuskript.ui.startup import TemplateEntry from manuskript.ui.util import bindMenuItem @@ -116,6 +116,7 @@ class StartupWindow(AbstractDialog): self.createButton = builder.get_object("create_button") self.openButton.connect("clicked", self._openClicked) + self.createButton.connect("clicked", self._createClicked) def loadTemplate(self, template: Template): self.template = template @@ -172,7 +173,7 @@ class StartupWindow(AbstractDialog): self.loadTemplate(self.template) def openProject(self): - path = openFileDialog(self.window, FileFilter("Manuskript project", "*.msk")) + path = openFileDialog(self.window, FileFilter("Manuskript project", "msk")) if path is None: return @@ -181,6 +182,16 @@ class StartupWindow(AbstractDialog): def _openClicked(self, button: Gtk.Button): self.openProject() + def _createClicked(self, button: Gtk.Button): + path = saveFileDialog(self.window, FileFilter("Manuskript project", "msk"), appendAllFilter=False) + if path is None: + return + + project = Project(path) + project.save() + + self.mainWindow.openProject(path) + def _openAction(self, menuItem: Gtk.MenuItem): self.openProject()