--- 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)