--- 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")