Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py

branch
Py2 comp.
changeset 3484
645c12de6b0c
parent 3178
f25fc1364c88
parent 3406
b3612f0fbf55
child 3591
2f2a4a76dd22
diff -r 96232974dcdb -r 645c12de6b0c Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py
--- a/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py	Sun Mar 30 22:00:14 2014 +0200
+++ b/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py	Thu Apr 03 23:05:31 2014 +0200
@@ -10,8 +10,8 @@
 
 from __future__ import unicode_literals
 try:
-    str = unicode    # __IGNORE_WARNING__
-except (NameError):
+    str = unicode
+except NameError:
     pass
 
 import os
@@ -50,9 +50,9 @@
         self.__lastColumn = self.statusList.columnCount()
         
         self.refreshButton = self.buttonBox.addButton(
-            self.trUtf8("Refresh"), QDialogButtonBox.ActionRole)
+            self.tr("Refresh"), QDialogButtonBox.ActionRole)
         self.refreshButton.setToolTip(
-            self.trUtf8("Press to refresh the status display"))
+            self.tr("Press to refresh the status display"))
         self.refreshButton.setEnabled(False)
         self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False)
         self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True)
@@ -78,60 +78,90 @@
             self.restoreButton.setVisible(False)
         
         self.menuactions = []
+        self.lfActions = []
         self.menu = QMenu()
         if not mq:
+            self.__commitAct = self.menu.addAction(
+                self.tr("Commit changes to repository..."), self.__commit)
+            self.menuactions.append(self.__commitAct)
             self.menuactions.append(self.menu.addAction(
-                self.trUtf8("Commit changes to repository..."), self.__commit))
+                self.tr("Select all for commit"), self.__commitSelectAll))
             self.menuactions.append(self.menu.addAction(
-                self.trUtf8("Select all for commit"), self.__commitSelectAll))
-            self.menuactions.append(self.menu.addAction(
-                self.trUtf8("Deselect all from commit"),
+                self.tr("Deselect all from commit"),
                 self.__commitDeselectAll))
             self.menu.addSeparator()
+            self.__addAct = self.menu.addAction(
+                self.tr("Add to repository"), self.__add)
+            self.menuactions.append(self.__addAct)
+            if self.vcs.version >= (2, 0):
+                self.lfActions.append(self.menu.addAction(
+                    self.tr("Add as Large File"),
+                    lambda: self.__lfAdd("large")))
+                self.lfActions.append(self.menu.addAction(
+                    self.tr("Add as Normal File"),
+                    lambda: self.__lfAdd("normal")))
+            self.__diffAct = self.menu.addAction(
+                self.tr("Show differences"), self.__diff)
+            self.menuactions.append(self.__diffAct)
+            self.__sbsDiffAct = self.menu.addAction(
+                self.tr("Show differences side-by-side"), self.__sbsDiff)
+            self.menuactions.append(self.__sbsDiffAct)
+            self.__revertAct = self.menu.addAction(
+                self.tr("Revert changes"), self.__revert)
+            self.menuactions.append(self.__revertAct)
+            self.__forgetAct = self.menu.addAction(
+                self.tr("Forget missing"), self.__forget)
+            self.menuactions.append(self.__forgetAct)
+            self.__restoreAct = self.menu.addAction(
+                self.tr("Restore missing"), self.__restoreMissing)
+            self.menuactions.append(self.__restoreAct)
+            self.menu.addSeparator()
             self.menuactions.append(self.menu.addAction(
-                self.trUtf8("Add to repository"), self.__add))
-            self.menuactions.append(self.menu.addAction(
-                self.trUtf8("Show differences"), self.__diff))
-            self.menuactions.append(self.menu.addAction(
-                self.trUtf8("Show differences side-by-side"), self.__sbsDiff))
-            self.menuactions.append(self.menu.addAction(
-                self.trUtf8("Remove from repository"), self.__forget))
-            self.menuactions.append(self.menu.addAction(
-                self.trUtf8("Revert changes"), self.__revert))
-            self.menuactions.append(self.menu.addAction(
-                self.trUtf8("Restore missing"), self.__restoreMissing))
-            self.menu.addSeparator()
-            self.menuactions.append(self.menu.addAction(
-                self.trUtf8("Adjust column sizes"), self.__resizeColumns))
+                self.tr("Adjust column sizes"), self.__resizeColumns))
             for act in self.menuactions:
                 act.setEnabled(False)
+            for act in self.lfActions:
+                act.setEnabled(False)
             
             self.statusList.setContextMenuPolicy(Qt.CustomContextMenu)
             self.statusList.customContextMenuRequested.connect(
                 self.__showContextMenu)
         
