mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-15 00:04:00 -04:00
Update ui and add shortcut to cancel pending query
This commit is contained in:
parent
86d66c73a9
commit
fea66f9913
@ -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()
|
||||
|
||||
|
@ -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)
|
@ -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)
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user