eric6/Plugins/DocumentationPlugins/Ericdoc/EricdocConfigDialog.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
child 7229
53054eb5b15a
equal deleted inserted replaced
6941:f99d60d6b59b 6942:2602857055c5
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2003 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a dialog to enter the parameters for eric6_doc.
8 """
9
10 from __future__ import unicode_literals
11
12 import sys
13 import os
14 import copy
15
16 from PyQt5.QtCore import pyqtSlot
17 from PyQt5.QtGui import QColor
18 from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QColorDialog
19
20 from E5Gui.E5PathPicker import E5PathPickerModes
21
22 from .Ui_EricdocConfigDialog import Ui_EricdocConfigDialog
23 from DocumentationTools.Config import eric6docDefaultColors, \
24 eric6docColorParameterNames
25 import Utilities
26
27 from eric6config import getConfig
28
29
30 class EricdocConfigDialog(QDialog, Ui_EricdocConfigDialog):
31 """
32 Class implementing a dialog to enter the parameters for eric6_doc.
33 """
34 def __init__(self, project, parms=None, parent=None):
35 """
36 Constructor
37
38 @param project reference to the project object (Project.Project)
39 @param parms parameters to set in the dialog
40 @param parent parent widget of this dialog
41 """
42 super(EricdocConfigDialog, self).__init__(parent)
43 self.setupUi(self)
44
45 self.outputDirPicker.setMode(E5PathPickerModes.DirectoryMode)
46 self.outputDirPicker.setDefaultDirectory(project.getProjectPath())
47
48 self.ignoreDirPicker.setMode(E5PathPickerModes.DirectoryMode)
49 self.ignoreDirPicker.setDefaultDirectory(project.getProjectPath())
50
51 self.cssPicker.setMode(E5PathPickerModes.OpenFileMode)
52 self.cssPicker.setDefaultDirectory(getConfig('ericCSSDir'))
53 self.cssPicker.setFilters(self.tr(
54 "Style sheet (*.css);;All files (*)"))
55
56 self.qtHelpDirPicker.setMode(E5PathPickerModes.DirectoryMode)
57 self.qtHelpDirPicker.setDefaultDirectory(project.getProjectPath())
58
59 self.__okButton = self.buttonBox.button(QDialogButtonBox.Ok)
60
61 self.__initializeDefaults()
62
63 self.sampleText = self.tr(
64 '''<?xml version="1.0" encoding="utf-8"?>'''
65 '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"'''
66 '''"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'''
67 '''<html><head>'''
68 '''<title></title>'''
69 '''</head>'''
70 '''<body style="background-color:{BodyBgColor};'''
71 '''color:{BodyColor}">'''
72 '''<h1 style="background-color:{Level1HeaderBgColor};'''
73 '''color:{Level1HeaderColor}">'''
74 '''Level 1 Header</h1>'''
75 '''<h3 style="background-color:{Level2HeaderBgColor};'''
76 '''color:{Level2HeaderColor}">'''
77 '''Level 2 Header</h3>'''
78 '''<h2 style="background-color:{CFBgColor};color:{CFColor}">'''
79 '''Class and Function Header</h2>'''
80 '''Standard body text with '''
81 '''<a style="color:{LinkColor}">some links</a> embedded.'''
82 '''</body></html>'''
83 )
84
85 # get a copy of the defaults to store the user settings
86 self.parameters = copy.deepcopy(self.defaults)
87 self.colors = eric6docDefaultColors.copy()
88
89 # combine it with the values of parms
90 if parms is not None:
91 for key in parms:
92 if key.endswith("Color"):
93 self.colors[key] = parms[key]
94 else:
95 self.parameters[key] = parms[key]
96 self.parameters['outputDirectory'] = \
97 Utilities.toNativeSeparators(self.parameters['outputDirectory'])
98 self.parameters['qtHelpOutputDirectory'] = \
99 Utilities.toNativeSeparators(
100 self.parameters['qtHelpOutputDirectory'])
101 self.parameters['cssFile'] = \
102 Utilities.toNativeSeparators(self.parameters['cssFile'])
103 if self.parameters['cssFile'].startswith("%PYTHON%"):
104 self.parameters['cssFile'] = self.parameters['cssFile'].replace(
105 "%PYTHON%", Utilities.getPythonModulesDirectory())
106
107 self.ppath = project.getProjectPath()
108 self.project = project
109
110 self.recursionCheckBox.setChecked(self.parameters['useRecursion'])
111 self.noindexCheckBox.setChecked(self.parameters['noindex'])
112 self.noemptyCheckBox.setChecked(self.parameters['noempty'])
113 self.outputDirPicker.setText(self.parameters['outputDirectory'])
114 self.ignoreDirsList.clear()
115 for d in self.parameters['ignoreDirectories']:
116 self.ignoreDirsList.addItem(d)
117 self.cssPicker.setText(self.parameters['cssFile'])
118 self.sourceExtEdit.setText(
119 ", ".join(self.parameters['sourceExtensions']))
120 self.excludeFilesEdit.setText(
121 ", ".join(self.parameters['ignoreFilePatterns']))
122 self.sample.setHtml(self.sampleText.format(**self.colors))
123
124 self.qtHelpGroup.setChecked(self.parameters['qtHelpEnabled'])
125 self.qtHelpDirPicker.setText(self.parameters['qtHelpOutputDirectory'])
126 self.qtHelpNamespaceEdit.setText(self.parameters['qtHelpNamespace'])
127 self.qtHelpFolderEdit.setText(self.parameters['qtHelpVirtualFolder'])
128 self.qtHelpFilterNameEdit.setText(self.parameters['qtHelpFilterName'])
129 self.qtHelpFilterAttributesEdit.setText(
130 self.parameters['qtHelpFilterAttributes'])
131 self.qtHelpTitleEdit.setText(self.parameters['qtHelpTitle'])
132 self.qtHelpGenerateCollectionCheckBox.setChecked(
133 self.parameters['qtHelpCreateCollection'])
134
135 def __initializeDefaults(self):
136 """
137 Private method to set the default values.
138
139 These are needed later on to generate the commandline
140 parameters.
141 """
142 self.defaults = {
143 'useRecursion': False,
144 'noindex': False,
145 'noempty': False,
146 'outputDirectory': '',
147 'ignoreDirectories': [],
148 'ignoreFilePatterns': [],
149 'cssFile': '',
150 'sourceExtensions': [],
151
152 'qtHelpEnabled': False,
153 'qtHelpOutputDirectory': '',
154 'qtHelpNamespace': '',
155 'qtHelpVirtualFolder': 'source',
156 'qtHelpFilterName': 'unknown',
157 'qtHelpFilterAttributes': '',
158 'qtHelpTitle': '',
159 'qtHelpCreateCollection': False,
160 }
161
162 def generateParameters(self):
163 """
164 Public method that generates the commandline parameters.
165
166 It generates a list of strings to be used
167 to set the QProcess arguments for the ericdoc call and
168 a dictionary containing the non default parameters. This
169 dictionary can be passed back upon object generation to overwrite
170 the default settings.
171
172 @return a tuple of the commandline parameters and non default
173 parameters (list of strings, dictionary)
174 """
175 parms = {}
176 args = []
177
178 # 1. the program name
179 args.append(sys.executable)
180 args.append(
181 Utilities.normabsjoinpath(getConfig('ericDir'), "eric6_doc.py"))
182
183 # 2. the commandline options
184 # 2a. general commandline options
185 if self.parameters['outputDirectory'] != \
186 self.defaults['outputDirectory']:
187 parms['outputDirectory'] = Utilities.fromNativeSeparators(
188 self.project.getRelativePath(
189 self.parameters['outputDirectory']))
190 args.append('-o')
191 if os.path.isabs(self.parameters['outputDirectory']):
192 args.append(self.parameters['outputDirectory'])
193 else:
194 args.append(os.path.join(
195 self.ppath, self.parameters['outputDirectory']))
196 else:
197 self.parameters['outputDirectory'] = \
198 self.defaults['outputDirectory']
199 parms['outputDirectory'] = self.parameters['outputDirectory']
200 if self.parameters['ignoreDirectories'] != \
201 self.defaults['ignoreDirectories']:
202 parms['ignoreDirectories'] = \
203 self.parameters['ignoreDirectories'][:]
204 for d in self.parameters['ignoreDirectories']:
205 args.append('-x')
206 args.append(d)
207 if self.parameters['ignoreFilePatterns'] != \
208 self.defaults['ignoreFilePatterns']:
209 parms['ignoreFilePatterns'] = \
210 self.parameters['ignoreFilePatterns'][:]
211 for pattern in self.parameters['ignoreFilePatterns']:
212 if pattern.strip():
213 args.append("--exclude-file={0}".format(pattern.strip()))
214 if self.parameters['useRecursion'] != self.defaults['useRecursion']:
215 parms['useRecursion'] = self.parameters['useRecursion']
216 args.append('-r')
217 if self.parameters['noindex'] != self.defaults['noindex']:
218 parms['noindex'] = self.parameters['noindex']
219 args.append('-i')
220 if self.parameters['noempty'] != self.defaults['noempty']:
221 parms['noempty'] = self.parameters['noempty']
222 args.append('-e')
223 if self.parameters['sourceExtensions'] != \
224 self.defaults['sourceExtensions']:
225 parms['sourceExtensions'] = self.parameters['sourceExtensions'][:]
226 for ext in self.parameters['sourceExtensions']:
227 if ext.strip():
228 args.append("--extension={0}".format(ext.strip()))
229
230 # 2b. style commandline options
231 if self.parameters['cssFile'] != self.defaults['cssFile']:
232 cssFile = self.project.getRelativePath(self.parameters['cssFile'])
233 if cssFile.startswith(Utilities.getPythonModulesDirectory()):
234 cssFile = cssFile.replace(
235 Utilities.getPythonModulesDirectory(), "%PYTHON%")
236 parms['cssFile'] = Utilities.fromNativeSeparators(cssFile)
237 args.append('-c')
238 if os.path.isabs(self.parameters['cssFile']):
239 args.append(self.parameters['cssFile'])
240 else:
241 args.append(
242 os.path.join(self.ppath, self.parameters['cssFile']))
243 for key in self.colors:
244 if self.colors[key] != eric6docDefaultColors[key]:
245 parms[key] = self.colors[key]
246 args.append("--{0}={1}".format(
247 eric6docColorParameterNames[key], self.colors[key]))
248
249 # 2c. QtHelp commandline options
250 parms['qtHelpEnabled'] = self.parameters['qtHelpEnabled']
251 if self.parameters['qtHelpEnabled']:
252 args.append('--create-qhp')
253 if self.parameters['qtHelpOutputDirectory'] != \
254 self.defaults['qtHelpOutputDirectory']:
255 parms['qtHelpOutputDirectory'] = Utilities.fromNativeSeparators(
256 self.project.getRelativePath(
257 self.parameters['qtHelpOutputDirectory']))
258 if os.path.isabs(self.parameters['outputDirectory']):
259 args.append("--qhp-outdir={0}".format(
260 self.parameters['qtHelpOutputDirectory']))
261 else:
262 args.append("--qhp-outdir={0}".format(
263 os.path.join(self.ppath,
264 self.parameters['qtHelpOutputDirectory'])))
265 if self.parameters['qtHelpNamespace'] != \
266 self.defaults['qtHelpNamespace']:
267 parms['qtHelpNamespace'] = self.parameters['qtHelpNamespace']
268 args.append("--qhp-namespace={0}".format(
269 self.parameters['qtHelpNamespace']))
270 if self.parameters['qtHelpVirtualFolder'] != \
271 self.defaults['qtHelpVirtualFolder']:
272 parms['qtHelpVirtualFolder'] = \
273 self.parameters['qtHelpVirtualFolder']
274 args.append("--qhp-virtualfolder={0}".format(
275 self.parameters['qtHelpVirtualFolder']))
276 if self.parameters['qtHelpFilterName'] != \
277 self.defaults['qtHelpFilterName']:
278 parms['qtHelpFilterName'] = self.parameters['qtHelpFilterName']
279 args.append("--qhp-filtername={0}".format(
280 self.parameters['qtHelpFilterName']))
281 if self.parameters['qtHelpFilterAttributes'] != \
282 self.defaults['qtHelpFilterAttributes']:
283 parms['qtHelpFilterAttributes'] = \
284 self.parameters['qtHelpFilterAttributes']
285 args.append("--qhp-filterattribs={0}".format(
286 self.parameters['qtHelpFilterAttributes']))
287 if self.parameters['qtHelpTitle'] != self.defaults['qtHelpTitle']:
288 parms['qtHelpTitle'] = self.parameters['qtHelpTitle']
289 args.append("--qhp-title={0}".format(
290 self.parameters['qtHelpTitle']))
291 if self.parameters['qtHelpCreateCollection'] != \
292 self.defaults['qtHelpCreateCollection']:
293 parms['qtHelpCreateCollection'] = \
294 self.parameters['qtHelpCreateCollection']
295 args.append('--create-qhc')
296
297 return (args, parms)
298
299 @pyqtSlot(str)
300 def on_outputDirPicker_pathSelected(self, path):
301 """
302 Private slot handling the selection of an output directory.
303
304 @param path path of the output directory
305 @type str
306 """
307 # make it relative, if it is in a subdirectory of the project path
308 dn = self.project.getRelativePath(path)
309 while dn.endswith(os.sep):
310 dn = dn[:-1]
311 self.outputDirPicker.setText(dn)
312
313 @pyqtSlot(str)
314 def on_ignoreDirPicker_pathSelected(self, path):
315 """
316 Private slot handling the selection of a directory to be ignored.
317
318 @param path path of the directory to be ignored
319 @type str
320 """
321 # make it relative, if it is in a subdirectory of the project path
322 dn = self.project.getRelativePath(path)
323 while dn.endswith(os.sep):
324 dn = dn[:-1]
325 self.ignoreDirPicker.setText(dn)
326
327 @pyqtSlot()
328 def on_addButton_clicked(self):
329 """
330 Private slot to add the directory displayed to the listview.
331
332 The directory in the ignore directories
333 line edit is moved to the listbox above and the edit is cleared.
334 """
335 basename = os.path.basename(self.ignoreDirPicker.text())
336 if basename:
337 self.ignoreDirsList.addItem(basename)
338 self.ignoreDirPicker.clear()
339
340 @pyqtSlot()
341 def on_deleteButton_clicked(self):
342 """
343 Private slot to delete the currently selected directory of the listbox.
344 """
345 itm = self.ignoreDirsList.takeItem(self.ignoreDirsList.currentRow())
346 del itm
347
348 @pyqtSlot(str)
349 def on_cssPicker_pathSelected(self, path):
350 """
351 Private slot handling the selection of a css style sheet.
352
353 @param path path of the css style sheet
354 @type str
355 """
356 # make it relative, if it is in a subdirectory of the project path
357 cf = self.project.getRelativePath(path)
358 self.cssPicker.setText(cf)
359
360 def __selectColor(self, colorKey):
361 """
362 Private method to select a color.
363
364 @param colorKey key of the color to select (string)
365 """
366 color = QColorDialog.getColor(QColor(self.colors[colorKey]))
367 if color.isValid():
368 self.colors[colorKey] = color.name()
369 self.sample.setHtml(self.sampleText.format(self.colors))
370
371 @pyqtSlot()
372 def on_bodyFgButton_clicked(self):
373 """
374 Private slot to select the body foreground color.
375 """
376 self.__selectColor('BodyColor')
377
378 @pyqtSlot()
379 def on_bodyBgButton_clicked(self):
380 """
381 Private slot to select the body background color.
382 """
383 self.__selectColor('BodyBgColor')
384
385 @pyqtSlot()
386 def on_l1FgButton_clicked(self):
387 """
388 Private slot to select the level 1 header foreground color.
389 """
390 self.__selectColor('Level1HeaderColor')
391
392 @pyqtSlot()
393 def on_l1BgButton_clicked(self):
394 """
395 Private slot to select the level 1 header background color.
396 """
397 self.__selectColor('Level1HeaderBgColor')
398
399 @pyqtSlot()
400 def on_l2FgButton_clicked(self):
401 """
402 Private slot to select the level 2 header foreground color.
403 """
404 self.__selectColor('Level2HeaderColor')
405
406 @pyqtSlot()
407 def on_l2BgButton_clicked(self):
408 """
409 Private slot to select the level 2 header background color.
410 """
411 self.__selectColor('Level2HeaderBgColor')
412
413 @pyqtSlot()
414 def on_cfFgButton_clicked(self):
415 """
416 Private slot to select the class/function header foreground color.
417 """
418 self.__selectColor('CFColor')
419
420 @pyqtSlot()
421 def on_cfBgButton_clicked(self):
422 """
423 Private slot to select the class/function header background color.
424 """
425 self.__selectColor('CFBgColor')
426
427 @pyqtSlot()
428 def on_linkFgButton_clicked(self):
429 """
430 Private slot to select the foreground color of links.
431 """
432 self.__selectColor('LinkColor')
433
434 def __checkQtHelpOptions(self):
435 """
436 Private slot to check the QtHelp options and set the ok button
437 accordingly.
438 """
439 setOn = True
440 if self.qtHelpGroup.isChecked():
441 if not self.qtHelpNamespaceEdit.text():
442 setOn = False
443 if not self.qtHelpFolderEdit.text():
444 setOn = False
445 else:
446 if '/' in self.qtHelpFolderEdit.text():
447 setOn = False
448 if not self.qtHelpTitleEdit.text():
449 setOn = False
450
451 self.__okButton.setEnabled(setOn)
452
453 @pyqtSlot(bool)
454 def on_qtHelpGroup_toggled(self, enabled):
455 """
456 Private slot to toggle the generation of QtHelp files.
457
458 @param enabled flag indicating the state (boolean)
459 """
460 self.__checkQtHelpOptions()
461
462 @pyqtSlot(str)
463 def on_qtHelpNamespaceEdit_textChanged(self, txt):
464 """
465 Private slot to check the namespace.
466
467 @param txt text of the line edit (string)
468 """
469 self.__checkQtHelpOptions()
470
471 @pyqtSlot(str)
472 def on_qtHelpFolderEdit_textChanged(self, txt):
473 """
474 Private slot to check the virtual folder.
475
476 @param txt text of the line edit (string)
477 """
478 self.__checkQtHelpOptions()
479
480 @pyqtSlot(str)
481 def on_qtHelpTitleEdit_textChanged(self, txt):
482 """
483 Private slot to check the title.
484
485 @param txt text of the line edit (string)
486 """
487 self.__checkQtHelpOptions()
488
489 @pyqtSlot(str)
490 def on_qtHelpDirPicker_pathSelected(self, path):
491 """
492 Private slot handling the selection of the output directory for the
493 QtHelp files.
494
495 @param path path of the the output directory for the QtHelp files
496 @type str
497 """
498 # make it relative, if it is in a subdirectory of the project path
499 dn = self.project.getRelativePath(path)
500 while dn.endswith(os.sep):
501 dn = dn[:-1]
502 self.qtHelpDirPicker.setText(dn)
503
504 def accept(self):
505 """
506 Public slot called by the Ok button.
507
508 It saves the values in the parameters dictionary.
509 """
510 self.parameters['useRecursion'] = self.recursionCheckBox.isChecked()
511 self.parameters['noindex'] = self.noindexCheckBox.isChecked()
512 self.parameters['noempty'] = self.noemptyCheckBox.isChecked()
513 outdir = self.outputDirPicker.text()
514 if outdir != '':
515 outdir = os.path.normpath(outdir)
516 if outdir.endswith(os.sep):
517 outdir = outdir[:-1]
518 self.parameters['outputDirectory'] = outdir
519 self.parameters['ignoreDirectories'] = []
520 for row in range(0, self.ignoreDirsList.count()):
521 itm = self.ignoreDirsList.item(row)
522 self.parameters['ignoreDirectories'].append(
523 os.path.normpath(itm.text()))
524 cssFile = self.cssPicker.text()
525 if cssFile != '':
526 cssFile = os.path.normpath(cssFile)
527 self.parameters['cssFile'] = cssFile
528 extensions = self.sourceExtEdit.text().split(',')
529 self.parameters['sourceExtensions'] = \
530 [ext.strip() for ext in extensions if ext.strip()]
531 patterns = self.excludeFilesEdit.text().split(',')
532 self.parameters['ignoreFilePatterns'] = \
533 [pattern.strip() for pattern in patterns if pattern.strip()]
534
535 self.parameters['qtHelpEnabled'] = self.qtHelpGroup.isChecked()
536 self.parameters['qtHelpOutputDirectory'] = self.qtHelpDirPicker.text()
537 self.parameters['qtHelpNamespace'] = self.qtHelpNamespaceEdit.text()
538 self.parameters['qtHelpVirtualFolder'] = self.qtHelpFolderEdit.text()
539 self.parameters['qtHelpFilterName'] = self.qtHelpFilterNameEdit.text()
540 self.parameters['qtHelpFilterAttributes'] = \
541 self.qtHelpFilterAttributesEdit.text()
542 self.parameters['qtHelpTitle'] = self.qtHelpTitleEdit.text()
543 self.parameters['qtHelpCreateCollection'] = \
544 self.qtHelpGenerateCollectionCheckBox.isChecked()
545
546 # call the accept slot of the base class
547 super(EricdocConfigDialog, self).accept()

eric ide

mercurial