eric6/Preferences/ConfigurationPages/EditorLanguageTabIndentOverrideDialog.py

changeset 7731
8ec83a027a21
parent 7360
9190402e4505
child 7732
4c9cf117acf6
--- a/eric6/Preferences/ConfigurationPages/EditorLanguageTabIndentOverrideDialog.py	Thu Oct 01 17:34:48 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/EditorLanguageTabIndentOverrideDialog.py	Thu Oct 01 17:39:16 2020 +0200
@@ -8,6 +8,8 @@
 a language.
 """
 
+from pygments.lexers import get_all_lexers
+
 from PyQt5.QtCore import pyqtSlot
 from PyQt5.QtWidgets import QDialog, QDialogButtonBox
 
@@ -23,6 +25,8 @@
     Class implementing a dialog to set the tab and indentation width override
     for a language.
     """
+    PygmentsMarker = "Pygments|"
+    
     def __init__(self, *, editMode=False, languages=None, tabWidth=0,
                  indentWidth=0, parent=None):
         """
@@ -31,25 +35,49 @@
         @keyparam editMode flag indicating the edit mode (Note: in edit mode
             the language is fixed)
         @type bool
-        @keyparam languages list of available languages
+        @param languages list of existing languages (if in add mode) or
+            a list containing the language to be edited
         @type list of str
-        @keyparam tabWidth tab width to be set
+        @param tabWidth tab width to be set
         @type int
-        @keyparam indentWidth indentation width to be set
+        @param indentWidth indentation width to be set
         @type int
-        @keyparam parent reference to the parent widget
+        @param parent reference to the parent widget
         @type QWidget
         """
         super(EditorLanguageTabIndentOverrideDialog, self).__init__(parent)
         self.setupUi(self)
         
+        self.__extras = ["-----------", self.tr("Alternative")]
+        
         if editMode:
             self.languageComboBox.addItems(languages)
         else:
-            self.languageComboBox.addItems([""] + sorted(languages))
+            self.__populateLanguages(languages)
         self.tabWidthSpinBox.setValue(tabWidth)
         self.indentWidthSpinBox.setValue(indentWidth)
     
+    def __populateLanguages(self, filterLanguages):
+        """
+        Private method to populate the language combo boxes.
+        """
+        import QScintilla.Lexers
+        languages = list(
+            QScintilla.Lexers.getSupportedLanguages().keys())
+        for lang in filterLanguages:
+            if lang in languages:
+                languages.remove(lang)
+        self.languageComboBox.addItems(
+            [""] + sorted(languages) + self.__extras)
+        
+        pygmentsLanguages = [lex[0] for lex in get_all_lexers()]
+        for lang in filterLanguages:
+            if lang.startswith(self.PygmentsMarker):
+                lang = lang.replace(self.PygmentsMarker, "")
+                if lang in pygmentsLanguages:
+                    pygmentsLanguages.remove(lang)
+        self.pygmentsLexerCombo.addItems([""] + sorted(pygmentsLanguages))
+    
     def getData(self):
         """
         Public method to get the entered data.
@@ -58,12 +86,28 @@
             indentation width
         @rtype tuple of (str, int, int)
         """
+        language = self.languageComboBox.currentText()
+        if language in self.__extras:
+            pygmentsLanguage = self.pygmentsLexerCombo.currentText()
+            language = self.PygmentsMarker + pygmentsLanguage
         return (
-            self.languageComboBox.currentText(),
+            language,
             self.tabWidthSpinBox.value(),
             self.indentWidthSpinBox.value(),
         )
     
+    def __updateOkButton(self):
+        """
+        Private method to set the enabled status of the OK button.
+        """
+        lang = self.languageComboBox.currentText()
+        if lang in self.__extras:
+            self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(
+                bool(self.pygmentsLexerCombo.currentText()))
+        else:
+            self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(
+                bool(lang))
+    
     @pyqtSlot(str)
     def on_languageComboBox_currentIndexChanged(self, lang):
         """
@@ -72,5 +116,21 @@
         @param lang selected language
         @type str
         """
-        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(
-            bool(lang))
+        if lang in self.__extras:
+            self.pygmentsLexerCombo.setEnabled(True)
+            self.pygmentsLabel.setEnabled(True)
+        else:
+            self.pygmentsLexerCombo.setEnabled(False)
+            self.pygmentsLabel.setEnabled(False)
+        
+        self.__updateOkButton()
+    
+    @pyqtSlot(str)
+    def on_pygmentsLexerCombo_currentIndexChanged(self, lang):
+        """
+        Private slot to handle the selection of a language.
+        
+        @param lang selected language
+        @type str
+        """
+        self.__updateOkButton()

eric ide

mercurial