src/eric7/Project/PropertiesDialog.py

branch
eric7-maintenance
changeset 9654
7328efba128b
parent 9549
67295777d9fe
parent 9653
e67609152c5e
child 10174
6aac1022f330
diff -r 88f10deec960 -r 7328efba128b src/eric7/Project/PropertiesDialog.py
--- a/src/eric7/Project/PropertiesDialog.py	Thu Dec 01 10:18:07 2022 +0100
+++ b/src/eric7/Project/PropertiesDialog.py	Mon Jan 02 11:16:03 2023 +0100
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Copyright (c) 2002 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+# Copyright (c) 2002 - 2023 Detlev Offenbach <detlev@die-offenbachs.de>
 #
 
 """
@@ -15,11 +15,12 @@
 from PyQt6.QtCore import QDir, pyqtSlot
 from PyQt6.QtWidgets import QDialog, QDialogButtonBox
 
-from eric7 import Preferences, Utilities
+from eric7 import Preferences
 from eric7.EricGui import EricPixmapCache
 from eric7.EricWidgets.EricApplication import ericApp
 from eric7.EricWidgets.EricPathPicker import EricPathPickerModes
 from eric7.QScintilla.DocstringGenerator import getSupportedDocstringTypes
+from eric7.SystemUtilities import FileSystemUtilities, OSUtilities
 from eric7.Testing.Interfaces import FrameworkNames
 
 from .Ui_PropertiesDialog import Ui_PropertiesDialog
@@ -35,9 +36,14 @@
         Constructor
 
         @param project reference to the project object
+        @type Project
         @param new flag indicating the generation of a new project
-        @param parent parent widget of this dialog (QWidget)
-        @param name name of this dialog (string)
+            (defaults to True)
+        @type bool (optional)
+        @param parent parent widget of this dialog (defaults to None)
+        @type QWidget (optional)
+        @param name name of this dialog (defaults to None)
+        @type str (optional)
         """
         super().__init__(parent)
         if name:
@@ -58,6 +64,7 @@
         self.transPropertiesDlg = None
         self.spellPropertiesDlg = None
         self.makePropertiesDlg = None
+        self.__fileTypesDict = {}
 
         patterns = []
         for pattern, filetype in self.project.getProjectData(
@@ -79,10 +86,10 @@
         for projectType in sorted(projectTypes):
             self.projectTypeComboBox.addItem(projectType[0], projectType[1])
 
-        ipath = Preferences.getMultiProject("Workspace") or Utilities.getHomeDir()
+        ipath = Preferences.getMultiProject("Workspace") or OSUtilities.getHomeDir()
         self.__initPaths = [
-            Utilities.fromNativeSeparators(ipath),
-            Utilities.fromNativeSeparators(ipath) + "/",
+            FileSystemUtilities.fromNativeSeparators(ipath),
+            FileSystemUtilities.fromNativeSeparators(ipath) + "/",
         ]
 
         self.licenseComboBox.lineEdit().setClearButtonEnabled(True)
@@ -170,6 +177,14 @@
             if not self.project.vcsSoftwareAvailable():
                 self.vcsCheckBox.hide()
 
+        self.__origProgrammingLanguage = self.languageComboBox.currentText()
+        self.__origMixedFlag = self.mixedLanguageCheckBox.isChecked()
+        self.__origProjectType = self.getProjectType()
+
+        self.languageComboBox.currentTextChanged.connect(self.__initFileTypesDict)
+        self.mixedLanguageCheckBox.stateChanged.connect(self.__initFileTypesDict)
+        self.projectTypeComboBox.currentIndexChanged.connect(self.__initFileTypesDict)
+
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
             bool(self.dirPicker.text())
             and self.dirPicker.text() not in self.__initPaths
@@ -226,7 +241,8 @@
         @param txt name of the project directory (string)
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(txt) and Utilities.fromNativeSeparators(txt) not in self.__initPaths
+            bool(txt)
+            and FileSystemUtilities.fromNativeSeparators(txt) not in self.__initPaths
         )
 
     @pyqtSlot()
@@ -334,6 +350,53 @@
         """
         return os.path.abspath(self.dirPicker.text())
 
+    @pyqtSlot()
+    def __initFileTypesDict(self):
+        """
+        Private slot to (re-)initialize the filetype dictionary.
+        """
+        if (
+            self.__origProgrammingLanguage != self.languageComboBox.currentText()
+            or self.__origMixedFlag != self.mixedLanguageCheckBox.isChecked()
+            or self.__origProjectType != self.getProjectType()
+        ):
+            # any of the defining data got changed
+            self.__fileTypesDict = self.project.defaultFileTypes(
+                self.languageComboBox.currentText(),
+                self.mixedLanguageCheckBox.isChecked(),
+                self.getProjectType(),
+            )
+        else:
+            # all of the defining data was changed back to original
+            self.__fileTypesDict = self.project.getProjectData(dataKey="FILETYPES")
+
+    @pyqtSlot()
+    def on_filetypesButton_clicked(self):
+        """
+        Private slot to open a dialog to edit the filetype associations.
+        """
+        from .FiletypeAssociationDialog import FiletypeAssociationDialog
+
+        if not self.__fileTypesDict:
+            self.__fileTypesDict = self.project.getProjectData(dataKey="FILETYPES")
+            if (
+                not self.__fileTypesDict
+                or self.__origProgrammingLanguage != self.languageComboBox.currentText()
+                or self.__origMixedFlag != self.mixedLanguageCheckBox.isChecked()
+                or self.__origProjectType != self.getProjectType()
+            ):
+                # the associations were not defined yet or any of the defining data got
+                # changed
+                self.__fileTypesDict = self.project.defaultFileTypes(
+                    self.languageComboBox.currentText(),
+                    self.mixedLanguageCheckBox.isChecked(),
+                    self.getProjectType(),
+                )
+
+        dlg = FiletypeAssociationDialog(self.project, self.__fileTypesDict)
+        if dlg.exec() == QDialog.DialogCode.Accepted:
+            self.__fileTypesDict = dlg.getData()
+
     def storeData(self):
         """
         Public method to store the entered/modified data.
@@ -400,3 +463,6 @@
         self.project.setProjectData(
             self.embeddedVenvCheckBox.isChecked(), dataKey="EMBEDDED_VENV"
         )
+
+        if self.__fileTypesDict:
+            self.project.setProjectData(self.__fileTypesDict, dataKey="FILETYPES")

eric ide

mercurial