--- a/Plugins/VcsPlugins/vcsMercurial/ProjectBrowserHelper.py Sun Mar 30 22:00:14 2014 +0200 +++ b/Plugins/VcsPlugins/vcsMercurial/ProjectBrowserHelper.py Thu Apr 03 23:05:31 2014 +0200 @@ -40,6 +40,50 @@ VcsProjectBrowserHelper.__init__(self, vcsObject, browserObject, projectObject, isTranslationsBrowser, parent, name) + + # instantiate the extensions + from .ShelveExtension.ProjectBrowserHelper import \ + ShelveProjectBrowserHelper + from .LargefilesExtension.ProjectBrowserHelper import \ + LargefilesProjectBrowserHelper + self.__extensions = { + "shelve": ShelveProjectBrowserHelper( + vcsObject, browserObject, projectObject), + "largefiles": LargefilesProjectBrowserHelper( + 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, controlled): + """ + Private slot showing the extensions menu. + + @param key menu key (string, one of 'mainMenu', 'multiMenu', + 'backMenu', 'dirMenu' or 'dirMultiMenu') + @param controlled flag indicating to show the menu for a + version controlled entry or a non-version controlled entry + (boolean) + """ + for extensionName in self.__extensionMenus: + if key in self.__extensionMenus[extensionName]: + self.__extensionMenus[extensionName][key].setEnabled( + self.vcs.isExtensionActive(extensionName)) + if self.__extensionMenus[extensionName][key].isEnabled(): + # adjust individual extension menu entries + self.__extensions[extensionName].showExtensionMenu( + key, controlled) + if (not self.__extensionMenus[extensionName][key].isEnabled() + and self.__extensionMenus[extensionName][key] + .isTearOffMenuVisible()): + self.__extensionMenus[extensionName][key].hideTearOffMenu() def showContextMenu(self, menu, standardItems): """ @@ -53,6 +97,7 @@ activation/deactivation depending on the overall VCS status """ if self.browser.currentItem().data(1) == self.vcs.vcsName(): + controlled = True for act in self.vcsMenuActions: act.setEnabled(True) for act in self.vcsAddMenuActions: @@ -62,12 +107,14 @@ if not hasattr(self.browser.currentItem(), 'fileName'): self.annotateAct.setEnabled(False) else: + controlled = False for act in self.vcsMenuActions: act.setEnabled(False) for act in self.vcsAddMenuActions: act.setEnabled(True) for act in standardItems: act.setEnabled(True) + self.__showExtensionMenu("mainMenu", controlled) def showContextMenuMulti(self, menu, standardItems): """ @@ -89,6 +136,7 @@ vcsItems += 1 if vcsItems > 0: + controlled = True if vcsItems != len(items): for act in self.vcsMultiMenuActions: act.setEnabled(False) @@ -100,12 +148,14 @@ for act in standardItems: act.setEnabled(False) else: + controlled = False for act in self.vcsMultiMenuActions: act.setEnabled(False) for act in self.vcsAddMultiMenuActions: act.setEnabled(True) for act in standardItems: act.setEnabled(True) + self.__showExtensionMenu("multiMenu", controlled) def showContextMenuDir(self, menu, standardItems): """ @@ -119,6 +169,7 @@ activation/deactivation depending on the overall VCS status """ if self.browser.currentItem().data(1) == self.vcs.vcsName(): + controlled = True for act in self.vcsDirMenuActions: act.setEnabled(True) for act in self.vcsAddDirMenuActions: @@ -126,12 +177,14 @@ for act in standardItems: act.setEnabled(False) else: + controlled = False for act in self.vcsDirMenuActions: act.setEnabled(False) for act in self.vcsAddDirMenuActions: act.setEnabled(True) for act in standardItems: act.setEnabled(True) + self.__showExtensionMenu("dirMenu", controlled) def showContextMenuDirMulti(self, menu, standardItems): """ @@ -153,6 +206,7 @@ vcsItems += 1 if vcsItems > 0: + controlled = True if vcsItems != len(items): for act in self.vcsDirMultiMenuActions: act.setEnabled(False) @@ -164,17 +218,48 @@ for act in standardItems: act.setEnabled(False) else: + controlled = False for act in self.vcsDirMultiMenuActions: act.setEnabled(False) for act in self.vcsAddDirMultiMenuActions: act.setEnabled(True) for act in standardItems: act.setEnabled(True) - + self.__showExtensionMenu("dirMultiMenu", controlled) + + ########################################################################### + ## 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. @@ -184,7 +269,7 @@ self.vcsMenuActions = [] self.vcsAddMenuActions = [] - menu = QMenu(self.trUtf8("Version Control")) + menu = QMenu(self.tr("Version Control")) act = menu.addAction( UI.PixmapCache.getIcon( @@ -198,83 +283,84 @@ act = menu.addAction( UI.PixmapCache.getIcon("vcsCommit.png"), - self.trUtf8('Commit changes to repository...'), + self.tr('Commit changes to repository...'), self._VCSCommit) self.vcsMenuActions.append(act) + self.__addExtensionsMenu(menu, 'mainMenu') menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsAdd.png"), - self.trUtf8('Add to repository'), + self.tr('Add to repository'), self._VCSAdd) self.vcsAddMenuActions.append(act) act = menu.addAction( UI.PixmapCache.getIcon("vcsRemove.png"), - self.trUtf8('Remove from repository (and disk)'), + self.tr('Remove from repository (and disk)'), self._VCSRemove) self.vcsMenuActions.append(act) act = menu.addAction( UI.PixmapCache.getIcon("vcsRemove.png"), - self.trUtf8('Remove from repository only'), + self.tr('Remove from repository only'), self.__HgForget) self.vcsMenuActions.append(act) menu.addSeparator() - act = menu.addAction(self.trUtf8('Copy'), self.__HgCopy) + act = menu.addAction(self.tr('Copy'), self.__HgCopy) self.vcsMenuActions.append(act) - act = menu.addAction(self.trUtf8('Move'), self.__HgMove) + act = menu.addAction(self.tr('Move'), self.__HgMove) self.vcsMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsLog.png"), - self.trUtf8('Show log'), self._VCSLog) + self.tr('Show log'), self._VCSLog) self.vcsMenuActions.append(act) act = menu.addAction( UI.PixmapCache.getIcon("vcsLog.png"), - self.trUtf8('Show log browser'), self.__HgLogBrowser) + self.tr('Show log browser'), self._VCSLogBrowser) self.vcsMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsStatus.png"), - self.trUtf8('Show status'), self._VCSStatus) + self.tr('Show status'), self._VCSStatus) self.vcsMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsDiff.png"), - self.trUtf8('Show difference'), self._VCSDiff) + self.tr('Show difference'), self._VCSDiff) self.vcsMenuActions.append(act) act = menu.addAction( UI.PixmapCache.getIcon("vcsSbsDiff.png"), - self.trUtf8('Show difference side-by-side'), self.__HgSbsDiff) + self.tr('Show difference side-by-side'), self.__HgSbsDiff) self.vcsMenuActions.append(act) act = menu.addAction( UI.PixmapCache.getIcon("vcsDiff.png"), - self.trUtf8('Show difference (extended)'), + self.tr('Show difference (extended)'), self.__HgExtendedDiff) self.vcsMenuActions.append(act) act = menu.addAction( UI.PixmapCache.getIcon("vcsSbsDiff.png"), - self.trUtf8('Show difference side-by-side (extended)'), + self.tr('Show difference side-by-side (extended)'), self.__HgSbsExtendedDiff) self.vcsMenuActions.append(act) self.annotateAct = menu.addAction( - self.trUtf8('Show annotated file'), + self.tr('Show annotated file'), self.__HgAnnotate) self.vcsMenuActions.append(self.annotateAct) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsRevert.png"), - self.trUtf8('Revert changes'), self.__HgRevert) + self.tr('Revert changes'), self.__HgRevert) self.vcsMenuActions.append(act) act = menu.addAction( - self.trUtf8('Conflict resolved'), self.__HgResolve) + self.tr('Conflict resolved'), self.__HgResolve) self.vcsMenuActions.append(act) menu.addSeparator() - menu.addAction(self.trUtf8('Select all local file entries'), + menu.addAction(self.tr('Select all local file entries'), self.browser.selectLocalEntries) - menu.addAction(self.trUtf8('Select all versioned file entries'), + menu.addAction(self.tr('Select all versioned file entries'), self.browser.selectVCSEntries) - menu.addAction(self.trUtf8('Select all local directory entries'), + menu.addAction(self.tr('Select all local directory entries'), self.browser.selectLocalDirEntries) - menu.addAction(self.trUtf8('Select all versioned directory entries'), + menu.addAction(self.tr('Select all versioned directory entries'), self.browser.selectVCSDirEntries) menu.addSeparator() @@ -292,7 +378,7 @@ self.vcsMultiMenuActions = [] self.vcsAddMultiMenuActions = [] - menu = QMenu(self.trUtf8("Version Control")) + menu = QMenu(self.tr("Version Control")) act = menu.addAction( UI.PixmapCache.getIcon( @@ -306,55 +392,56 @@ act = menu.addAction( UI.PixmapCache.getIcon("vcsCommit.png"), - self.trUtf8('Commit changes to repository...'), + self.tr('Commit changes to repository...'), self._VCSCommit) self.vcsMultiMenuActions.append(act) + self.__addExtensionsMenu(menu, 'multiMenu') menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsAdd.png"), - self.trUtf8('Add to repository'), self._VCSAdd) + self.tr('Add to repository'), self._VCSAdd) self.vcsAddMultiMenuActions.append(act) act = menu.addAction( UI.PixmapCache.getIcon("vcsRemove.png"), - self.trUtf8('Remove from repository (and disk)'), + self.tr('Remove from repository (and disk)'), self._VCSRemove) self.vcsMultiMenuActions.append(act) act = menu.addAction( UI.PixmapCache.getIcon("vcsRemove.png"), - self.trUtf8('Remove from repository only'), + self.tr('Remove from repository only'), self.__HgForget) self.vcsMultiMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsStatus.png"), - self.trUtf8('Show status'), self._VCSStatus) + self.tr('Show status'), self._VCSStatus) self.vcsMultiMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsDiff.png"), - self.trUtf8('Show difference'), self._VCSDiff) + self.tr('Show difference'), self._VCSDiff) self.vcsMultiMenuActions.append(act) act = menu.addAction( UI.PixmapCache.getIcon("vcsDiff.png"), - self.trUtf8('Show difference (extended)'), + self.tr('Show difference (extended)'), self.__HgExtendedDiff) self.vcsMultiMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsRevert.png"), - self.trUtf8('Revert changes'), self.__HgRevert) + self.tr('Revert changes'), self.__HgRevert) self.vcsMultiMenuActions.append(act) act = menu.addAction( - self.trUtf8('Conflict resolved'), self.__HgResolve) + self.tr('Conflict resolved'), self.__HgResolve) self.vcsMultiMenuActions.append(act) menu.addSeparator() - menu.addAction(self.trUtf8('Select all local file entries'), + menu.addAction(self.tr('Select all local file entries'), self.browser.selectLocalEntries) - menu.addAction(self.trUtf8('Select all versioned file entries'), + menu.addAction(self.tr('Select all versioned file entries'), self.browser.selectVCSEntries) - menu.addAction(self.trUtf8('Select all local directory entries'), + menu.addAction(self.tr('Select all local directory entries'), self.browser.selectLocalDirEntries) - menu.addAction(self.trUtf8('Select all versioned directory entries'), + menu.addAction(self.tr('Select all versioned directory entries'), self.browser.selectVCSDirEntries) menu.addSeparator() @@ -368,7 +455,7 @@ @param mainMenu reference to the menu to be amended """ - menu = QMenu(self.trUtf8("Version Control")) + menu = QMenu(self.tr("Version Control")) act = menu.addAction( UI.PixmapCache.getIcon( @@ -380,13 +467,13 @@ act.setFont(font) menu.addSeparator() - menu.addAction(self.trUtf8('Select all local file entries'), + menu.addAction(self.tr('Select all local file entries'), self.browser.selectLocalEntries) - menu.addAction(self.trUtf8('Select all versioned file entries'), + menu.addAction(self.tr('Select all versioned file entries'), self.browser.selectVCSEntries) - menu.addAction(self.trUtf8('Select all local directory entries'), + menu.addAction(self.tr('Select all local directory entries'), self.browser.selectLocalDirEntries) - menu.addAction(self.trUtf8('Select all versioned directory entries'), + menu.addAction(self.tr('Select all versioned directory entries'), self.browser.selectVCSDirEntries) menu.addSeparator() @@ -406,7 +493,7 @@ self.vcsDirMenuActions = [] self.vcsAddDirMenuActions = [] - menu = QMenu(self.trUtf8("Version Control")) + menu = QMenu(self.tr("Version Control")) act = menu.addAction( UI.PixmapCache.getIcon( @@ -420,64 +507,65 @@ act = menu.addAction( UI.PixmapCache.getIcon("vcsCommit.png"), - self.trUtf8('Commit changes to repository...'), + self.tr('Commit changes to repository...'), self._VCSCommit) self.vcsDirMenuActions.append(act) + self.__addExtensionsMenu(menu, 'dirMenu') menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsAdd.png"), - self.trUtf8('Add to repository'), self._VCSAdd) + self.tr('Add to repository'), self._VCSAdd) self.vcsAddDirMenuActions.append(act) act = menu.addAction( UI.PixmapCache.getIcon("vcsRemove.png"), - self.trUtf8('Remove from repository (and disk)'), + self.tr('Remove from repository (and disk)'), self._VCSRemove) self.vcsDirMenuActions.append(act) menu.addSeparator() - act = menu.addAction(self.trUtf8('Copy'), self.__HgCopy) + act = menu.addAction(self.tr('Copy'), self.__HgCopy) self.vcsDirMenuActions.append(act) - act = menu.addAction(self.trUtf8('Move'), self.__HgMove) + act = menu.addAction(self.tr('Move'), self.__HgMove) self.vcsDirMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsLog.png"), - self.trUtf8('Show log'), self._VCSLog) + self.tr('Show log'), self._VCSLog) self.vcsDirMenuActions.append(act) act = menu.addAction( UI.PixmapCache.getIcon("vcsLog.png"), - self.trUtf8('Show log browser'), self.__HgLogBrowser) + self.tr('Show log browser'), self._VCSLogBrowser) self.vcsDirMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsStatus.png"), - self.trUtf8('Show status'), self._VCSStatus) + self.tr('Show status'), self._VCSStatus) self.vcsDirMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsDiff.png"), - self.trUtf8('Show difference'), self._VCSDiff) + self.tr('Show difference'), self._VCSDiff) self.vcsDirMenuActions.append(act) act = menu.addAction( UI.PixmapCache.getIcon("vcsDiff.png"), - self.trUtf8('Show difference (extended)'), + self.tr('Show difference (extended)'), self.__HgExtendedDiff) self.vcsDirMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsRevert.png"), - self.trUtf8('Revert changes'), self.__HgRevert) + self.tr('Revert changes'), self.__HgRevert) self.vcsDirMenuActions.append(act) act = menu.addAction( - self.trUtf8('Conflict resolved'), self.__HgResolve) + self.tr('Conflict resolved'), self.__HgResolve) self.vcsDirMenuActions.append(act) menu.addSeparator() - menu.addAction(self.trUtf8('Select all local file entries'), + menu.addAction(self.tr('Select all local file entries'), self.browser.selectLocalEntries) - menu.addAction(self.trUtf8('Select all versioned file entries'), + menu.addAction(self.tr('Select all versioned file entries'), self.browser.selectVCSEntries) - menu.addAction(self.trUtf8('Select all local directory entries'), + menu.addAction(self.tr('Select all local directory entries'), self.browser.selectLocalDirEntries) - menu.addAction(self.trUtf8('Select all versioned directory entries'), + menu.addAction(self.tr('Select all versioned directory entries'), self.browser.selectVCSDirEntries) menu.addSeparator() @@ -497,7 +585,7 @@ self.vcsDirMultiMenuActions = [] self.vcsAddDirMultiMenuActions = [] - menu = QMenu(self.trUtf8("Version Control")) + menu = QMenu(self.tr("Version Control")) act = menu.addAction( UI.PixmapCache.getIcon( @@ -511,50 +599,51 @@ act = menu.addAction( UI.PixmapCache.getIcon("vcsCommit.png"), - self.trUtf8('Commit changes to repository...'), + self.tr('Commit changes to repository...'), self._VCSCommit) self.vcsDirMultiMenuActions.append(act) + self.__addExtensionsMenu(menu, 'dirMultiMenu') menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsAdd.png"), - self.trUtf8('Add to repository'), self._VCSAdd) + self.tr('Add to repository'), self._VCSAdd) self.vcsAddDirMultiMenuActions.append(act) act = menu.addAction( UI.PixmapCache.getIcon("vcsRemove.png"), - self.trUtf8('Remove from repository (and disk)'), + self.tr('Remove from repository (and disk)'), self._VCSRemove) self.vcsDirMultiMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsStatus.png"), - self.trUtf8('Show status'), self._VCSStatus) + self.tr('Show status'), self._VCSStatus) self.vcsDirMultiMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsDiff.png"), - self.trUtf8('Show difference'), self._VCSDiff) + self.tr('Show difference'), self._VCSDiff) self.vcsDirMultiMenuActions.append(act) act = menu.addAction( UI.PixmapCache.getIcon("vcsDiff.png"), - self.trUtf8('Show difference (extended)'), + self.tr('Show difference (extended)'), self.__HgExtendedDiff) self.vcsDirMultiMenuActions.append(act) menu.addSeparator() act = menu.addAction( UI.PixmapCache.getIcon("vcsRevert.png"), - self.trUtf8('Revert changes'), self.__HgRevert) + self.tr('Revert changes'), self.__HgRevert) self.vcsDirMultiMenuActions.append(act) act = menu.addAction( - self.trUtf8('Conflict resolved'), self.__HgResolve) + self.tr('Conflict resolved'), self.__HgResolve) self.vcsDirMultiMenuActions.append(act) menu.addSeparator() - menu.addAction(self.trUtf8('Select all local file entries'), + menu.addAction(self.tr('Select all local file entries'), self.browser.selectLocalEntries) - menu.addAction(self.trUtf8('Select all versioned file entries'), + menu.addAction(self.tr('Select all versioned file entries'), self.browser.selectVCSEntries) - menu.addAction(self.trUtf8('Select all local directory entries'), + menu.addAction(self.tr('Select all local directory entries'), self.browser.selectLocalDirEntries) - menu.addAction(self.trUtf8('Select all versioned directory entries'), + menu.addAction(self.tr('Select all versioned directory entries'), self.browser.selectVCSDirEntries) menu.addSeparator() @@ -563,7 +652,7 @@ self.menuDirMulti = menu ########################################################################### - # Menu handling methods below + ## Menu handling methods below ########################################################################### def __HgRevert(self): @@ -652,20 +741,6 @@ fn = itm.fileName() self.vcs.hgAnnotate(fn) - def __HgLogBrowser(self): - """ - Private slot called by the context menu to show the log browser for a - file. - """ - itm = self.browser.currentItem() - try: - fn = itm.fileName() - isFile = True - except AttributeError: - fn = itm.dirName() - isFile = False - self.vcs.hgLogBrowser(fn, isFile=isFile) - def __HgResolve(self): """ Private slot called by the context menu to resolve conflicts of a file. @@ -691,8 +766,8 @@ dlg = DeleteFilesConfirmationDialog( self.parent(), - self.trUtf8("Remove from repository only"), - self.trUtf8( + self.tr("Remove from repository only"), + self.tr( "Do you really want to remove these files" " from the repository?"), names) @@ -704,8 +779,8 @@ dlg = DeleteFilesConfirmationDialog( self.parent(), - self.trUtf8("Remove from repository only"), - self.trUtf8( + self.tr("Remove from repository only"), + self.tr( "Do you really want to remove these files" " from the repository?"), files)