diff --git a/nw/config.py b/nw/config.py index 43865cdc..e090ddbc 100644 --- a/nw/config.py +++ b/nw/config.py @@ -148,7 +148,8 @@ class Config: self.osUnknown = True # Packages - self.hasEnchant = False + self.hasEnchant = False + self.hasSymSpell = False return @@ -196,7 +197,7 @@ class Config: self._checkOptionalPackages() if self.spellTool is None: - self.spellTool = "simple" + self.spellTool = "internal" if self.spellLanguage is None: self.spellLanguage = "en" diff --git a/nw/gui/dialogs/configeditor.py b/nw/gui/dialogs/configeditor.py index b38e20ee..fe615430 100644 --- a/nw/gui/dialogs/configeditor.py +++ b/nw/gui/dialogs/configeditor.py @@ -16,8 +16,10 @@ import nw from os import path from PyQt5.QtCore import Qt, QSize -from PyQt5.QtGui import QIcon, QPixmap, QColor, QBrush, QStandardItemModel, QFont from PyQt5.QtSvg import QSvgWidget +from PyQt5.QtGui import ( + QIcon, QPixmap, QColor, QBrush, QStandardItemModel, QFont +) from PyQt5.QtWidgets import ( QDialog, QHBoxLayout, QVBoxLayout, QFormLayout, QLineEdit, QPlainTextEdit, QLabel, QWidget, QTabWidget, QDialogButtonBox, QSpinBox, QGroupBox, @@ -25,6 +27,7 @@ from PyQt5.QtWidgets import ( QFileDialog ) +from nw.tools import NWSpellCheck from nw.constants import nwAlert, nwQuotes logger = logging.getLogger(__name__) @@ -155,6 +158,17 @@ class GuiConfigEditGeneral(QWidget): self.spellLangForm = QGridLayout(self) self.spellLang.setLayout(self.spellLangForm) + self.spellToolList = QComboBox(self) + self.spellToolList.addItem("Internal (difflib)", NWSpellCheck.SP_INTERNAL) + self.spellToolList.addItem("Spell Enchant (pyenchant)", NWSpellCheck.SP_ENCHANT) + self.spellToolList.addItem("SymSpell (symspellpy)", NWSpellCheck.SP_SYMSPELL) + + theModel = self.spellToolList.model() + idEnchant = self.spellToolList.findData(NWSpellCheck.SP_ENCHANT) + idSymSpell = self.spellToolList.findData(NWSpellCheck.SP_SYMSPELL) + theModel.item(idEnchant).setEnabled(self.mainConf.hasEnchant) + theModel.item(idSymSpell).setEnabled(self.mainConf.hasSymSpell) + self.spellLangList = QComboBox(self) for spTag, spName in self.theParent.docEditor.theDict.listDictionaries(): self.spellLangList.addItem(spName, spTag) @@ -162,8 +176,10 @@ class GuiConfigEditGeneral(QWidget): if spellIdx != -1: self.spellLangList.setCurrentIndex(spellIdx) - self.spellLangForm.addWidget(QLabel("Language"), 0, 0) - self.spellLangForm.addWidget(self.spellLangList, 0, 1) + self.spellLangForm.addWidget(QLabel("Provider"), 0, 0) + self.spellLangForm.addWidget(self.spellToolList, 0, 1) + self.spellLangForm.addWidget(QLabel("Language"), 1, 0) + self.spellLangForm.addWidget(self.spellLangList, 1, 1) self.spellLangForm.setColumnStretch(2, 1) # AutoSave @@ -241,6 +257,7 @@ class GuiConfigEditGeneral(QWidget): guiTheme = self.guiLookTheme.currentData() guiSyntax = self.guiLookSyntax.currentData() + spellTool = self.spellToolList.currentData() spellLanguage = self.spellLangList.currentData() autoSaveDoc = self.autoSaveDoc.value() autoSaveProj = self.autoSaveProj.value() @@ -253,6 +270,7 @@ class GuiConfigEditGeneral(QWidget): self.mainConf.guiTheme = guiTheme self.mainConf.guiSyntax = guiSyntax + self.mainConf.spellTool = spellTool self.mainConf.spellLanguage = spellLanguage self.mainConf.autoSaveDoc = autoSaveDoc self.mainConf.autoSaveProj = autoSaveProj @@ -286,6 +304,13 @@ class GuiConfigEditGeneral(QWidget): return False + def _disableComboItem(self, theList, theValue): + theIdx = theList.findData(theValue) + theModel = theList.model() + anItem = theModel.item(1) + anItem.setFlags(anItem.flags() ^ Qt.ItemIsEnabled) + return theModel + # END Class GuiConfigEditGeneral class GuiConfigEditEditor(QWidget): @@ -536,12 +561,12 @@ class GuiConfigEditEditor(QWidget): self.mainConf.textMargin = textMargin self.mainConf.tabWidth = tabWidth - autoSelect = self.autoSelect.isChecked() - doReplace = self.autoReplaceMain.isChecked() - doReplaceSQuote = self.autoReplaceSQ.isChecked() - doReplaceDQuote = self.autoReplaceDQ.isChecked() - doReplaceDash = self.autoReplaceDash.isChecked() - doReplaceDots = self.autoReplaceDash.isChecked() + autoSelect = self.autoSelect.isChecked() + doReplace = self.autoReplaceMain.isChecked() + doReplaceSQuote = self.autoReplaceSQ.isChecked() + doReplaceDQuote = self.autoReplaceDQ.isChecked() + doReplaceDash = self.autoReplaceDash.isChecked() + doReplaceDots = self.autoReplaceDash.isChecked() self.mainConf.autoSelect = autoSelect self.mainConf.doReplace = doReplace diff --git a/nw/tools/spellcheck.py b/nw/tools/spellcheck.py index 051767d8..7d5575e1 100644 --- a/nw/tools/spellcheck.py +++ b/nw/tools/spellcheck.py @@ -17,6 +17,10 @@ logger = logging.getLogger(__name__) class NWSpellCheck(): + SP_INTERNAL = "internal" + SP_ENCHANT = "enchant" + SP_SYMSPELL = "symspell" + theDict = None def __init__(self):