diff --git a/nw/config.py b/nw/config.py index a12aaa9a..f6a170de 100644 --- a/nw/config.py +++ b/nw/config.py @@ -25,6 +25,11 @@ class Config: WIN_WIDTH = 0 WIN_HEIGHT = 1 + CNF_STR = 0 + CNF_INT = 1 + CNF_BOOL = 2 + CNF_LIST = 3 + def __init__(self): # Set Application Variables @@ -60,6 +65,7 @@ class Config: self.textWidth = 600 self.textMargin = [40, 40] self.textSize = 13 + self.tabWidth = 40 self.doJustify = True self.autoSelect = True self.doReplace = True @@ -68,7 +74,7 @@ class Config: self.doReplaceDash = True self.doReplaceDots = True self.wordCountTimer = 5.0 - + self.fmtDoubleQuotes = ["“","”"] self.fmtSingleQuotes = ["‘","’"] self.fmtApostrophe = "’" @@ -117,140 +123,105 @@ class Config: def loadConfig(self): logger.debug("Loading config file") - confParser = configparser.ConfigParser() + cnfParse = configparser.ConfigParser() try: - confParser.read_file(open(path.join(self.confPath,self.confFile))) + cnfParse.read_file(open(path.join(self.confPath,self.confFile))) except Exception as e: logger.error("Could not load config file") return False - # Get options - ## Main cnfSec = "Main" - if confParser.has_section(cnfSec): - if confParser.has_option(cnfSec,"theme"): - self.guiTheme = confParser.get(cnfSec,"theme") + self.guiTheme = self._parseLine(cnfParse, cnfSec, "theme", self.CNF_STR) ## Sizes cnfSec = "Sizes" - if confParser.has_section(cnfSec): - if confParser.has_option(cnfSec,"geometry"): - self.winGeometry = self.unpackList( - confParser.get(cnfSec,"geometry"), 2, self.winGeometry - ) - if confParser.has_option(cnfSec,"treecols"): - self.treeColWidth = self.unpackList( - confParser.get(cnfSec,"treecols"), 3, self.treeColWidth - ) - if confParser.has_option(cnfSec,"mainpane"): - self.mainPanePos = self.unpackList( - confParser.get(cnfSec,"mainpane"), 2, self.mainPanePos - ) - if confParser.has_option(cnfSec,"docpane"): - self.docPanePos = self.unpackList( - confParser.get(cnfSec,"docpane"), 2, self.docPanePos - ) + self.winGeometry = self._parseLine(cnfParse, cnfSec, "geometry", self.CNF_LIST, self.winGeometry) + self.treeColWidth = self._parseLine(cnfParse, cnfSec, "treecols", self.CNF_LIST, self.treeColWidth) + self.mainPanePos = self._parseLine(cnfParse, cnfSec, "mainpane", self.CNF_LIST, self.mainPanePos) + self.docPanePos = self._parseLine(cnfParse, cnfSec, "docpane", self.CNF_LIST, self.docPanePos) ## Project cnfSec = "Project" - if confParser.has_section(cnfSec): - if confParser.has_option(cnfSec,"autosaveproject"): - self.autoSaveProj = confParser.getint(cnfSec,"autosaveproject") - if confParser.has_option(cnfSec,"autosavedoc"): - self.autoSaveDoc = confParser.getint(cnfSec,"autosavedoc") + self.autoSaveProj = self._parseLine(cnfParse, cnfSec, "autosaveproject", self.CNF_INT) + self.autoSaveDoc = self._parseLine(cnfParse, cnfSec, "autosavedoc", self.CNF_INT) ## Editor cnfSec = "Editor" - if confParser.has_section(cnfSec): - if confParser.has_option(cnfSec,"fixedwidth"): - self.textFixedW = confParser.getboolean(cnfSec,"fixedwidth") - if confParser.has_option(cnfSec,"width"): - self.textWidth = confParser.getint(cnfSec,"width") - if confParser.has_option(cnfSec,"margins"): - self.textMargin = self.unpackList( - confParser.get(cnfSec,"margins"), 2, self.textMargin - ) - if confParser.has_option(cnfSec,"textsize"): - self.textSize = confParser.getint(cnfSec,"textsize") - if confParser.has_option(cnfSec,"justify"): - self.doJustify = confParser.getboolean(cnfSec,"justify") - if confParser.has_option(cnfSec,"autoselect"): - self.autoSelect = confParser.getboolean(cnfSec,"autoselect") - if confParser.has_option(cnfSec,"autoreplace"): - self.doReplace = confParser.getboolean(cnfSec,"autoreplace") - if confParser.has_option(cnfSec,"repsquotes"): - self.doReplaceSQuote = confParser.getboolean(cnfSec,"repsquotes") - if confParser.has_option(cnfSec,"repdquotes"): - self.doReplaceDQuote = confParser.getboolean(cnfSec,"repdquotes") - if confParser.has_option(cnfSec,"repdash"): - self.doReplaceDash = confParser.getboolean(cnfSec,"repdash") - if confParser.has_option(cnfSec,"repdots"): - self.doReplaceDots = confParser.getboolean(cnfSec,"repdots") - if confParser.has_option(cnfSec,"spellcheck"): - self.spellLanguage = confParser.get(cnfSec,"spellcheck") + self.textFixedW = self._parseLine(cnfParse, cnfSec, "fixedwidth", self.CNF_BOOL) + self.textWidth = self._parseLine(cnfParse, cnfSec, "width", self.CNF_INT) + self.textMargin = self._parseLine(cnfParse, cnfSec, "margins", self.CNF_LIST, self.textMargin) + self.textSize = self._parseLine(cnfParse, cnfSec, "textsize", self.CNF_INT) + self.tabWidth = self._parseLine(cnfParse, cnfSec, "tabwidth", self.CNF_INT) + self.doJustify = self._parseLine(cnfParse, cnfSec, "justify", self.CNF_BOOL) + self.autoSelect = self._parseLine(cnfParse, cnfSec, "autoselect", self.CNF_BOOL) + self.doReplace = self._parseLine(cnfParse, cnfSec, "autoreplace", self.CNF_BOOL) + self.doReplaceSQuote = self._parseLine(cnfParse, cnfSec, "repsquotes", self.CNF_BOOL) + self.doReplaceDQuote = self._parseLine(cnfParse, cnfSec, "repdquotes", self.CNF_BOOL) + self.doReplaceDash = self._parseLine(cnfParse, cnfSec, "repdash", self.CNF_BOOL) + self.doReplaceDots = self._parseLine(cnfParse, cnfSec, "repdots", self.CNF_BOOL) + self.spellLanguage = self._parseLine(cnfParse, cnfSec, "spellcheck", self.CNF_STR) ## Path cnfSec = "Path" - if confParser.has_section(cnfSec): - for i in range(10): - if confParser.has_option(cnfSec,"recent%d" % i): - self.recentList[i] = confParser.get(cnfSec,"recent%d" % i) + for i in range(10): + self.recentList[i] = self._parseLine(cnfParse, cnfSec, "recent%d" % i,self.CNF_STR) return True def saveConfig(self): logger.debug("Saving config file") - confParser = configparser.ConfigParser() + cnfParse = configparser.ConfigParser() # Set options ## Main cnfSec = "Main" - confParser.add_section(cnfSec) - confParser.set(cnfSec,"timestamp", datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - confParser.set(cnfSec,"theme", str(self.guiTheme)) + cnfParse.add_section(cnfSec) + cnfParse.set(cnfSec,"timestamp", datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + cnfParse.set(cnfSec,"theme", str(self.guiTheme)) ## Sizes cnfSec = "Sizes" - confParser.add_section(cnfSec) - confParser.set(cnfSec,"geometry", self.packList(self.winGeometry)) - confParser.set(cnfSec,"treecols", self.packList(self.treeColWidth)) - confParser.set(cnfSec,"mainpane", self.packList(self.mainPanePos)) - confParser.set(cnfSec,"docpane", self.packList(self.docPanePos)) + cnfParse.add_section(cnfSec) + cnfParse.set(cnfSec,"geometry", self._packList(self.winGeometry)) + cnfParse.set(cnfSec,"treecols", self._packList(self.treeColWidth)) + cnfParse.set(cnfSec,"mainpane", self._packList(self.mainPanePos)) + cnfParse.set(cnfSec,"docpane", self._packList(self.docPanePos)) ## Project cnfSec = "Project" - confParser.add_section(cnfSec) - confParser.set(cnfSec,"autosaveproject", str(self.autoSaveProj)) - confParser.set(cnfSec,"autosavedoc", str(self.autoSaveDoc)) + cnfParse.add_section(cnfSec) + cnfParse.set(cnfSec,"autosaveproject", str(self.autoSaveProj)) + cnfParse.set(cnfSec,"autosavedoc", str(self.autoSaveDoc)) ## Editor cnfSec = "Editor" - confParser.add_section(cnfSec) - confParser.set(cnfSec,"fixedwidth", str(self.textFixedW)) - confParser.set(cnfSec,"width", str(self.textWidth)) - confParser.set(cnfSec,"margins", self.packList(self.textMargin)) - confParser.set(cnfSec,"textsize", str(self.textSize)) - confParser.set(cnfSec,"justify", str(self.doJustify)) - confParser.set(cnfSec,"autoselect", str(self.autoSelect)) - confParser.set(cnfSec,"autoreplace",str(self.doReplace)) - confParser.set(cnfSec,"repsquotes", str(self.doReplaceSQuote)) - confParser.set(cnfSec,"repdquotes", str(self.doReplaceDQuote)) - confParser.set(cnfSec,"repdash", str(self.doReplaceDash)) - confParser.set(cnfSec,"repdots", str(self.doReplaceDots)) - confParser.set(cnfSec,"spellcheck", str(self.spellLanguage)) + cnfParse.add_section(cnfSec) + cnfParse.set(cnfSec,"fixedwidth", str(self.textFixedW)) + cnfParse.set(cnfSec,"width", str(self.textWidth)) + cnfParse.set(cnfSec,"margins", self._packList(self.textMargin)) + cnfParse.set(cnfSec,"textsize", str(self.textSize)) + cnfParse.set(cnfSec,"tabwidth", str(self.tabWidth)) + cnfParse.set(cnfSec,"justify", str(self.doJustify)) + cnfParse.set(cnfSec,"autoselect", str(self.autoSelect)) + cnfParse.set(cnfSec,"autoreplace",str(self.doReplace)) + cnfParse.set(cnfSec,"repsquotes", str(self.doReplaceSQuote)) + cnfParse.set(cnfSec,"repdquotes", str(self.doReplaceDQuote)) + cnfParse.set(cnfSec,"repdash", str(self.doReplaceDash)) + cnfParse.set(cnfSec,"repdots", str(self.doReplaceDots)) + cnfParse.set(cnfSec,"spellcheck", str(self.spellLanguage)) ## Path cnfSec = "Path" - confParser.add_section(cnfSec) + cnfParse.add_section(cnfSec) for i in range(10): - confParser.set(cnfSec,"recent%d" % i, str(self.recentList[i])) + cnfParse.set(cnfSec,"recent%d" % i, str(self.recentList[i])) # Write config file try: - confParser.write(open(path.join(self.confPath,self.confFile),"w")) + cnfParse.write(open(path.join(self.confPath,self.confFile),"w")) self.confChanged = False except Exception as e: logger.error("Could not save config file") @@ -258,19 +229,6 @@ class Config: return True - def unpackList(self, inStr, listLen, listDefault, castTo=int): - inData = inStr.split(",") - outData = [] - for i in range(listLen): - try: - outData.append(castTo(inData[i])) - except: - outData.append(listDefault[i]) - return outData - - def packList(self, inData): - return ", ".join(str(inVal) for inVal in inData) - ## # Setters ## @@ -316,4 +274,36 @@ class Config: self.confChanged = True return True + ## + # Internal Functions + ## + + def _unpackList(self, inStr, listLen, listDefault, castTo=int): + inData = inStr.split(",") + outData = [] + for i in range(listLen): + try: + outData.append(castTo(inData[i])) + except: + outData.append(listDefault[i]) + return outData + + def _packList(self, inData): + return ", ".join(str(inVal) for inVal in inData) + + def _parseLine(self, cnfParse, cnfSec, cnfName, cnfType, cnfDefault=[]): + if cnfParse.has_section(cnfSec): + if cnfParse.has_option(cnfSec, cnfName): + if cnfType == self.CNF_STR: + return cnfParse.get(cnfSec, cnfName) + elif cnfType == self.CNF_INT: + return cnfParse.getint(cnfSec, cnfName) + elif cnfType == self.CNF_BOOL: + return cnfParse.getboolean(cnfSec, cnfName) + elif cnfType == self.CNF_LIST: + return self._unpackList( + cnfParse.get(cnfSec, cnfName), len(cnfDefault), cnfDefault + ) + return None + # End Class Config diff --git a/nw/gui/doceditor.py b/nw/gui/doceditor.py index 7ba063d7..0f749e7c 100644 --- a/nw/gui/doceditor.py +++ b/nw/gui/doceditor.py @@ -104,8 +104,12 @@ class GuiDocEditor(QTextEdit): mTB = self.mainConf.textMargin[0] mLR = self.mainConf.textMargin[1] self.setViewportMargins(mLR,mTB,mLR,mTB) + theOpt = QTextOption() + if self.mainConf.tabWidth >= 0: + theOpt.setTabStopDistance(self.mainConf.tabWidth) if self.mainConf.doJustify: - self.theDoc.setDefaultTextOption(QTextOption(Qt.AlignJustify)) + theOpt.setAlignment(Qt.AlignJustify) + self.theDoc.setDefaultTextOption(theOpt) return True ##