26 |
26 |
27 class EricapiConfigDialog(QDialog, Ui_EricapiConfigDialog): |
27 class EricapiConfigDialog(QDialog, Ui_EricapiConfigDialog): |
28 """ |
28 """ |
29 Class implementing a dialog to enter the parameters for eric7_api. |
29 Class implementing a dialog to enter the parameters for eric7_api. |
30 """ |
30 """ |
|
31 |
31 def __init__(self, project, parms=None, parent=None): |
32 def __init__(self, project, parms=None, parent=None): |
32 """ |
33 """ |
33 Constructor |
34 Constructor |
34 |
35 |
35 @param project reference to the project object (Project.Project) |
36 @param project reference to the project object (Project.Project) |
36 @param parms parameters to set in the dialog |
37 @param parms parameters to set in the dialog |
37 @param parent parent widget of this dialog |
38 @param parent parent widget of this dialog |
38 """ |
39 """ |
39 super().__init__(parent) |
40 super().__init__(parent) |
40 self.setupUi(self) |
41 self.setupUi(self) |
41 |
42 |
42 self.startDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE) |
43 self.startDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE) |
43 self.startDirPicker.setDefaultDirectory(project.getProjectPath()) |
44 self.startDirPicker.setDefaultDirectory(project.getProjectPath()) |
44 |
45 |
45 self.outputFilePicker.setMode(EricPathPickerModes.SAVE_FILE_MODE) |
46 self.outputFilePicker.setMode(EricPathPickerModes.SAVE_FILE_MODE) |
46 self.outputFilePicker.setDefaultDirectory(project.getProjectPath()) |
47 self.outputFilePicker.setDefaultDirectory(project.getProjectPath()) |
47 self.outputFilePicker.setFilters(self.tr( |
48 self.outputFilePicker.setFilters(self.tr("API files (*.api);;All files (*)")) |
48 "API files (*.api);;All files (*)")) |
49 |
49 |
|
50 self.ignoreDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE) |
50 self.ignoreDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE) |
51 self.ignoreDirPicker.setDefaultDirectory(project.getProjectPath()) |
51 self.ignoreDirPicker.setDefaultDirectory(project.getProjectPath()) |
52 |
52 |
53 self.buttonBox.button( |
53 self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False) |
54 QDialogButtonBox.StandardButton.Ok).setEnabled(False) |
|
55 for language in sorted( |
54 for language in sorted( |
56 DocumentationTools.supportedExtensionsDictForApis.keys()): |
55 DocumentationTools.supportedExtensionsDictForApis.keys() |
|
56 ): |
57 self.languagesList.addItem(language) |
57 self.languagesList.addItem(language) |
58 |
58 |
59 self.ppath = project.getProjectPath() |
59 self.ppath = project.getProjectPath() |
60 self.project = project |
60 self.project = project |
61 |
61 |
62 self.__initializeDefaults() |
62 self.__initializeDefaults() |
63 |
63 |
64 # get a copy of the defaults to store the user settings |
64 # get a copy of the defaults to store the user settings |
65 self.parameters = copy.deepcopy(self.defaults) |
65 self.parameters = copy.deepcopy(self.defaults) |
66 |
66 |
67 # combine it with the values of parms |
67 # combine it with the values of parms |
68 if parms is not None: |
68 if parms is not None: |
69 self.parameters.update(parms) |
69 self.parameters.update(parms) |
70 self.parameters["startDirectory"] = Utilities.toNativeSeparators( |
70 self.parameters["startDirectory"] = Utilities.toNativeSeparators( |
71 self.parameters['startDirectory'] |
71 self.parameters["startDirectory"] |
72 ) |
72 ) |
73 self.parameters['outputFile'] = Utilities.toNativeSeparators( |
73 self.parameters["outputFile"] = Utilities.toNativeSeparators( |
74 self.parameters['outputFile']) |
74 self.parameters["outputFile"] |
75 |
75 ) |
76 self.recursionCheckBox.setChecked(self.parameters['useRecursion']) |
76 |
77 self.includePrivateCheckBox.setChecked( |
77 self.recursionCheckBox.setChecked(self.parameters["useRecursion"]) |
78 self.parameters['includePrivate']) |
78 self.includePrivateCheckBox.setChecked(self.parameters["includePrivate"]) |
79 self.startDirPicker.setText(self.parameters['startDirectory']) |
79 self.startDirPicker.setText(self.parameters["startDirectory"]) |
80 self.outputFilePicker.setText(self.parameters['outputFile']) |
80 self.outputFilePicker.setText(self.parameters["outputFile"]) |
81 self.baseEdit.setText(self.parameters['basePackage']) |
81 self.baseEdit.setText(self.parameters["basePackage"]) |
82 self.ignoreDirsList.clear() |
82 self.ignoreDirsList.clear() |
83 for d in self.parameters['ignoreDirectories']: |
83 for d in self.parameters["ignoreDirectories"]: |
84 self.ignoreDirsList.addItem(d) |
84 self.ignoreDirsList.addItem(d) |
85 self.sourceExtEdit.setText( |
85 self.sourceExtEdit.setText(", ".join(self.parameters["sourceExtensions"])) |
86 ", ".join(self.parameters['sourceExtensions'])) |
86 self.excludeFilesEdit.setText(", ".join(self.parameters["ignoreFilePatterns"])) |
87 self.excludeFilesEdit.setText( |
87 for language in self.parameters["languages"]: |
88 ", ".join(self.parameters['ignoreFilePatterns'])) |
|
89 for language in self.parameters['languages']: |
|
90 if language == "Python": |
88 if language == "Python": |
91 # convert Python to the more specific Python3 |
89 # convert Python to the more specific Python3 |
92 language = "Python3" |
90 language = "Python3" |
93 items = self.languagesList.findItems( |
91 items = self.languagesList.findItems(language, Qt.MatchFlag.MatchExactly) |
94 language, Qt.MatchFlag.MatchExactly) |
|
95 items and items[0].setSelected(True) |
92 items and items[0].setSelected(True) |
96 |
93 |
97 def __initializeDefaults(self): |
94 def __initializeDefaults(self): |
98 """ |
95 """ |
99 Private method to set the default values. |
96 Private method to set the default values. |
100 |
97 |
101 These are needed later on to generate the commandline |
98 These are needed later on to generate the commandline |
102 parameters. |
99 parameters. |
103 """ |
100 """ |
104 self.defaults = { |
101 self.defaults = { |
105 'useRecursion': False, |
102 "useRecursion": False, |
106 'includePrivate': False, |
103 "includePrivate": False, |
107 'startDirectory': '', |
104 "startDirectory": "", |
108 'outputFile': '', |
105 "outputFile": "", |
109 'basePackage': '', |
106 "basePackage": "", |
110 'ignoreDirectories': [], |
107 "ignoreDirectories": [], |
111 'ignoreFilePatterns': [], |
108 "ignoreFilePatterns": [], |
112 'sourceExtensions': [], |
109 "sourceExtensions": [], |
113 } |
110 } |
114 |
111 |
115 lang = self.project.getProjectLanguage() |
112 lang = self.project.getProjectLanguage() |
116 if lang in DocumentationTools.supportedExtensionsDictForApis: |
113 if lang in DocumentationTools.supportedExtensionsDictForApis: |
117 self.defaults['languages'] = [lang] |
114 self.defaults["languages"] = [lang] |
118 else: |
115 else: |
119 self.defaults['languages'] = ["Python3"] |
116 self.defaults["languages"] = ["Python3"] |
120 |
117 |
121 def generateParameters(self): |
118 def generateParameters(self): |
122 """ |
119 """ |
123 Public method that generates the command line parameters. |
120 Public method that generates the command line parameters. |
124 |
121 |
125 It generates a list of strings to be used |
122 It generates a list of strings to be used |
126 to set the QProcess arguments for the ericapi call and |
123 to set the QProcess arguments for the ericapi call and |
127 a dictionary containing the non default parameters. This |
124 a dictionary containing the non default parameters. This |
128 dictionary can be passed back upon object generation to overwrite |
125 dictionary can be passed back upon object generation to overwrite |
129 the default settings. |
126 the default settings. |
130 |
127 |
131 @return a tuple containing the commandline parameters, non default |
128 @return a tuple containing the commandline parameters, non default |
132 parameters and the start directory |
129 parameters and the start directory |
133 @rtype tuple of (list of str, dict, str) |
130 @rtype tuple of (list of str, dict, str) |
134 """ |
131 """ |
135 parms = {} |
132 parms = {} |
136 args = [] |
133 args = [] |
137 |
134 |
138 # 1. the program name |
135 # 1. the program name |
139 args.append(Globals.getPythonExecutable()) |
136 args.append(Globals.getPythonExecutable()) |
140 args.append( |
137 args.append(Utilities.normabsjoinpath(getConfig("ericDir"), "eric7_api.py")) |
141 Utilities.normabsjoinpath(getConfig('ericDir'), "eric7_api.py")) |
138 |
142 |
|
143 # 2. the commandline options |
139 # 2. the commandline options |
144 if self.parameters['startDirectory'] != self.defaults['startDirectory']: |
140 if self.parameters["startDirectory"] != self.defaults["startDirectory"]: |
145 parms['startDirectory'] = self.project.getRelativeUniversalPath( |
141 parms["startDirectory"] = self.project.getRelativeUniversalPath( |
146 self.parameters['startDirectory'] |
142 self.parameters["startDirectory"] |
147 ) |
143 ) |
148 else: |
144 else: |
149 self.parameters['startDirectory'] = self.defaults['startDirectory'] |
145 self.parameters["startDirectory"] = self.defaults["startDirectory"] |
150 parms['startDirectory'] = self.parameters['startDirectory'] |
146 parms["startDirectory"] = self.parameters["startDirectory"] |
151 if self.parameters['outputFile'] != self.defaults['outputFile']: |
147 if self.parameters["outputFile"] != self.defaults["outputFile"]: |
152 parms['outputFile'] = self.project.getRelativeUniversalPath( |
148 parms["outputFile"] = self.project.getRelativeUniversalPath( |
153 self.parameters['outputFile'] |
149 self.parameters["outputFile"] |
154 ) |
150 ) |
155 args.append('-o') |
151 args.append("-o") |
156 args.append( |
152 args.append(self.project.getAbsolutePath(self.parameters["outputFile"])) |
157 self.project.getAbsolutePath(self.parameters['outputFile']) |
|
158 ) |
|
159 else: |
153 else: |
160 self.parameters['outputFile'] = self.defaults['outputFile'] |
154 self.parameters["outputFile"] = self.defaults["outputFile"] |
161 if self.parameters['basePackage'] != self.defaults['basePackage']: |
155 if self.parameters["basePackage"] != self.defaults["basePackage"]: |
162 parms['basePackage'] = self.parameters['basePackage'] |
156 parms["basePackage"] = self.parameters["basePackage"] |
163 args.append('-b') |
157 args.append("-b") |
164 args.append(self.parameters['basePackage']) |
158 args.append(self.parameters["basePackage"]) |
165 if ( |
159 if self.parameters["ignoreDirectories"] != self.defaults["ignoreDirectories"]: |
166 self.parameters['ignoreDirectories'] != |
160 parms["ignoreDirectories"] = self.parameters["ignoreDirectories"][:] |
167 self.defaults['ignoreDirectories'] |
161 for d in self.parameters["ignoreDirectories"]: |
168 ): |
162 args.append("-x") |
169 parms['ignoreDirectories'] = ( |
|
170 self.parameters['ignoreDirectories'][:] |
|
171 ) |
|
172 for d in self.parameters['ignoreDirectories']: |
|
173 args.append('-x') |
|
174 args.append(d) |
163 args.append(d) |
175 if ( |
164 if self.parameters["ignoreFilePatterns"] != self.defaults["ignoreFilePatterns"]: |
176 self.parameters['ignoreFilePatterns'] != |
165 parms["ignoreFilePatterns"] = self.parameters["ignoreFilePatterns"][:] |
177 self.defaults['ignoreFilePatterns'] |
166 for pattern in self.parameters["ignoreFilePatterns"]: |
178 ): |
|
179 parms['ignoreFilePatterns'] = ( |
|
180 self.parameters['ignoreFilePatterns'][:] |
|
181 ) |
|
182 for pattern in self.parameters['ignoreFilePatterns']: |
|
183 args.append("--exclude-file={0}".format(pattern)) |
167 args.append("--exclude-file={0}".format(pattern)) |
184 if self.parameters['useRecursion'] != self.defaults['useRecursion']: |
168 if self.parameters["useRecursion"] != self.defaults["useRecursion"]: |
185 parms['useRecursion'] = self.parameters['useRecursion'] |
169 parms["useRecursion"] = self.parameters["useRecursion"] |
186 args.append('-r') |
170 args.append("-r") |
187 if ( |
171 if self.parameters["sourceExtensions"] != self.defaults["sourceExtensions"]: |
188 self.parameters['sourceExtensions'] != |
172 parms["sourceExtensions"] = self.parameters["sourceExtensions"][:] |
189 self.defaults['sourceExtensions'] |
173 for ext in self.parameters["sourceExtensions"]: |
190 ): |
174 args.append("-t") |
191 parms['sourceExtensions'] = self.parameters['sourceExtensions'][:] |
|
192 for ext in self.parameters['sourceExtensions']: |
|
193 args.append('-t') |
|
194 args.append(ext) |
175 args.append(ext) |
195 if ( |
176 if self.parameters["includePrivate"] != self.defaults["includePrivate"]: |
196 self.parameters['includePrivate'] != |
177 parms["includePrivate"] = self.parameters["includePrivate"] |
197 self.defaults['includePrivate'] |
178 args.append("-p") |
198 ): |
179 parms["languages"] = self.parameters["languages"][:] |
199 parms['includePrivate'] = self.parameters['includePrivate'] |
180 for lang in self.parameters["languages"]: |
200 args.append('-p') |
181 args.append("--language={0}".format(lang)) |
201 parms['languages'] = self.parameters['languages'][:] |
182 |
202 for lang in self.parameters['languages']: |
|
203 args.append('--language={0}'.format(lang)) |
|
204 |
|
205 startDir = ( |
183 startDir = ( |
206 self.project.getAbsolutePath(self.parameters['startDirectory']) |
184 self.project.getAbsolutePath(self.parameters["startDirectory"]) |
207 if self.parameters['startDirectory'] else |
185 if self.parameters["startDirectory"] |
208 "" |
186 else "" |
209 ) |
187 ) |
210 return args, parms, startDir |
188 return args, parms, startDir |
211 |
189 |
212 @pyqtSlot(str) |
190 @pyqtSlot(str) |
213 def on_startDirPicker_pathSelected(self, path): |
191 def on_startDirPicker_pathSelected(self, path): |
214 """ |
192 """ |
215 Private slot handling the selection of a start directory. |
193 Private slot handling the selection of a start directory. |
216 |
194 |
217 @param path path of the start directory |
195 @param path path of the start directory |
218 @type str |
196 @type str |
219 """ |
197 """ |
220 # make it relative, if it is in a subdirectory of the project path |
198 # make it relative, if it is in a subdirectory of the project path |
221 dn = self.project.getRelativePath(path) |
199 dn = self.project.getRelativePath(path) |
222 while dn.endswith(os.sep): |
200 while dn.endswith(os.sep): |
223 dn = dn[:-1] |
201 dn = dn[:-1] |
224 self.startDirPicker.setText(dn) |
202 self.startDirPicker.setText(dn) |
225 |
203 |
226 @pyqtSlot() |
204 @pyqtSlot() |
227 def on_outputFilePicker_aboutToShowPathPickerDialog(self): |
205 def on_outputFilePicker_aboutToShowPathPickerDialog(self): |
228 """ |
206 """ |
229 Private slot called before the file selection dialog is shown. |
207 Private slot called before the file selection dialog is shown. |
230 """ |
208 """ |
231 startFile = self.outputFilePicker.text() |
209 startFile = self.outputFilePicker.text() |
232 if not startFile: |
210 if not startFile: |
233 self.outputFilePicker.setText( |
211 self.outputFilePicker.setText(self.project.getProjectName() + ".api") |
234 self.project.getProjectName() + ".api") |
212 |
235 |
|
236 @pyqtSlot(str) |
213 @pyqtSlot(str) |
237 def on_outputFilePicker_pathSelected(self, path): |
214 def on_outputFilePicker_pathSelected(self, path): |
238 """ |
215 """ |
239 Private slot handling the selection of an output file. |
216 Private slot handling the selection of an output file. |
240 |
217 |
241 @param path path of the output file |
218 @param path path of the output file |
242 @type str |
219 @type str |
243 """ |
220 """ |
244 # make it relative, if it is in a subdirectory of the project path |
221 # make it relative, if it is in a subdirectory of the project path |
245 fn = self.project.getRelativePath(path) |
222 fn = self.project.getRelativePath(path) |
246 self.outputFilePicker.setText(fn) |
223 self.outputFilePicker.setText(fn) |
247 |
224 |
248 def on_outputFilePicker_textChanged(self, filename): |
225 def on_outputFilePicker_textChanged(self, filename): |
249 """ |
226 """ |
250 Private slot to enable/disable the "OK" button. |
227 Private slot to enable/disable the "OK" button. |
251 |
228 |
252 @param filename name of the file (string) |
229 @param filename name of the file (string) |
253 """ |
230 """ |
254 self.buttonBox.button( |
231 self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled( |
255 QDialogButtonBox.StandardButton.Ok).setEnabled(filename != "") |
232 filename != "" |
256 |
233 ) |
|
234 |
257 @pyqtSlot(str) |
235 @pyqtSlot(str) |
258 def on_ignoreDirPicker_pathSelected(self, path): |
236 def on_ignoreDirPicker_pathSelected(self, path): |
259 """ |
237 """ |
260 Private slot handling the selection of a directory to be ignored. |
238 Private slot handling the selection of a directory to be ignored. |
261 |
239 |
262 @param path path of the directory to be ignored |
240 @param path path of the directory to be ignored |
263 @type str |
241 @type str |
264 """ |
242 """ |
265 # make it relative, if it is in a subdirectory of the project path |
243 # make it relative, if it is in a subdirectory of the project path |
266 dn = self.project.getRelativePath(path) |
244 dn = self.project.getRelativePath(path) |
267 while dn.endswith(os.sep): |
245 while dn.endswith(os.sep): |
268 dn = dn[:-1] |
246 dn = dn[:-1] |
269 self.ignoreDirPicker.setText(dn) |
247 self.ignoreDirPicker.setText(dn) |
270 |
248 |
271 @pyqtSlot() |
249 @pyqtSlot() |
272 def on_addButton_clicked(self): |
250 def on_addButton_clicked(self): |
273 """ |
251 """ |
274 Private slot to add the directory displayed to the listview. |
252 Private slot to add the directory displayed to the listview. |
275 |
253 |
276 The directory in the ignore directories |
254 The directory in the ignore directories |
277 line edit is moved to the listbox above and the edit is cleared. |
255 line edit is moved to the listbox above and the edit is cleared. |
278 """ |
256 """ |
279 basename = os.path.basename(self.ignoreDirPicker.text()) |
257 basename = os.path.basename(self.ignoreDirPicker.text()) |
280 if basename: |
258 if basename: |