17 |
17 |
18 from E5Gui.E5Application import e5App |
18 from E5Gui.E5Application import e5App |
19 from E5Gui import E5MessageBox, E5FileDialog |
19 from E5Gui import E5MessageBox, E5FileDialog |
20 from E5Gui.E5ProgressDialog import E5ProgressDialog |
20 from E5Gui.E5ProgressDialog import E5ProgressDialog |
21 |
21 |
22 from .ProjectBrowserModel import ProjectBrowserFileItem, \ |
22 from .ProjectBrowserModel import ( |
23 ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem, \ |
23 ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem, |
24 ProjectBrowserFormType |
24 ProjectBrowserDirectoryItem, ProjectBrowserFormType |
|
25 ) |
25 from .ProjectBaseBrowser import ProjectBaseBrowser |
26 from .ProjectBaseBrowser import ProjectBaseBrowser |
26 |
27 |
27 import UI.PixmapCache |
28 import UI.PixmapCache |
28 |
29 |
29 import Preferences |
30 import Preferences |
59 @param parent parent widget of this browser (QWidget) |
60 @param parent parent widget of this browser (QWidget) |
60 """ |
61 """ |
61 ProjectBaseBrowser.__init__(self, project, ProjectBrowserFormType, |
62 ProjectBaseBrowser.__init__(self, project, ProjectBrowserFormType, |
62 parent) |
63 parent) |
63 |
64 |
64 self.selectedItemsFilter = \ |
65 self.selectedItemsFilter = [ProjectBrowserFileItem, |
65 [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem] |
66 ProjectBrowserSimpleDirectoryItem] |
66 |
67 |
67 self.setWindowTitle(self.tr('Forms')) |
68 self.setWindowTitle(self.tr('Forms')) |
68 |
69 |
69 self.setWhatsThis(self.tr( |
70 self.setWhatsThis(self.tr( |
70 """<b>Project Forms Browser</b>""" |
71 """<b>Project Forms Browser</b>""" |
122 self.dirMultiMenuActions = [] |
123 self.dirMultiMenuActions = [] |
123 |
124 |
124 self.menusAboutToBeCreated.emit() |
125 self.menusAboutToBeCreated.emit() |
125 |
126 |
126 self.menu = QMenu(self) |
127 self.menu = QMenu(self) |
127 if self.project.getProjectType() in \ |
128 if self.project.getProjectType() in [ |
128 ["Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"]: |
129 "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2" |
|
130 ]: |
129 self.menu.addAction( |
131 self.menu.addAction( |
130 self.tr('Compile form'), self.__compileForm) |
132 self.tr('Compile form'), self.__compileForm) |
131 self.menu.addAction( |
133 self.menu.addAction( |
132 self.tr('Compile all forms'), |
134 self.tr('Compile all forms'), |
133 self.__compileAllForms) |
135 self.__compileAllForms) |
163 self.menu.addAction( |
165 self.menu.addAction( |
164 self.hooksMenuEntries.get( |
166 self.hooksMenuEntries.get( |
165 "generateDialogCode", |
167 "generateDialogCode", |
166 self.tr('Generate Dialog Code...')), |
168 self.tr('Generate Dialog Code...')), |
167 self.__generateDialogCode) |
169 self.__generateDialogCode) |
168 if self.hooks["compileForm"] is not None or \ |
170 if ( |
169 self.hooks["compileAllForms"] is not None or \ |
171 self.hooks["compileForm"] is not None or |
170 self.hooks["generateDialogCode"] is not None: |
172 self.hooks["compileAllForms"] is not None or |
|
173 self.hooks["generateDialogCode"] is not None |
|
174 ): |
171 self.menu.addSeparator() |
175 self.menu.addSeparator() |
172 if self.hooks["open"] is not None: |
176 if self.hooks["open"] is not None: |
173 self.menu.addAction( |
177 self.menu.addAction( |
174 self.hooksMenuEntries.get("open", self.tr('Open')), |
178 self.hooksMenuEntries.get("open", self.tr('Open')), |
175 self.__openFile) |
179 self.__openFile) |
181 self.tr('Remove from project'), self._removeFile) |
185 self.tr('Remove from project'), self._removeFile) |
182 self.menuActions.append(act) |
186 self.menuActions.append(act) |
183 act = self.menu.addAction(self.tr('Delete'), self.__deleteFile) |
187 act = self.menu.addAction(self.tr('Delete'), self.__deleteFile) |
184 self.menuActions.append(act) |
188 self.menuActions.append(act) |
185 self.menu.addSeparator() |
189 self.menu.addSeparator() |
186 if self.project.getProjectType() in \ |
190 if self.project.getProjectType() in [ |
187 ["Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"]: |
191 "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2" |
|
192 ]: |
188 self.menu.addAction(self.tr('New form...'), self.__newForm) |
193 self.menu.addAction(self.tr('New form...'), self.__newForm) |
189 else: |
194 else: |
190 if self.hooks["newForm"] is not None: |
195 if self.hooks["newForm"] is not None: |
191 self.menu.addAction( |
196 self.menu.addAction( |
192 self.hooksMenuEntries.get( |
197 self.hooksMenuEntries.get( |
204 self.tr('Collapse all directories'), self._collapseAllDirs) |
209 self.tr('Collapse all directories'), self._collapseAllDirs) |
205 self.menu.addSeparator() |
210 self.menu.addSeparator() |
206 self.menu.addAction(self.tr('Configure...'), self._configure) |
211 self.menu.addAction(self.tr('Configure...'), self._configure) |
207 |
212 |
208 self.backMenu = QMenu(self) |
213 self.backMenu = QMenu(self) |
209 if self.project.getProjectType() in \ |
214 if ( |
210 ["Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"] or \ |
215 self.project.getProjectType() in [ |
211 self.hooks["compileAllForms"] is not None: |
216 "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2" |
|
217 ] or |
|
218 self.hooks["compileAllForms"] is not None |
|
219 ): |
212 self.backMenu.addAction( |
220 self.backMenu.addAction( |
213 self.tr('Compile all forms'), self.__compileAllForms) |
221 self.tr('Compile all forms'), self.__compileAllForms) |
214 self.backMenu.addSeparator() |
222 self.backMenu.addSeparator() |
215 self.backMenu.addAction( |
223 self.backMenu.addAction( |
216 self.tr('Configure uic Compiler'), |
224 self.tr('Configure uic Compiler'), |
235 self.backMenu.addAction(self.tr('Configure...'), self._configure) |
243 self.backMenu.addAction(self.tr('Configure...'), self._configure) |
236 self.backMenu.setEnabled(False) |
244 self.backMenu.setEnabled(False) |
237 |
245 |
238 # create the menu for multiple selected files |
246 # create the menu for multiple selected files |
239 self.multiMenu = QMenu(self) |
247 self.multiMenu = QMenu(self) |
240 if self.project.getProjectType() in \ |
248 if self.project.getProjectType() in [ |
241 ["Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"]: |
249 "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2" |
|
250 ]: |
242 self.multiMenu.addAction( |
251 self.multiMenu.addAction( |
243 self.tr('Compile forms'), self.__compileSelectedForms) |
252 self.tr('Compile forms'), self.__compileSelectedForms) |
244 self.multiMenu.addSeparator() |
253 self.multiMenu.addSeparator() |
245 self.multiMenu.addAction( |
254 self.multiMenu.addAction( |
246 self.tr('Configure uic Compiler'), |
255 self.tr('Configure uic Compiler'), |
281 self.tr('Collapse all directories'), self._collapseAllDirs) |
290 self.tr('Collapse all directories'), self._collapseAllDirs) |
282 self.multiMenu.addSeparator() |
291 self.multiMenu.addSeparator() |
283 self.multiMenu.addAction(self.tr('Configure...'), self._configure) |
292 self.multiMenu.addAction(self.tr('Configure...'), self._configure) |
284 |
293 |
285 self.dirMenu = QMenu(self) |
294 self.dirMenu = QMenu(self) |
286 if self.project.getProjectType() in \ |
295 if self.project.getProjectType() in [ |
287 ["Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"]: |
296 "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2" |
|
297 ]: |
288 self.dirMenu.addAction( |
298 self.dirMenu.addAction( |
289 self.tr('Compile all forms'), self.__compileAllForms) |
299 self.tr('Compile all forms'), self.__compileAllForms) |
290 self.dirMenu.addSeparator() |
300 self.dirMenu.addSeparator() |
291 self.dirMenu.addAction( |
301 self.dirMenu.addAction( |
292 self.tr('Configure uic Compiler'), |
302 self.tr('Configure uic Compiler'), |
305 self.dirMenuActions.append(act) |
315 self.dirMenuActions.append(act) |
306 act = self.dirMenu.addAction( |
316 act = self.dirMenu.addAction( |
307 self.tr('Delete'), self._deleteDirectory) |
317 self.tr('Delete'), self._deleteDirectory) |
308 self.dirMenuActions.append(act) |
318 self.dirMenuActions.append(act) |
309 self.dirMenu.addSeparator() |
319 self.dirMenu.addSeparator() |
310 if self.project.getProjectType() in \ |
320 if self.project.getProjectType() in [ |
311 ["Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"]: |
321 "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2" |
|
322 ]: |
312 self.dirMenu.addAction(self.tr('New form...'), self.__newForm) |
323 self.dirMenu.addAction(self.tr('New form...'), self.__newForm) |
313 else: |
324 else: |
314 if self.hooks["newForm"] is not None: |
325 if self.hooks["newForm"] is not None: |
315 self.dirMenu.addAction( |
326 self.dirMenu.addAction( |
316 self.hooksMenuEntries.get( |
327 self.hooksMenuEntries.get( |
330 self.tr('Collapse all directories'), self._collapseAllDirs) |
341 self.tr('Collapse all directories'), self._collapseAllDirs) |
331 self.dirMenu.addSeparator() |
342 self.dirMenu.addSeparator() |
332 self.dirMenu.addAction(self.tr('Configure...'), self._configure) |
343 self.dirMenu.addAction(self.tr('Configure...'), self._configure) |
333 |
344 |
334 self.dirMultiMenu = QMenu(self) |
345 self.dirMultiMenu = QMenu(self) |
335 if self.project.getProjectType() in \ |
346 if self.project.getProjectType() in [ |
336 ["Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"]: |
347 "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2" |
|
348 ]: |
337 self.dirMultiMenu.addAction( |
349 self.dirMultiMenu.addAction( |
338 self.tr('Compile all forms'), self.__compileAllForms) |
350 self.tr('Compile all forms'), self.__compileAllForms) |
339 self.dirMultiMenu.addSeparator() |
351 self.dirMultiMenu.addSeparator() |
340 self.dirMultiMenu.addAction( |
352 self.dirMultiMenu.addAction( |
341 self.tr('Configure uic Compiler'), |
353 self.tr('Configure uic Compiler'), |
456 Private method to add form files to the project. |
468 Private method to add form files to the project. |
457 """ |
469 """ |
458 itm = self.model().item(self.currentIndex()) |
470 itm = self.model().item(self.currentIndex()) |
459 if isinstance(itm, ProjectBrowserFileItem): |
471 if isinstance(itm, ProjectBrowserFileItem): |
460 dn = os.path.dirname(itm.fileName()) |
472 dn = os.path.dirname(itm.fileName()) |
461 elif isinstance(itm, ProjectBrowserSimpleDirectoryItem) or \ |
473 elif isinstance( |
462 isinstance(itm, ProjectBrowserDirectoryItem): |
474 itm, |
|
475 (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem) |
|
476 ): |
463 dn = itm.dirName() |
477 dn = itm.dirName() |
464 else: |
478 else: |
465 dn = None |
479 dn = None |
466 self.project.addFiles('form', dn) |
480 self.project.addFiles('form', dn) |
467 |
481 |
470 Private method to add form files of a directory to the project. |
484 Private method to add form files of a directory to the project. |
471 """ |
485 """ |
472 itm = self.model().item(self.currentIndex()) |
486 itm = self.model().item(self.currentIndex()) |
473 if isinstance(itm, ProjectBrowserFileItem): |
487 if isinstance(itm, ProjectBrowserFileItem): |
474 dn = os.path.dirname(itm.fileName()) |
488 dn = os.path.dirname(itm.fileName()) |
475 elif isinstance(itm, ProjectBrowserSimpleDirectoryItem) or \ |
489 elif isinstance( |
476 isinstance(itm, ProjectBrowserDirectoryItem): |
490 itm, |
|
491 (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem) |
|
492 ): |
477 dn = itm.dirName() |
493 dn = itm.dirName() |
478 else: |
494 else: |
479 dn = None |
495 dn = None |
480 self.project.addDirectory('form', dn) |
496 self.project.addDirectory('form', dn) |
481 |
497 |
552 path = os.path.join(self.project.ppath, itm.data(0)) |
568 path = os.path.join(self.project.ppath, itm.data(0)) |
553 |
569 |
554 if self.hooks["newForm"] is not None: |
570 if self.hooks["newForm"] is not None: |
555 self.hooks["newForm"](path) |
571 self.hooks["newForm"](path) |
556 else: |
572 else: |
557 if self.project.getProjectType() in \ |
573 if self.project.getProjectType() in [ |
558 ["Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"]: |
574 "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2" |
|
575 ]: |
559 self.__newUiForm(path) |
576 self.__newUiForm(path) |
560 |
577 |
561 def __newUiForm(self, path): |
578 def __newUiForm(self, path): |
562 """ |
579 """ |
563 Private slot to handle the New Form menu action for Qt-related |
580 Private slot to handle the New Form menu action for Qt-related |
633 fn2 = itm.fileName() |
650 fn2 = itm.fileName() |
634 fullNames.append(fn2) |
651 fullNames.append(fn2) |
635 fn = self.project.getRelativePath(fn2) |
652 fn = self.project.getRelativePath(fn2) |
636 files.append(fn) |
653 files.append(fn) |
637 |
654 |
638 from UI.DeleteFilesConfirmationDialog import \ |
655 from UI.DeleteFilesConfirmationDialog import ( |
639 DeleteFilesConfirmationDialog |
656 DeleteFilesConfirmationDialog |
|
657 ) |
640 dlg = DeleteFilesConfirmationDialog( |
658 dlg = DeleteFilesConfirmationDialog( |
641 self.parent(), |
659 self.parent(), |
642 self.tr("Delete forms"), |
660 self.tr("Delete forms"), |
643 self.tr( |
661 self.tr( |
644 "Do you really want to delete these forms from the project?"), |
662 "Do you really want to delete these forms from the project?"), |
663 """ |
681 """ |
664 Private method to determine the UI compiler for the project. |
682 Private method to determine the UI compiler for the project. |
665 """ |
683 """ |
666 self.__resetUiCompiler() |
684 self.__resetUiCompiler() |
667 |
685 |
668 if self.project.getProjectLanguage() in \ |
686 if self.project.getProjectLanguage() in [ |
669 ["Python", "Python2", "Python3"]: |
687 "Python", "Python2", "Python3" |
|
688 ]: |
670 if self.project.getProjectType() in ["Qt4", ]: |
689 if self.project.getProjectType() in ["Qt4", ]: |
671 self.__uicompiler = Utilities.generatePyQtToolPath( |
690 self.__uicompiler = Utilities.generatePyQtToolPath( |
672 'pyuic4', ["py3uic4"]) |
691 'pyuic4', ["py3uic4"]) |
673 elif self.project.getProjectType() in ["PyQt5"]: |
692 elif self.project.getProjectType() in ["PyQt5"]: |
674 self.__uicompiler = Utilities.generatePyQtToolPath( |
693 self.__uicompiler = Utilities.generatePyQtToolPath( |
675 'pyuic5', ["py3uic5"]) |
694 'pyuic5', ["py3uic5"]) |
676 elif self.project.getProjectType() in ["E6Plugin"]: |
695 elif self.project.getProjectType() in ["E6Plugin"]: |
677 self.__uicompiler = Utilities.generatePyQtToolPath( |
696 self.__uicompiler = Utilities.generatePyQtToolPath( |
678 'pyuic5', ["py3uic5"]) |
697 'pyuic5', ["py3uic5"]) |
679 elif self.project.getProjectType() == "PySide": |
698 elif self.project.getProjectType() == "PySide": |
680 self.__uicompiler = \ |
699 self.__uicompiler = Utilities.generatePySideToolPath( |
681 Utilities.generatePySideToolPath('pyside-uic', "1") |
700 'pyside-uic', "1") |
682 elif self.project.getProjectType() == "PySide2": |
701 elif self.project.getProjectType() == "PySide2": |
683 self.__uicompiler = \ |
702 self.__uicompiler = Utilities.generatePySideToolPath( |
684 Utilities.generatePySideToolPath('pyside2-uic', "2") |
703 'pyside2-uic', "2") |
685 elif self.project.getProjectLanguage() == "Ruby": |
704 elif self.project.getProjectLanguage() == "Ruby": |
686 if self.project.getProjectType() == "Qt4": |
705 if self.project.getProjectType() == "Qt4": |
687 self.__uicompiler = 'rbuic4' |
706 self.__uicompiler = 'rbuic4' |
688 if Utilities.isWindowsPlatform(): |
707 if Utilities.isWindowsPlatform(): |
689 self.__uicompiler = \ |
708 self.__uicompiler = Utilities.getWindowsExecutablePath( |
690 Utilities.getWindowsExecutablePath(self.__uicompiler) |
709 self.__uicompiler) |
691 |
710 |
692 def getUiCompiler(self): |
711 def getUiCompiler(self): |
693 """ |
712 """ |
694 Public method to get the UI compiler executable of the project. |
713 Public method to get the UI compiler executable of the project. |
695 |
714 |
814 return None |
833 return None |
815 |
834 |
816 ofn, ext = os.path.splitext(fn) |
835 ofn, ext = os.path.splitext(fn) |
817 fn = os.path.join(self.project.ppath, fn) |
836 fn = os.path.join(self.project.ppath, fn) |
818 |
837 |
819 if self.project.getProjectLanguage() in \ |
838 if self.project.getProjectLanguage() in [ |
820 ["Python", "Python2", "Python3"]: |
839 "Python", "Python2", "Python3" |
|
840 ]: |
821 dirname, filename = os.path.split(ofn) |
841 dirname, filename = os.path.split(ofn) |
822 self.compiledFile = os.path.join(dirname, "Ui_" + filename + ".py") |
842 self.compiledFile = os.path.join(dirname, "Ui_" + filename + ".py") |
823 args.append("-x") |
843 args.append("-x") |
824 indentWidth = Preferences.getQt("PyuicIndent") |
844 indentWidth = Preferences.getQt("PyuicIndent") |
825 if indentWidth != self.PyuicIndentDefault: |
845 if indentWidth != self.PyuicIndentDefault: |
829 # PySide and PySide2 |
849 # PySide and PySide2 |
830 if Preferences.getQt("PyuicFromImports"): |
850 if Preferences.getQt("PyuicFromImports"): |
831 args.append("--from-imports") |
851 args.append("--from-imports") |
832 else: |
852 else: |
833 # PyQt4 and PyQt5 |
853 # PyQt4 and PyQt5 |
834 if 'uic5' in uicompiler and \ |
854 if ( |
835 self.project.pdata["UICPARAMS"]["Package"]: |
855 'uic5' in uicompiler and |
|
856 self.project.pdata["UICPARAMS"]["Package"] |
|
857 ): |
836 args.append("--import-from={0}".format( |
858 args.append("--import-from={0}".format( |
837 self.project.pdata["UICPARAMS"]["Package"])) |
859 self.project.pdata["UICPARAMS"]["Package"])) |
838 elif Preferences.getQt("PyuicFromImports"): |
860 elif Preferences.getQt("PyuicFromImports"): |
839 args.append("--from-imports") |
861 args.append("--from-imports") |
840 if self.project.pdata["UICPARAMS"]["RcSuffix"]: |
862 if self.project.pdata["UICPARAMS"]["RcSuffix"]: |
984 Public method to compile all changed forms to source files. |
1006 Public method to compile all changed forms to source files. |
985 """ |
1007 """ |
986 if self.hooks["compileChangedForms"] is not None: |
1008 if self.hooks["compileChangedForms"] is not None: |
987 self.hooks["compileChangedForms"](self.project.pdata["FORMS"]) |
1009 self.hooks["compileChangedForms"](self.project.pdata["FORMS"]) |
988 else: |
1010 else: |
989 if self.project.getProjectType() not in \ |
1011 if self.project.getProjectType() not in [ |
990 ["Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"]: |
1012 "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2" |
|
1013 ]: |
991 # ignore the request for non Qt GUI projects |
1014 # ignore the request for non Qt GUI projects |
992 return |
1015 return |
993 |
1016 |
994 progress = E5ProgressDialog( |
1017 progress = E5ProgressDialog( |
995 self.tr("Determining changed forms..."), |
1018 self.tr("Determining changed forms..."), |
1004 for fn in self.project.pdata["FORMS"]: |
1027 for fn in self.project.pdata["FORMS"]: |
1005 progress.setValue(i) |
1028 progress.setValue(i) |
1006 QApplication.processEvents() |
1029 QApplication.processEvents() |
1007 |
1030 |
1008 ifn = os.path.join(self.project.ppath, fn) |
1031 ifn = os.path.join(self.project.ppath, fn) |
1009 if self.project.getProjectLanguage() in \ |
1032 if self.project.getProjectLanguage() in [ |
1010 ["Python", "Python2", "Python3"]: |
1033 "Python", "Python2", "Python3" |
|
1034 ]: |
1011 dirname, filename = os.path.split(os.path.splitext(ifn)[0]) |
1035 dirname, filename = os.path.split(os.path.splitext(ifn)[0]) |
1012 ofn = os.path.join(dirname, "Ui_" + filename + ".py") |
1036 ofn = os.path.join(dirname, "Ui_" + filename + ".py") |
1013 elif self.project.getProjectLanguage() == "Ruby": |
1037 elif self.project.getProjectLanguage() == "Ruby": |
1014 ofn = os.path.splitext(ifn)[0] + '.rb' |
1038 ofn = os.path.splitext(ifn)[0] + '.rb' |
1015 if not os.path.exists(ofn) or \ |
1039 if ( |
1016 os.stat(ifn).st_mtime > os.stat(ofn).st_mtime: |
1040 not os.path.exists(ofn) or |
|
1041 os.stat(ifn).st_mtime > os.stat(ofn).st_mtime |
|
1042 ): |
1017 changedForms.append(fn) |
1043 changedForms.append(fn) |
1018 i += 1 |
1044 i += 1 |
1019 progress.setValue(i) |
1045 progress.setValue(i) |
1020 QApplication.processEvents() |
1046 QApplication.processEvents() |
1021 |
1047 |