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