+        if not mq and self.vcs.version >= (2, 0):
+            self.__lfAddActions = []
+            self.__addButtonMenu = QMenu()
+            self.__addButtonMenu.addAction(self.tr("Add"), self.__add)
+            self.__lfAddActions.append(
+                self.__addButtonMenu.addAction(self.tr("Add as Large File"),
+                                               lambda: self.__lfAdd("large")))
+            self.__lfAddActions.append(
+                self.__addButtonMenu.addAction(self.tr("Add as Normal File"),
+                                               lambda: self.__lfAdd("normal")))
+            self.addButton.setMenu(self.__addButtonMenu)
+            self.__addButtonMenu.aboutToShow.connect(self.__showAddMenu)
+        
         self.modifiedIndicators = [
-            self.trUtf8('added'),
-            self.trUtf8('modified'),
-            self.trUtf8('removed'),
+            self.tr('added'),
+            self.tr('modified'),
+            self.tr('removed'),
         ]
         
         self.unversionedIndicators = [
-            self.trUtf8('not tracked'),
+            self.tr('not tracked'),
         ]
         
         self.missingIndicators = [
-            self.trUtf8('missing')
+            self.tr('missing')
         ]
         
         self.status = {
-            'A': self.trUtf8('added'),
-            'C': self.trUtf8('normal'),
-            'I': self.trUtf8('ignored'),
-            'M': self.trUtf8('modified'),
-            'R': self.trUtf8('removed'),
-            '?': self.trUtf8('not tracked'),
-            '!': self.trUtf8('missing'),
+            'A': self.tr('added'),
+            'C': self.tr('normal'),
+            'I': self.tr('ignored'),
+            'M': self.tr('modified'),
+            'R': self.tr('removed'),
+            '?': self.tr('not tracked'),
+            '!': self.tr('missing'),
         }
     
     def __resort(self):
@@ -206,6 +236,8 @@
         
         for act in self.menuactions:
             act.setEnabled(False)
+        for act in self.lfActions:
+            act.setEnabled(False)
         
         self.addButton.setEnabled(False)
         self.commitButton.setEnabled(False)
@@ -220,13 +252,11 @@
         
         if self.__mq:
             self.setWindowTitle(
-                self.trUtf8("Mercurial Queue Repository Status"))
+                self.tr("Mercurial Queue Repository Status"))
         else:
-            self.setWindowTitle(self.trUtf8('Mercurial Status'))
+            self.setWindowTitle(self.tr('Mercurial Status'))
         
-        args = []
-        args.append('status')
-        self.vcs.addArguments(args, self.vcs.options['global'])
+        args = self.vcs.initCommand("status")
         if self.__mq:
             args.append('--mq')
             if isinstance(fn, list):
@@ -234,8 +264,6 @@
             else:
                 self.dname, fname = self.vcs.splitPath(fn)
         else:
-            self.vcs.addArguments(args, self.vcs.options['status'])
-            
             if self.vcs.hasSubrepositories():
                 args.append("--subrepos")
             
@@ -284,8 +312,8 @@
                 self.inputGroup.hide()
                 E5MessageBox.critical(
                     self,
-                    self.trUtf8('Process Generation Error'),
-                    self.trUtf8(
+                    self.tr('Process Generation Error'),
+                    self.tr(
                         'The process {0} could not be started. '
                         'Ensure, that it is in the search path.'
                     ).format('hg'))
@@ -315,7 +343,7 @@
             Qt.OtherFocusReason)
         
         self.__statusFilters.sort()
-        self.__statusFilters.insert(0, "<{0}>".format(self.trUtf8("all")))
+        self.__statusFilters.insert(0, "<{0}>".format(self.tr("all")))
         self.statusFilterCombo.addItems(self.__statusFilters)
         
         for act in self.menuactions:
@@ -365,10 +393,8 @@
             self.process.setReadChannel(QProcess.StandardOutput)
             
             while self.process.canReadLine():
