diff --git a/nw/gui/doceditor.py b/nw/gui/doceditor.py index 175be69b..74554b4e 100644 --- a/nw/gui/doceditor.py +++ b/nw/gui/doceditor.py @@ -34,8 +34,9 @@ class GuiDocEditor(QTextEdit): logger.debug("Initialising DocEditor ...") # Class Variables - self.mainConf = nw.CONFIG - self.theParent = theParent + self.mainConf = nw.CONFIG + self.theParent = theParent + self.docChanged = False # Document Variables self.charCount = 0 @@ -92,11 +93,17 @@ class GuiDocEditor(QTextEdit): # Class Methods ## + def setDocumentChanged(self, bValue): + self.docChanged = bValue + self.theParent.statusBar.setDocumentStatus(self.docChanged) + return + def setText(self, theText): self.setPlainText(theText) self.lastEdit = time() self._runCounter() self.wcTimer.start() + self.setDocumentChanged(False) return True def getText(self): @@ -200,6 +207,7 @@ class GuiDocEditor(QTextEdit): def _docChange(self, thePos, charsRemoved, charsAdded): self.lastEdit = time() + self.setDocumentChanged(True) if not self.wcTimer.isActive(): self.wcTimer.start() if self.mainConf.doReplace and not self.hasSelection: diff --git a/nw/gui/doctree.py b/nw/gui/doctree.py index 1c60349c..c0fe0e6c 100644 --- a/nw/gui/doctree.py +++ b/nw/gui/doctree.py @@ -163,7 +163,7 @@ class GuiDocTree(QTreeWidget): pItem.insertChild(nIndex, cItem) self.clearSelection() cItem.setSelected(True) - self.theProject.projChanged = True + self.theProject.setProjectChanged(True) return def saveTreeOrder(self): @@ -209,7 +209,7 @@ class GuiDocTree(QTreeWidget): nwItemS.setParent(self.theProject.trashRoot) self.clearSelection() trItemP.setSelected(True) - self.theProject.projChanged = True + self.theProject.setProjectChanged(True) elif nwItemS.itemType == nwItemType.FOLDER: logger.debug("User requested folder %s deleted" % tHandle) @@ -222,7 +222,7 @@ class GuiDocTree(QTreeWidget): trItemP.takeChild(tIndex) self.clearSelection() trItemP.setSelected(True) - self.theProject.projChanged = True + self.theProject.setProjectChanged(True) else: self.theParent.makeAlert(["Cannot delete folder.","It is not empty."],2) return @@ -233,7 +233,7 @@ class GuiDocTree(QTreeWidget): if trItemS.childCount() == 0: self.takeTopLevelItem(tIndex) self.theParent.mainMenu.setAvailableRoot() - self.theProject.projChanged = True + self.theProject.setProjectChanged(True) else: self.theParent.makeAlert(["Cannot delete root folder.","It is not empty."],2) return @@ -391,7 +391,7 @@ class GuiDocTree(QTreeWidget): pHandle = trItemP.text(self.C_HANDLE) nwItemS.setParent(pHandle) self.setTreeItemValues(tHandle) - self.theProject.projChanged = True + self.theProject.setProjectChanged(True) return def _moveOrphanedItem(self, tHandle, dHandle): @@ -406,7 +406,7 @@ class GuiDocTree(QTreeWidget): pHandle = trItemP.text(self.C_HANDLE) nwItemS.setParent(pHandle) self.setTreeItemValues(tHandle) - self.theProject.projChanged = True + self.theProject.setProjectChanged(True) return ## diff --git a/nw/gui/statusbar.py b/nw/gui/statusbar.py index f6a2aba9..6b29aef7 100644 --- a/nw/gui/statusbar.py +++ b/nw/gui/statusbar.py @@ -15,7 +15,6 @@ import nw from os import path from PyQt5.QtWidgets import QStatusBar, QLabel, QFrame -from PyQt5.QtGui import QIcon logger = logging.getLogger(__name__) @@ -29,9 +28,20 @@ class GuiMainStatus(QStatusBar): self.mainConf = nw.CONFIG self.boxCounts = QLabel() + self.boxCounts.setToolTip("Character, Word, Paragraph Count") self.boxCounts.setFrameStyle(QFrame.Panel | QFrame.Sunken); self.addPermanentWidget(self.boxCounts) + self.projChanged = QLabel("P") + self.projChanged.setToolTip("Project Changes Saved") + self.projChanged.setFrameStyle(QFrame.Panel | QFrame.Sunken); + self.addPermanentWidget(self.projChanged) + + self.docChanged = QLabel("D") + self.docChanged.setToolTip("Document Changes Saved") + self.docChanged.setFrameStyle(QFrame.Panel | QFrame.Sunken); + self.addPermanentWidget(self.docChanged) + self.boxDocHandle = QLabel() self.boxDocHandle.setFrameStyle(QFrame.Panel | QFrame.Sunken); if self.mainConf.debugGUI: @@ -41,6 +51,8 @@ class GuiMainStatus(QStatusBar): self.setCounts(0,0,0) self.setDocHandleCount(None) + self.setProjectStatus(None) + self.setDocumentStatus(None) self.setSizeGripEnabled(True) @@ -50,6 +62,28 @@ class GuiMainStatus(QStatusBar): self.showMessage(theMessage, int(timeOut*1000)) return + def setProjectStatus(self, isChanged): + if isChanged is None: + self.projChanged.setStyleSheet("QLabel {background-color: rgba(120,120,120,1.0);}") + elif isChanged == True: + self.projChanged.setStyleSheet("QLabel {background-color: rgba(120,120,40,1.0);}") + elif isChanged == False: + self.projChanged.setStyleSheet("QLabel {background-color: rgba(40,120,0,1.0);}") + else: + self.projChanged.setStyleSheet("QLabel {background-color: rgba(120,120,120,1.0);}") + return + + def setDocumentStatus(self, isChanged): + if isChanged is None: + self.docChanged.setStyleSheet("QLabel {background-color: rgba(120,120,120,1.0);}") + elif isChanged == True: + self.docChanged.setStyleSheet("QLabel {background-color: rgba(120,120,40,1.0);}") + elif isChanged == False: + self.docChanged.setStyleSheet("QLabel {background-color: rgba(40,120,0,1.0);}") + else: + self.docChanged.setStyleSheet("QLabel {background-color: rgba(120,120,120,1.0);}") + return + def setCounts(self, cC, wC, pC): self.boxCounts.setText("C: {:n}  W: {:n}  P: {:n}".format(cC,wC,pC)) return diff --git a/nw/gui/winmain.py b/nw/gui/winmain.py index 4b67339e..5467c0b4 100644 --- a/nw/gui/winmain.py +++ b/nw/gui/winmain.py @@ -186,7 +186,7 @@ class GuiMain(QMainWindow): self.theDocument.theItem.setWordCount(self.docEditor.wordCount) self.theDocument.theItem.setParaCount(self.docEditor.paraCount) self.theDocument.saveDocument(docHtml) - self.docEditor.theDoc.setModified(False) + self.docEditor.setDocumentChanged(False) return ## @@ -311,7 +311,7 @@ class GuiMain(QMainWindow): return False if self.theDocument.theItem is None: return False - if not self.docEditor.theDoc.isModified(): + if not self.docEditor.docChanged: return False return True diff --git a/nw/project/project.py b/nw/project/project.py index 79b22a05..1ba4685a 100644 --- a/nw/project/project.py +++ b/nw/project/project.py @@ -33,7 +33,7 @@ class NWProject(): # Internal self.mainConf = nw.CONFIG self.theParent = theParent - self.projChanged = False + self.projChanged = None # Project Settings self.projTree = None @@ -112,7 +112,7 @@ class NWProject(): def clearProject(self): - self.projChanged = False + self.projChanged = None # Project Settings self.projTree = {} @@ -200,7 +200,7 @@ class NWProject(): self.theParent.statusBar.setStatus("Opened Project: %s" % self.projName) self._scanProjectFolder() - self.projChanged = False + self.setProjectChanged(False) return True @@ -259,7 +259,7 @@ class NWProject(): self.mainConf.setRecent(self.projPath) self.theParent.statusBar.setStatus("Saved Project: %s" % self.projName) - self.projChanged = False + self.setProjectChanged(False) return True @@ -269,17 +269,17 @@ class NWProject(): def setProjectPath(self, projPath): self.projPath = projPath - self.projChanged = True + self.setProjectChanged(True) return True def setProjectName(self, projName): self.projName = projName.strip() - self.projChanged = True + self.setProjectChanged(True) return True def setBookTitle(self, bookTitle): self.bookTitle = bookTitle.strip() - self.projChanged = True + self.setProjectChanged(True) return True def setBookAuthors(self, bookAuthors): @@ -289,16 +289,21 @@ class NWProject(): if bookAuthor == "": continue self.bookAuthors.append(bookAuthor) - self.projChanged = True + self.setProjectChanged(True) return True def setTreeOrder(self, newOrder): if len(self.treeOrder) != len(newOrder): logger.warning("Size of new and old tree order does not match") self.treeOrder = newOrder - self.projChanged = True + self.setProjectChanged(True) return True + def setProjectChanged(self, bValue): + self.projChanged = bValue + self.theParent.statusBar.setProjectStatus(self.projChanged) + return + ## # Get Functions ## @@ -402,7 +407,7 @@ class NWProject(): else: logger.error("Only one trash folder allowed") - self.projChanged = True + self.setProjectChanged(True) return