src/eric7/Project/PropertiesDialog.py

branch
eric7-maintenance
changeset 10814
ba20efe10336
parent 10616
4aa36fcd4a30
parent 10632
1109854f15f9
child 11019
27cd57e98461
--- a/src/eric7/Project/PropertiesDialog.py	Sun Jun 02 09:51:47 2024 +0200
+++ b/src/eric7/Project/PropertiesDialog.py	Wed Jul 03 09:20:41 2024 +0200
@@ -31,7 +31,7 @@
     Class implementing the project properties dialog.
     """
 
-    def __init__(self, project, new=True, parent=None, name=None):
+    def __init__(self, project, new=True, isRemote=False, parent=None, name=None):
         """
         Constructor
 
@@ -40,6 +40,8 @@
         @param new flag indicating the generation of a new project
             (defaults to True)
         @type bool (optional)
+        @param isRemote flag indicating a remote project (defaults to False)
+        @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)
@@ -50,9 +52,19 @@
             self.setObjectName(name)
         self.setupUi(self)
 
+        self.__remoteProject = isRemote
+        self.__remotefsInterface = (
+            ericApp().getObject("EricServer").getServiceInterface("FileSystem")
+        )
+
         self.dirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
+        self.dirPicker.setRemote(isRemote)
+
         self.srcDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
+        self.srcDirPicker.setRemote(isRemote)
+
         self.mainscriptPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
+        self.mainscriptPicker.setRemote(isRemote)
 
         self.makeButton.setIcon(EricPixmapCache.getIcon("makefile"))
 
@@ -62,11 +74,19 @@
 
         self.project = project
         self.newProject = new
+
         self.transPropertiesDlg = None
         self.spellPropertiesDlg = None
         self.makePropertiesDlg = None
         self.__fileTypesDict = {}
 
+        if self.__remoteProject:
+            # some stuff is not supported for remote projects
+            self.makeCheckBox.setEnabled(False)
+            self.makeButton.setEnabled(False)
+            self.testingFrameworkComboBox.setEnabled(False)
+            self.embeddedVenvCheckBox.setEnabled(False)
+            self.spellPropertiesButton.setEnabled(False)
         self.languageComboBox.addItems(project.getProgrammingLanguages())
 
         projectTypes = []
@@ -76,18 +96,28 @@
         for projectType in sorted(projectTypes):
             self.projectTypeComboBox.addItem(projectType[0], projectType[1])
 
-        ipath = Preferences.getMultiProject("Workspace") or OSUtilities.getHomeDir()
-        self.__initPaths = [
-            FileSystemUtilities.fromNativeSeparators(ipath),
-            FileSystemUtilities.fromNativeSeparators(ipath) + "/",
-        ]
+        if self.__remoteProject:
+            self.__initPaths = [self.__remotefsInterface.getcwd()]
+        else:
+            ipath = Preferences.getMultiProject("Workspace") or OSUtilities.getHomeDir()
+            self.__initPaths = [
+                FileSystemUtilities.fromNativeSeparators(ipath),
+                FileSystemUtilities.fromNativeSeparators(ipath) + "/",
+            ]
 
         self.licenseComboBox.lineEdit().setClearButtonEnabled(True)
         self.__populateLicenseComboBox()
 
         if not new:
