src/eric7/Project/LexerAssociationDialog.py

Fri, 04 Nov 2022 13:52:26 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 04 Nov 2022 13:52:26 +0100
branch
eric7
changeset 9473
3f23dbf37dbe
parent 9413
80c06d472826
child 9482
a2bc06a54d9d
permissions
-rw-r--r--

Resorted the import statements using isort.

# -*- coding: utf-8 -*-

# Copyright (c) 2009 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing a dialog to enter lexer associations for the project.
"""

import os

from PyQt6.QtCore import Qt, pyqtSlot
from PyQt6.QtWidgets import QDialog, QHeaderView, QTreeWidgetItem

from eric7.EricGui import EricPixmapCache
from eric7.QScintilla import Lexers

from .Ui_LexerAssociationDialog import Ui_LexerAssociationDialog


class LexerAssociationDialog(QDialog, Ui_LexerAssociationDialog):
    """
    Class implementing a dialog to enter lexer associations for the project.
    """

    def __init__(self, project, parent=None):
        """
        Constructor

        @param project reference to the project object
        @param parent reference to the parent widget (QWidget)
        """
        super().__init__(parent)
        self.setupUi(self)

        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 = "."

        self.extras = ["-----------", self.tr("Alternative")]

        self.editorLexerCombo.addItem("")
        self.editorLexerCombo.addItem(EricPixmapCache.getIcon("fileText"), "Text")
        for lang in sorted(Lexers.getSupportedLanguages().keys()):
            self.editorLexerCombo.addItem(Lexers.getLanguageIcon(lang, False), lang)
        self.editorLexerCombo.addItems(self.extras)

        from pygments.lexers import get_all_lexers

        pygmentsLexers = [""] + sorted(lex[0] for lex in get_all_lexers())
        self.pygmentsLexerCombo.addItems(pygmentsLexers)

        # set initial values
        self.project = project
        for ext, lexer in list(self.project.pdata["LEXERASSOCS"].items()):
            QTreeWidgetItem(self.editorLexerList, [ext, lexer])
        self.editorLexerList.sortByColumn(0, Qt.SortOrder.AscendingOrder)

    @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.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 transferData(self):
        """
        Public slot to transfer the associations into the projects data
        structure.
        """
        self.project.pdata["LEXERASSOCS"] = {}
        for index in range(self.editorLexerList.topLevelItemCount()):
            itm = self.editorLexerList.topLevelItem(index)
            pattern = itm.text(0)
            self.project.pdata["LEXERASSOCS"][pattern] = itm.text(1)

eric ide

mercurial