src/eric7/Project/FiletypeAssociationDialog.py

Mon, 07 Nov 2022 17:19:58 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 07 Nov 2022 17:19:58 +0100
branch
eric7
changeset 9482
a2bc06a54d9d
parent 9473
3f23dbf37dbe
child 9514
2b104ad132a4
permissions
-rw-r--r--

Corrected/acknowledged some bad import style and removed some obsolete code.

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

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

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

import contextlib

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

from .Ui_FiletypeAssociationDialog import Ui_FiletypeAssociationDialog


class FiletypeAssociationDialog(QDialog, Ui_FiletypeAssociationDialog):
    """
    Class implementing a dialog to enter filetype 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.filetypeAssociationList.headerItem().setText(
            self.filetypeAssociationList.columnCount(), ""
        )
        self.filetypeAssociationList.header().setSortIndicator(
            0, Qt.SortOrder.AscendingOrder
        )

        # keep these lists in sync
        self.filetypes = [
            "SOURCES",
            "FORMS",
            "TRANSLATIONS",
            "RESOURCES",
            "INTERFACES",
            "PROTOCOLS",
            "OTHERS",
            "__IGNORE__",
        ]
        self.filetypeStrings = [
            self.tr("Sources"),
            self.tr("Forms"),
            self.tr("Translations"),
            self.tr("Resources"),
            self.tr("Interfaces"),
            self.tr("Protocols"),
            self.tr("Others"),
            self.tr("Ignore"),
        ]
        self.filetypeCombo.addItems(self.filetypeStrings)

        self.project = project
        for pattern, filetype in list(self.project.pdata["FILETYPES"].items()):
            with contextlib.suppress(ValueError):
                index = self.filetypes.index(filetype)
                self.__createItem(pattern, self.filetypeStrings[index])

        self.__resort()
        self.__reformat()

    def __resort(self):
        """
        Private method to resort the tree.
        """
        self.filetypeAssociationList.sortItems(
            self.filetypeAssociationList.sortColumn(),
            self.filetypeAssociationList.header().sortIndicatorOrder(),
        )

    def __reformat(self):
        """
        Private method to reformat the tree.
        """
        self.filetypeAssociationList.header().resizeSections(
            QHeaderView.ResizeMode.ResizeToContents
        )
        self.filetypeAssociationList.header().setStretchLastSection(True)

    def __createItem(self, pattern, filetype):
        """
        Private slot to create a new entry in the association list.

        @param pattern pattern of the entry (string)
        @param filetype file type of the entry (string)
        @return reference to the newly generated entry (QTreeWidgetItem)
        """
        itm = QTreeWidgetItem(self.filetypeAssociationList, [pattern, filetype])
        return itm

    def on_filetypeAssociationList_currentItemChanged(self, itm, prevItm):
        """
        Private slot to handle the currentItemChanged signal of the
        association list.

        @param itm reference to the new current item (QTreeWidgetItem)
        @param prevItm reference to the previous current item (QTreeWidgetItem)
        """
        if itm is None:
            self.filePatternEdit.clear()
            self.filetypeCombo.setCurrentIndex(0)
            self.deleteAssociationButton.setEnabled(False)
        else:
            self.filePatternEdit.setText(itm.text(0))
            self.filetypeCombo.setCurrentIndex(self.filetypeCombo.findText(itm.text(1)))
            self.deleteAssociationButton.setEnabled(True)

    @pyqtSlot()
    def on_addAssociationButton_clicked(self):
        """
        Private slot to add the association displayed to the list.
        """
        pattern = self.filePatternEdit.text()
        filetype = self.filetypeCombo.currentText()
        if pattern:
            items = self.filetypeAssociationList.findItems(
                pattern, Qt.MatchFlag.MatchExactly, 0
            )
            for itm in items:
                itm = self.filetypeAssociationList.takeTopLevelItem(
                    self.filetypeAssociationList.indexOfTopLevelItem(itm)
                )
                del itm
            itm = self.__createItem(pattern, filetype)
            self.__resort()
            self.__reformat()
            self.filePatternEdit.clear()
            self.filetypeCombo.setCurrentIndex(0)
            self.filetypeAssociationList.setCurrentItem(itm)

    @pyqtSlot()
    def on_deleteAssociationButton_clicked(self):
        """
        Private slot to delete the currently selected association of the
        listbox.
        """
        for itm in self.filetypeAssociationList.selectedItems():
            itm = self.filetypeAssociationList.takeTopLevelItem(
                self.filetypeAssociationList.indexOfTopLevelItem(itm)
            )
            del itm

            self.filetypeAssociationList.clearSelection()
            self.filePatternEdit.clear()
            self.filetypeCombo.setCurrentIndex(0)

    def on_filePatternEdit_textChanged(self, txt):
        """
        Private slot to handle the textChanged signal of the pattern lineedit.

        @param txt text of the lineedit (string)
        """
        if not txt:
            self.addAssociationButton.setEnabled(False)
            self.deleteAssociationButton.setEnabled(False)
        else:
            self.addAssociationButton.setEnabled(True)
            if len(self.filetypeAssociationList.selectedItems()) == 0:
                self.deleteAssociationButton.setEnabled(False)
            else:
                self.deleteAssociationButton.setEnabled(
                    self.filetypeAssociationList.selectedItems()[0].text(0) == txt
                )

    def transferData(self):
        """
        Public slot to transfer the associations into the projects data
        structure.
        """
        self.project.pdata["FILETYPES"] = {}
        for index in range(self.filetypeAssociationList.topLevelItemCount()):
            itm = self.filetypeAssociationList.topLevelItem(index)
            pattern = itm.text(0)
            index = self.filetypeStrings.index(itm.text(1))
            self.project.pdata["FILETYPES"][pattern] = self.filetypes[index]

eric ide

mercurial