-            name = os.path.splitext(self.project.pfile)[0]
-            self.nameEdit.setText(os.path.basename(name))
+            self.nameEdit.setReadOnly(True)
+            self.dirPicker.setReadOnly(True)
+
+            if self.__remoteProject:
+                name = self.__remotefsInterface.splitext(self.project.pfile)[0]
+                self.nameEdit.setText(self.__remotefsInterface.basename(name))
+            else:
+                name = os.path.splitext(self.project.pfile)[0]
+                self.nameEdit.setText(os.path.basename(name))
             self.nameEdit.setReadOnly(True)
             self.languageComboBox.setCurrentIndex(
                 self.languageComboBox.findText(
@@ -116,40 +146,53 @@
             )
             self.eolComboBox.setCurrentIndex(self.project.getProjectData(dataKey="EOL"))
             self.vcsLabel.show()
-            if self.project.vcs is not None:
-                vcsSystemsDict = (
-                    ericApp()
-                    .getObject("PluginManager")
-                    .getPluginDisplayStrings("version_control")
+            if not self.__remoteProject:
+                # VCS not supported for remote projects
+                if self.project.vcs is not None:
+                    vcsSystemsDict = (
+                        ericApp()
+                        .getObject("PluginManager")
+                        .getPluginDisplayStrings("version_control")
+                    )
+                    try:
+                        vcsSystemDisplay = vcsSystemsDict[
+                            self.project.getProjectData(dataKey="VCS")
+                        ]
+                    except KeyError:
+                        vcsSystemDisplay = "None"
+                    self.vcsLabel.setText(
+                        self.tr(
+                            "The project is version controlled by <b>{0}</b>."
+                        ).format(vcsSystemDisplay)
+                    )
+                    self.vcsInfoButton.show()
+                else:
+                    self.vcsLabel.setText(
+                        self.tr("The project is not version controlled.")
+                    )
+                    self.vcsInfoButton.hide()
+            else:
+                self.vcsLabel.setText(
+                    self.tr("Version control is not available for remote projects.")
                 )
-                try:
-                    vcsSystemDisplay = vcsSystemsDict[
-                        self.project.getProjectData(dataKey="VCS")
-                    ]
-                except KeyError:
-                    vcsSystemDisplay = "None"
-                self.vcsLabel.setText(
-                    self.tr("The project is version controlled by <b>{0}</b>.").format(
-                        vcsSystemDisplay
-                    )
-                )
-                self.vcsInfoButton.show()
-            else:
-                self.vcsLabel.setText(self.tr("The project is not version controlled."))
                 self.vcsInfoButton.hide()
             self.vcsCheckBox.hide()
-            self.makeCheckBox.setChecked(
-                self.project.getProjectData(dataKey="MAKEPARAMS")["MakeEnabled"]
-            )
+            if self.__remoteProject:
+                self.makeCheckBox.setChecked(False)
+            else:
+                self.makeCheckBox.setChecked(
+                    self.project.getProjectData(dataKey="MAKEPARAMS")["MakeEnabled"]
+                )
             cindex = self.docstringStyleComboBox.findData(
                 self.project.getProjectData(dataKey="DOCSTRING")
             )
             self.docstringStyleComboBox.setCurrentIndex(cindex)
-            with contextlib.suppress(KeyError):
-                cindex = self.testingFrameworkComboBox.findData(
-                    self.project.getProjectData(dataKey="TESTING_FRAMEWORK")
-                )
-                self.testingFrameworkComboBox.setCurrentIndex(cindex)
+            if not self.__remoteProject:
+                with contextlib.suppress(KeyError):
+                    cindex = self.testingFrameworkComboBox.findData(
+                        self.project.getProjectData(dataKey="TESTING_FRAMEWORK")
+                    )
+                    self.testingFrameworkComboBox.setCurrentIndex(cindex)
             with contextlib.suppress(KeyError):
                 self.licenseComboBox.setCurrentText(
                     self.project.getProjectData(dataKey="LICENSE")
@@ -166,7 +209,7 @@
             self.versionEdit.setText("0.1")
             self.vcsLabel.hide()
             self.vcsInfoButton.hide()
-            if not self.project.vcsSoftwareAvailable():
+            if self.__remoteProject or not self.project.vcsSoftwareAvailable():
                 self.vcsCheckBox.hide()
 
         self.__origProgrammingLanguage = self.languageComboBox.currentText()
@@ -252,10 +295,17 @@
         @param txt name of the project directory
         @type str
         """
-        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(txt)
-            and FileSystemUtilities.fromNativeSeparators(txt) not in self.__initPaths
-        )
+        if self.__remoteProject:
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+                FileSystemUtilities.isRemoteFileName(txt)
+                and txt not in self.__initPaths
+            )
+        else:
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+                bool(txt)
+                and FileSystemUtilities.fromNativeSeparators(txt)
+                not in self.__initPaths
+            )
 
     @pyqtSlot(str)
     def on_srcDirPicker_pathSelected(self, srcDir):
@@ -268,7 +318,13 @@
         if srcDir:
             ppath = self.dirPicker.text()
             if ppath:
-                ppath = QDir(ppath).absolutePath() + QDir.separator()
+                if self.__remoteProject:
+                    ppath = (
+                        FileSystemUtilities.remoteFileName(ppath)
+                        + self.__remotefsInterface.separator()
+                    )
+                else:
+                    ppath = os.path.abspath(ppath) + os.sep
                 srcDir = srcDir.replace(ppath, "")
             self.srcDirPicker.setText(srcDir)
 
@@ -280,7 +336,10 @@
         """
         ppath = self.dirPicker.text()
         if not ppath:
-            ppath = QDir.currentPath()
+            if self.__remoteProject:
+                ppath = self.__remotefsInterface.getcwd()
+            else:
+                ppath = QDir.currentPath()
         self.srcDirPicker.setDefaultDirectory(ppath)
 
     @pyqtSlot()
@@ -307,7 +366,7 @@
 
         if self.transPropertiesDlg is None:
             self.transPropertiesDlg = TranslationPropertiesDialog(
-                self.project, self.newProject, self
+                self.project, self.newProject, self, isRemote=self.__remoteProject
             )
         else:
             self.transPropertiesDlg.initFilters()
@@ -341,7 +400,13 @@
         if script:
             ppath = self.dirPicker.text()
             if ppath:
-                ppath = QDir(ppath).absolutePath() + QDir.separator()
+                if self.__remoteProject:
+                    ppath = (
+                        FileSystemUtilities.remoteFileName(ppath)
+                        + self.__remotefsInterface.separator()
+                    )
+                else:
+                    ppath = os.path.abspath(ppath) + os.sep
                 script = script.replace(ppath, "")
             self.mainscriptPicker.setText(script)
 
@@ -353,7 +418,10 @@
         """
         ppath = self.dirPicker.text()
         if not ppath:
-            ppath = QDir.currentPath()
+            if self.__remoteProject:
+                ppath = self.__remotefsInterface.getcwd()
+            else:
+                ppath = QDir.currentPath()
         self.mainscriptPicker.setDefaultDirectory(ppath)
 
     @pyqtSlot()
@@ -388,7 +456,10 @@
         @return data of the project directory edit
         @rtype str
         """
-        return os.path.abspath(self.dirPicker.text())
+        if self.__remoteProject:
+            return FileSystemUtilities.remoteFileName(self.dirPicker.text())
+        else:
+            return os.path.abspath(self.dirPicker.text())
 
     @pyqtSlot()
     def __initFileTypesDict(self, force=False):
@@ -445,18 +516,35 @@
 
         self.__setMainScriptPickerFilters()
 
+        self.__setMainScriptPickerFilters()
+
     def storeData(self):
         """
         Public method to store the entered/modified data.
         """
-        self.project.ppath = os.path.abspath(self.dirPicker.text())
-        fn = self.nameEdit.text()
-        if fn:
-            self.project.name = fn
-            fn = f"{fn}.epj"
-            self.project.pfile = os.path.join(self.project.ppath, fn)
-        else:
-            self.project.pfile = ""
+        if self.newProject:
+            if self.__remoteProject:
+                self.project.ppath = FileSystemUtilities.remoteFileName(
+                    self.__remotefsInterface.abspath(self.dirPicker.text())
+                )
+                fn = self.nameEdit.text()
+                if fn:
+                    self.project.name = fn
+                    fn = f"{fn}.epj"
+                    self.project.pfile = self.__remotefsInterface.join(
+                        self.project.ppath, fn
+                    )
+                else:
+                    self.project.pfile = ""
+            else:
+                self.project.ppath = os.path.abspath(self.dirPicker.text())
+                fn = self.nameEdit.text()
+                if fn:
+                    self.project.name = fn
+                    fn = f"{fn}.epj"
+                    self.project.pfile = os.path.join(self.project.ppath, fn)
+                else:
+                    self.project.pfile = ""
         self.project.setProjectData(self.versionEdit.text(), dataKey="VERSION")
         srcDir = self.srcDirPicker.text()
         if srcDir:
@@ -468,7 +556,10 @@
         if fn:
             fn = self.project.getRelativePath(fn)
             self.project.setProjectData(fn, dataKey="MAINSCRIPT")
-            self.project.translationsRoot = os.path.splitext(fn)[0]
+            if self.__remoteProject:
+                self.project.translationsRoot = self.__remotefsInterface.splitext(fn)[0]
+            else:
+                self.project.translationsRoot = os.path.splitext(fn)[0]
         else:
             self.project.setProjectData("", dataKey="MAINSCRIPT")
             self.project.translationsRoot = ""

eric ide

mercurial