src/eric7/Preferences/ConfigurationPages/EditorKeywordsPage.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 8881
54e42bc2437a
child 9221
bf71ee032bb4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/eric7/Preferences/ConfigurationPages/EditorKeywordsPage.py	Thu Jul 07 11:23:56 2022 +0200
@@ -0,0 +1,222 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2010 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the editor highlighter keywords configuration page.
+"""
+
+from PyQt6.QtCore import pyqtSlot
+
+from EricWidgets import EricMessageBox
+
+from .ConfigurationPageBase import ConfigurationPageBase
+from .Ui_EditorKeywordsPage import Ui_EditorKeywordsPage
+
+import Preferences
+
+
+class EditorKeywordsPage(ConfigurationPageBase, Ui_EditorKeywordsPage):
+    """
+    Class implementing the editor highlighter keywords configuration page.
+    """
+    MaxKeywordSets = 8          # max. 8 sets are allowed
+    
+    def __init__(self):
+        """
+        Constructor
+        """
+        super().__init__()
+        self.setupUi(self)
+        self.setObjectName("EditorKeywordsPage")
+        
+        # set initial values
+        import QScintilla.Lexers
+        from QScintilla.Lexers.LexerContainer import LexerContainer
+        
+        self.__keywords = {
+            "": {
+                "Sets": [""] * (self.MaxKeywordSets + 1),
+                "Descriptions": [""] * (self.MaxKeywordSets + 1),
+                "MaxSets": 0,
+            }
+        }
+        
+        languages = sorted(
+            [''] + list(QScintilla.Lexers.getSupportedLanguages().keys()))
+        for lang in languages:
+            if lang:
+                lex = QScintilla.Lexers.getLexer(lang)
+                if isinstance(lex, LexerContainer):
+                    continue
+                keywords = Preferences.getEditorKeywords(lang)[:]
+                if keywords:
+                    # set empty entries to default values
+                    for kwSet in range(1, self.MaxKeywordSets + 1):
+                        if not keywords[kwSet]:
+                            kw = lex.defaultKeywords(kwSet)
+                            if kw is None:
+                                kw = ""
+                            keywords[kwSet] = kw
+                else:
+                    keywords = [""]
+                    descriptions = [""]
+                    for kwSet in range(1, self.MaxKeywordSets + 1):
+                        kw = lex.keywords(kwSet)
+                        if kw is None:
+                            kw = ""
+                        keywords.append(kw)
+                descriptions = [""]
+                for kwSet in range(1, self.MaxKeywordSets + 1):
+                    desc = lex.keywordsDescription(kwSet)
+                    descriptions.append(desc)
+                defaults = [""]
+                for kwSet in range(1, self.MaxKeywordSets + 1):
+                    dkw = lex.defaultKeywords(kwSet)
+                    if dkw is None:
+                        dkw = ""
+                    defaults.append(dkw)
+                self.__keywords[lang] = {
+                    "Sets": keywords,
+                    "Descriptions": descriptions,
+                    "DefaultSets": defaults,
+                    "MaxSets": lex.maximumKeywordSet(),
+                }
+            self.languageCombo.addItem(
+                QScintilla.Lexers.getLanguageIcon(lang, False),
+                lang)
+        
+        self.currentLanguage = ''
+        self.currentSet = 1
+        self.on_languageCombo_activated(0)
+    
+    def save(self):
+        """
+        Public slot to save the editor highlighter keywords configuration.
+        """
+        lang = self.languageCombo.currentText()
+        kwSet = self.setSpinBox.value()
+        self.__keywords[lang]["Sets"][kwSet] = self.keywordsEdit.toPlainText()
+        
+        for lang, keywords in self.__keywords.items():
+            Preferences.setEditorKeywords(lang, keywords["Sets"])
+        
+    @pyqtSlot(int)
+    def on_languageCombo_activated(self, index):
+        """
+        Private slot to fill the keywords edit.
+        
+        @param index index of the selected entry
+        @type int
+        """
+        language = self.languageCombo.itemText(index)
+        
+        self.defaultButton.setEnabled(bool(language))
+        self.allDefaultButton.setEnabled(bool(language))
+        
+        if self.currentLanguage == language:
+            return
+        
+        if self.setSpinBox.value() == 1:
+            self.on_setSpinBox_valueChanged(1)
+        if self.__keywords[language]["MaxSets"]:
+            first = 1
+            last = self.__keywords[language]["MaxSets"]
+        else:
+            first, last = self.MaxKeywordSets + 1, 0
+            for kwSet in range(1, self.MaxKeywordSets + 1):
+                if self.__keywords[language]["Descriptions"][kwSet] != "":
+                    first = min(first, kwSet)
+                    last = max(last, kwSet)
+        self.setSpinBox.setEnabled(language != "" and
+                                   first <= self.MaxKeywordSets)
+        self.keywordsEdit.setEnabled(language != "" and
+                                     first <= self.MaxKeywordSets)
+        if first <= self.MaxKeywordSets:
+            self.setSpinBox.setMinimum(first)
+            self.setSpinBox.setMaximum(last)
+            self.setSpinBox.setValue(first)
+        else:
+            self.setSpinBox.setMinimum(0)
+            self.setSpinBox.setMaximum(0)
+            self.setSpinBox.setValue(0)
+    
+    @pyqtSlot(int)
+    def on_setSpinBox_valueChanged(self, kwSet):
+        """
+        Private slot to fill the keywords edit.
+        
+        @param kwSet number of the selected keyword set
+        @type int
+        """
+        language = self.languageCombo.currentText()
+        if self.currentLanguage == language and self.currentSet == kwSet:
+            return
+        
+        self.__keywords[self.currentLanguage]["Sets"][self.currentSet] = (
+            self.keywordsEdit.toPlainText()
+        )
+        
+        self.currentLanguage = language
+        self.currentSet = kwSet
+        self.setDescriptionLabel.setText("<b>{0}</b>".format(
+            self.__keywords[language]["Descriptions"][kwSet]))
+        self.keywordsEdit.setPlainText(
+            self.__keywords[language]["Sets"][kwSet])
+    
+    @pyqtSlot()
+    def on_defaultButton_clicked(self):
+        """
+        Private slot to set the current keyword set to default values.
+        """
+        ok = (
+            EricMessageBox.yesNo(
+                self,
+                self.tr("Reset to Default"),
+                self.tr("Shall the current keyword set really be reset to"
+                        " default values?"))
+            if bool(self.keywordsEdit.toPlainText()) else
+            True
+        )
+        if ok:
+            language = self.languageCombo.currentText()
+            kwSet = self.setSpinBox.value()
+            self.__keywords[language]["Sets"][kwSet] = (
+                self.__keywords[language]["DefaultSets"][kwSet]
+            )
+            self.keywordsEdit.setPlainText(
+                self.__keywords[language]["Sets"][kwSet])
+    
+    @pyqtSlot()
+    def on_allDefaultButton_clicked(self):
+        """
+        Private slot to set all keyword sets of the current language to default
+        values.
+        """
+        ok = EricMessageBox.yesNo(
+            self,
+            self.tr("Reset All to Default"),
+            self.tr("Shall all keyword sets of the current language really be"
+                    " reset to default values?"))
+        if ok:
+            language = self.languageCombo.currentText()
+            kwSet = self.setSpinBox.value()
+            self.__keywords[language]["Sets"] = (
+                self.__keywords[language]["DefaultSets"][:]
+            )
+            self.keywordsEdit.setPlainText(
+                self.__keywords[language]["Sets"][kwSet])
+
+
+def create(dlg):
+    """
+    Module function to create the configuration page.
+    
+    @param dlg reference to the configuration dialog
+    @type ConfigurationWidget
+    @return reference to the instantiated page
+    @rtype ConfigurationPageBase
+    """
+    page = EditorKeywordsPage()
+    return page

eric ide

mercurial