diff -r 505055151390 -r cf4f22a19dc6 Plugins/VcsPlugins/vcsMercurial/ProjectBrowserHelper.py --- a/Plugins/VcsPlugins/vcsMercurial/ProjectBrowserHelper.py Mon Feb 24 18:46:32 2014 +0100 +++ b/Plugins/VcsPlugins/vcsMercurial/ProjectBrowserHelper.py Mon Feb 24 19:27:39 2014 +0100 @@ -38,6 +38,39 @@ VcsProjectBrowserHelper.__init__(self, vcsObject, browserObject, projectObject, isTranslationsBrowser, parent, name) + + # instantiate the extensions + from .ShelveExtension.ProjectBrowserHelper import \ + ShelveProjectBrowserHelper + self.__extensions = { + "shelve": ShelveProjectBrowserHelper(vcsObject, browserObject, + projectObject), + } + + self.__extensionMenuTitles = {} + for extension in self.__extensions: + self.__extensionMenuTitles[ + self.__extensions[extension].menuTitle()] = extension + self.__extensionMenus = {} + for extension in self.__extensions: + self.__extensionMenus[extension] = \ + self.__extensions[extension].initMenus() + + def __showExtensionMenu(self, key): + """ + Private slot showing the extensions menu. + + @param key menu key (string, one of 'mainMenu', 'multiMenu', + 'backMenu', 'dirMenu' or 'dirMultiMenu') + """ + for extensionName in self.__extensionMenus: + if key in self.__extensionMenus[extensionName]: + self.__extensionMenus[extensionName][key].setEnabled( + self.vcs.isExtensionActive(extensionName)) + if (not self.__extensionMenus[extensionName][key].isEnabled() + and self.__extensionMenus[extensionName][key] + .isTearOffMenuVisible()): + self.__extensionMenus[extensionName][key].hideTearOffMenu() def showContextMenu(self, menu, standardItems): """ @@ -59,6 +92,7 @@ act.setEnabled(False) if not hasattr(self.browser.currentItem(), 'fileName'): self.annotateAct.setEnabled(False) + self.__showExtensionMenu("mainMenu") else: for act in self.vcsMenuActions: act.setEnabled(False) @@ -97,6 +131,7 @@ act.setEnabled(False) for act in standardItems: act.setEnabled(False) + self.__showExtensionMenu("multiMenu") else: for act in self.vcsMultiMenuActions: act.setEnabled(False) @@ -123,6 +158,7 @@ act.setEnabled(False) for act in standardItems: act.setEnabled(False) + self.__showExtensionMenu("dirMenu") else: for act in self.vcsDirMenuActions: act.setEnabled(False) @@ -161,6 +197,7 @@ act.setEnabled(False) for act in standardItems: act.setEnabled(False) + self.__showExtensionMenu("dirMultiMenu") else: for act in self.vcsDirMultiMenuActions: act.setEnabled(False) @@ -168,11 +205,40 @@ act.setEnabled(True) for act in standardItems: act.setEnabled(True) - + + ########################################################################### + ## Private menu generation methods below ########################################################################### - # Protected menu generation methods below + + def __addExtensionsMenu(self, menu, key): + """ + Private method to add an extension menu entry. + + @param menu menu to add it to (QMenu) + @param key menu key (string, one of 'mainMenu', 'multiMenu', + 'backMenu', 'dirMenu' or 'dirMultiMenu') + @return reference to the menu action (QAction) + """ + act = None + if key in ['mainMenu', 'multiMenu', 'backMenu', 'dirMenu', + 'dirMultiMenu']: + extensionsMenu = QMenu(self.tr("Extensions"), menu) + extensionsMenu.setTearOffEnabled(True) + for extensionMenuTitle in sorted(self.__extensionMenuTitles): + extensionName = self.__extensionMenuTitles[extensionMenuTitle] + if key in self.__extensionMenus[extensionName]: + extensionsMenu.addMenu( + self.__extensionMenus[extensionName][key]) + if not extensionsMenu.isEmpty(): + if not menu.isEmpty(): + menu.addSeparator() + act = menu.addMenu(extensionsMenu) + return act + ########################################################################### - + ## Protected menu generation methods below + ########################################################################### + def _addVCSMenu(self, mainMenu): """ Protected method used to add the VCS menu to all project browsers. @@ -199,6 +265,9 @@ self.tr('Commit changes to repository...'), self._VCSCommit) self.vcsMenuActions.append(act) + act = self.__addExtensionsMenu(menu, 'mainMenu') + if act: + self.vcsMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsAdd.png"), @@ -307,6 +376,9 @@ self.tr('Commit changes to repository...'), self._VCSCommit) self.vcsMultiMenuActions.append(act) + act = self.__addExtensionsMenu(menu, 'multiMenu') + if act: + self.vcsMultiMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsAdd.png"), @@ -421,6 +493,9 @@ self.tr('Commit changes to repository...'), self._VCSCommit) self.vcsDirMenuActions.append(act) + act = self.__addExtensionsMenu(menu, 'dirMenu') + if act: + self.vcsDirMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsAdd.png"), @@ -512,6 +587,9 @@ self.tr('Commit changes to repository...'), self._VCSCommit) self.vcsDirMultiMenuActions.append(act) + act = self.__addExtensionsMenu(menu, 'dirMultiMenu') + if act: + self.vcsDirMultiMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsAdd.png"), @@ -561,7 +639,7 @@ self.menuDirMulti = menu ########################################################################### - # Menu handling methods below + ## Menu handling methods below ########################################################################### def __HgRevert(self):