diff -r 20b05e846148 -r 8ec83a027a21 eric6/Preferences/ConfigurationPages/EditorLanguageTabIndentOverrideDialog.py --- 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()