diff --git a/nw/gui/dialogs/docmerge.py b/nw/gui/dialogs/docmerge.py index 2b46eba5..ba3f8d61 100644 --- a/nw/gui/dialogs/docmerge.py +++ b/nw/gui/dialogs/docmerge.py @@ -46,7 +46,7 @@ class GuiDocMerge(QDialog): self.outerBox.addLayout(self.innerBox) self.doMergeForm = QGridLayout() - self.doMergeForm.setContentsMargins(10,5,0,10) + self.doMergeForm.setContentsMargins(0,0,0,0) self.listBox = QListWidget() self.listBox.setDragDropMode(QAbstractItemView.InternalMove) diff --git a/nw/gui/dialogs/docsplit.py b/nw/gui/dialogs/docsplit.py index 739bb14e..817a3284 100644 --- a/nw/gui/dialogs/docsplit.py +++ b/nw/gui/dialogs/docsplit.py @@ -46,16 +46,16 @@ class GuiDocSplit(QDialog): self.outerBox.addLayout(self.innerBox) self.doMergeForm = QGridLayout() - self.doMergeForm.setContentsMargins(10,5,0,10) + self.doMergeForm.setContentsMargins(0,0,0,0) self.listBox = QListWidget() self.listBox.setDragDropMode(QAbstractItemView.NoDragDrop) self.splitLevel = QComboBox(self) - self.splitLevel.addItem("Split on Title (Level 1)", 1) - self.splitLevel.addItem("Split on Chapter (Level 2)", 2) - self.splitLevel.addItem("Split on Scene (Level 3)", 3) - self.splitLevel.addItem("Split on Section (Level 4)", 4) + self.splitLevel.addItem("Split on Header Level 1 (Title)", 1) + self.splitLevel.addItem("Split up to Header Level 2 (Chapter)", 2) + self.splitLevel.addItem("Split up to Header Level 3 (Scene)", 3) + self.splitLevel.addItem("Split up to Header Level 4 (Section)", 4) self.splitLevel.setCurrentIndex(2) self.splitLevel.currentIndexChanged.connect(self._populateList) diff --git a/nw/gui/elements/doctree.py b/nw/gui/elements/doctree.py index 5ade6c5b..ae7aef17 100644 --- a/nw/gui/elements/doctree.py +++ b/nw/gui/elements/doctree.py @@ -246,7 +246,44 @@ class GuiDocTree(QTreeWidget): ] return retVals - def deleteItem(self, tHandle=None): + def emptyTrash(self): + """Permanently delete all documents in the Trash folder. This + function only asks for confirmation once, and calls the regular + deleteItem function for each document in the Trash folder. + """ + + logger.debug("Emptying Trash folder") + if self.theProject.trashRoot is None: + self.makeAlert("There is no Trash folder.", nwAlert.INFO) + return False + + theTrash = self.getTreeFromHandle(self.theProject.trashRoot) + if self.theProject.trashRoot in theTrash: + theTrash.remove(self.theProject.trashRoot) + + nTrash = len(theTrash) + if nTrash == 0: + self.makeAlert("The Trash folder is empty.", nwAlert.INFO) + return False + + msgBox = QMessageBox() + msgRes = msgBox.question( + self, "Empty Trash", "Permanently delete %d file%s from Trash?" % ( + nTrash, "s"*int(nTrash > 1) + ) + ) + if msgRes != QMessageBox.Yes: + return False + + logger.verbose("Deleting %d files from Trash" % nTrash) + for tHandle in self.getTreeFromHandle(self.theProject.trashRoot): + if tHandle == self.theProject.trashRoot: + continue + self.deleteItem(tHandle, True) + + return True + + def deleteItem(self, tHandle=None, alreadyAsked=False): """Delete items from the tree. Note that this does not delete the item from the item tree in the project object. However, since this is only meta data, there isn't really a need to do @@ -280,7 +317,7 @@ class GuiDocTree(QTreeWidget): # user if they want to permanently delete the file. doPermanent = False - if self.mainConf.showGUI: + if self.mainConf.showGUI and not alreadyAsked: msgBox = QMessageBox() msgRes = msgBox.question( self, "Delete File", "Permanently delete file '%s'?" % nwItemS.itemName @@ -576,16 +613,22 @@ class GuiDocTree(QTreeWidget): """ sHandle = self.getSelectedHandle() if sHandle is None: + logger.error("No handle selected") return - dIndex = self.indexAt(theEvent.pos()) + dIndex = self.indexAt(theEvent.pos()) if not dIndex.isValid(): + logger.error("Invalid drop index") return dItem = self.itemFromIndex(dIndex) dHandle = dItem.text(self.C_HANDLE) snItem = self.theProject.getItem(sHandle) dnItem = self.theProject.getItem(dHandle) + if dnItem is None: + self.makeAlert("The item cannot be moved to that location.", nwAlert.ERROR) + return + isSame = snItem.itemClass == dnItem.itemClass isNone = snItem.itemClass == nwItemClass.NO_CLASS isNote = snItem.itemLayout == nwItemLayout.NOTE diff --git a/nw/gui/mainmenu.py b/nw/gui/mainmenu.py index ba75e779..b515576a 100644 --- a/nw/gui/mainmenu.py +++ b/nw/gui/mainmenu.py @@ -281,6 +281,12 @@ class GuiMainMenu(QMenuBar): self.aDeleteItem.triggered.connect(lambda : self.theParent.treeView.deleteItem(None)) self.projMenu.addAction(self.aDeleteItem) + # Project > Empty Trash + self.aEmptyTrash = QAction("Empty Trash", self) + self.aEmptyTrash.setStatusTip("Permanently delete all files in the Trash folder") + self.aEmptyTrash.triggered.connect(self.theParent.treeView.emptyTrash) + self.projMenu.addAction(self.aEmptyTrash) + # Project > Separator self.projMenu.addSeparator()