-                line = str(
-                    self.process.readLine(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+                line = str(self.process.readLine(), self.vcs.getEncoding(),
+                           'replace')
                 self.__processOutputLine(line)
     
     def __processOutputLine(self, line):
@@ -390,8 +416,7 @@
         """
         if self.process is not None:
             s = str(self.process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+                    self.vcs.getEncoding(), 'replace')
             self.__showError(s)
     
     def __showError(self, out):
@@ -500,7 +525,7 @@
         
         @param txt selected status filter (string)
         """
-        if txt == "<{0}>".format(self.trUtf8("all")):
+        if txt == "<{0}>".format(self.tr("all")):
             for topIndex in range(self.statusList.topLevelItemCount()):
                 topItem = self.statusList.topLevelItem(topIndex)
                 topItem.setHidden(False)
@@ -586,8 +611,35 @@
         
         @param coord the position of the mouse pointer (QPoint)
         """
+        modified = len(self.__getModifiedItems())
+        unversioned = len(self.__getUnversionedItems())
+        missing = len(self.__getMissingItems())
+        commitable = len(self.__getCommitableItems())
+
+        self.__addAct.setEnabled(unversioned)
+        self.__diffAct.setEnabled(modified)
+        self.__sbsDiffAct.setEnabled(modified == 1)
+        self.__revertAct.setEnabled(modified)
+        self.__forgetAct.setEnabled(missing)
+        self.__restoreAct.setEnabled(missing)
+        self.__commitAct.setEnabled(commitable)
+        
+        if self.vcs.isExtensionActive("largefiles"):
+            enable = len(self.__getUnversionedItems()) > 0
+        else:
+            enable = False
+        for act in self.lfActions:
+            act.setEnabled(enable)
         self.menu.popup(self.mapToGlobal(coord))
     
+    def __showAddMenu(self):
+        """
+        Private slot to prepare the Add button menu before it is shown.
+        """
+        enable = self.vcs.isExtensionActive("largefiles")
+        for act in self.__lfAddActions:
+            act.setEnabled(enable)
+    
     def __commit(self):
         """
         Private slot to handle the Commit context menu entry.
@@ -600,9 +652,9 @@
             if not names:
                 E5MessageBox.information(
                     self,
-                    self.trUtf8("Commit"),
-                    self.trUtf8("""There are no entries selected to be"""
-                                """ committed."""))
+                    self.tr("Commit"),
+                    self.tr("""There are no entries selected to be"""
+                            """ committed."""))
                 return
             
             if Preferences.getVCS("AutoSaveFiles"):
@@ -640,9 +692,9 @@
         if not names:
             E5MessageBox.information(
                 self,
-                self.trUtf8("Add"),
-                self.trUtf8("""There are no unversioned entries"""
-                            """ available/selected."""))
+                self.tr("Add"),
+                self.tr("""There are no unversioned entries"""
+                        """ available/selected."""))
             return
         
         self.vcs.vcsAdd(names)
@@ -653,6 +705,31 @@
             project.getModel().updateVCSStatus(name)
         self.vcs.checkVCSStatus()
     
+    def __lfAdd(self, mode):
+        """
+        Private slot to add a file to the repository.
+        
+        @param mode add mode (string one of 'normal' or 'large')
+        """
+        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
+                 for itm in self.__getUnversionedItems()]
+        if not names:
+            E5MessageBox.information(
+                self,
+                self.tr("Add"),
+                self.tr("""There are no unversioned entries"""
+                        """ available/selected."""))
+            return
+        
+        self.vcs.getExtensionObject("largefiles").hgAdd(
+            names, mode)
+        self.on_refreshButton_clicked()
+        
+        project = e5App().getObject("Project")
+        for name in names:
+            project.getModel().updateVCSStatus(name)
+        self.vcs.checkVCSStatus()
+    
     def __forget(self):
         """
         Private slot to handle the Remove context menu entry.
@@ -662,9 +739,9 @@
         if not names:
             E5MessageBox.information(
                 self,
-                self.trUtf8("Remove"),
-                self.trUtf8("""There are no missing entries"""
-                            """ available/selected."""))
+                self.tr("Remove"),
+                self.tr("""There are no missing entries"""
+                        """ available/selected."""))
             return
         
         self.vcs.hgForget(names)
@@ -679,9 +756,9 @@
         if not names:
             E5MessageBox.information(
                 self,
-                self.trUtf8("Revert"),
-                self.trUtf8("""There are no uncommitted changes"""
-                            """ available/selected."""))
+                self.tr("Revert"),
+                self.tr("""There are no uncommitted changes"""
+                        """ available/selected."""))
             return
         
         self.vcs.hgRevert(names)
@@ -703,9 +780,9 @@
         if not names:
             E5MessageBox.information(
                 self,
-                self.trUtf8("Revert"),
-                self.trUtf8("""There are no missing entries"""
-                            """ available/selected."""))
+                self.tr("Revert"),
+                self.tr("""There are no missing entries"""
+                        """ available/selected."""))
             return
         
         self.vcs.hgRevert(names)
@@ -721,9 +798,9 @@
         if not names:
             E5MessageBox.information(
                 self,
-                self.trUtf8("Differences"),
-                self.trUtf8("""There are no uncommitted changes"""
-                            """ available/selected."""))
+                self.tr("Differences"),
+                self.tr("""There are no uncommitted changes"""
+                        """ available/selected."""))
             return
         
         if self.diff is None:
@@ -741,16 +818,16 @@
         if not names:
             E5MessageBox.information(
                 self,
-                self.trUtf8("Side-by-Side Diff"),
-                self.trUtf8("""There are no uncommitted changes"""
-                            """ available/selected."""))
+                self.tr("Side-by-Side Diff"),
+                self.tr("""There are no uncommitted changes"""
+                        """ available/selected."""))
             return
         elif len(names) > 1:
             E5MessageBox.information(
                 self,
-                self.trUtf8("Side-by-Side Diff"),
-                self.trUtf8("""Only one file with uncommitted changes"""
-                            """ must be selected."""))
+                self.tr("Side-by-Side Diff"),
+                self.tr("""Only one file with uncommitted changes"""
+                        """ must be selected."""))
             return
         
         self.vcs.hgSbsDiff(names[0])

eric ide

mercurial