Added code to the Mercurial status dialog to remember the window geometry and the splitter state.

Mon, 13 Feb 2017 19:06:24 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 13 Feb 2017 19:06:24 +0100
changeset 5520
2a97a4d58bc6
parent 5519
ab19452732df
child 5521
37089cbeb1b9

Added code to the Mercurial status dialog to remember the window geometry and the splitter state.

Plugins/PluginVcsMercurial.py file | annotate | diff | comparison | revisions
Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py file | annotate | diff | comparison | revisions
Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.ui file | annotate | diff | comparison | revisions
--- a/Plugins/PluginVcsMercurial.py	Mon Feb 13 19:04:58 2017 +0100
+++ b/Plugins/PluginVcsMercurial.py	Mon Feb 13 19:06:24 2017 +0100
@@ -180,6 +180,10 @@
             "LogBrowserSplitterStates": [QByteArray(), QByteArray(),
                                          QByteArray()],
             # mainSplitter, detailsSplitter, diffSplitter
+            "StatusDialogGeometry": QByteArray(),
+            "StatusDialogSplitterState": QByteArray(),
+            "MqStatusDialogGeometry": QByteArray(),
+            "MqStatusDialogSplitterState": QByteArray(),
         }
         
         from VcsPlugins.vcsMercurial.ProjectHelper import HgProjectHelper
@@ -262,13 +266,17 @@
         elif key in ["Commits", "CommitAuthors"]:
             return Preferences.toList(Preferences.Prefs.settings.value(
                 "Mercurial/" + key))
-        elif key in ["LogBrowserGeometry"]:
+        elif key in ["LogBrowserGeometry", "StatusDialogGeometry",
+                     "StatusDialogSplitterState", "MqStatusDialogGeometry",
+                     "MqStatusDialogSplitterState"]:
+            # QByteArray values
             v = Preferences.Prefs.settings.value("Mercurial/" + key)
             if v is not None:
                 return v
             else:
                 return self.__mercurialDefaults[key]
         elif key in ["LogBrowserSplitterStates"]:
+            # list of QByteArray values
             states = Preferences.Prefs.settings.value("Mercurial/" + key)
             if states is not None:
                 return states
--- a/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py	Mon Feb 13 19:04:58 2017 +0100
+++ b/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py	Mon Feb 13 19:06:24 2017 +0100
@@ -16,7 +16,7 @@
 
 import os
 
-from PyQt5.QtCore import pyqtSlot, Qt, QProcess, QTimer
+from PyQt5.QtCore import pyqtSlot, Qt, QProcess, QTimer, QSize
 from PyQt5.QtGui import QTextCursor
 from PyQt5.QtWidgets import QWidget, QDialogButtonBox, QMenu, QHeaderView, \
     QTreeWidgetItem, QLineEdit
@@ -34,7 +34,6 @@
 
 # TODO: convert action buttons to a tool button with menu and delete status
 #       list context menu (i.e. make it the action menu)
