1# -*- coding: utf-8 -*- 2 3# Copyright (c) 2014 - 2021 Detlev Offenbach <detlev@die-offenbachs.de> 4# 5 6""" 7Module implementing the largefiles extension project browser helper. 8""" 9 10from PyQt5.QtWidgets import QMenu 11 12from ..HgExtensionProjectBrowserHelper import HgExtensionProjectBrowserHelper 13 14import UI.PixmapCache 15 16 17class LargefilesProjectBrowserHelper(HgExtensionProjectBrowserHelper): 18 """ 19 Class implementing the largefiles extension project browser helper. 20 """ 21 def __init__(self, vcsObject, browserObject, projectObject): 22 """ 23 Constructor 24 25 @param vcsObject reference to the vcs object 26 @param browserObject reference to the project browser object 27 @param projectObject reference to the project object 28 """ 29 super().__init__( 30 vcsObject, browserObject, projectObject) 31 32 def initMenus(self): 33 """ 34 Public method to generate the extension menus. 35 36 Note: Derived class must implement this method. 37 38 @return dictionary of populated menu (dict of QMenu). The dict 39 must have the keys 'mainMenu', 'multiMenu', 'backMenu', 'dirMenu' 40 and 'dirMultiMenu'. 41 """ 42 self.__menus = {} 43 self.__addSingleActs = [] 44 self.__addMultiActs = [] 45 46 menu = QMenu(self.menuTitle()) 47 menu.setTearOffEnabled(True) 48 act = menu.addAction( 49 UI.PixmapCache.getIcon("vcsAdd"), 50 self.tr('Add as Large File'), 51 lambda: self.__hgAddLargefiles("large")) 52 self.__addSingleActs.append(act) 53 act = menu.addAction( 54 UI.PixmapCache.getIcon("vcsAdd"), 55 self.tr('Add as Normal File'), 56 lambda: self.__hgAddLargefiles("normal")) 57 self.__addSingleActs.append(act) 58 self.__menus['mainMenu'] = menu 59 60 menu = QMenu(self.menuTitle()) 61 menu.setTearOffEnabled(True) 62 act = menu.addAction( 63 UI.PixmapCache.getIcon("vcsAdd"), 64 self.tr('Add as Large Files'), 65 lambda: self.__hgAddLargefiles("large")) 66 self.__addMultiActs.append(act) 67 act = menu.addAction( 68 UI.PixmapCache.getIcon("vcsAdd"), 69 self.tr('Add as Normal Files'), 70 lambda: self.__hgAddLargefiles("normal")) 71 self.__addMultiActs.append(act) 72 self.__menus['multiMenu'] = menu 73 74 return self.__menus 75 76 def menuTitle(self): 77 """ 78 Public method to get the menu title. 79 80 Note: Derived class must implement this method. 81 82 @return title of the menu (string) 83 """ 84 return self.tr("Large Files") 85 86 def showExtensionMenu(self, key, controlled): 87 """ 88 Public method to prepare the extension menu for display. 89 90 @param key menu key (string, one of 'mainMenu', 'multiMenu', 91 'backMenu', 'dirMenu' or 'dirMultiMenu') 92 @param controlled flag indicating to prepare the menu for a 93 version controlled entry or a non-version controlled entry 94 (boolean) 95 """ 96 if key == "mainMenu": 97 for act in self.__addSingleActs: 98 act.setEnabled(not controlled) 99 elif key == "multiMenu": 100 for act in self.__addMultiActs: 101 act.setEnabled(not controlled) 102 103 def __hgAddLargefiles(self, mode): 104 """ 105 Private slot to add the selected files as large files. 106 107 @param mode add mode (string one of 'normal' or 'large') 108 """ 109 names = [] 110 for itm in self.browser.getSelectedItems(): 111 try: 112 name = itm.fileName() 113 except AttributeError: 114 continue 115 names.append(name) 116 117 if names: 118 if len(names) == 1: 119 self.vcs.getExtensionObject("largefiles").hgAdd(names[0], mode) 120 else: 121 self.vcs.getExtensionObject("largefiles").hgAdd(names, mode) 122 for fn in names: 123 self._updateVCSStatus(fn) 124