Update ui and add shortcut to cancel pending query

This commit is contained in:
Blottiere Paul 2018-02-01 16:22:24 +00:00
parent 86d66c73a9
commit fea66f9913
4 changed files with 71 additions and 71 deletions

View File

@ -158,8 +158,10 @@ class SqlResultModelAsync(QObject):
self.status = None
self.model = None
self.task = None
self.canceled = False
def cancel(self):
self.canceled = True
if self.task:
self.task.cancel()

View File

@ -1,65 +0,0 @@
# -*- coding: utf-8 -*-
"""
/***************************************************************************
Name : DB Manager
Description : Database manager plugin for QGIS
Date : January 15, 2018
copyright : (C) 2018 by Paul Blottiere
email : paul.blottiere@oslandia.com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
"""
from qgis.PyQt.QtWidgets import QDialog, QLabel, QHBoxLayout
from qgis.PyQt.QtGui import QMovie
from qgis.PyQt.QtCore import QSize, Qt, pyqtSignal
from qgis.core import QgsApplication
from .ui.ui_DlgCancelTaskQuery import Ui_DlgCancelTaskQuery as Ui_Dialog
class DlgCancelTaskQuery(QDialog, Ui_Dialog):
canceled = pyqtSignal()
def __init__(self, parent=None):
QDialog.__init__(self, parent)
self.setupUi(self)
gif = QgsApplication.iconPath("/mIconLoading.gif")
self.mGif = QMovie(gif)
self.mGif.setScaledSize(QSize(16, 16))
self.mMovie.setMovie(self.mGif)
self.setWindowModality(Qt.ApplicationModal)
self.mCancelButton.clicked.connect(self.cancel)
self.cancelStatus = False
def cancel(self):
self.mLabel.setText("Stopping SQL...")
self.cancelStatus = True
self.mCancelButton.setEnabled(False)
self.canceled.emit()
def show(self):
self.cancelStatus = False
self.mGif.start()
self.mCancelButton.setEnabled(True)
self.mLabel.setText("Executing SQL...")
QDialog.show(self)
def hide(self):
self.mGif.stop()
QDialog.hide(self)

View File

@ -37,7 +37,6 @@ from .db_plugins.plugin import BaseError
from .db_plugins.postgis.plugin import PGDatabase
from .dlg_db_error import DlgDbError
from .dlg_query_builder import QueryBuilderDlg
from .dlg_cancel_task_query import DlgCancelTaskQuery
try:
from qgis.gui import QgsCodeEditorSQL # NOQA
@ -57,12 +56,11 @@ class DlgSqlWindow(QWidget, Ui_Dialog):
def __init__(self, iface, db, parent=None):
QWidget.__init__(self, parent)
self.mainWindow = parent
self.iface = iface
self.db = db
self.filter = ""
self.modelAsync = None
self.dlg_cancel_task = DlgCancelTaskQuery(self)
self.dlg_cancel_task.canceled.connect(self.executeSqlCanceled)
self.allowMultiColumnPk = isinstance(db, PGDatabase) # at the moment only PostgreSQL allows a primary key to span multiple columns, SpatiaLite doesn't
self.aliasSubQuery = isinstance(db, PGDatabase) # only PostgreSQL requires subqueries to be aliases
self.setupUi(self)
@ -81,6 +79,16 @@ class DlgSqlWindow(QWidget, Ui_Dialog):
self.editSql.setMarginVisible(True)
self.initCompleter()
self.btnCancel.setText(self.tr("Cancel (ESC)"))
self.btnCancel.setEnabled(False)
self.btnCancel.clicked.connect(self.executeSqlCanceled)
self.btnCancel.setShortcut(QKeySequence.Cancel)
self.progressBar.setEnabled(False)
self.progressBar.setRange(0, 100)
self.progressBar.setValue(0)
self.progressBar.setFormat("")
self.progressBar.setAlignment(Qt.AlignCenter)
# allow copying results
copyAction = QAction("copy", self)
self.viewResult.addAction(copyAction)
@ -181,11 +189,45 @@ class DlgSqlWindow(QWidget, Ui_Dialog):
self.editSql.setFocus()
self.filter = ""
def updateUiWhileSqlExecution(self, status):
if status:
for i in range(0, self.mainWindow.tabs.count()):
if i != self.mainWindow.tabs.currentIndex():
self.mainWindow.tabs.setTabEnabled(i, False)
self.mainWindow.menuBar.setEnabled(False)
self.mainWindow.toolBar.setEnabled(False)
self.mainWindow.tree.setEnabled(False)
for w in self.findChildren(QWidget):
w.setEnabled(False)
self.btnCancel.setEnabled(True)
self.progressBar.setEnabled(True)
self.progressBar.setRange(0, 0)
else:
for i in range(0, self.mainWindow.tabs.count()):
if i != self.mainWindow.tabs.currentIndex():
self.mainWindow.tabs.setTabEnabled(i, True)
self.mainWindow.refreshTabs()
self.mainWindow.menuBar.setEnabled(True)
self.mainWindow.toolBar.setEnabled(True)
self.mainWindow.tree.setEnabled(True)
for w in self.findChildren(QWidget):
w.setEnabled(True)
self.btnCancel.setEnabled(False)
self.progressBar.setRange(0, 100)
self.progressBar.setEnabled(False)
def executeSqlCanceled(self):
self.btnCancel.setEnabled(False)
self.modelAsync.cancel()
def executeSqlCompleted(self):
self.dlg_cancel_task.hide()
self.updateUiWhileSqlExecution(False)
with OverrideCursor(Qt.WaitCursor):
if self.modelAsync.task.status() == QgsTask.Complete:
@ -201,7 +243,7 @@ class DlgSqlWindow(QWidget, Ui_Dialog):
self.setColumnCombos(cols, quotedCols)
self.update()
elif not self.dlg_cancel_task.cancelStatus:
elif not self.modelAsync.canceled:
DlgDbError.showError(self.modelAsync.error, self)
self.uniqueModel.clear()
self.geomCombo.clear()
@ -222,7 +264,7 @@ class DlgSqlWindow(QWidget, Ui_Dialog):
try:
self.modelAsync = self.db.sqlResultModelAsync(sql, self)
self.modelAsync.done.connect(self.executeSqlCompleted)
self.dlg_cancel_task.show()
self.updateUiWhileSqlExecution(True)
QgsApplication.taskManager().addTask(self.modelAsync.task)
except Exception as e:
DlgDbError.showError(e, self)

View File

@ -393,6 +393,27 @@ unique values</string>
</widget>
</widget>
</item>
<item row="4" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QProgressBar" name="progressBar">
<property name="value">
<number>24</number>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnCancel">
<property name="text">
<string>Cancel (ESC)</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>