ProjectFlask/FlaskMigrateExtension/MigrateSummaryDialog.py

changeset 39
120f30d7b949
parent 36
548dea93941c
child 60
02243723ac17
diff -r f5055c1e4e07 -r 120f30d7b949 ProjectFlask/FlaskMigrateExtension/MigrateSummaryDialog.py
--- a/ProjectFlask/FlaskMigrateExtension/MigrateSummaryDialog.py	Sun Nov 29 17:03:34 2020 +0100
+++ b/ProjectFlask/FlaskMigrateExtension/MigrateSummaryDialog.py	Sun Nov 29 18:06:14 2020 +0100
@@ -10,7 +10,8 @@
 from PyQt5.QtCore import pyqtSlot, Qt, QProcess, QEventLoop, QTimer
 from PyQt5.QtGui import QGuiApplication
 from PyQt5.QtWidgets import (
-    QDialog, QDialogButtonBox, QAbstractButton, QTreeWidgetItem
+    QDialog, QDialogButtonBox, QAbstractButton, QTreeWidgetItem,
+    QAbstractItemView
 )
 
 from E5Gui import E5MessageBox
@@ -45,7 +46,10 @@
         self.__project = project
         self.__migrateProject = migrateProject
         self.__migrations = migrations
+        
         self.__process = None
+        self.__currentItemIndex = 1000000
+        self.__currentRevision = ""
     
     def showSummary(self):
         """
@@ -81,6 +85,7 @@
                 if ok:
                     out = str(self.__process.readAllStandardOutput(), "utf-8")
                     self.__processOutput(out)
+                    self.__selectItem(self.__currentRevision)
                 else:
                     E5MessageBox.critical(
                         None,
@@ -111,8 +116,9 @@
         @type str
         """
         self.summaryWidget.clear()
-        self.upgradeButton.setEnabled(False)
-        self.downgradeButton.setEnabled(False)
+        self.upDownButton.setEnabled(False)
+        self.__currentItemIndex = 1000000
+        self.__currentRevision = ""
         
         lines = output.splitlines()
         for line in lines:
@@ -142,34 +148,39 @@
                 font.setBold(True)
                 for column in range(self.summaryWidget.columnCount()):
                     itm.setFont(column, font)
+                
+                self.__currentItemIndex = (
+                    self.summaryWidget.indexOfTopLevelItem(itm)
+                )
+                self.__currentRevision = newRev.strip()
     
     @pyqtSlot()
     def on_summaryWidget_itemSelectionChanged(self):
         """
         Private slot to handle the selection of an entry.
         """
-        enable = bool(self.summaryWidget.selectedItems())
-        self.upgradeButton.setEnabled(enable)
-        self.downgradeButton.setEnabled(enable)
+        items = self.summaryWidget.selectedItems()
+        if items:
+            index = self.summaryWidget.indexOfTopLevelItem(items[0])
+            if index < self.__currentItemIndex:
+                self.upDownButton.setText(self.tr("Upgrade"))
+            elif index > self.__currentItemIndex:
+                self.upDownButton.setText(self.tr("Downgrade"))
+            self.upDownButton.setEnabled(index != self.__currentItemIndex)
+        else:
+            self.upDownButton.setEnabled(False)
     
     @pyqtSlot()
-    def on_upgradeButton_clicked(self):
+    def on_upDownButton_clicked(self):
         """
-        Private slot to upgrade to the selected revision.
+        Private slot to upgrade/downgrade to the selected revision.
         """
         itm = self.summaryWidget.selectedItems()[0]
         rev = itm.text(1)
-        self.__migrateProject.upgradeDatabase(revision=rev)
-        self.showSummary()
-    
-    @pyqtSlot()
-    def on_downgradeButton_clicked(self):
-        """
-        Private slot to downgrade to the selected revision.
-        """
-        itm = self.summaryWidget.selectedItems()[0]
-        rev = itm.text(1)
-        self.__migrateProject.downgradeDatabase(revision=rev)
+        if self.upDownButton.text() == self.tr("Upgrade"):
+            self.__migrateProject.upgradeDatabase(revision=rev)
+        else:
+            self.__migrateProject.downgradeDatabase(revision=rev)
         self.showSummary()
     
     @pyqtSlot(QAbstractButton)
@@ -197,3 +208,19 @@
             self.__process.waitForFinished(3000)
         
         self.__process = None
+    
+    def __selectItem(self, revision):
+        """
+        Private method to select an item given its revision.
+        
+        @param revision revision of the item to select
+        @type str
+        """
+        if revision:
+            items = self.summaryWidget.findItems(
+                revision, Qt.MatchExactly, 1)
+            if items:
+                # select the first item
+                items[0].setSelected(True)
+                self.summaryWidget.scrollToItem(
+                    items[0], QAbstractItemView.PositionAtCenter)

eric ide

mercurial