-# TODO: save window geometry and splitter state
 class HgStatusDialog(QWidget, Ui_HgStatusDialog):
     """
     Class implementing a dialog to show the output of the hg status command
@@ -77,8 +76,7 @@
             self.process.readyReadStandardOutput.connect(self.__readStdout)
             self.process.readyReadStandardError.connect(self.__readStderr)
         
-        self.diffSplitter.setSizes([350, 350])
-        self.__diffSplitterState = None
+        self.diffSplitter.setSizes([300, 300])
         
         self.statusList.headerItem().setText(self.__lastColumn, "")
         self.statusList.header().setSortIndicator(
@@ -198,6 +196,62 @@
             '!': self.tr('missing'),
         }
     
+    def closeEvent(self, e):
+        """
+        Protected slot implementing a close event handler.
+        
+        @param e close event (QCloseEvent)
+        """
+        if self.__hgClient:
+            if self.__hgClient.isExecuting():
+                self.__hgClient.cancel()
+        else:
+            if self.process is not None and \
+               self.process.state() != QProcess.NotRunning:
+                self.process.terminate()
+                QTimer.singleShot(2000, self.process.kill)
+                self.process.waitForFinished(3000)
+        
+        if self.__mq:
+            self.vcs.getPlugin().setPreferences(
+                "MqStatusDialogGeometry", self.saveGeometry())
+            self.vcs.getPlugin().setPreferences(
+                "MqStatusDialogSplitterState", self.diffSplitter.saveState())
+        else:
+            self.vcs.getPlugin().setPreferences(
+                "StatusDialogGeometry", self.saveGeometry())
+            self.vcs.getPlugin().setPreferences(
+                "StatusDialogSplitterState", self.diffSplitter.saveState())
+        
+        e.accept()
+    
+    def show(self):
+        """
+        Public slot to show the dialog.
+        """
+        super(HgStatusDialog, self).show()
+        
+        if self.__mq:
+            geom = self.vcs.getPlugin().getPreferences(
+                "MqStatusDialogGeometry")
+        else:
+            geom = self.vcs.getPlugin().getPreferences(
+                "StatusDialogGeometry")
+        if geom.isEmpty():
+            s = QSize(800, 600)
+            self.resize(s)
+        else:
+            self.restoreGeometry(geom)
+        
+        if self.__mq:
+            diffSplitterState = self.vcs.getPlugin().getPreferences(
+                "MqStatusDialogSplitterState")
+        else:
+            diffSplitterState = self.vcs.getPlugin().getPreferences(
+                "StatusDialogSplitterState")
+        if diffSplitterState is not None:
+            self.diffSplitter.restoreState(diffSplitterState)
+    
     def __activeExtensionsChanged(self):
         """
         Private slot handling a change in the activated extensions.
@@ -209,15 +263,6 @@
             if self.addButton.menu() is not None:
                 self.addButton.setMenu(None)
     
-    def show(self):
-        """
-        Public slot to show the dialog.
-        """
-        super(HgStatusDialog, self).show()
-        
-        if not self.__mq and self.__diffSplitterState:
-            self.diffSplitter.restoreState(self.__diffSplitterState)
-    
     def __resort(self):
         """
         Private method to resort the tree.
@@ -259,27 +304,6 @@
         if statusText not in self.__statusFilters:
             self.__statusFilters.append(statusText)
         
-    def closeEvent(self, e):
-        """
-        Protected slot implementing a close event handler.
-        
-        @param e close event (QCloseEvent)
-        """
-        if self.__hgClient:
-            if self.__hgClient.isExecuting():
-                self.__hgClient.cancel()
-        else:
-            if self.process is not None and \
-               self.process.state() != QProcess.NotRunning:
-                self.process.terminate()
-                QTimer.singleShot(2000, self.process.kill)
-                self.process.waitForFinished(3000)
-        
-        if not self.__mq:
-            self.__diffSplitterState = self.diffSplitter.saveState()
-        
-        e.accept()
-    
     def start(self, fn):
         """
         Public slot to start the hg status command.
--- a/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.ui	Mon Feb 13 19:04:58 2017 +0100
+++ b/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.ui	Mon Feb 13 19:06:24 2017 +0100
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>1000</width>
-    <height>700</height>
+    <width>800</width>
+    <height>600</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -69,7 +69,7 @@
      <property name="childrenCollapsible">
       <bool>false</bool>
      </property>
-     <widget class="QWidget" name="">
+     <widget class="QWidget" name="layoutWidget">
       <layout class="QVBoxLayout" name="verticalLayout">
        <item>
         <widget class="QTreeWidget" name="statusList">
@@ -204,7 +204,7 @@
        </item>
       </layout>
      </widget>
-     <widget class="QWidget" name="">
+     <widget class="QWidget" name="layoutWidget">
       <layout class="QVBoxLayout" name="verticalLayout_2">
        <item>
         <widget class="QLabel" name="label_2">

eric ide

mercurial