src/eric7/Project/PropertiesDialog.py

branch
eric7-maintenance
changeset 10814
ba20efe10336
parent 10616
4aa36fcd4a30
parent 10632
1109854f15f9
child 11019
27cd57e98461
equal deleted inserted replaced
10734:2b015db9761a 10814:ba20efe10336
29 class PropertiesDialog(QDialog, Ui_PropertiesDialog): 29 class PropertiesDialog(QDialog, Ui_PropertiesDialog):
30 """ 30 """
31 Class implementing the project properties dialog. 31 Class implementing the project properties dialog.
32 """ 32 """
33 33
34 def __init__(self, project, new=True, parent=None, name=None): 34 def __init__(self, project, new=True, isRemote=False, parent=None, name=None):
35 """ 35 """
36 Constructor 36 Constructor
37 37
38 @param project reference to the project object 38 @param project reference to the project object
39 @type Project 39 @type Project
40 @param new flag indicating the generation of a new project 40 @param new flag indicating the generation of a new project
41 (defaults to True) 41 (defaults to True)
42 @type bool (optional) 42 @type bool (optional)
43 @param isRemote flag indicating a remote project (defaults to False)
44 @type bool (optional)
43 @param parent parent widget of this dialog (defaults to None) 45 @param parent parent widget of this dialog (defaults to None)
44 @type QWidget (optional) 46 @type QWidget (optional)
45 @param name name of this dialog (defaults to None) 47 @param name name of this dialog (defaults to None)
46 @type str (optional) 48 @type str (optional)
47 """ 49 """
48 super().__init__(parent) 50 super().__init__(parent)
49 if name: 51 if name:
50 self.setObjectName(name) 52 self.setObjectName(name)
51 self.setupUi(self) 53 self.setupUi(self)
52 54
55 self.__remoteProject = isRemote
56 self.__remotefsInterface = (
57 ericApp().getObject("EricServer").getServiceInterface("FileSystem")
58 )
59
53 self.dirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE) 60 self.dirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
61 self.dirPicker.setRemote(isRemote)
62
54 self.srcDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE) 63 self.srcDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
64 self.srcDirPicker.setRemote(isRemote)
65
55 self.mainscriptPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE) 66 self.mainscriptPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
67 self.mainscriptPicker.setRemote(isRemote)
56 68
57 self.makeButton.setIcon(EricPixmapCache.getIcon("makefile")) 69 self.makeButton.setIcon(EricPixmapCache.getIcon("makefile"))
58 70
59 self.docstringStyleComboBox.addItem(self.tr("None"), "") 71 self.docstringStyleComboBox.addItem(self.tr("None"), "")
60 for docstringType, docstringStyle in sorted(getSupportedDocstringTypes()): 72 for docstringType, docstringStyle in sorted(getSupportedDocstringTypes()):
61 self.docstringStyleComboBox.addItem(docstringStyle, docstringType) 73 self.docstringStyleComboBox.addItem(docstringStyle, docstringType)
62 74
63 self.project = project 75 self.project = project
64 self.newProject = new 76 self.newProject = new
77
65 self.transPropertiesDlg = None 78 self.transPropertiesDlg = None
66 self.spellPropertiesDlg = None 79 self.spellPropertiesDlg = None
67 self.makePropertiesDlg = None 80 self.makePropertiesDlg = None
68 self.__fileTypesDict = {} 81 self.__fileTypesDict = {}
69 82
83 if self.__remoteProject:
84 # some stuff is not supported for remote projects
85 self.makeCheckBox.setEnabled(False)
86 self.makeButton.setEnabled(False)
87 self.testingFrameworkComboBox.setEnabled(False)
88 self.embeddedVenvCheckBox.setEnabled(False)
89 self.spellPropertiesButton.setEnabled(False)
70 self.languageComboBox.addItems(project.getProgrammingLanguages()) 90 self.languageComboBox.addItems(project.getProgrammingLanguages())
71 91
72 projectTypes = [] 92 projectTypes = []
73 for projectTypeItem in project.getProjectTypes().items(): 93 for projectTypeItem in project.getProjectTypes().items():
74 projectTypes.append((projectTypeItem[1], projectTypeItem[0])) 94 projectTypes.append((projectTypeItem[1], projectTypeItem[0]))
75 self.projectTypeComboBox.clear() 95 self.projectTypeComboBox.clear()
76 for projectType in sorted(projectTypes): 96 for projectType in sorted(projectTypes):
77 self.projectTypeComboBox.addItem(projectType[0], projectType[1]) 97 self.projectTypeComboBox.addItem(projectType[0], projectType[1])
78 98
79 ipath = Preferences.getMultiProject("Workspace") or OSUtilities.getHomeDir() 99 if self.__remoteProject:
80 self.__initPaths = [ 100 self.__initPaths = [self.__remotefsInterface.getcwd()]
81 FileSystemUtilities.fromNativeSeparators(ipath), 101 else:
82 FileSystemUtilities.fromNativeSeparators(ipath) + "/", 102 ipath = Preferences.getMultiProject("Workspace") or OSUtilities.getHomeDir()
83 ] 103 self.__initPaths = [
104 FileSystemUtilities.fromNativeSeparators(ipath),
105 FileSystemUtilities.fromNativeSeparators(ipath) + "/",
106 ]
84 107
85 self.licenseComboBox.lineEdit().setClearButtonEnabled(True) 108 self.licenseComboBox.lineEdit().setClearButtonEnabled(True)
86 self.__populateLicenseComboBox() 109 self.__populateLicenseComboBox()
87 110
88 if not new: 111 if not new:
89 name = os.path.splitext(self.project.pfile)[0] 112 self.nameEdit.setReadOnly(True)
90 self.nameEdit.setText(os.path.basename(name)) 113 self.dirPicker.setReadOnly(True)
114
115 if self.__remoteProject:
116 name = self.__remotefsInterface.splitext(self.project.pfile)[0]
117 self.nameEdit.setText(self.__remotefsInterface.basename(name))
118 else:
119 name = os.path.splitext(self.project.pfile)[0]
120 self.nameEdit.setText(os.path.basename(name))
91 self.nameEdit.setReadOnly(True) 121 self.nameEdit.setReadOnly(True)
92 self.languageComboBox.setCurrentIndex( 122 self.languageComboBox.setCurrentIndex(
93 self.languageComboBox.findText( 123 self.languageComboBox.findText(
94 self.project.getProjectData(dataKey="PROGLANGUAGE") 124 self.project.getProjectData(dataKey="PROGLANGUAGE")
95 ) 125 )
114 self.descriptionEdit.setPlainText( 144 self.descriptionEdit.setPlainText(
115 self.project.getProjectData(dataKey="DESCRIPTION") 145 self.project.getProjectData(dataKey="DESCRIPTION")
116 ) 146 )
117 self.eolComboBox.setCurrentIndex(self.project.getProjectData(dataKey="EOL")) 147 self.eolComboBox.setCurrentIndex(self.project.getProjectData(dataKey="EOL"))
118 self.vcsLabel.show() 148 self.vcsLabel.show()
119 if self.project.vcs is not None: 149 if not self.__remoteProject:
120 vcsSystemsDict = ( 150 # VCS not supported for remote projects
121 ericApp() 151 if self.project.vcs is not None:
122 .getObject("PluginManager") 152 vcsSystemsDict = (
123 .getPluginDisplayStrings("version_control") 153 ericApp()
154 .getObject("PluginManager")
155 .getPluginDisplayStrings("version_control")
156 )
157 try:
158 vcsSystemDisplay = vcsSystemsDict[
159 self.project.getProjectData(dataKey="VCS")
160 ]
161 except KeyError:
162 vcsSystemDisplay = "None"
163 self.vcsLabel.setText(
164 self.tr(
165 "The project is version controlled by <b>{0}</b>."
166 ).format(vcsSystemDisplay)
167 )
168 self.vcsInfoButton.show()
169 else:
170 self.vcsLabel.setText(
171 self.tr("The project is not version controlled.")
172 )
173 self.vcsInfoButton.hide()
174 else:
175 self.vcsLabel.setText(
176 self.tr("Version control is not available for remote projects.")
124 ) 177 )
125 try:
126 vcsSystemDisplay = vcsSystemsDict[
127 self.project.getProjectData(dataKey="VCS")
128 ]
129 except KeyError:
130 vcsSystemDisplay = "None"
131 self.vcsLabel.setText(
132 self.tr("The project is version controlled by <b>{0}</b>.").format(
133 vcsSystemDisplay
134 )
135 )
136 self.vcsInfoButton.show()
137 else:
138 self.vcsLabel.setText(self.tr("The project is not version controlled."))
139 self.vcsInfoButton.hide() 178 self.vcsInfoButton.hide()
140 self.vcsCheckBox.hide() 179 self.vcsCheckBox.hide()
141 self.makeCheckBox.setChecked( 180 if self.__remoteProject:
142 self.project.getProjectData(dataKey="MAKEPARAMS")["MakeEnabled"] 181 self.makeCheckBox.setChecked(False)
143 ) 182 else:
183 self.makeCheckBox.setChecked(
184 self.project.getProjectData(dataKey="MAKEPARAMS")["MakeEnabled"]
185 )
144 cindex = self.docstringStyleComboBox.findData( 186 cindex = self.docstringStyleComboBox.findData(
145 self.project.getProjectData(dataKey="DOCSTRING") 187 self.project.getProjectData(dataKey="DOCSTRING")
146 ) 188 )
147 self.docstringStyleComboBox.setCurrentIndex(cindex) 189 self.docstringStyleComboBox.setCurrentIndex(cindex)
148 with contextlib.suppress(KeyError): 190 if not self.__remoteProject:
149 cindex = self.testingFrameworkComboBox.findData( 191 with contextlib.suppress(KeyError):
150 self.project.getProjectData(dataKey="TESTING_FRAMEWORK") 192 cindex = self.testingFrameworkComboBox.findData(
151 ) 193 self.project.getProjectData(dataKey="TESTING_FRAMEWORK")
152 self.testingFrameworkComboBox.setCurrentIndex(cindex) 194 )
195 self.testingFrameworkComboBox.setCurrentIndex(cindex)
153 with contextlib.suppress(KeyError): 196 with contextlib.suppress(KeyError):
154 self.licenseComboBox.setCurrentText( 197 self.licenseComboBox.setCurrentText(
155 self.project.getProjectData(dataKey="LICENSE") 198 self.project.getProjectData(dataKey="LICENSE")
156 ) 199 )
157 self.embeddedVenvCheckBox.setChecked( 200 self.embeddedVenvCheckBox.setChecked(
164 ) 207 )
165 self.dirPicker.setText(self.__initPaths[0]) 208 self.dirPicker.setText(self.__initPaths[0])
166 self.versionEdit.setText("0.1") 209 self.versionEdit.setText("0.1")
167 self.vcsLabel.hide() 210 self.vcsLabel.hide()
168 self.vcsInfoButton.hide() 211 self.vcsInfoButton.hide()
169 if not self.project.vcsSoftwareAvailable(): 212 if self.__remoteProject or not self.project.vcsSoftwareAvailable():
170 self.vcsCheckBox.hide() 213 self.vcsCheckBox.hide()
171 214
172 self.__origProgrammingLanguage = self.languageComboBox.currentText() 215 self.__origProgrammingLanguage = self.languageComboBox.currentText()
173 self.__origMixedFlag = self.mixedLanguageCheckBox.isChecked() 216 self.__origMixedFlag = self.mixedLanguageCheckBox.isChecked()
174 self.__origProjectType = self.getProjectType() 217 self.__origProjectType = self.getProjectType()
250 Private slot to handle a change of the project directory. 293 Private slot to handle a change of the project directory.
251 294
252 @param txt name of the project directory 295 @param txt name of the project directory
253 @type str 296 @type str
254 """ 297 """
255 self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled( 298 if self.__remoteProject:
256 bool(txt) 299 self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
257 and FileSystemUtilities.fromNativeSeparators(txt) not in self.__initPaths 300 FileSystemUtilities.isRemoteFileName(txt)
258 ) 301 and txt not in self.__initPaths
302 )
303 else:
304 self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
305 bool(txt)
306 and FileSystemUtilities.fromNativeSeparators(txt)
307 not in self.__initPaths
308 )
259 309
260 @pyqtSlot(str) 310 @pyqtSlot(str)
261 def on_srcDirPicker_pathSelected(self, srcDir): 311 def on_srcDirPicker_pathSelected(self, srcDir):
262 """ 312 """
263 Private slot to check the selected sources sub-directory name. 313 Private slot to check the selected sources sub-directory name.
266 @type str 316 @type str
267 """ 317 """
268 if srcDir: 318 if srcDir:
269 ppath = self.dirPicker.text() 319 ppath = self.dirPicker.text()
270 if ppath: 320 if ppath:
271 ppath = QDir(ppath).absolutePath() + QDir.separator() 321 if self.__remoteProject:
322 ppath = (
323 FileSystemUtilities.remoteFileName(ppath)
324 + self.__remotefsInterface.separator()
325 )
326 else:
327 ppath = os.path.abspath(ppath) + os.sep
272 srcDir = srcDir.replace(ppath, "") 328 srcDir = srcDir.replace(ppath, "")
273 self.srcDirPicker.setText(srcDir) 329 self.srcDirPicker.setText(srcDir)
274 330
275 @pyqtSlot() 331 @pyqtSlot()
276 def on_srcDirPicker_aboutToShowPathPickerDialog(self): 332 def on_srcDirPicker_aboutToShowPathPickerDialog(self):
278 Private slot to perform actions before the sources sub-directory selection 334 Private slot to perform actions before the sources sub-directory selection
279 dialog is shown. 335 dialog is shown.
280 """ 336 """
281 ppath = self.dirPicker.text() 337 ppath = self.dirPicker.text()
282 if not ppath: 338 if not ppath:
283 ppath = QDir.currentPath() 339 if self.__remoteProject:
340 ppath = self.__remotefsInterface.getcwd()
341 else:
342 ppath = QDir.currentPath()
284 self.srcDirPicker.setDefaultDirectory(ppath) 343 self.srcDirPicker.setDefaultDirectory(ppath)
285 344
286 @pyqtSlot() 345 @pyqtSlot()
287 def on_spellPropertiesButton_clicked(self): 346 def on_spellPropertiesButton_clicked(self):
288 """ 347 """
305 """ 364 """
306 from .TranslationPropertiesDialog import TranslationPropertiesDialog 365 from .TranslationPropertiesDialog import TranslationPropertiesDialog
307 366
308 if self.transPropertiesDlg is None: 367 if self.transPropertiesDlg is None:
309 self.transPropertiesDlg = TranslationPropertiesDialog( 368 self.transPropertiesDlg = TranslationPropertiesDialog(
310 self.project, self.newProject, self 369 self.project, self.newProject, self, isRemote=self.__remoteProject
311 ) 370 )
312 else: 371 else:
313 self.transPropertiesDlg.initFilters() 372 self.transPropertiesDlg.initFilters()
314 res = self.transPropertiesDlg.exec() 373 res = self.transPropertiesDlg.exec()
315 if res == QDialog.DialogCode.Rejected: 374 if res == QDialog.DialogCode.Rejected:
339 @type str 398 @type str
340 """ 399 """
341 if script: 400 if script:
342 ppath = self.dirPicker.text() 401 ppath = self.dirPicker.text()
343 if ppath: 402 if ppath:
344 ppath = QDir(ppath).absolutePath() + QDir.separator() 403 if self.__remoteProject:
404 ppath = (
405 FileSystemUtilities.remoteFileName(ppath)
406 + self.__remotefsInterface.separator()
407 )
408 else:
409 ppath = os.path.abspath(ppath) + os.sep
345 script = script.replace(ppath, "") 410 script = script.replace(ppath, "")
346 self.mainscriptPicker.setText(script) 411 self.mainscriptPicker.setText(script)
347 412
348 @pyqtSlot() 413 @pyqtSlot()
349 def on_mainscriptPicker_aboutToShowPathPickerDialog(self): 414 def on_mainscriptPicker_aboutToShowPathPickerDialog(self):
351 Private slot to perform actions before the main script selection dialog 416 Private slot to perform actions before the main script selection dialog
352 is shown. 417 is shown.
353 """ 418 """
354 ppath = self.dirPicker.text() 419 ppath = self.dirPicker.text()
355 if not ppath: 420 if not ppath:
356 ppath = QDir.currentPath() 421 if self.__remoteProject:
422 ppath = self.__remotefsInterface.getcwd()
423 else:
424 ppath = QDir.currentPath()
357 self.mainscriptPicker.setDefaultDirectory(ppath) 425 self.mainscriptPicker.setDefaultDirectory(ppath)
358 426
359 @pyqtSlot() 427 @pyqtSlot()
360 def on_vcsInfoButton_clicked(self): 428 def on_vcsInfoButton_clicked(self):
361 """ 429 """
386 Public method to get the project path. 454 Public method to get the project path.
387 455
388 @return data of the project directory edit 456 @return data of the project directory edit
389 @rtype str 457 @rtype str
390 """ 458 """
391 return os.path.abspath(self.dirPicker.text()) 459 if self.__remoteProject:
460 return FileSystemUtilities.remoteFileName(self.dirPicker.text())
461 else:
462 return os.path.abspath(self.dirPicker.text())
392 463
393 @pyqtSlot() 464 @pyqtSlot()
394 def __initFileTypesDict(self, force=False): 465 def __initFileTypesDict(self, force=False):
395 """ 466 """
396 Private slot to (re-)initialize the filetype dictionary. 467 Private slot to (re-)initialize the filetype dictionary.
443 if dlg.exec() == QDialog.DialogCode.Accepted: 514 if dlg.exec() == QDialog.DialogCode.Accepted:
444 self.__fileTypesDict = dlg.getData() 515 self.__fileTypesDict = dlg.getData()
445 516
446 self.__setMainScriptPickerFilters() 517 self.__setMainScriptPickerFilters()
447 518
519 self.__setMainScriptPickerFilters()
520
448 def storeData(self): 521 def storeData(self):
449 """ 522 """
450 Public method to store the entered/modified data. 523 Public method to store the entered/modified data.
451 """ 524 """
452 self.project.ppath = os.path.abspath(self.dirPicker.text()) 525 if self.newProject:
453 fn = self.nameEdit.text() 526 if self.__remoteProject:
454 if fn: 527 self.project.ppath = FileSystemUtilities.remoteFileName(
455 self.project.name = fn 528 self.__remotefsInterface.abspath(self.dirPicker.text())
456 fn = f"{fn}.epj" 529 )
457 self.project.pfile = os.path.join(self.project.ppath, fn) 530 fn = self.nameEdit.text()
458 else: 531 if fn:
459 self.project.pfile = "" 532 self.project.name = fn
533 fn = f"{fn}.epj"
534 self.project.pfile = self.__remotefsInterface.join(
535 self.project.ppath, fn
536 )
537 else:
538 self.project.pfile = ""
539 else:
540 self.project.ppath = os.path.abspath(self.dirPicker.text())
541 fn = self.nameEdit.text()
542 if fn:
543 self.project.name = fn
544 fn = f"{fn}.epj"
545 self.project.pfile = os.path.join(self.project.ppath, fn)
546 else:
547 self.project.pfile = ""
460 self.project.setProjectData(self.versionEdit.text(), dataKey="VERSION") 548 self.project.setProjectData(self.versionEdit.text(), dataKey="VERSION")
461 srcDir = self.srcDirPicker.text() 549 srcDir = self.srcDirPicker.text()
462 if srcDir: 550 if srcDir:
463 srcDir = self.project.getRelativePath(srcDir) 551 srcDir = self.project.getRelativePath(srcDir)
464 self.project.setProjectData(srcDir, dataKey="SOURCESDIR") 552 self.project.setProjectData(srcDir, dataKey="SOURCESDIR")
466 self.project.setProjectData("", dataKey="SOURCESDIR") 554 self.project.setProjectData("", dataKey="SOURCESDIR")
467 fn = self.mainscriptPicker.text() 555 fn = self.mainscriptPicker.text()
468 if fn: 556 if fn:
469 fn = self.project.getRelativePath(fn) 557 fn = self.project.getRelativePath(fn)
470 self.project.setProjectData(fn, dataKey="MAINSCRIPT") 558 self.project.setProjectData(fn, dataKey="MAINSCRIPT")
471 self.project.translationsRoot = os.path.splitext(fn)[0] 559 if self.__remoteProject:
560 self.project.translationsRoot = self.__remotefsInterface.splitext(fn)[0]
561 else:
562 self.project.translationsRoot = os.path.splitext(fn)[0]
472 else: 563 else:
473 self.project.setProjectData("", dataKey="MAINSCRIPT") 564 self.project.setProjectData("", dataKey="MAINSCRIPT")
474 self.project.translationsRoot = "" 565 self.project.translationsRoot = ""
475 self.project.setProjectData(self.authorEdit.text(), dataKey="AUTHOR") 566 self.project.setProjectData(self.authorEdit.text(), dataKey="AUTHOR")
476 self.project.setProjectData(self.emailEdit.text(), dataKey="EMAIL") 567 self.project.setProjectData(self.emailEdit.text(), dataKey="EMAIL")

eric ide

mercurial