diff --git a/nw/config.py b/nw/config.py index 6ab2e110..fa993523 100644 --- a/nw/config.py +++ b/nw/config.py @@ -92,8 +92,7 @@ class Config: # Backup self.backupPath = "" self.backupOnClose = False - self.askBeforeBackup = False - self.minBackupTime = 0 + self.askBeforeBackup = True # Path self.recentList = [""]*10 @@ -195,7 +194,6 @@ class Config: self.backupPath = self._parseLine(cnfParse, cnfSec, "backuppath", self.CNF_STR, self.backupPath) self.backupOnClose = self._parseLine(cnfParse, cnfSec, "backuponclose", self.CNF_BOOL, self.backupOnClose) self.askBeforeBackup = self._parseLine(cnfParse, cnfSec, "askbeforebackup", self.CNF_BOOL, self.askBeforeBackup) - self.minBackupTime = self._parseLine(cnfParse, cnfSec, "minbackuptime", self.CNF_INT, self.minBackupTime) ## Path cnfSec = "Path" @@ -259,7 +257,6 @@ class Config: cnfParse.set(cnfSec,"backuppath", str(self.backupPath)) cnfParse.set(cnfSec,"backuponclose", str(self.backupOnClose)) cnfParse.set(cnfSec,"askbeforebackup",str(self.askBeforeBackup)) - cnfParse.set(cnfSec,"minbackuptime", str(self.minBackupTime)) ## Path cnfSec = "Path" diff --git a/nw/gui/configeditor.py b/nw/gui/configeditor.py index ebf2855f..e6851b22 100644 --- a/nw/gui/configeditor.py +++ b/nw/gui/configeditor.py @@ -202,20 +202,20 @@ class GuiConfigEditGeneral(QWidget): else: self.projBackupClose.setCheckState(Qt.Unchecked) - self.projBackupTime = QSpinBox(self) - self.projBackupTime.setMinimum(0) - self.projBackupTime.setMaximum(1440) - self.projBackupTime.setSingleStep(10) - self.projBackupTime.setValue(self.mainConf.minBackupTime) + self.projBackupAsk = QCheckBox(self) + self.projBackupAsk.setToolTip("Ask before backup.") + if self.mainConf.askBeforeBackup: + self.projBackupAsk.setCheckState(Qt.Checked) + else: + self.projBackupAsk.setCheckState(Qt.Unchecked) - self.projBackupForm.addWidget(QLabel("Backup Folder"),0, 0) - self.projBackupForm.addWidget(self.projBackupPath, 0, 1, 1, 4) - self.projBackupForm.addWidget(self.projBackupGetPath, 0, 5) - self.projBackupForm.addWidget(QLabel("Run on Close"), 1, 0) - self.projBackupForm.addWidget(self.projBackupClose, 1, 1) - self.projBackupForm.addWidget(QLabel("At Most Every"),1, 2) - self.projBackupForm.addWidget(self.projBackupTime, 1, 3) - self.projBackupForm.addWidget(QLabel("minutes"), 1, 4, 1, 2) + self.projBackupForm.addWidget(QLabel("Backup Folder"), 0, 0) + self.projBackupForm.addWidget(self.projBackupPath, 0, 1, 1, 3) + self.projBackupForm.addWidget(self.projBackupGetPath, 0, 4) + self.projBackupForm.addWidget(QLabel("Run on Close"), 1, 0) + self.projBackupForm.addWidget(self.projBackupClose, 1, 1) + self.projBackupForm.addWidget(QLabel("Ask Before Backuo"), 1, 2) + self.projBackupForm.addWidget(self.projBackupAsk, 1, 3) # Assemble self.outerBox.addWidget(self.guiLook, 0, 0) @@ -233,26 +233,26 @@ class GuiConfigEditGeneral(QWidget): validEntries = True needsRestart = False - guiTheme = self.guiLookTheme.currentData() - guiSyntax = self.guiLookSyntax.currentData() - spellLanguage = self.spellLangList.currentData() - autoSaveDoc = self.autoSaveDoc.value() - autoSaveProj = self.autoSaveProj.value() - backupPath = self.projBackupPath.text() - backupOnClose = self.projBackupClose.isChecked() - minBackupTime = self.projBackupTime.value() + guiTheme = self.guiLookTheme.currentData() + guiSyntax = self.guiLookSyntax.currentData() + spellLanguage = self.spellLangList.currentData() + autoSaveDoc = self.autoSaveDoc.value() + autoSaveProj = self.autoSaveProj.value() + backupPath = self.projBackupPath.text() + backupOnClose = self.projBackupClose.isChecked() + askBeforeBackup = self.projBackupAsk.isChecked() # Check if restart is needed needsRestart |= self.mainConf.guiTheme != guiTheme - self.mainConf.guiTheme = guiTheme - self.mainConf.guiSyntax = guiSyntax - self.mainConf.spellLanguage = spellLanguage - self.mainConf.autoSaveDoc = autoSaveDoc - self.mainConf.autoSaveProj = autoSaveProj - self.mainConf.backupPath = backupPath - self.mainConf.backupOnClose = backupOnClose - self.mainConf.minBackupTime = minBackupTime + self.mainConf.guiTheme = guiTheme + self.mainConf.guiSyntax = guiSyntax + self.mainConf.spellLanguage = spellLanguage + self.mainConf.autoSaveDoc = autoSaveDoc + self.mainConf.autoSaveProj = autoSaveProj + self.mainConf.backupPath = backupPath + self.mainConf.backupOnClose = backupOnClose + self.mainConf.askBeforeBackup = askBeforeBackup self.mainConf.confChanged = True diff --git a/nw/gui/mainmenu.py b/nw/gui/mainmenu.py index 917af5f8..6fba5cfd 100644 --- a/nw/gui/mainmenu.py +++ b/nw/gui/mainmenu.py @@ -507,6 +507,12 @@ class GuiMainMenu(QMenuBar): menuItem.triggered.connect(self.theParent.rebuildIndex) self.toolsMenu.addAction(menuItem) + # Tools > Backup + menuItem = QAction(QIcon.fromTheme("drive-harddisk"), "Backup Project", self) + menuItem.setStatusTip("Backup Project") + menuItem.triggered.connect(self.theParent.backupProject) + self.toolsMenu.addAction(menuItem) + # Tools > Settings menuItem = QAction(QIcon.fromTheme("preferences-system"), "Preferences", self) menuItem.setStatusTip("Preferences") diff --git a/nw/gui/projecteditor.py b/nw/gui/projecteditor.py index ab15c148..88da6ca6 100644 --- a/nw/gui/projecteditor.py +++ b/nw/gui/projecteditor.py @@ -21,7 +21,7 @@ from PyQt5.QtSvg import QSvgWidget from PyQt5.QtWidgets import ( QDialog, QHBoxLayout, QVBoxLayout, QFormLayout, QLineEdit, QPlainTextEdit, QLabel, QWidget, QTabWidget, QDialogButtonBox, QListWidget, QListWidgetItem, QPushButton, - QColorDialog, QAbstractItemView, QTreeWidget, QTreeWidgetItem + QColorDialog, QAbstractItemView, QTreeWidget, QTreeWidgetItem, QCheckBox ) from nw.enum import nwAlert @@ -81,9 +81,11 @@ class GuiProjectEditor(QDialog): projName = self.tabMain.editName.text() bookTitle = self.tabMain.editTitle.text() bookAuthors = self.tabMain.editAuthors.toPlainText() + doBackup = self.tabMain.doBackup.isChecked() self.theProject.setProjectName(projName) self.theProject.setBookTitle(bookTitle) self.theProject.setBookAuthors(bookAuthors) + self.theProject.setProjBackup(doBackup) if self.tabStatus.colChanged: statusCol = self.tabStatus.getNewList() @@ -116,13 +118,19 @@ class GuiProjectEditMain(QWidget): self.theParent = theParent self.theProject = theProject self.mainForm = QFormLayout() + self.backupBox = QHBoxLayout() self.editName = QLineEdit() self.editTitle = QLineEdit() self.editAuthors = QPlainTextEdit() + self.doBackup = QCheckBox(self) - self.mainForm.addRow("Working Title", self.editName) - self.mainForm.addRow("Book Title", self.editTitle) - self.mainForm.addRow("Book Authors", self.editAuthors) + self.mainForm.addRow("Working Title", self.editName) + self.mainForm.addRow("Book Title", self.editTitle) + self.mainForm.addRow("Book Authors", self.editAuthors) + self.mainForm.addRow(self.backupBox) + self.backupBox.addStretch(1) + self.backupBox.addWidget(QLabel("Backup on Close")) + self.backupBox.addWidget(self.doBackup) self.editName.setText(self.theProject.projName) self.editTitle.setText(self.theProject.bookTitle) @@ -130,8 +138,13 @@ class GuiProjectEditMain(QWidget): for bookAuthor in self.theProject.bookAuthors: bookAuthors += bookAuthor+"\n" self.editAuthors.setPlainText(bookAuthors) + if self.theProject.doBackup: + self.doBackup.setCheckState(Qt.Checked) + else: + self.doBackup.setCheckState(Qt.Unchecked) self.setLayout(self.mainForm) + self.editAuthors.setMaximumHeight(120) return diff --git a/nw/gui/winmain.py b/nw/gui/winmain.py index 1132ba48..7b9bb03e 100644 --- a/nw/gui/winmain.py +++ b/nw/gui/winmain.py @@ -207,15 +207,28 @@ class GuiMain(QMainWindow): if msgRes != QMessageBox.Yes: return False - self.closeDocument() + if self.docEditor.docChanged: + self.saveDocument() + if self.theProject.projChanged: - saveOK = self.saveProject() - theBackup = NWBackup(self, self.theProject) - theBackup.zipIt() + saveOK = self.saveProject() + doBackup = False + if self.theProject.doBackup and self.mainConf.backupOnClose: + doBackup = True + if self.mainConf.showGUI and self.mainConf.askBeforeBackup: + msgBox = QMessageBox() + msgRes = msgBox.question( + self, "Backup Project", "Backup current project?" + ) + if msgRes != QMessageBox.Yes: + doBackup = False + if doBackup: + self.backupProject() else: saveOK = True if saveOK: + self.closeDocument() self.theProject.closeProject() self.theIndex.clearIndex() self.clearGUI() @@ -282,6 +295,11 @@ class GuiMain(QMainWindow): return True + def backupProject(self): + theBackup = NWBackup(self, self.theProject) + theBackup.zipIt() + return True + ## # Document Actions ## diff --git a/nw/project/project.py b/nw/project/project.py index 8cc6bf9b..bdc1b8b3 100644 --- a/nw/project/project.py +++ b/nw/project/project.py @@ -67,6 +67,7 @@ class NWProject(): self.lastViewed = None self.lastWCount = 0 self.currWCount = 0 + self.doBackup = True # Set Defaults self.clearProject() @@ -221,6 +222,8 @@ class NWProject(): elif xItem.tag == "author": logger.verbose("Author: '%s'" % xItem.text) self.bookAuthors.append(xItem.text) + elif xItem.tag == "backup": + self.doBackup = checkBool(xItem.text,False) elif xChild.tag == "settings": logger.debug("Found project settings") for xItem in xChild: @@ -295,6 +298,7 @@ class NWProject(): self._saveProjectValue(xProject,"name", self.projName, True) self._saveProjectValue(xProject,"title", self.bookTitle, True) self._saveProjectValue(xProject,"author",self.bookAuthors) + self._saveProjectValue(xProject,"backup",self.doBackup) # Save Project Settings xSettings = etree.SubElement(nwXML,"settings") @@ -375,6 +379,24 @@ class NWProject(): self.setProjectChanged(True) return True + def setProjBackup(self, doBackup): + self.doBackup = False + if doBackup: + if not path.isdir(self.mainConf.backupPath): + self.theParent.makeAlert( + "You must set a valid backup path in preferences
to use the automatic project backup feature.", + nwAlert.ERROR + ) + return False + if self.projName == "": + self.theParent.makeAlert( + "You must set a valid project name in project settings
to use the automatic project backup feature.", + nwAlert.ERROR + ) + return False + self.doBackup = True + return True + def setSpellCheck(self, theMode): if self.spellCheck != theMode: self.spellCheck = theMode diff --git a/sample/sampleNovel/nwProject.nwx b/sample/sampleNovel/nwProject.nwx index 0081d96a..d7d364cd 100644 --- a/sample/sampleNovel/nwProject.nwx +++ b/sample/sampleNovel/nwProject.nwx @@ -1,10 +1,11 @@ - + Sample Project Sample Project Jane Smith Jay Doh + False True @@ -80,7 +81,7 @@ 736 137 6 - 69 + 82 New File