eric6/Project/ProjectFormsBrowser.py

changeset 7266
d001bc703c29
parent 7229
53054eb5b15a
child 7360
9190402e4505
equal deleted inserted replaced
7265:0665c4d509c9 7266:d001bc703c29
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

eric ide

mercurial