1# -*- coding: utf-8 -*-
2
3# Copyright (c) 2003 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4#
5
6"""
7Module implementing the file dialog wizard dialog.
8"""
9
10import os
11
12from PyQt5.QtCore import pyqtSlot, QUrl
13from PyQt5.QtWidgets import (
14    QDialog, QDialogButtonBox, QFileDialog, QButtonGroup
15)
16
17from E5Gui.E5Completers import E5FileCompleter, E5DirCompleter
18
19from .Ui_FileDialogWizardDialog import Ui_FileDialogWizardDialog
20
21import Globals
22
23
24class FileDialogWizardDialog(QDialog, Ui_FileDialogWizardDialog):
25    """
26    Class implementing the color dialog wizard dialog.
27
28    It displays a dialog for entering the parameters for the
29    E5FileDialog or QFileDialog code generator.
30    """
31    def __init__(self, dialogVariant, parent=None):
32        """
33        Constructor
34
35        @param dialogVariant variant of the file dialog to be generated
36            (-1 = E5FileDialog, 0 = unknown, 5 = PyQt5)
37        @type int
38        @param parent parent widget
39        @type QWidget
40        """
41        super().__init__(parent)
42        self.setupUi(self)
43
44        self.eStartWithCompleter = E5FileCompleter(self.eStartWith)
45        self.eWorkDirCompleter = E5DirCompleter(self.eWorkDir)
46
47        self.__dialogVariant = dialogVariant
48
49        self.__typeButtonsGroup = QButtonGroup(self)
50        self.__typeButtonsGroup.setExclusive(True)
51        self.__typeButtonsGroup.addButton(self.rOpenFile, 1)
52        self.__typeButtonsGroup.addButton(self.rOpenFiles, 2)
53        self.__typeButtonsGroup.addButton(self.rSaveFile, 3)
54        self.__typeButtonsGroup.addButton(self.rfOpenFile, 11)
55        self.__typeButtonsGroup.addButton(self.rfOpenFiles, 12)
56        self.__typeButtonsGroup.addButton(self.rfSaveFile, 13)
57        self.__typeButtonsGroup.addButton(self.rOpenFileUrl, 21)
58        self.__typeButtonsGroup.addButton(self.rOpenFileUrls, 22)
59        self.__typeButtonsGroup.addButton(self.rSaveFileUrl, 23)
60        self.__typeButtonsGroup.addButton(self.rDirectory, 30)
61        self.__typeButtonsGroup.addButton(self.rDirectoryUrl, 31)
62        self.__typeButtonsGroup.buttonClicked[int].connect(
63            self.__toggleInitialFilterAndResult)
64        self.__toggleInitialFilterAndResult(1)
65
66        if self.__dialogVariant == -1:
67            self.pyqtComboBox.addItems(["eric"])
68            self.setWindowTitle(self.tr("E5FileDialog Wizard"))
69            self.pyqtComboBox.setCurrentIndex(0)
70            self.pyqtComboBox.setEnabled(False)
71        else:
72            self.pyqtComboBox.addItems(["PyQt5", "PyQt6"])
73            self.setWindowTitle(self.tr("QFileDialog Wizard"))
74            if self.__dialogVariant == 5:
75                self.pyqtComboBox.setCurrentIndex(0)
76            elif self.__dialogVariant == 6:
77                self.pyqtComboBox.setCurrentIndex(1)
78            else:
79                self.pyqtComboBox.setCurrentIndex(0)
80
81        self.rSaveFile.toggled[bool].connect(self.__toggleConfirmCheckBox)
82        self.rfSaveFile.toggled[bool].connect(self.__toggleConfirmCheckBox)
83        self.rSaveFileUrl.toggled[bool].connect(self.__toggleConfirmCheckBox)
84        self.rDirectory.toggled[bool].connect(self.__toggleGroupsAndTest)
85        self.rDirectoryUrl.toggled[bool].connect(self.__toggleGroupsAndTest)
86        self.cStartWith.toggled[bool].connect(self.__toggleGroupsAndTest)
87        self.cWorkDir.toggled[bool].connect(self.__toggleGroupsAndTest)
88        self.cFilters.toggled[bool].connect(self.__toggleGroupsAndTest)
89
90        self.bTest = self.buttonBox.addButton(
91            self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole)
92
93        msh = self.minimumSizeHint()
94        self.resize(max(self.width(), msh.width()), msh.height())
95
96    def __adjustOptions(self, options):
97        """
98        Private method to adjust the file dialog options.
99
100        @param options file dialog options (QFileDialog.Options)
101        @return modified options (QFileDialog.Options)
102        """
103        if Globals.isLinuxPlatform():
104            options |= QFileDialog.Option.DontUseNativeDialog
105        return options
106
107    @pyqtSlot(int)
108    def on_pyqtComboBox_currentIndexChanged(self, index):
109        """
110        Private slot to setup the dialog for the selected PyQt variant.
111
112        @param index index of the current item
113        @type int
114        """
115        txt = self.pyqtComboBox.itemText(index)
116        self.rfOpenFile.setEnabled(txt == "eric")
117        self.rfOpenFiles.setEnabled(txt == "eric")
118        self.rfSaveFile.setEnabled(txt == "eric")
119
120        self.rOpenFileUrl.setEnabled(txt in ["PyQt5", "PyQt6"])
121        self.rOpenFileUrls.setEnabled(txt in ["PyQt5", "PyQt6"])
122        self.rSaveFileUrl.setEnabled(txt in ["PyQt5", "PyQt6"])
123        self.rDirectoryUrl.setEnabled(txt in ["PyQt5", "PyQt6"])
124
125        if txt in ["PyQt5", "PyQt6"]:
126            if self.rfOpenFile.isChecked():
127                self.rOpenFile.setChecked(True)
128            elif self.rfOpenFiles.isChecked():
129                self.rOpenFiles.setChecked(True)
130            elif self.rfSaveFile.isChecked():
131                self.rSaveFile.setChecked(True)
132        else:
133            if self.rOpenFileUrl.isChecked():
134                self.rOpenFile.setChecked(True)
135            if self.rOpenFileUrls.isChecked():
136                self.rOpenFiles.setChecked(True)
137            if self.rSaveFileUrl.isChecked():
138                self.rSaveFile.setChecked(True)
139            if self.rDirectoryUrl.isChecked():
140                self.rDirectory.setChecked(True)
141
142        if txt == "eric":
143            self.__dialogVariant = -1
144        elif txt == "PyQt5":
145            self.__dialogVariant = 5
146        elif txt == "PyQt6":
147            self.__dialogVariant = 6
148        else:
149            # default is PyQt5
150            self.__dialogVariant = 5
151
152        self.__toggleInitialFilterAndResult(
153            self.__typeButtonsGroup.checkedId())
154
155    def on_buttonBox_clicked(self, button):
156        """
157        Private slot called by a button of the button box clicked.
158
159        @param button button that was clicked (QAbstractButton)
160        """
161        if button == self.bTest:
162            self.on_bTest_clicked()
163
164    @pyqtSlot()
165    def on_bTest_clicked(self):
166        """
167        Private method to test the selected options.
168        """
169        if self.rOpenFile.isChecked() or self.rfOpenFile.isChecked():
170            if not self.cSymlinks.isChecked():
171                options = QFileDialog.Options(
172                    QFileDialog.Option.DontResolveSymlinks)
173            else:
174                options = QFileDialog.Options()
175            options = self.__adjustOptions(options)
176            QFileDialog.getOpenFileName(
177                None,
178                self.eCaption.text(),
179                self.eStartWith.text(),
180                self.eFilters.text(),
181                self.eInitialFilter.text(),
182                options)
183        elif self.rOpenFileUrl.isChecked():
184            if not self.cSymlinks.isChecked():
185                options = QFileDialog.Options(
186                    QFileDialog.Option.DontResolveSymlinks)
187            else:
188                options = QFileDialog.Options()
189            options = self.__adjustOptions(options)
190            try:
191                QFileDialog.getOpenFileUrl(
192                    None,
193                    self.eCaption.text(),
194                    QUrl(self.eStartWith.text()),
195                    self.eFilters.text(),
196                    self.eInitialFilter.text(),
197                    options,
198                    self.schemesEdit.text().split())
199            except TypeError:
200                # PyQt5 < 5.13.0 contains an error
201                QFileDialog.getOpenFileUrl(
202                    None,
203                    self.eCaption.text(),
204                    self.eStartWith.text(),
205                    self.eFilters.text(),
206                    self.eInitialFilter.text(),
207                    options,
208                    self.schemesEdit.text().split())
209        elif self.rOpenFiles.isChecked() or self.rfOpenFiles.isChecked():
210            if not self.cSymlinks.isChecked():
211                options = QFileDialog.Options(
212                    QFileDialog.Option.DontResolveSymlinks)
213            else:
214                options = QFileDialog.Options()
215            options = self.__adjustOptions(options)
216            QFileDialog.getOpenFileNames(
217                None,
218                self.eCaption.text(),
219                self.eStartWith.text(),
220                self.eFilters.text(),
221                self.eInitialFilter.text(),
222                options)
223        elif self.rOpenFileUrls.isChecked():
224            if not self.cSymlinks.isChecked():
225                options = QFileDialog.Options(
226                    QFileDialog.Option.DontResolveSymlinks)
227            else:
228                options = QFileDialog.Options()
229            options = self.__adjustOptions(options)
230            try:
231                QFileDialog.getOpenFileUrls(
232                    None,
233                    self.eCaption.text(),
234                    QUrl(self.eStartWith.text()),
235                    self.eFilters.text(),
236                    self.eInitialFilter.text(),
237                    options,
238                    self.schemesEdit.text().split())
239            except TypeError:
240                # PyQt5 < 5.13.0 contains an error
241                QFileDialog.getOpenFileUrls(
242                    None,
243                    self.eCaption.text(),
244                    self.eStartWith.text(),
245                    self.eFilters.text(),
246                    self.eInitialFilter.text(),
247                    options,
248                    self.schemesEdit.text().split())
249        elif self.rSaveFile.isChecked() or self.rfSaveFile.isChecked():
250            if not self.cSymlinks.isChecked():
251                options = QFileDialog.Options(
252                    QFileDialog.Option.DontResolveSymlinks)
253            else:
254                options = QFileDialog.Options()
255            options = self.__adjustOptions(options)
256            QFileDialog.getSaveFileName(
257                None,
258                self.eCaption.text(),
259                self.eStartWith.text(),
260                self.eFilters.text(),
261                self.eInitialFilter.text(),
262                options)
263        elif self.rSaveFileUrl.isChecked():
264            if not self.cSymlinks.isChecked():
265                options = QFileDialog.Options(
266                    QFileDialog.Option.DontResolveSymlinks)
267            else:
268                options = QFileDialog.Options()
269            options = self.__adjustOptions(options)
270            try:
271                QFileDialog.getSaveFileUrl(
272                    None,
273                    self.eCaption.text(),
274                    QUrl(self.eStartWith.text()),
275                    self.eFilters.text(),
276                    self.eInitialFilter.text(),
277                    options,
278                    self.schemesEdit.text().split())
279            except TypeError:
280                # PyQt5 < 5.13.0 contains an error
281                QFileDialog.getSaveFileUrl(
282                    None,
283                    self.eCaption.text(),
284                    self.eStartWith.text(),
285                    self.eFilters.text(),
286                    self.eInitialFilter.text(),
287                    options,
288                    self.schemesEdit.text().split())
289        elif self.rDirectory.isChecked():
290            options = QFileDialog.Options()
291            if not self.cSymlinks.isChecked():
292                options |= QFileDialog.Options(
293                    QFileDialog.Option.DontResolveSymlinks)
294            if self.cDirOnly.isChecked():
295                options |= QFileDialog.Options(QFileDialog.Option.ShowDirsOnly)
296            else:
297                options |= QFileDialog.Options(QFileDialog.Option(0))
298            options = self.__adjustOptions(options)
299            QFileDialog.getExistingDirectory(
300                None,
301                self.eCaption.text(),
302                self.eWorkDir.text(),
303                options)
304        elif self.rDirectoryUrl.isChecked():
305            options = QFileDialog.Options()
306            if not self.cSymlinks.isChecked():
307                options |= QFileDialog.Options(
308                    QFileDialog.Option.DontResolveSymlinks)
309            if self.cDirOnly.isChecked():
310                options |= QFileDialog.Options(QFileDialog.Option.ShowDirsOnly)
311            else:
312                options |= QFileDialog.Options(QFileDialog.Option(0))
313            options = self.__adjustOptions(options)
314            try:
315                QFileDialog.getExistingDirectoryUrl(
316                    None,
317                    self.eCaption.text(),
318                    QUrl(self.eWorkDir.text()),
319                    options,
320                    self.schemesEdit.text().split())
321            except TypeError:
322                # PyQt5 < 5.13.0 contains an error
323                QFileDialog.getExistingDirectoryUrl(
324                    None,
325                    self.eCaption.text(),
326                    self.eWorkDir.text(),
327                    options,
328                    self.schemesEdit.text().split())
329
330    def __toggleConfirmCheckBox(self):
331        """
332        Private slot to enable/disable the confirmation check box.
333        """
334        self.cConfirmOverwrite.setEnabled(
335            self.rSaveFile.isChecked() or self.rfSaveFile.isChecked() or
336            self.rSaveFileUrl.isChecked())
337
338    def __toggleGroupsAndTest(self):
339        """
340        Private slot to enable/disable certain groups and the test button.
341        """
342        if self.rDirectory.isChecked() or self.rDirectoryUrl.isChecked():
343            self.filePropertiesGroup.setEnabled(False)
344            self.dirPropertiesGroup.setEnabled(True)
345            self.bTest.setDisabled(self.cWorkDir.isChecked())
346        else:
347            self.filePropertiesGroup.setEnabled(True)
348            self.dirPropertiesGroup.setEnabled(False)
349            self.bTest.setDisabled(
350                self.cStartWith.isChecked() or self.cFilters.isChecked())
351
352    def __toggleInitialFilterAndResult(self, checkedId):
353        """
354        Private slot to enable/disable the initial filter elements and the
355        results entries.
356
357        @param checkedId id of the clicked button (integer)
358        """
359        enable = (
360            (self.__dialogVariant in (-1, ) and checkedId in [11, 12, 13]) or
361            (self.__dialogVariant in (5, 6) and
362             checkedId in [1, 2, 3, 21, 22, 23])
363        )
364
365        self.lInitialFilter.setEnabled(enable)
366        self.eInitialFilter.setEnabled(enable)
367        self.cInitialFilter.setEnabled(enable)
368
369        self.lFilterVariable.setEnabled(enable)
370        self.eFilterVariable.setEnabled(enable)
371
372        self.urlPropertiesGroup.setEnabled(checkedId in (21, 22, 23, 31))
373
374    def getCode(self, indLevel, indString):
375        """
376        Public method to get the source code for Qt5.
377
378        @param indLevel indentation level (int)
379        @param indString string used for indentation (space or tab) (string)
380        @return generated code (string)
381        """
382        # calculate our indentation level and the indentation string
383        il = indLevel + 1
384        istring = il * indString
385        estring = os.linesep + indLevel * indString
386
387        # now generate the code
388        if self.parentSelf.isChecked():
389            parent = "self"
390        elif self.parentNone.isChecked():
391            parent = "None"
392        elif self.parentOther.isChecked():
393            parent = self.parentEdit.text()
394            if parent == "":
395                parent = "None"
396
397        # prepare the result variables
398        nameVariable = self.eNameVariable.text()
399        if not nameVariable:
400            if self.__typeButtonsGroup.checkedButton() in [
401                    self.rOpenFile, self.rfOpenFile,
402                    self.rSaveFile, self.rfSaveFile]:
403                nameVariable = "fileName"
404            elif self.__typeButtonsGroup.checkedButton() in [
405                    self.rOpenFiles, self.rfOpenFiles]:
406                nameVariable = "fileNames"
407            elif self.__typeButtonsGroup.checkedButton() == self.rDirectory:
408                nameVariable = "dirName"
409            else:
410                nameVariable = "res"
411        filterVariable = self.eFilterVariable.text()
412        if not filterVariable:
413            if (
414                (self.__dialogVariant in (-1, ) and
415                 self.__typeButtonsGroup.checkedButton() in [
416                    self.rfOpenFile, self.rfOpenFiles, self.rfSaveFile]) or
417                (self.__dialogVariant in (5, 6) and
418                 self.__typeButtonsGroup.checkedButton() in [
419                    self.rOpenFile, self.rOpenFiles, self.rSaveFile])
420            ):
421                filterVariable = ", selectedFilter"
422            else:
423                filterVariable = ""
424        else:
425            filterVariable = ", " + filterVariable
426
427        if self.__dialogVariant == -1:
428            dialogType = "E5FileDialog"
429            optionStr = ""
430        else:
431            dialogType = "QFileDialog"
432            optionStr = ".Option"
433
434        code = '{0}{1} = {2}.'.format(nameVariable, filterVariable, dialogType)
435        if (
436            self.rOpenFile.isChecked() or
437            self.rfOpenFile.isChecked() or
438            self.rOpenFileUrl.isChecked()
439        ):
440            if self.rOpenFile.isChecked():
441                code += 'getOpenFileName({0}{1}'.format(os.linesep, istring)
442            elif self.rOpenFileUrl.isChecked():
443                code += 'getOpenFileUrl({0}{1}'.format(os.linesep, istring)
444            else:
445                code += 'getOpenFileNameAndFilter({0}{1}'.format(
446                    os.linesep, istring)
447            code += '{0},{1}{2}'.format(parent, os.linesep, istring)
448            if not self.eCaption.text():
449                code += '"",{0}{1}'.format(os.linesep, istring)
450            else:
451                code += 'self.tr("{0}"),{1}{2}'.format(
452                    self.eCaption.text(), os.linesep, istring)
453            if self.rOpenFileUrl.isChecked():
454                if not self.eStartWith.text():
455                    code += 'QUrl(),{0}{1}'.format(os.linesep, istring)
456                else:
457                    if self.cStartWith.isChecked():
458                        fmt = '{0},{1}{2}'
459                    else:
460                        fmt = 'QUrl("{0}"),{1}{2}'
461                    code += fmt.format(self.eStartWith.text(), os.linesep,
462                                       istring)
463            else:
464                if not self.eStartWith.text():
465                    code += '"",{0}{1}'.format(os.linesep, istring)
466                else:
467                    if self.cStartWith.isChecked():
468                        fmt = '{0},{1}{2}'
469                    else:
470                        fmt = '"{0}",{1}{2}'
471                    code += fmt.format(self.eStartWith.text(), os.linesep,
472                                       istring)
473            if self.eFilters.text() == "":
474                code += '""'
475            else:
476                if self.cFilters.isChecked():
477                    fmt = '{0}'
478                else:
479                    fmt = 'self.tr("{0}")'
480                code += fmt.format(self.eFilters.text())
481            if self.rfOpenFile.isChecked() or self.__dialogVariant in (5, 6):
482                if self.eInitialFilter.text() == "":
483                    initialFilter = "None"
484                else:
485                    if self.cInitialFilter.isChecked():
486                        fmt = '{0}'
487                    else:
488                        fmt = 'self.tr("{0}")'
489                    initialFilter = fmt.format(self.eInitialFilter.text())
490                code += ',{0}{1}{2}'.format(os.linesep, istring, initialFilter)
491            if not self.cSymlinks.isChecked():
492                code += (
493                    ',{0}{1}{2}.Options({2}{3}.DontResolveSymlinks)'
494                    .format(os.linesep, istring, dialogType, optionStr)
495                )
496            if self.rOpenFileUrl.isChecked() and bool(self.schemesEdit.text()):
497                code += ',{0}{1}{2}'.format(
498                    os.linesep, istring, self.__prepareSchemesList())
499            code += '){0}'.format(estring)
500        elif (
501            self.rOpenFiles.isChecked() or
502            self.rfOpenFiles.isChecked() or
503            self.rOpenFileUrls.isChecked()
504        ):
505            if self.rOpenFiles.isChecked():
506                code += 'getOpenFileNames({0}{1}'.format(os.linesep, istring)
507            elif self.rOpenFileUrls.isChecked():
508                code += 'getOpenFileUrls({0}{1}'.format(os.linesep, istring)
509            else:
510                code += 'getOpenFileNamesAndFilter({0}{1}'.format(
511                    os.linesep, istring)
512            code += '{0},{1}{2}'.format(parent, os.linesep, istring)
513            if not self.eCaption.text():
514                code += '"",{0}{1}'.format(os.linesep, istring)
515            else:
516                code += 'self.tr("{0}"),{1}{2}'.format(
517                    self.eCaption.text(), os.linesep, istring)
518            if self.rOpenFileUrls.isChecked():
519                if not self.eStartWith.text():
520                    code += 'QUrl(),{0}{1}'.format(os.linesep, istring)
521                else:
522                    if self.cStartWith.isChecked():
523                        fmt = '{0},{1}{2}'
524                    else:
525                        fmt = 'QUrl("{0}"),{1}{2}'
526                    code += fmt.format(self.eStartWith.text(), os.linesep,
527                                       istring)
528            else:
529                if not self.eStartWith.text():
530                    code += '"",{0}{1}'.format(os.linesep, istring)
531                else:
532                    if self.cStartWith.isChecked():
533                        fmt = '{0},{1}{2}'
534                    else:
535                        fmt = '"{0}",{1}{2}'
536                    code += fmt.format(self.eStartWith.text(), os.linesep,
537                                       istring)
538            if not self.eFilters.text():
539                code += '""'
540            else:
541                if self.cFilters.isChecked():
542                    fmt = '{0}'
543                else:
544                    fmt = 'self.tr("{0}")'
545                code += fmt.format(self.eFilters.text())
546            if self.rfOpenFiles.isChecked() or self.__dialogVariant in (5, 6):
547                if self.eInitialFilter.text() == "":
548                    initialFilter = "None"
549                else:
550                    if self.cInitialFilter.isChecked():
551                        fmt = '{0}'
552                    else:
553                        fmt = 'self.tr("{0}")'
554                    initialFilter = fmt.format(self.eInitialFilter.text())
555                code += ',{0}{1}{2}'.format(os.linesep, istring, initialFilter)
556            if not self.cSymlinks.isChecked():
557                code += (
558                    ',{0}{1}{2}.Options({2}{3}.DontResolveSymlinks)'
559                    .format(os.linesep, istring, dialogType, optionStr)
560                )
561            if (
562                self.rOpenFileUrls.isChecked() and
563                bool(self.schemesEdit.text())
564            ):
565                code += ',{0}{1}{2}'.format(
566                    os.linesep, istring, self.__prepareSchemesList())
567            code += '){0}'.format(estring)
568        elif (
569            self.rSaveFile.isChecked() or
570            self.rfSaveFile.isChecked() or
571            self.rSaveFileUrl.isChecked()
572        ):
573            if self.rSaveFile.isChecked():
574                code += 'getSaveFileName({0}{1}'.format(os.linesep, istring)
575            elif self.rSaveFileUrl.isChecked():
576                code += 'getSaveFileUrl({0}{1}'.format(os.linesep, istring)
577            else:
578                code += 'getSaveFileNameAndFilter({0}{1}'.format(
579                    os.linesep, istring)
580            code += '{0},{1}{2}'.format(parent, os.linesep, istring)
581            if not self.eCaption.text():
582                code += '"",{0}{1}'.format(os.linesep, istring)
583            else:
584                code += 'self.tr("{0}"),{1}{2}'.format(
585                    self.eCaption.text(), os.linesep, istring)
586            if self.rSaveFileUrl.isChecked():
587                if not self.eStartWith.text():
588                    code += 'QUrl(),{0}{1}'.format(os.linesep, istring)
589                else:
590                    if self.cStartWith.isChecked():
591                        fmt = '{0},{1}{2}'
592                    else:
593                        fmt = 'QUrl("{0}"),{1}{2}'
594                    code += fmt.format(self.eStartWith.text(), os.linesep,
595                                       istring)
596            else:
597                if not self.eStartWith.text():
598                    code += '"",{0}{1}'.format(os.linesep, istring)
599                else:
600                    if self.cStartWith.isChecked():
601                        fmt = '{0},{1}{2}'
602                    else:
603                        fmt = '"{0}",{1}{2}'
604                    code += fmt.format(self.eStartWith.text(), os.linesep,
605                                       istring)
606            if not self.eFilters.text():
607                code += '""'
608            else:
609                if self.cFilters.isChecked():
610                    fmt = '{0}'
611                else:
612                    fmt = 'self.tr("{0}")'
613                code += fmt.format(self.eFilters.text())
614            if self.rfSaveFile.isChecked() or self.__dialogVariant in (5, 6):
615                if self.eInitialFilter.text() == "":
616                    initialFilter = "None"
617                else:
618                    if self.cInitialFilter.isChecked():
619                        fmt = '{0}'
620                    else:
621                        fmt = 'self.tr("{0}")'
622                    initialFilter = fmt.format(self.eInitialFilter.text())
623                code += ',{0}{1}{2}'.format(os.linesep, istring, initialFilter)
624            if (
625                (not self.cSymlinks.isChecked()) or
626                (not self.cConfirmOverwrite.isChecked())
627            ):
628                code += ',{0}{1}{2}.Options('.format(
629                    os.linesep, istring, dialogType)
630                if not self.cSymlinks.isChecked():
631                    code += '{0}{1}.DontResolveSymlinks'.format(
632                        dialogType, optionStr)
633                if (
634                    (not self.cSymlinks.isChecked()) and
635                    (not self.cConfirmOverwrite.isChecked())
636                ):
637                    code += ' | '
638                if not self.cConfirmOverwrite.isChecked():
639                    code += '{0}{1}.DontConfirmOverwrite'.format(
640                        dialogType, optionStr)
641                code += ')'
642            if (
643                self.rSaveFileUrl.isChecked() and
644                bool(self.schemesEdit.text())
645            ):
646                code += ',{0}{1}{2}'.format(
647                    os.linesep, istring, self.__prepareSchemesList())
648
649            code += '){0}'.format(estring)
650        elif self.rDirectory.isChecked() or self.rDirectoryUrl.isChecked():
651            if self.rDirectory.isChecked():
652                code += 'getExistingDirectory({0}{1}'.format(
653                    os.linesep, istring)
654            else:
655                code += 'getExistingDirectoryUrl({0}{1}'.format(
656                    os.linesep, istring)
657            code += '{0},{1}{2}'.format(parent, os.linesep, istring)
658            if not self.eCaption.text():
659                code += '"",{0}{1}'.format(os.linesep, istring)
660            else:
661                code += 'self.tr("{0}"),{1}{2}'.format(
662                    self.eCaption.text(), os.linesep, istring)
663            if self.rDirectoryUrl.isChecked():
664                if not self.eWorkDir.text():
665                    code += 'QUrl()'
666                else:
667                    if self.cWorkDir.isChecked():
668                        fmt = '{0}'
669                    else:
670                        fmt = 'QUrl("{0}")'
671                    code += fmt.format(self.eWorkDir.text())
672            else:
673                if not self.eWorkDir.text():
674                    code += '""'
675                else:
676                    if self.cWorkDir.isChecked():
677                        fmt = '{0}'
678                    else:
679                        fmt = '"{0}"'
680                    code += fmt.format(self.eWorkDir.text())
681            code += ',{0}{1}{2}.Options('.format(os.linesep, istring,
682                                                 dialogType)
683            if not self.cSymlinks.isChecked():
684                code += '{0}{1}.DontResolveSymlinks | '.format(
685                    dialogType, optionStr)
686            if self.cDirOnly.isChecked():
687                code += '{0}{1}.ShowDirsOnly'.format(
688                    dialogType, optionStr)
689            else:
690                code += '{0}.Option(0)'.format(dialogType)
691            code += ')'
692            if self.rDirectoryUrl.isChecked():
693                code += ',{0}{1}{2}'.format(
694                    os.linesep, istring, self.__prepareSchemesList())
695            code += '){0}'.format(estring)
696
697        return code
698
699    def __prepareSchemesList(self):
700        """
701        Private method to prepare the list of supported schemes.
702
703        @return string representation of the supported schemes
704        @rtype str
705        """
706        return repr(self.schemesEdit.text().strip().split())
707