Merge pull request #492 from vkbo/fixes
Action fixes for no project or document open
This commit is contained in:
@@ -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
@@ -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):
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user