eric6/Project/ProjectResourcesBrowser.py

changeset 7266
d001bc703c29
parent 7229
53054eb5b15a
child 7360
9190402e4505
equal deleted inserted replaced
7265:0665c4d509c9 7266:d001bc703c29
15 15
16 from E5Gui.E5Application import e5App 16 from E5Gui.E5Application import e5App
17 from E5Gui import E5MessageBox, E5FileDialog 17 from E5Gui import E5MessageBox, E5FileDialog
18 from E5Gui.E5ProgressDialog import E5ProgressDialog 18 from E5Gui.E5ProgressDialog import E5ProgressDialog
19 19
20 from .ProjectBrowserModel import ProjectBrowserFileItem, \ 20 from .ProjectBrowserModel import (
21 ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem, \ 21 ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem,
22 ProjectBrowserResourceType 22 ProjectBrowserDirectoryItem, ProjectBrowserResourceType
23 )
23 from .ProjectBaseBrowser import ProjectBaseBrowser 24 from .ProjectBaseBrowser import ProjectBaseBrowser
24 25
25 import UI.PixmapCache 26 import UI.PixmapCache
26 27
27 import Preferences 28 import Preferences
51 @param parent parent widget of this browser (QWidget) 52 @param parent parent widget of this browser (QWidget)
52 """ 53 """
53 ProjectBaseBrowser.__init__(self, project, ProjectBrowserResourceType, 54 ProjectBaseBrowser.__init__(self, project, ProjectBrowserResourceType,
54 parent) 55 parent)
55 56
56 self.selectedItemsFilter = \ 57 self.selectedItemsFilter = [ProjectBrowserFileItem,
57 [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem] 58 ProjectBrowserSimpleDirectoryItem]
58 59
59 self.setWindowTitle(self.tr('Resources')) 60 self.setWindowTitle(self.tr('Resources'))
60 61
61 self.setWhatsThis(self.tr( 62 self.setWhatsThis(self.tr(
62 """<b>Project Resources Browser</b>""" 63 """<b>Project Resources Browser</b>"""
75 self.multiMenuActions = [] 76 self.multiMenuActions = []
76 self.dirMenuActions = [] 77 self.dirMenuActions = []
77 self.dirMultiMenuActions = [] 78 self.dirMultiMenuActions = []
78 79
79 self.menu = QMenu(self) 80 self.menu = QMenu(self)
80 if self.project.getProjectType() in \ 81 if self.project.getProjectType() in [
81 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", 82 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
82 "PySide", "PySideC", "PySide2", "PySideC2"]: 83 "PySide", "PySideC", "PySide2", "PySideC2"
84 ]:
83 self.menu.addAction( 85 self.menu.addAction(
84 self.tr('Compile resource'), 86 self.tr('Compile resource'),
85 self.__compileResource) 87 self.__compileResource)
86 self.menu.addAction( 88 self.menu.addAction(
87 self.tr('Compile all resources'), 89 self.tr('Compile all resources'),
102 self.menu.addAction( 104 self.menu.addAction(
103 self.hooksMenuEntries.get( 105 self.hooksMenuEntries.get(
104 "compileAllResources", 106 "compileAllResources",
105 self.tr('Compile all resources')), 107 self.tr('Compile all resources')),
106 self.__compileAllResources) 108 self.__compileAllResources)
107 if self.hooks["compileResource"] is not None or \ 109 if (
108 self.hooks["compileAllResources"] is not None: 110 self.hooks["compileResource"] is not None or
111 self.hooks["compileAllResources"] is not None
112 ):
109 self.menu.addSeparator() 113 self.menu.addSeparator()
110 self.menu.addAction(self.tr('Open'), self.__openFile) 114 self.menu.addAction(self.tr('Open'), self.__openFile)
111 self.menu.addSeparator() 115 self.menu.addSeparator()
112 act = self.menu.addAction(self.tr('Rename file'), self._renameFile) 116 act = self.menu.addAction(self.tr('Rename file'), self._renameFile)
113 self.menuActions.append(act) 117 self.menuActions.append(act)
115 self.tr('Remove from project'), self._removeFile) 119 self.tr('Remove from project'), self._removeFile)
116 self.menuActions.append(act) 120 self.menuActions.append(act)
117 act = self.menu.addAction(self.tr('Delete'), self.__deleteFile) 121 act = self.menu.addAction(self.tr('Delete'), self.__deleteFile)
118 self.menuActions.append(act) 122 self.menuActions.append(act)
119 self.menu.addSeparator() 123 self.menu.addSeparator()
120 if self.project.getProjectType() in \ 124 if self.project.getProjectType() in [
121 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", 125 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
122 "PySide", "PySideC", "PySide2", "PySideC2"]: 126 "PySide", "PySideC", "PySide2", "PySideC2"
127 ]:
123 self.menu.addAction( 128 self.menu.addAction(
124 self.tr('New resource...'), self.__newResource) 129 self.tr('New resource...'), self.__newResource)
125 else: 130 else:
126 if self.hooks["newResource"] is not None: 131 if self.hooks["newResource"] is not None:
127 self.menu.addAction( 132 self.menu.addAction(
143 self.tr('Collapse all directories'), self._collapseAllDirs) 148 self.tr('Collapse all directories'), self._collapseAllDirs)
144 self.menu.addSeparator() 149 self.menu.addSeparator()
145 self.menu.addAction(self.tr('Configure...'), self._configure) 150 self.menu.addAction(self.tr('Configure...'), self._configure)
146 151
147 self.backMenu = QMenu(self) 152 self.backMenu = QMenu(self)
148 if self.project.getProjectType() in \ 153 if self.project.getProjectType() in [
149 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", 154 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
150 "PySide", "PySideC", "PySide2", "PySideC2"]: 155 "PySide", "PySideC", "PySide2", "PySideC2"
156 ]:
151 self.backMenu.addAction( 157 self.backMenu.addAction(
152 self.tr('Compile all resources'), 158 self.tr('Compile all resources'),
153 self.__compileAllResources) 159 self.__compileAllResources)
154 self.backMenu.addSeparator() 160 self.backMenu.addSeparator()
155 self.backMenu.addAction( 161 self.backMenu.addAction(
185 self.backMenu.addAction(self.tr('Configure...'), self._configure) 191 self.backMenu.addAction(self.tr('Configure...'), self._configure)
186 self.backMenu.setEnabled(False) 192 self.backMenu.setEnabled(False)
187 193
188 # create the menu for multiple selected files 194 # create the menu for multiple selected files
189 self.multiMenu = QMenu(self) 195 self.multiMenu = QMenu(self)
190 if self.project.getProjectType() in \ 196 if self.project.getProjectType() in [
191 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", 197 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
192 "PySide", "PySideC", "PySide2", "PySideC2"]: 198 "PySide", "PySideC", "PySide2", "PySideC2"
199 ]:
193 act = self.multiMenu.addAction( 200 act = self.multiMenu.addAction(
194 self.tr('Compile resources'), 201 self.tr('Compile resources'),
195 self.__compileSelectedResources) 202 self.__compileSelectedResources)
196 self.multiMenu.addSeparator() 203 self.multiMenu.addSeparator()
197 self.multiMenu.addAction( 204 self.multiMenu.addAction(
221 self.tr('Collapse all directories'), self._collapseAllDirs) 228 self.tr('Collapse all directories'), self._collapseAllDirs)
222 self.multiMenu.addSeparator() 229 self.multiMenu.addSeparator()
223 self.multiMenu.addAction(self.tr('Configure...'), self._configure) 230 self.multiMenu.addAction(self.tr('Configure...'), self._configure)
224 231
225 self.dirMenu = QMenu(self) 232 self.dirMenu = QMenu(self)
226 if self.project.getProjectType() in \ 233 if self.project.getProjectType() in [
227 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", 234 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
228 "PySide", "PySideC", "PySide2", "PySideC2"]: 235 "PySide", "PySideC", "PySide2", "PySideC2"
236 ]:
229 self.dirMenu.addAction( 237 self.dirMenu.addAction(
230 self.tr('Compile all resources'), 238 self.tr('Compile all resources'),
231 self.__compileAllResources) 239 self.__compileAllResources)
232 self.dirMenu.addSeparator() 240 self.dirMenu.addSeparator()
233 self.dirMenu.addAction( 241 self.dirMenu.addAction(
266 self.tr('Collapse all directories'), self._collapseAllDirs) 274 self.tr('Collapse all directories'), self._collapseAllDirs)
267 self.dirMenu.addSeparator() 275 self.dirMenu.addSeparator()
268 self.dirMenu.addAction(self.tr('Configure...'), self._configure) 276 self.dirMenu.addAction(self.tr('Configure...'), self._configure)
269 277
270 self.dirMultiMenu = QMenu(self) 278 self.dirMultiMenu = QMenu(self)
271 if self.project.getProjectType() in \ 279 if self.project.getProjectType() in [
272 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", 280 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
273 "PySide", "PySideC", "PySide2", "PySideC2"]: 281 "PySide", "PySideC", "PySide2", "PySideC2"
282 ]:
274 self.dirMultiMenu.addAction( 283 self.dirMultiMenu.addAction(
275 self.tr('Compile all resources'), 284 self.tr('Compile all resources'),
276 self.__compileAllResources) 285 self.__compileAllResources)
277 self.dirMultiMenu.addSeparator() 286 self.dirMultiMenu.addSeparator()
278 self.dirMultiMenu.addAction( 287 self.dirMultiMenu.addAction(
396 Private method to add resource files to the project. 405 Private method to add resource files to the project.
397 """ 406 """
398 itm = self.model().item(self.currentIndex()) 407 itm = self.model().item(self.currentIndex())
399 if isinstance(itm, ProjectBrowserFileItem): 408 if isinstance(itm, ProjectBrowserFileItem):
400 dn = os.path.dirname(itm.fileName()) 409 dn = os.path.dirname(itm.fileName())
401 elif isinstance(itm, ProjectBrowserSimpleDirectoryItem) or \ 410 elif isinstance(
402 isinstance(itm, ProjectBrowserDirectoryItem): 411 itm,
412 (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
413 ):
403 dn = itm.dirName() 414 dn = itm.dirName()
404 else: 415 else:
405 dn = None 416 dn = None
406 self.project.addFiles('resource', dn) 417 self.project.addFiles('resource', dn)
407 418
410 Private method to add resource files of a directory to the project. 421 Private method to add resource files of a directory to the project.
411 """ 422 """
412 itm = self.model().item(self.currentIndex()) 423 itm = self.model().item(self.currentIndex())
413 if isinstance(itm, ProjectBrowserFileItem): 424 if isinstance(itm, ProjectBrowserFileItem):
414 dn = os.path.dirname(itm.fileName()) 425 dn = os.path.dirname(itm.fileName())
415 elif isinstance(itm, ProjectBrowserSimpleDirectoryItem) or \ 426 elif isinstance(
416 isinstance(itm, ProjectBrowserDirectoryItem): 427 itm,
428 (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
429 ):
417 dn = itm.dirName() 430 dn = itm.dirName()
418 else: 431 else:
419 dn = None 432 dn = None
420 self.project.addDirectory('resource', dn) 433 self.project.addDirectory('resource', dn)
421 434
518 fn2 = itm.fileName() 531 fn2 = itm.fileName()
519 fullNames.append(fn2) 532 fullNames.append(fn2)
520 fn = self.project.getRelativePath(fn2) 533 fn = self.project.getRelativePath(fn2)
521 files.append(fn) 534 files.append(fn)
522 535
523 from UI.DeleteFilesConfirmationDialog import \ 536 from UI.DeleteFilesConfirmationDialog import (
524 DeleteFilesConfirmationDialog 537 DeleteFilesConfirmationDialog
538 )
525 dlg = DeleteFilesConfirmationDialog( 539 dlg = DeleteFilesConfirmationDialog(
526 self.parent(), 540 self.parent(),
527 self.tr("Delete resources"), 541 self.tr("Delete resources"),
528 self.tr( 542 self.tr(
529 "Do you really want to delete these resources from the" 543 "Do you really want to delete these resources from the"
640 """ 654 """
641 self.compileProc = QProcess() 655 self.compileProc = QProcess()
642 args = [] 656 args = []
643 self.buf = "" 657 self.buf = ""
644 658
645 if self.project.getProjectLanguage() in \ 659 if self.project.getProjectLanguage() in [
646 ["Python", "Python2", "Python3"]: 660 "Python", "Python2", "Python3"
661 ]:
647 if self.project.getProjectType() in ["Qt4", "Qt4C"]: 662 if self.project.getProjectType() in ["Qt4", "Qt4C"]:
648 self.rccCompiler = Utilities.generatePyQtToolPath('pyrcc4') 663 self.rccCompiler = Utilities.generatePyQtToolPath('pyrcc4')
649 if self.project.getProjectLanguage() in \ 664 if self.project.getProjectLanguage() in [
650 ["Python", "Python2"]: 665 "Python", "Python2"
666 ]:
651 args.append("-py2") 667 args.append("-py2")
652 else: 668 else:
653 args.append("-py3") 669 args.append("-py3")
654 elif self.project.getProjectType() in ["PyQt5", "PyQt5C"]: 670 elif self.project.getProjectType() in ["PyQt5", "PyQt5C"]:
655 self.rccCompiler = Utilities.generatePyQtToolPath('pyrcc5') 671 self.rccCompiler = Utilities.generatePyQtToolPath('pyrcc5')
656 elif self.project.getProjectType() in ["E6Plugin"]: 672 elif self.project.getProjectType() in ["E6Plugin"]:
657 self.rccCompiler = Utilities.generatePyQtToolPath('pyrcc5') 673 self.rccCompiler = Utilities.generatePyQtToolPath('pyrcc5')
658 elif self.project.getProjectType() in ["PySide", "PySideC"]: 674 elif self.project.getProjectType() in ["PySide", "PySideC"]:
659 self.rccCompiler = Utilities.generatePySideToolPath( 675 self.rccCompiler = Utilities.generatePySideToolPath(
660 'pyside-rcc', "1") 676 'pyside-rcc', "1")
661 if self.project.getProjectLanguage() in \ 677 if self.project.getProjectLanguage() in [
662 ["Python", "Python2"]: 678 "Python", "Python2"
679 ]:
663 args.append("-py2") 680 args.append("-py2")
664 else: 681 else:
665 args.append("-py3") 682 args.append("-py3")
666 elif self.project.getProjectType() in ["PySide2", "PySide2C"]: 683 elif self.project.getProjectType() in ["PySide2", "PySide2C"]:
667 self.rccCompiler = Utilities.generatePySideToolPath( 684 self.rccCompiler = Utilities.generatePySideToolPath(
668 'pyside2-rcc', "2") 685 'pyside2-rcc', "2")
669 if self.project.getProjectLanguage() in \ 686 if self.project.getProjectLanguage() in [
670 ["Python", "Python2"]: 687 "Python", "Python2"
688 ]:
671 args.append("-py2") 689 args.append("-py2")
672 else: 690 else:
673 args.append("-py3") 691 args.append("-py3")
674 else: 692 else:
675 return None 693 return None
676 defaultParameters = self.project.getDefaultRccCompilerParameters() 694 defaultParameters = self.project.getDefaultRccCompilerParameters()
677 rccParameters = self.project.pdata["RCCPARAMS"] 695 rccParameters = self.project.pdata["RCCPARAMS"]
678 if rccParameters["CompressionThreshold"] != \ 696 if (
679 defaultParameters["CompressionThreshold"]: 697 rccParameters["CompressionThreshold"] !=
698 defaultParameters["CompressionThreshold"]
699 ):
680 args.append("-threshold") 700 args.append("-threshold")
681 args.append(str(rccParameters["CompressionThreshold"])) 701 args.append(str(rccParameters["CompressionThreshold"]))
682 if rccParameters["CompressLevel"] != \ 702 if (
683 defaultParameters["CompressLevel"]: 703 rccParameters["CompressLevel"] !=
704 defaultParameters["CompressLevel"]
705 ):
684 args.append("-compress") 706 args.append("-compress")
685 args.append(str(rccParameters["CompressLevel"])) 707 args.append(str(rccParameters["CompressLevel"]))
686 if rccParameters["CompressionDisable"] != \ 708 if (
687 defaultParameters["CompressionDisable"]: 709 rccParameters["CompressionDisable"] !=
710 defaultParameters["CompressionDisable"]
711 ):
688 args.append("-no-compress") 712 args.append("-no-compress")
689 if rccParameters["PathPrefix"] != \ 713 if rccParameters["PathPrefix"] != defaultParameters["PathPrefix"]:
690 defaultParameters["PathPrefix"]:
691 args.append("-root") 714 args.append("-root")
692 args.append(rccParameters["PathPrefix"]) 715 args.append(rccParameters["PathPrefix"])
693 elif self.project.getProjectLanguage() == "Ruby": 716 elif self.project.getProjectLanguage() == "Ruby":
694 if self.project.getProjectType() == "Qt4": 717 if self.project.getProjectType() == "Qt4":
695 self.rccCompiler = 'rbrcc' 718 self.rccCompiler = 'rbrcc'
704 727
705 ofn, ext = os.path.splitext(fn) 728 ofn, ext = os.path.splitext(fn)
706 fn = os.path.join(self.project.ppath, fn) 729 fn = os.path.join(self.project.ppath, fn)
707 730
708 dirname, filename = os.path.split(ofn) 731 dirname, filename = os.path.split(ofn)
709 if self.project.getProjectLanguage() in \ 732 if self.project.getProjectLanguage() in [
710 ["Python", "Python2", "Python3"]: 733 "Python", "Python2", "Python3"
734 ]:
711 self.compiledFile = os.path.join( 735 self.compiledFile = os.path.join(
712 dirname, self.RCFilenameFormatPython.format(filename)) 736 dirname, self.RCFilenameFormatPython.format(filename))
713 elif self.project.getProjectLanguage() == "Ruby": 737 elif self.project.getProjectLanguage() == "Ruby":
714 self.compiledFile = os.path.join( 738 self.compiledFile = os.path.join(
715 dirname, self.RCFilenameFormatRuby.format(filename)) 739 dirname, self.RCFilenameFormatRuby.format(filename))
840 864
841 qrcDirName = os.path.dirname(filename) 865 qrcDirName = os.path.dirname(filename)
842 lbuf = "" 866 lbuf = ""
843 for line in buf.splitlines(): 867 for line in buf.splitlines():
844 line = line.strip() 868 line = line.strip()
845 if line.lower().startswith("<file>") or \ 869 if (
846 line.lower().startswith("<file "): 870 line.lower().startswith("<file>") or
871 line.lower().startswith("<file ")
872 ):
847 lbuf = line 873 lbuf = line
848 elif lbuf: 874 elif lbuf:
849 lbuf = "{0}{1}".format(lbuf, line) 875 lbuf = "{0}{1}".format(lbuf, line)
850 if lbuf.lower().endswith("</file>"): 876 if lbuf.lower().endswith("</file>"):
851 rfile = lbuf.split(">", 1)[1].split("<", 1)[0] 877 rfile = lbuf.split(">", 1)[1].split("<", 1)[0]
852 if not os.path.isabs(rfile): 878 if not os.path.isabs(rfile):
853 rfile = os.path.join(qrcDirName, rfile) 879 rfile = os.path.join(qrcDirName, rfile)
854 if os.path.exists(rfile) and \ 880 if (
855 os.stat(rfile).st_mtime > mtime: 881 os.path.exists(rfile) and
882 os.stat(rfile).st_mtime > mtime
883 ):
856 return True 884 return True
857 885
858 lbuf = "" 886 lbuf = ""
859 887
860 return False 888 return False
879 progress.setMaximum(len(self.project.pdata["RESOURCES"])) 907 progress.setMaximum(len(self.project.pdata["RESOURCES"]))
880 for fn in self.project.pdata["RESOURCES"]: 908 for fn in self.project.pdata["RESOURCES"]:
881 progress.setValue(i) 909 progress.setValue(i)
882 QApplication.processEvents() 910 QApplication.processEvents()
883 ifn = os.path.join(self.project.ppath, fn) 911 ifn = os.path.join(self.project.ppath, fn)
884 if self.project.getProjectLanguage() in \ 912 if self.project.getProjectLanguage() in [
885 ["Python", "Python2", "Python3"]: 913 "Python", "Python2", "Python3"
914 ]:
886 dirname, filename = os.path.split(os.path.splitext(ifn)[0]) 915 dirname, filename = os.path.split(os.path.splitext(ifn)[0])
887 ofn = os.path.join( 916 ofn = os.path.join(
888 dirname, self.RCFilenameFormatPython.format(filename)) 917 dirname, self.RCFilenameFormatPython.format(filename))
889 elif self.project.getProjectLanguage() == "Ruby": 918 elif self.project.getProjectLanguage() == "Ruby":
890 dirname, filename = os.path.split(os.path.splitext(ifn)[0]) 919 dirname, filename = os.path.split(os.path.splitext(ifn)[0])
891 ofn = os.path.join( 920 ofn = os.path.join(
892 dirname, self.RCFilenameFormatRuby.format(filename)) 921 dirname, self.RCFilenameFormatRuby.format(filename))
893 else: 922 else:
894 return 923 return
895 if not os.path.exists(ofn) or \ 924 if (
896 os.stat(ifn).st_mtime > os.stat(ofn).st_mtime: 925 not os.path.exists(ofn) or
926 os.stat(ifn).st_mtime > os.stat(ofn).st_mtime
927 ):
897 changedResources.append(fn) 928 changedResources.append(fn)
898 elif self.__checkResourcesNewer(ifn, os.stat(ofn).st_mtime): 929 elif self.__checkResourcesNewer(ifn, os.stat(ofn).st_mtime):
899 changedResources.append(fn) 930 changedResources.append(fn)
900 i += 1 931 i += 1
901 progress.setValue(i) 932 progress.setValue(i)

eric ide

mercurial