diff -r 4e8b98454baa -r 800c432b34c8 eric7/Preferences/ConfigurationPages/EditorHighlightersPage.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/Preferences/ConfigurationPages/EditorHighlightersPage.py Sat May 15 18:45:04 2021 +0200 @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2006 - 2021 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the Editor Highlighter Associations configuration page. +""" + +import os + +from pygments.lexers import get_all_lexers + +from PyQt5.QtCore import Qt, pyqtSlot +from PyQt5.QtWidgets import QHeaderView, QTreeWidgetItem + +from .ConfigurationPageBase import ConfigurationPageBase +from .Ui_EditorHighlightersPage import Ui_EditorHighlightersPage + +import Preferences + + +class EditorHighlightersPage(ConfigurationPageBase, Ui_EditorHighlightersPage): + """ + Class implementing the Editor Highlighter Associations configuration page. + """ + def __init__(self, lexers): + """ + Constructor + + @param lexers reference to the lexers dictionary + """ + super().__init__() + self.setupUi(self) + self.setObjectName("EditorHighlightersPage") + + self.editorLexerList.headerItem().setText( + self.editorLexerList.columnCount(), "") + header = self.editorLexerList.header() + header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents) + header.setSortIndicator(0, Qt.SortOrder.AscendingOrder) + + try: + self.extsep = os.extsep + except AttributeError: + self.extsep = "." + + import QScintilla.Lexers + self.extras = ["-----------", self.tr("Alternative")] + languages = [''] + sorted(lexers.keys()) + self.extras + for lang in languages: + self.editorLexerCombo.addItem( + QScintilla.Lexers.getLanguageIcon(lang, False), + lang) + + pygmentsLexers = [''] + sorted(lex[0] for lex in get_all_lexers()) + self.pygmentsLexerCombo.addItems(pygmentsLexers) + + # set initial values + lexerAssocs = Preferences.getEditorLexerAssocs() + for ext in lexerAssocs: + QTreeWidgetItem(self.editorLexerList, [ext, lexerAssocs[ext]]) + self.editorLexerList.sortByColumn(0, Qt.SortOrder.AscendingOrder) + + def save(self): + """ + Public slot to save the Editor Highlighter Associations configuration. + """ + lexerAssocs = {} + for index in range( + self.editorLexerList.topLevelItemCount()): + itm = self.editorLexerList.topLevelItem(index) + lexerAssocs[itm.text(0)] = itm.text(1) + Preferences.setEditorLexerAssocs(lexerAssocs) + + @pyqtSlot() + def on_addLexerButton_clicked(self): + """ + Private slot to add the lexer association displayed to the list. + """ + ext = self.editorFileExtEdit.text() + if ext.startswith(self.extsep): + ext.replace(self.extsep, "") + lexer = self.editorLexerCombo.currentText() + if lexer in self.extras: + pygmentsLexer = self.pygmentsLexerCombo.currentText() + if not pygmentsLexer: + lexer = pygmentsLexer + else: + lexer = "Pygments|{0}".format(pygmentsLexer) + if ext and lexer: + itmList = self.editorLexerList.findItems( + ext, Qt.MatchFlags(Qt.MatchFlag.MatchExactly), 0) + if itmList: + index = self.editorLexerList.indexOfTopLevelItem(itmList[0]) + itm = self.editorLexerList.takeTopLevelItem(index) + # __IGNORE_WARNING__ + del itm + QTreeWidgetItem(self.editorLexerList, [ext, lexer]) + self.editorFileExtEdit.clear() + self.editorLexerCombo.setCurrentIndex(0) + self.pygmentsLexerCombo.setCurrentIndex(0) + self.editorLexerList.sortItems( + self.editorLexerList.sortColumn(), + self.editorLexerList.header().sortIndicatorOrder()) + + @pyqtSlot() + def on_deleteLexerButton_clicked(self): + """ + Private slot to delete the currently selected lexer association of the + list. + """ + itmList = self.editorLexerList.selectedItems() + if itmList: + index = self.editorLexerList.indexOfTopLevelItem(itmList[0]) + itm = self.editorLexerList.takeTopLevelItem(index) + # __IGNORE_WARNING__ + del itm + + self.editorLexerList.clearSelection() + self.editorFileExtEdit.clear() + self.editorLexerCombo.setCurrentIndex(0) + + def on_editorLexerList_itemClicked(self, itm, column): + """ + Private slot to handle the clicked signal of the lexer association + list. + + @param itm reference to the selecte item (QTreeWidgetItem) + @param column column the item was clicked or activated (integer) + (ignored) + """ + if itm is None: + self.editorFileExtEdit.clear() + self.editorLexerCombo.setCurrentIndex(0) + self.pygmentsLexerCombo.setCurrentIndex(0) + else: + self.editorFileExtEdit.setText(itm.text(0)) + lexer = itm.text(1) + if lexer.startswith("Pygments|"): + pygmentsLexer = lexer.split("|")[1] + pygmentsIndex = self.pygmentsLexerCombo.findText(pygmentsLexer) + lexer = self.tr("Alternative") + else: + pygmentsIndex = 0 + index = self.editorLexerCombo.findText(lexer) + self.editorLexerCombo.setCurrentIndex(index) + self.pygmentsLexerCombo.setCurrentIndex(pygmentsIndex) + + def on_editorLexerList_itemActivated(self, itm, column): + """ + Private slot to handle the activated signal of the lexer association + list. + + @param itm reference to the selecte item (QTreeWidgetItem) + @param column column the item was clicked or activated (integer) + (ignored) + """ + self.on_editorLexerList_itemClicked(itm, column) + + @pyqtSlot(int) + def on_editorLexerCombo_currentIndexChanged(self, index): + """ + Private slot to handle the selection of a lexer. + + @param index index of the current item + @type int + """ + text = self.editorLexerCombo.itemText(index) + if text in self.extras: + self.pygmentsLexerCombo.setEnabled(True) + self.pygmentsLabel.setEnabled(True) + else: + self.pygmentsLexerCombo.setEnabled(False) + self.pygmentsLabel.setEnabled(False) + + +def create(dlg): + """ + Module function to create the configuration page. + + @param dlg reference to the configuration dialog + @return reference to the instantiated page (ConfigurationPageBase) + """ + page = EditorHighlightersPage(dlg.getLexers()) + return page