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 |
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) |