Merge pull request #492 from vkbo/fixes

Action fixes for no project or document open
This commit is contained in:
Veronica K. Berglyd Olsen
2020-11-01 18:47:49 +01:00
committed by GitHub
5 changed files with 130 additions and 55 deletions
+4
View File
@@ -781,6 +781,10 @@ class NWProject():
def zipIt(self, doNotify): def zipIt(self, doNotify):
"""Create a zip file of the entire project. """Create a zip file of the entire project.
""" """
if not self.theParent.hasProject:
logger.error("No project open")
return False
logger.info("Backing up project") logger.info("Backing up project")
self.theParent.setStatus("Backing up project ...") self.theParent.setStatus("Backing up project ...")
+23 -12
View File
@@ -620,9 +620,10 @@ class GuiDocEditor(QTextEdit):
this class when calling these actions from other classes. this class when calling these actions from other classes.
""" """
logger.verbose("Requesting action: %s" % theAction.name) logger.verbose("Requesting action: %s" % theAction.name)
if not self.theParent.hasProject: if self.theHandle is None:
logger.error("No project open") logger.error("No document open")
return False return False
self._allowAutoReplace(False) self._allowAutoReplace(False)
if theAction == nwDocAction.UNDO: if theAction == nwDocAction.UNDO:
self.undo() self.undo()
@@ -678,7 +679,9 @@ class GuiDocEditor(QTextEdit):
logger.debug("Unknown or unsupported document action %s" % str(theAction)) logger.debug("Unknown or unsupported document action %s" % str(theAction))
self._allowAutoReplace(True) self._allowAutoReplace(True)
return False return False
self._allowAutoReplace(True) self._allowAutoReplace(True)
return True return True
def isEmpty(self): def isEmpty(self):
@@ -690,21 +693,29 @@ class GuiDocEditor(QTextEdit):
"""Tell the user where on the file system the file in the editor """Tell the user where on the file system the file in the editor
is saved. is saved.
""" """
if self.theHandle is not None: if self.theHandle is None:
msgBox = QMessageBox() logger.error("No document open")
msgBox.information(self, "File Location", ( return False
"File details for the currently open file<br>"
"Handle: {handle:s}<br>" msgBox = QMessageBox()
"Location: {fileLoc:s}" msgBox.information(self, "File Location", (
).format( "File details for the currently open file<br>"
handle = self.theHandle, "Handle: {handle:s}<br>"
fileLoc = str(self.nwDocument.getFileLocation()) "Location: {fileLoc:s}"
)) ).format(
handle = self.theHandle,
fileLoc = str(self.nwDocument.getFileLocation())
))
return return
def insertText(self, theInsert): def insertText(self, theInsert):
"""Insert a specific type of text at the cursor position. """Insert a specific type of text at the cursor position.
""" """
if self.theHandle is None:
logger.error("No document open")
return False
if isinstance(theInsert, str): if isinstance(theInsert, str):
theText = theInsert theText = theInsert
elif isinstance(theInsert, nwDocInsert): elif isinstance(theInsert, nwDocInsert):
+13
View File
@@ -163,6 +163,7 @@ class GuiProjectTree(QTreeWidget):
nHandle = None nHandle = None
if not self.theParent.hasProject: if not self.theParent.hasProject:
logger.error("No project open")
return False return False
# The item needs to be assigned an item class, so one must be # The item needs to be assigned an item class, so one must be
@@ -281,6 +282,10 @@ class GuiProjectTree(QTreeWidget):
"""Move an item up or down in the tree, but only if the treeView """Move an item up or down in the tree, but only if the treeView
has focus. This also applies when the menu is used. has focus. This also applies when the menu is used.
""" """
if not self.theParent.hasProject:
logger.error("No project open")
return False
hasFocus = qApp.focusWidget() == self or not self.mainConf.showGUI hasFocus = qApp.focusWidget() == self or not self.mainConf.showGUI
if hasFocus and self.theParent.hasProject: if hasFocus and self.theParent.hasProject:
@@ -364,6 +369,10 @@ class GuiProjectTree(QTreeWidget):
function only asks for confirmation once, and calls the regular function only asks for confirmation once, and calls the regular
deleteItem function for each document in the Trash folder. deleteItem function for each document in the Trash folder.
""" """
if not self.theParent.hasProject:
logger.error("No project open")
return False
trashHandle = self.theProject.projTree.trashRoot() trashHandle = self.theProject.projTree.trashRoot()
logger.debug("Emptying Trash folder") logger.debug("Emptying Trash folder")
@@ -409,6 +418,10 @@ class GuiProjectTree(QTreeWidget):
delete the files on disk. Folders are deleted if they're empty only, delete the files on disk. Folders are deleted if they're empty only,
and the deletion is always permanent. and the deletion is always permanent.
""" """
if not self.theParent.hasProject:
logger.error("No project open")
return False
if tHandle is None: if tHandle is None:
tHandle = self.getSelectedHandle() tHandle = self.getSelectedHandle()
+89 -43
View File
@@ -442,6 +442,7 @@ class GuiMain(QMainWindow):
"""Save the current project. """Save the current project.
""" """
if not self.hasProject: if not self.hasProject:
logger.error("No project open")
return False return False
# If the project is new, it may not have a path, so we need one # If the project is new, it may not have a path, so we need one
@@ -465,27 +466,33 @@ class GuiMain(QMainWindow):
def closeDocument(self): def closeDocument(self):
"""Close the document and clear the editor and title field. """Close the document and clear the editor and title field.
""" """
if self.hasProject: if not self.hasProject:
self.docEditor.saveCursorPosition() logger.error("No project open")
if self.docEditor.docChanged: return False
self.saveDocument()
self.docEditor.clearEditor() self.docEditor.saveCursorPosition()
if self.docEditor.docChanged:
self.saveDocument()
self.docEditor.clearEditor()
return True return True
def openDocument(self, tHandle, tLine=None, changeFocus=True, doScroll=False): def openDocument(self, tHandle, tLine=None, changeFocus=True, doScroll=False):
"""Open a specific document, optionally at a given line. """Open a specific document, optionally at a given line.
""" """
if self.hasProject: if not self.hasProject:
self.closeDocument() logger.error("No project open")
self.tabWidget.setCurrentWidget(self.splitDocs) return False
if self.docEditor.loadText(tHandle, tLine):
if changeFocus: self.closeDocument()
self.docEditor.setFocus() self.tabWidget.setCurrentWidget(self.splitDocs)
self.theProject.setLastEdited(tHandle) if self.docEditor.loadText(tHandle, tLine):
self.treeView.setSelectedHandle(tHandle, doScroll=doScroll) if changeFocus:
else: self.docEditor.setFocus()
return False self.theProject.setLastEdited(tHandle)
self.treeView.setSelectedHandle(tHandle, doScroll=doScroll)
else:
return False
return True return True
@@ -493,43 +500,54 @@ class GuiMain(QMainWindow):
"""Opens the next document in the project tree, following the """Opens the next document in the project tree, following the
document with the given handle. Stops when reaching the end. document with the given handle. Stops when reaching the end.
""" """
if self.hasProject: if not self.hasProject:
self.treeView.flushTreeOrder() logger.error("No project open")
nHandle = None # The next handle after tHandle return False
fHandle = None # The first file handle we encounter
foundIt = False # We've found tHandle, pick the next we see
for tItem in self.theProject.projTree:
if tItem is None:
continue
if tItem.itemType != nwItemType.FILE:
continue
if fHandle is None:
fHandle = tItem.itemHandle
if tItem.itemHandle == tHandle:
foundIt = True
elif foundIt:
nHandle = tItem.itemHandle
break
if nHandle is not None: self.treeView.flushTreeOrder()
self.openDocument(nHandle, tLine=0, doScroll=True) nHandle = None # The next handle after tHandle
return True fHandle = None # The first file handle we encounter
elif wrapAround: foundIt = False # We've found tHandle, pick the next we see
self.openDocument(fHandle, tLine=0, doScroll=True) for tItem in self.theProject.projTree:
return False if tItem is None:
continue
if tItem.itemType != nwItemType.FILE:
continue
if fHandle is None:
fHandle = tItem.itemHandle
if tItem.itemHandle == tHandle:
foundIt = True
elif foundIt:
nHandle = tItem.itemHandle
break
if nHandle is not None:
self.openDocument(nHandle, tLine=0, doScroll=True)
return True
elif wrapAround:
self.openDocument(fHandle, tLine=0, doScroll=True)
return False
return False return False
def saveDocument(self): def saveDocument(self):
"""Save the current documents. """Save the current documents.
""" """
if self.hasProject: if not self.hasProject:
self.docEditor.saveText() logger.error("No project open")
return False
self.docEditor.saveText()
return True return True
def viewDocument(self, tHandle=None, tAnchor=None): def viewDocument(self, tHandle=None, tAnchor=None):
"""Load a document for viewing in the view panel. """Load a document for viewing in the view panel.
""" """
if not self.hasProject:
logger.error("No project open")
return False
if tHandle is None: if tHandle is None:
logger.debug("Viewing document, but no handle provided") logger.debug("Viewing document, but no handle provided")
@@ -573,8 +591,11 @@ class GuiMain(QMainWindow):
"""Import the text contained in an out-of-project text file, and """Import the text contained in an out-of-project text file, and
insert the text into the currently open document. insert the text into the currently open document.
""" """
lastPath = self.mainConf.lastPath if not self.hasProject:
logger.error("No project open")
return False
lastPath = self.mainConf.lastPath
extFilter = [ extFilter = [
"Text files (*.txt)", "Text files (*.txt)",
"Markdown files (*.md)", "Markdown files (*.md)",
@@ -627,16 +648,26 @@ class GuiMain(QMainWindow):
def mergeDocuments(self): def mergeDocuments(self):
"""Merge multiple documents to one single new document. """Merge multiple documents to one single new document.
""" """
if not self.hasProject:
logger.error("No project open")
return False
dlgMerge = GuiDocMerge(self, self.theProject) dlgMerge = GuiDocMerge(self, self.theProject)
dlgMerge.exec_() dlgMerge.exec_()
return
return True
def splitDocument(self): def splitDocument(self):
"""Split a single document into multiple documents. """Split a single document into multiple documents.
""" """
if not self.hasProject:
logger.error("No project open")
return False
dlgSplit = GuiDocSplit(self, self.theProject) dlgSplit = GuiDocSplit(self, self.theProject)
dlgSplit.exec_() dlgSplit.exec_()
return
return True
def passDocumentAction(self, theAction): def passDocumentAction(self, theAction):
"""Pass on document action theAction to the document viewer if """Pass on document action theAction to the document viewer if
@@ -655,6 +686,10 @@ class GuiMain(QMainWindow):
def openSelectedItem(self): def openSelectedItem(self):
"""Open the selected documents. """Open the selected documents.
""" """
if not self.hasProject:
logger.error("No project open")
return False
tHandle = self.treeView.getSelectedHandle() tHandle = self.treeView.getSelectedHandle()
if tHandle is None: if tHandle is None:
logger.warning("No item selected") logger.warning("No item selected")
@@ -673,6 +708,10 @@ class GuiMain(QMainWindow):
def editItem(self, tHandle=None): def editItem(self, tHandle=None):
"""Open the edit item dialog. """Open the edit item dialog.
""" """
if not self.hasProject:
logger.error("No project open")
return False
if tHandle is None: if tHandle is None:
tHandle = self.treeView.getSelectedHandle() tHandle = self.treeView.getSelectedHandle()
if tHandle is None: if tHandle is None:
@@ -703,6 +742,7 @@ class GuiMain(QMainWindow):
"""Rebuild the entire index. """Rebuild the entire index.
""" """
if not self.hasProject: if not self.hasProject:
logger.error("No project open")
return False return False
logger.debug("Rebuilding index ...") logger.debug("Rebuilding index ...")
@@ -748,9 +788,14 @@ class GuiMain(QMainWindow):
def rebuildOutline(self): def rebuildOutline(self):
"""Force a rebuild of the Outline view. """Force a rebuild of the Outline view.
""" """
if not self.hasProject:
logger.error("No project open")
return False
logger.verbose("Forcing a rebuild of the Project Outline") logger.verbose("Forcing a rebuild of the Project Outline")
self.tabWidget.setCurrentWidget(self.splitOutline) self.tabWidget.setCurrentWidget(self.splitOutline)
self.projView.refreshTree(overRide=True) self.projView.refreshTree(overRide=True)
return True return True
## ##
@@ -1008,6 +1053,7 @@ class GuiMain(QMainWindow):
""" """
if self.docEditor.theHandle is None: if self.docEditor.theHandle is None:
logger.error("No document open, so not activating Focus Mode") logger.error("No document open, so not activating Focus Mode")
self.mainMenu.aFocusMode.setChecked(self.isFocusMode)
return False return False
self.isFocusMode = not self.isFocusMode self.isFocusMode = not self.isFocusMode
+1
View File
@@ -6,6 +6,7 @@ class DummyMain():
def __init__(self): def __init__(self):
self.mainConf = None self.mainConf = None
self.hasProject = True
self.statusBar = StatusBar() self.statusBar = StatusBar()
return return