class GuiItemEditor(QDialog): def __init__(self, theParent, theProject, tHandle): QDialog.__init__(self, theParent) logger.debug("Initialising GuiItemEditor ...") self.setObjectName("GuiItemEditor") self.mainConf = nw.CONFIG self.theProject = theProject self.theParent = theParent ## # Build GUI ## self.theItem = self.theProject.projTree[tHandle] if self.theItem is None: self._doClose() self.setWindowTitle("Item Settings") mVd = self.mainConf.pxInt(220) mSp = self.mainConf.pxInt(16) vSp = self.mainConf.pxInt(4) # Item Label self.editName = QLineEdit() self.editName.setMinimumWidth(mVd) self.editName.setMaxLength(200) # Item Status self.editStatus = QComboBox() self.editStatus.setMinimumWidth(mVd) if self.theItem.itemClass in nwLists.CLS_NOVEL: for sLabel, _, _ in self.theProject.statusItems: self.editStatus.addItem(self.theParent.statusIcons[sLabel], sLabel, sLabel) else: for sLabel, _, _ in self.theProject.importItems: self.editStatus.addItem(self.theParent.importIcons[sLabel], sLabel, sLabel) # Item Layout self.editLayout = QComboBox() self.editLayout.setMinimumWidth(mVd) validLayouts = [] if self.theItem.itemType == nwItemType.FILE: if self.theItem.itemClass in nwLists.CLS_NOVEL: validLayouts.append(nwItemLayout.TITLE) validLayouts.append(nwItemLayout.BOOK) validLayouts.append(nwItemLayout.PAGE) validLayouts.append(nwItemLayout.PARTITION) validLayouts.append(nwItemLayout.UNNUMBERED) validLayouts.append(nwItemLayout.CHAPTER) validLayouts.append(nwItemLayout.SCENE) validLayouts.append(nwItemLayout.NOTE) else: validLayouts.append(nwItemLayout.NO_LAYOUT) self.editLayout.setEnabled(False) for itemLayout in nwItemLayout: if itemLayout in validLayouts: self.editLayout.addItem(nwLabels.LAYOUT_NAME[itemLayout], itemLayout) # Export Switch self.textExport = QLabel("Include when building project") self.editExport = QSwitch() if self.theItem.itemType == nwItemType.FILE: self.editExport.setEnabled(True) self.editExport.setChecked(self.theItem.isExported) else: self.editExport.setEnabled(False) self.editExport.setChecked(False) # Buttons self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.buttonBox.accepted.connect(self._doSave) self.buttonBox.rejected.connect(self._doClose) # Set Current Values self.editName.setText(self.theItem.itemName) self.editName.selectAll() statusIdx = self.editStatus.findData(self.theItem.itemStatus) if statusIdx != -1: self.editStatus.setCurrentIndex(statusIdx) layoutIdx = self.editLayout.findData(self.theItem.itemLayout) if layoutIdx != -1: self.editLayout.setCurrentIndex(layoutIdx) ## # Assemble ## self.mainForm = QGridLayout() self.mainForm.setVerticalSpacing(vSp) self.mainForm.setHorizontalSpacing(mSp) self.mainForm.addWidget(QLabel("Label"), 0, 0, 1, 1) self.mainForm.addWidget(self.editName, 0, 1, 1, 2) self.mainForm.addWidget(QLabel("Status"), 1, 0, 1, 1) self.mainForm.addWidget(self.editStatus, 1, 1, 1, 2) self.mainForm.addWidget(QLabel("Layout"), 2, 0, 1, 1) self.mainForm.addWidget(self.editLayout, 2, 1, 1, 2) self.mainForm.addWidget(self.textExport, 3, 0, 1, 2) self.mainForm.addWidget(self.editExport, 3, 2, 1, 1) self.mainForm.setColumnStretch(0, 0) self.mainForm.setColumnStretch(1, 1) self.mainForm.setColumnStretch(2, 0) self.outerBox = QVBoxLayout() self.outerBox.setSpacing(mSp) self.outerBox.addLayout(self.mainForm) self.outerBox.addStretch(1) self.outerBox.addWidget(self.buttonBox) self.setLayout(self.outerBox) self.rejected.connect(self._doClose) logger.debug("GuiItemEditor initialisation complete") return ## # Slots ## @pyqtSlot() def _doSave(self): """Save the setting to the item. """ logger.verbose("ItemEditor save button clicked") itemName = self.editName.text() itemStatus = self.editStatus.currentData() itemLayout = self.editLayout.currentData() isExported = self.editExport.isChecked() self.theItem.setName(itemName) self.theItem.setStatus(itemStatus) self.theItem.setLayout(itemLayout) self.theItem.setExported(isExported) self.theProject.setProjectChanged(True) self.accept() self.close() return @pyqtSlot() def _doClose(self): """Close the dialog without saving the settings. """ logger.verbose("ItemEditor cancel button clicked") self.close() return
class GuiConfigEditAutoReplaceTab(QWidget): def __init__(self, theParent): QWidget.__init__(self, theParent) self.mainConf = nw.CONFIG self.theParent = theParent self.theTheme = theParent.theTheme # The Form self.mainForm = QConfigLayout() self.mainForm.setHelpTextStyle(self.theTheme.helpText) self.setLayout(self.mainForm) # Automatic Features # ================== self.mainForm.addGroupLabel("Automatic Features") ## Auto-Select Word Under Cursor self.autoSelect = QSwitch() self.autoSelect.setChecked(self.mainConf.autoSelect) self.mainForm.addRow( "Auto-select word under cursor", self.autoSelect, "Apply formatting to word under cursor if no selection is made.") ## Auto-Replace as You Type Main Switch self.autoReplaceMain = QSwitch() self.autoReplaceMain.setChecked(self.mainConf.doReplace) self.autoReplaceMain.toggled.connect(self._toggleAutoReplaceMain) self.mainForm.addRow( "Auto-replace text as you type", self.autoReplaceMain, "Allow the editor to replace symbols as you type.") # Auto-Replace # ============ self.mainForm.addGroupLabel("Replace as You Type") ## Auto-Replace Single Quotes self.autoReplaceSQ = QSwitch() self.autoReplaceSQ.setChecked(self.mainConf.doReplaceSQuote) self.autoReplaceSQ.setEnabled(self.mainConf.doReplace) self.mainForm.addRow( "Auto-replace single quotes", self.autoReplaceSQ, "Try to guess which is an opening or a closing single quote.") ## Auto-Replace Double Quotes self.autoReplaceDQ = QSwitch() self.autoReplaceDQ.setChecked(self.mainConf.doReplaceDQuote) self.autoReplaceDQ.setEnabled(self.mainConf.doReplace) self.mainForm.addRow( "Auto-replace double quotes", self.autoReplaceDQ, "Try to guess which is an opening or a closing double quote.") ## Auto-Replace Hyphens self.autoReplaceDash = QSwitch() self.autoReplaceDash.setChecked(self.mainConf.doReplaceDash) self.autoReplaceDash.setEnabled(self.mainConf.doReplace) self.mainForm.addRow( "Auto-replace dashes", self.autoReplaceDash, "Double and triple hyphens become short and long dashes.") ## Auto-Replace Dots self.autoReplaceDots = QSwitch() self.autoReplaceDots.setChecked(self.mainConf.doReplaceDots) self.autoReplaceDots.setEnabled(self.mainConf.doReplace) self.mainForm.addRow("Auto-replace dots", self.autoReplaceDots, "Three consecutive dots becomes ellipsis.") # Quotation Style # =============== self.mainForm.addGroupLabel("Quotation Style") qWidth = self.mainConf.pxInt(40) bWidth = int(2.5 * self.theTheme.getTextWidth("...")) self.quoteSym = {} ## Single Quote Style self.quoteSym["SO"] = QLineEdit() self.quoteSym["SO"].setMaxLength(1) self.quoteSym["SO"].setReadOnly(True) self.quoteSym["SO"].setFixedWidth(qWidth) self.quoteSym["SO"].setAlignment(Qt.AlignCenter) self.quoteSym["SO"].setText(self.mainConf.fmtSingleQuotes[0]) self.btnSingleStyleO = QPushButton("...") self.btnSingleStyleO.setMaximumWidth(bWidth) self.btnSingleStyleO.clicked.connect(lambda: self._getQuote("SO")) self.mainForm.addRow("Single quote open style", self.quoteSym["SO"], "The symbol to use for a leading single quote.", theButton=self.btnSingleStyleO) self.quoteSym["SC"] = QLineEdit() self.quoteSym["SC"].setMaxLength(1) self.quoteSym["SC"].setReadOnly(True) self.quoteSym["SC"].setFixedWidth(qWidth) self.quoteSym["SC"].setAlignment(Qt.AlignCenter) self.quoteSym["SC"].setText(self.mainConf.fmtSingleQuotes[1]) self.btnSingleStyleC = QPushButton("...") self.btnSingleStyleC.setMaximumWidth(bWidth) self.btnSingleStyleC.clicked.connect(lambda: self._getQuote("SC")) self.mainForm.addRow("Single quote close style", self.quoteSym["SC"], "The symbol to use for a trailing single quote.", theButton=self.btnSingleStyleC) ## Double Quote Style self.quoteSym["DO"] = QLineEdit() self.quoteSym["DO"].setMaxLength(1) self.quoteSym["DO"].setReadOnly(True) self.quoteSym["DO"].setFixedWidth(qWidth) self.quoteSym["DO"].setAlignment(Qt.AlignCenter) self.quoteSym["DO"].setText(self.mainConf.fmtDoubleQuotes[0]) self.btnDoubleStyleO = QPushButton("...") self.btnDoubleStyleO.setMaximumWidth(bWidth) self.btnDoubleStyleO.clicked.connect(lambda: self._getQuote("DO")) self.mainForm.addRow("Double quote open style", self.quoteSym["DO"], "The symbol to use for a leading double quote.", theButton=self.btnDoubleStyleO) self.quoteSym["DC"] = QLineEdit() self.quoteSym["DC"].setMaxLength(1) self.quoteSym["DC"].setReadOnly(True) self.quoteSym["DC"].setFixedWidth(qWidth) self.quoteSym["DC"].setAlignment(Qt.AlignCenter) self.quoteSym["DC"].setText(self.mainConf.fmtDoubleQuotes[1]) self.btnDoubleStyleC = QPushButton("...") self.btnDoubleStyleC.setMaximumWidth(bWidth) self.btnDoubleStyleC.clicked.connect(lambda: self._getQuote("DC")) self.mainForm.addRow("Double quote close style", self.quoteSym["DC"], "The symbol to use for a trailing double quote.", theButton=self.btnDoubleStyleC) return def saveValues(self): """Save the values set for this tab. """ validEntries = True needsRestart = False autoSelect = self.autoSelect.isChecked() doReplace = self.autoReplaceMain.isChecked() doReplaceSQuote = self.autoReplaceSQ.isChecked() doReplaceDQuote = self.autoReplaceDQ.isChecked() doReplaceDash = self.autoReplaceDash.isChecked() doReplaceDots = self.autoReplaceDots.isChecked() self.mainConf.autoSelect = autoSelect self.mainConf.doReplace = doReplace self.mainConf.doReplaceSQuote = doReplaceSQuote self.mainConf.doReplaceDQuote = doReplaceDQuote self.mainConf.doReplaceDash = doReplaceDash self.mainConf.doReplaceDots = doReplaceDots fmtSingleQuotesO = self.quoteSym["SO"].text() fmtSingleQuotesC = self.quoteSym["SC"].text() fmtDoubleQuotesO = self.quoteSym["DO"].text() fmtDoubleQuotesC = self.quoteSym["DC"].text() self.mainConf.fmtSingleQuotes[0] = fmtSingleQuotesO self.mainConf.fmtSingleQuotes[1] = fmtSingleQuotesC self.mainConf.fmtDoubleQuotes[0] = fmtDoubleQuotesO self.mainConf.fmtDoubleQuotes[1] = fmtDoubleQuotesC self.mainConf.confChanged = True return validEntries, needsRestart ## # Slots ## def _toggleAutoReplaceMain(self, theState): """Enables or disables switches controlled by the main auto replace switch. """ self.autoReplaceSQ.setEnabled(theState) self.autoReplaceDQ.setEnabled(theState) self.autoReplaceDash.setEnabled(theState) self.autoReplaceDots.setEnabled(theState) return def _getQuote(self, qType): """Dialog for single quote open. """ qtBox = QuotesDialog(self, currentQuote=self.quoteSym[qType].text()) if qtBox.exec_() == QDialog.Accepted: self.quoteSym[qType].setText(qtBox.selectedQuote) return
class GuiConfigEditProjectsTab(QWidget): def __init__(self, theParent): QWidget.__init__(self, theParent) self.mainConf = nw.CONFIG self.theParent = theParent self.theTheme = theParent.theTheme # The Form self.mainForm = QConfigLayout() self.mainForm.setHelpTextStyle(self.theTheme.helpText) self.setLayout(self.mainForm) # AutoSave Settings # ================= self.mainForm.addGroupLabel("Automatic Save") ## Document Save Timer self.autoSaveDoc = QSpinBox(self) self.autoSaveDoc.setMinimum(5) self.autoSaveDoc.setMaximum(600) self.autoSaveDoc.setSingleStep(1) self.autoSaveDoc.setValue(self.mainConf.autoSaveDoc) self.backupPathRow = self.mainForm.addRow( "Save document interval", self.autoSaveDoc, "How often the open document is automatically saved.", theUnit="seconds") ## Project Save Timer self.autoSaveProj = QSpinBox(self) self.autoSaveProj.setMinimum(5) self.autoSaveProj.setMaximum(600) self.autoSaveProj.setSingleStep(1) self.autoSaveProj.setValue(self.mainConf.autoSaveProj) self.backupPathRow = self.mainForm.addRow( "Save project interval", self.autoSaveProj, "How often the open project is automatically saved.", theUnit="seconds") # Backup Settings # =============== self.mainForm.addGroupLabel("Project Backup") ## Backup Path self.backupPath = self.mainConf.backupPath self.backupGetPath = QPushButton("Browse") self.backupGetPath.clicked.connect(self._backupFolder) self.backupPathRow = self.mainForm.addRow("Backup storage location", self.backupGetPath, "Path: %s" % self.backupPath) ## Run when closing self.backupOnClose = QSwitch() self.backupOnClose.setChecked(self.mainConf.backupOnClose) self.backupOnClose.toggled.connect(self._toggledBackupOnClose) self.mainForm.addRow( "Run backup when the project is closed", self.backupOnClose, "Can be overridden for individual projects in project settings.") ## Ask before backup ## Only enabled when "Run when closing" is checked self.askBeforeBackup = QSwitch() self.askBeforeBackup.setChecked(self.mainConf.askBeforeBackup) self.askBeforeBackup.setEnabled(self.mainConf.backupOnClose) self.mainForm.addRow( "Ask before running backup", self.askBeforeBackup, "Disabling this will cause backups to run in the background.") return def saveValues(self): """Save the values set for this tab. """ validEntries = True needsRestart = False autoSaveDoc = self.autoSaveDoc.value() autoSaveProj = self.autoSaveProj.value() backupPath = self.backupPath backupOnClose = self.backupOnClose.isChecked() askBeforeBackup = self.askBeforeBackup.isChecked() self.mainConf.autoSaveDoc = autoSaveDoc self.mainConf.autoSaveProj = autoSaveProj self.mainConf.backupPath = backupPath self.mainConf.backupOnClose = backupOnClose self.mainConf.askBeforeBackup = askBeforeBackup self.mainConf.confChanged = True return validEntries, needsRestart ## # Slots ## def _backupFolder(self): """Open a dialog to select the backup folder. """ currDir = self.backupPath if not os.path.isdir(currDir): currDir = "" dlgOpt = QFileDialog.Options() dlgOpt |= QFileDialog.ShowDirsOnly dlgOpt |= QFileDialog.DontUseNativeDialog newDir = QFileDialog.getExistingDirectory(self, "Backup Directory", currDir, options=dlgOpt) if newDir: self.backupPath = newDir self.mainForm.setHelpText(self.backupPathRow, "Path: %s" % self.backupPath) return True return False def _toggledBackupOnClose(self, theState): """Enable or disable switch that depends on the backup on close switch. """ self.askBeforeBackup.setEnabled(theState) return
class GuiPreferencesSyntax(QWidget): def __init__(self, theParent): QWidget.__init__(self, theParent) self.mainConf = nw.CONFIG self.theParent = theParent self.theTheme = theParent.theTheme # The Form self.mainForm = QConfigLayout() self.mainForm.setHelpTextStyle(self.theTheme.helpText) self.setLayout(self.mainForm) # Highlighting Theme # ================== self.mainForm.addGroupLabel("Highlighting Theme") self.guiSyntax = QComboBox() self.guiSyntax.setMinimumWidth(self.mainConf.pxInt(200)) self.theSyntaxes = self.theTheme.listSyntax() for syntaxFile, syntaxName in self.theSyntaxes: self.guiSyntax.addItem(syntaxName, syntaxFile) syntaxIdx = self.guiSyntax.findData(self.mainConf.guiSyntax) if syntaxIdx != -1: self.guiSyntax.setCurrentIndex(syntaxIdx) self.mainForm.addRow( "Highlighting theme", self.guiSyntax, "Colour theme to apply to the editor and viewer.") # Quotes & Dialogue # ================= self.mainForm.addGroupLabel("Quotes & Dialogue") self.highlightQuotes = QSwitch() self.highlightQuotes.setChecked(self.mainConf.highlightQuotes) self.highlightQuotes.toggled.connect(self._toggleHighlightQuotes) self.mainForm.addRow("Highlight text wrapped in quotes", self.highlightQuotes, "Applies to single, double and straight quotes.") self.allowOpenSQuote = QSwitch() self.allowOpenSQuote.setChecked(self.mainConf.allowOpenSQuote) self.mainForm.addRow( "Allow open-ended single quotes", self.allowOpenSQuote, "Highlight single-quoted line with no closing quote.") self.allowOpenDQuote = QSwitch() self.allowOpenDQuote.setChecked(self.mainConf.allowOpenDQuote) self.mainForm.addRow( "Allow open-ended double quotes", self.allowOpenDQuote, "Highlight double-quoted line with no closing quote.") # Text Emphasis # ============= self.mainForm.addGroupLabel("Text Emphasis") self.highlightEmph = QSwitch() self.highlightEmph.setChecked(self.mainConf.highlightEmph) self.mainForm.addRow( "Add highlight colour to emphasised text", self.highlightEmph, "Applies to emphasis (italic) and strong (bold).") return def saveValues(self): """Save the values set for this tab. """ # Highlighting Theme self.mainConf.guiSyntax = self.guiSyntax.currentData() # Quotes & Dialogue self.mainConf.highlightQuotes = self.highlightQuotes.isChecked() self.mainConf.allowOpenSQuote = self.allowOpenSQuote.isChecked() self.mainConf.allowOpenDQuote = self.allowOpenDQuote.isChecked() # Text Emphasis self.mainConf.highlightEmph = self.highlightEmph.isChecked() self.mainConf.confChanged = True return ## # Slots ## def _toggleHighlightQuotes(self, theState): """Enables or disables switches controlled by the highlight quotes switch. """ self.allowOpenSQuote.setEnabled(theState) self.allowOpenDQuote.setEnabled(theState) return
class GuiPreferencesAutomation(QWidget): def __init__(self, theParent): QWidget.__init__(self, theParent) self.mainConf = nw.CONFIG self.theParent = theParent self.theTheme = theParent.theTheme # The Form self.mainForm = QConfigLayout() self.mainForm.setHelpTextStyle(self.theTheme.helpText) self.setLayout(self.mainForm) # Automatic Features # ================== self.mainForm.addGroupLabel(self.tr("Automatic Features")) ## Auto-Select Word Under Cursor self.autoSelect = QSwitch() self.autoSelect.setChecked(self.mainConf.autoSelect) self.mainForm.addRow( self.tr("Auto-select word under cursor"), self.autoSelect, self. tr("Apply formatting to word under cursor if no selection is made." )) ## Auto-Replace as You Type Main Switch self.doReplace = QSwitch() self.doReplace.setChecked(self.mainConf.doReplace) self.doReplace.toggled.connect(self._toggleAutoReplaceMain) self.mainForm.addRow( self.tr("Auto-replace text as you type"), self.doReplace, self.tr("Allow the editor to replace symbols as you type.")) # Replace as You Type # =================== self.mainForm.addGroupLabel(self.tr("Replace as You Type")) ## Auto-Replace Single Quotes self.doReplaceSQuote = QSwitch() self.doReplaceSQuote.setChecked(self.mainConf.doReplaceSQuote) self.doReplaceSQuote.setEnabled(self.mainConf.doReplace) self.mainForm.addRow( self.tr("Auto-replace single quotes"), self.doReplaceSQuote, self.tr( "Try to guess which is an opening or a closing single quote.")) ## Auto-Replace Double Quotes self.doReplaceDQuote = QSwitch() self.doReplaceDQuote.setChecked(self.mainConf.doReplaceDQuote) self.doReplaceDQuote.setEnabled(self.mainConf.doReplace) self.mainForm.addRow( self.tr("Auto-replace double quotes"), self.doReplaceDQuote, self.tr( "Try to guess which is an opening or a closing double quote.")) ## Auto-Replace Hyphens self.doReplaceDash = QSwitch() self.doReplaceDash.setChecked(self.mainConf.doReplaceDash) self.doReplaceDash.setEnabled(self.mainConf.doReplace) self.mainForm.addRow( self.tr("Auto-replace dashes"), self.doReplaceDash, self.tr("Double and triple hyphens become short and long dashes.")) ## Auto-Replace Dots self.doReplaceDots = QSwitch() self.doReplaceDots.setChecked(self.mainConf.doReplaceDots) self.doReplaceDots.setEnabled(self.mainConf.doReplace) self.mainForm.addRow( self.tr("Auto-replace dots"), self.doReplaceDots, self.tr("Three consecutive dots become ellipsis.")) # Automatic Padding # ================= self.mainForm.addGroupLabel(self.tr("Automatic Padding")) ## Pad Before self.fmtPadBefore = QLineEdit() self.fmtPadBefore.setMaxLength(32) self.fmtPadBefore.setText(self.mainConf.fmtPadBefore) self.mainForm.addRow( self.tr("Insert non-breaking space before"), self.fmtPadBefore, self.tr("Automatically add space before any of these symbols."), ) ## Pad After self.fmtPadAfter = QLineEdit() self.fmtPadAfter.setMaxLength(32) self.fmtPadAfter.setText(self.mainConf.fmtPadAfter) self.mainForm.addRow( self.tr("Insert non-breaking space after"), self.fmtPadAfter, self.tr("Automatically add space after any of these symbols."), ) ## Use Thin Space self.fmtPadThin = QSwitch() self.fmtPadThin.setChecked(self.mainConf.fmtPadThin) self.fmtPadThin.setEnabled(self.mainConf.doReplace) self.mainForm.addRow( self.tr("Use thin space instead"), self.fmtPadThin, self.tr("Inserts a thin space instead of a regular space.")) return def saveValues(self): """Save the values set for this tab. """ # Automatic Features self.mainConf.autoSelect = self.autoSelect.isChecked() self.mainConf.doReplace = self.doReplace.isChecked() # Replace as You Type self.mainConf.doReplaceSQuote = self.doReplaceSQuote.isChecked() self.mainConf.doReplaceDQuote = self.doReplaceDQuote.isChecked() self.mainConf.doReplaceDash = self.doReplaceDash.isChecked() self.mainConf.doReplaceDots = self.doReplaceDots.isChecked() # Automatic Padding self.mainConf.fmtPadBefore = self.fmtPadBefore.text().strip() self.mainConf.fmtPadAfter = self.fmtPadAfter.text().strip() self.mainConf.fmtPadThin = self.fmtPadThin.isChecked() self.mainConf.confChanged = True return ## # Slots ## def _toggleAutoReplaceMain(self, theState): """Enables or disables switches controlled by the main auto replace switch. """ self.doReplaceSQuote.setEnabled(theState) self.doReplaceDQuote.setEnabled(theState) self.doReplaceDash.setEnabled(theState) self.doReplaceDots.setEnabled(theState) self.fmtPadThin.setEnabled(theState) return
class GuiPreferencesProjects(QWidget): def __init__(self, theParent): QWidget.__init__(self, theParent) self.mainConf = nw.CONFIG self.theParent = theParent self.theTheme = theParent.theTheme # The Form self.mainForm = QConfigLayout() self.mainForm.setHelpTextStyle(self.theTheme.helpText) self.setLayout(self.mainForm) # Automatic Save # ============== self.mainForm.addGroupLabel(self.tr("Automatic Save")) ## Document Save Timer self.autoSaveDoc = QSpinBox(self) self.autoSaveDoc.setMinimum(5) self.autoSaveDoc.setMaximum(600) self.autoSaveDoc.setSingleStep(1) self.autoSaveDoc.setValue(self.mainConf.autoSaveDoc) self.mainForm.addRow( self.tr("Save document interval"), self.autoSaveDoc, self.tr("How often the open document is automatically saved."), theUnit=self.tr("seconds")) ## Project Save Timer self.autoSaveProj = QSpinBox(self) self.autoSaveProj.setMinimum(5) self.autoSaveProj.setMaximum(600) self.autoSaveProj.setSingleStep(1) self.autoSaveProj.setValue(self.mainConf.autoSaveProj) self.mainForm.addRow( self.tr("Save project interval"), self.autoSaveProj, self.tr("How often the open project is automatically saved."), theUnit=self.tr("seconds")) # Project Backup # ============== self.mainForm.addGroupLabel(self.tr("Project Backup")) ## Backup Path self.backupPath = self.mainConf.backupPath self.backupGetPath = QPushButton(self.tr("Browse")) self.backupGetPath.clicked.connect(self._backupFolder) self.backupPathRow = self.mainForm.addRow( self.tr("Backup storage location"), self.backupGetPath, self.tr("Path: {0}").format(self.backupPath)) ## Run when closing self.backupOnClose = QSwitch() self.backupOnClose.setChecked(self.mainConf.backupOnClose) self.backupOnClose.toggled.connect(self._toggledBackupOnClose) self.mainForm.addRow( self.tr("Run backup when the project is closed"), self.backupOnClose, self. tr("Can be overridden for individual projects in Project Settings." )) ## Ask before backup ## Only enabled when "Run when closing" is checked self.askBeforeBackup = QSwitch() self.askBeforeBackup.setChecked(self.mainConf.askBeforeBackup) self.askBeforeBackup.setEnabled(self.mainConf.backupOnClose) self.mainForm.addRow( self.tr("Ask before running backup"), self.askBeforeBackup, self.tr("If off, backups will run in the background.")) # Session Timer # ============= self.mainForm.addGroupLabel(self.tr("Session Timer")) ## Pause when idle self.stopWhenIdle = QSwitch() self.stopWhenIdle.setChecked(self.mainConf.stopWhenIdle) self.mainForm.addRow( self.tr("Pause the session timer when not writing"), self.stopWhenIdle, self. tr("Also pauses when the application window does not have focus.")) ## Inactive time for idle self.userIdleTime = QDoubleSpinBox() self.userIdleTime.setMinimum(0.5) self.userIdleTime.setMaximum(600.0) self.userIdleTime.setSingleStep(0.5) self.userIdleTime.setDecimals(1) self.userIdleTime.setValue(self.mainConf.userIdleTime / 60.0) self.mainForm.addRow( self.tr("Editor inactive time before pausing timer"), self.userIdleTime, self.tr("User activity includes typing and changing the content."), theUnit=self.tr("minutes")) return def saveValues(self): """Save the values set for this tab. """ # Automatic Save self.mainConf.autoSaveDoc = self.autoSaveDoc.value() self.mainConf.autoSaveProj = self.autoSaveProj.value() # Project Backup self.mainConf.backupPath = self.backupPath self.mainConf.backupOnClose = self.backupOnClose.isChecked() self.mainConf.askBeforeBackup = self.askBeforeBackup.isChecked() # Session Timer self.mainConf.stopWhenIdle = self.stopWhenIdle.isChecked() self.mainConf.userIdleTime = round(self.userIdleTime.value() * 60) self.mainConf.confChanged = True return ## # Slots ## def _backupFolder(self): """Open a dialog to select the backup folder. """ currDir = self.backupPath if not os.path.isdir(currDir): currDir = "" newDir = QFileDialog.getExistingDirectory( self, self.tr("Backup Directory"), currDir, options=QFileDialog.ShowDirsOnly) if newDir: self.backupPath = newDir self.mainForm.setHelpText( self.backupPathRow, self.tr("Path: {0}").format(self.backupPath)) return True return False def _toggledBackupOnClose(self, theState): """Enable or disable switch that depends on the backup on close switch. """ self.askBeforeBackup.setEnabled(theState) return