Skip to content

Commit 973d351

Browse files
committed
Avoid endless wait cursors
1 parent cf753e9 commit 973d351

File tree

5 files changed

+85
-93
lines changed

5 files changed

+85
-93
lines changed

python/plugins/MetaSearch/dialogs/maindialog.py

Lines changed: 27 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
QgsCoordinateTransform, QgsGeometry, QgsPointXY,
4747
QgsProviderRegistry, QgsSettings)
4848
from qgis.gui import QgsRubberBand
49+
from qgis.utils import OverrideCursor
4950

5051
from owslib.csw import CatalogueServiceWeb # spellok
5152
from owslib.fes import BBox, PropertyIsLike
@@ -281,8 +282,6 @@ def connection_info(self):
281282
if not self._get_csw():
282283
return
283284

284-
QApplication.restoreOverrideCursor()
285-
286285
if self.catalog: # display service metadata
287286
self.btnCapabilities.setEnabled(True)
288287
metadata = render_template('en', self.context,
@@ -490,25 +489,22 @@ def search(self):
490489
# TODO: allow users to select resources types
491490
# to find ('service', 'dataset', etc.)
492491
try:
493-
self.catalog.getrecords2(constraints=self.constraints,
494-
maxrecords=self.maxrecords, esn='full')
492+
with OverrideCursor(Qt.WaitCursor):
493+
self.catalog.getrecords2(constraints=self.constraints,
494+
maxrecords=self.maxrecords, esn='full')
495495
except ExceptionReport as err:
496-
QApplication.restoreOverrideCursor()
497496
QMessageBox.warning(self, self.tr('Search error'),
498497
self.tr('Search error: {0}').format(err))
499498
return
500499
except Exception as err:
501-
QApplication.restoreOverrideCursor()
502500
QMessageBox.warning(self, self.tr('Connection error'),
503501
self.tr('Connection error: {0}').format(err))
504502
return
505503

506504
if self.catalog.results['matches'] == 0:
507-
QApplication.restoreOverrideCursor()
508505
self.lblResults.setText(self.tr('0 results'))
509506
return
510507

511-
QApplication.restoreOverrideCursor()
512508
self.display_results()
513509

514510
def display_results(self):
@@ -675,25 +671,20 @@ def navigate(self):
675671
else:
676672
return
677673

678-
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
679-
680674
try:
681-
self.catalog.getrecords2(constraints=self.constraints,
682-
maxrecords=self.maxrecords,
683-
startposition=self.startfrom, esn='full')
675+
with OverrideCursor(Qt.WaitCursor):
676+
self.catalog.getrecords2(constraints=self.constraints,
677+
maxrecords=self.maxrecords,
678+
startposition=self.startfrom, esn='full')
684679
except ExceptionReport as err:
685-
QApplication.restoreOverrideCursor()
686680
QMessageBox.warning(self, self.tr('Search error'),
687681
self.tr('Search error: {0}').format(err))
688682
return
689683
except Exception as err:
690-
QApplication.restoreOverrideCursor()
691684
QMessageBox.warning(self, self.tr('Connection error'),
692685
self.tr('Connection error: {0}').format(err))
693686
return
694687

695-
QApplication.restoreOverrideCursor()
696-
697688
self.display_results()
698689

699690
def add_to_ows(self):
@@ -727,8 +718,6 @@ def add_to_ows(self):
727718
stype = ['ESRI:ArcGIS:FeatureServer', 'afs', 'arcgisfeatureserver']
728719
data_url = item_data['afs'].split('FeatureServer')[0] + 'FeatureServer'
729720

730-
QApplication.restoreOverrideCursor()
731-
732721
sname = '%s from MetaSearch' % stype[1]
733722

734723
# store connection
@@ -820,26 +809,22 @@ def show_metadata(self):
820809
identifier = get_item_data(item, 'identifier')
821810

822811
try:
823-
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
824-
cat = CatalogueServiceWeb(self.catalog_url, timeout=self.timeout, # spellok
825-
username=self.catalog_username,
826-
password=self.catalog_password)
827-
cat.getrecordbyid(
828-
[self.catalog.records[identifier].identifier])
812+
with OverrideCursor(Qt.WaitCursor):
813+
cat = CatalogueServiceWeb(self.catalog_url, timeout=self.timeout, # spellok
814+
username=self.catalog_username,
815+
password=self.catalog_password)
816+
cat.getrecordbyid(
817+
[self.catalog.records[identifier].identifier])
829818
except ExceptionReport as err:
830-
QApplication.restoreOverrideCursor()
831819
QMessageBox.warning(self, self.tr('GetRecords error'),
832820
self.tr('Error getting response: {0}').format(err))
833821
return
834822
except KeyError as err:
835823
QMessageBox.warning(self,
836824
self.tr('Record parsing error'),
837825
self.tr('Unable to locate record identifier'))
838-
QApplication.restoreOverrideCursor()
839826
return
840827

841-
QApplication.restoreOverrideCursor()
842-
843828
record = cat.records[identifier]
844829
record.xml_url = cat.request
845830

@@ -902,21 +887,20 @@ def _get_csw(self):
902887
"""convenience function to init owslib.csw.CatalogueServiceWeb""" # spellok
903888

904889
# connect to the server
905-
try:
906-
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
907-
self.catalog = CatalogueServiceWeb(self.catalog_url, # spellok
908-
timeout=self.timeout,
909-
username=self.catalog_username,
910-
password=self.catalog_password)
911-
return True
912-
except ExceptionReport as err:
913-
msg = self.tr('Error connecting to service: {0}').format(err)
914-
except ValueError as err:
915-
msg = self.tr('Value Error: {0}').format(err)
916-
except Exception as err:
917-
msg = self.tr('Unknown Error: {0}').format(err)
890+
with OverrideCursor(Qt.WaitCursor):
891+
try:
892+
self.catalog = CatalogueServiceWeb(self.catalog_url, # spellok
893+
timeout=self.timeout,
894+
username=self.catalog_username,
895+
password=self.catalog_password)
896+
return True
897+
except ExceptionReport as err:
898+
msg = self.tr('Error connecting to service: {0}').format(err)
899+
except ValueError as err:
900+
msg = self.tr('Value Error: {0}').format(err)
901+
except Exception as err:
902+
msg = self.tr('Unknown Error: {0}').format(err)
918903

919-
QApplication.restoreOverrideCursor()
920904
QMessageBox.warning(self, self.tr('CSW Connection error'), msg)
921905
return False
922906

python/plugins/db_manager/db_manager.py

Lines changed: 28 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232

3333
from qgis.gui import QgsMessageBar
3434
from qgis.core import QgsSettings, QgsMapLayer
35+
from qgis.utils import OverrideCursor
36+
3537
from .info_viewer import InfoViewer
3638
from .table_viewer import TableViewer
3739
from .layer_preview import LayerPreview
@@ -72,29 +74,23 @@ def closeEvent(self, e):
7274
QMainWindow.closeEvent(self, e)
7375

7476
def refreshItem(self, item=None):
75-
QApplication.setOverrideCursor(Qt.WaitCursor)
76-
try:
77-
if item is None:
78-
item = self.tree.currentItem()
79-
self.tree.refreshItem(item) # refresh item children in the db tree
80-
except BaseError as e:
81-
DlgDbError.showError(e, self)
82-
return
83-
finally:
84-
QApplication.restoreOverrideCursor()
77+
with OverrideCursor(Qt.WaitCursor):
78+
try:
79+
if item is None:
80+
item = self.tree.currentItem()
81+
self.tree.refreshItem(item) # refresh item children in the db tree
82+
except BaseError as e:
83+
DlgDbError.showError(e, self)
8584

8685
def itemChanged(self, item):
87-
QApplication.setOverrideCursor(Qt.WaitCursor)
88-
try:
89-
self.reloadButtons()
90-
# clear preview, this will delete the layer in preview tab
91-
self.preview.loadPreview(None)
92-
self.refreshTabs()
93-
except BaseError as e:
94-
DlgDbError.showError(e, self)
95-
return
96-
finally:
97-
QApplication.restoreOverrideCursor()
86+
with OverrideCursor(Qt.WaitCursor):
87+
try:
88+
self.reloadButtons()
89+
# clear preview, this will delete the layer in preview tab
90+
self.preview.loadPreview(None)
91+
self.refreshTabs()
92+
except BaseError as e:
93+
DlgDbError.showError(e, self)
9894

9995
def reloadButtons(self):
10096
db = self.tree.currentDatabase()
@@ -114,14 +110,11 @@ def reloadButtons(self):
114110
self._lastDb.registerAllActions(self)
115111

116112
def tabChanged(self, index):
117-
QApplication.setOverrideCursor(Qt.WaitCursor)
118-
try:
119-
self.refreshTabs()
120-
except BaseError as e:
121-
DlgDbError.showError(e, self)
122-
return
123-
finally:
124-
QApplication.restoreOverrideCursor()
113+
with OverrideCursor(Qt.WaitCursor):
114+
try:
115+
self.refreshTabs()
116+
except BaseError as e:
117+
DlgDbError.showError(e, self)
125118

126119
def refreshTabs(self):
127120
index = self.tabs.currentIndex()
@@ -300,17 +293,12 @@ def invokeCallback(self, callback, *params):
300293
This method takes care to override and restore the cursor,
301294
but also catches exceptions and displays the error dialog.
302295
"""
303-
QApplication.setOverrideCursor(Qt.WaitCursor)
304-
try:
305-
callback(self.tree.currentItem(), self.sender(), self, *params)
306-
307-
except BaseError as e:
308-
# catch database errors and display the error dialog
309-
DlgDbError.showError(e, self)
310-
return
311-
312-
finally:
313-
QApplication.restoreOverrideCursor()
296+
with OverrideCursor(Qt.WaitCursor):
297+
try:
298+
callback(self.tree.currentItem(), self.sender(), self, *params)
299+
except BaseError as e:
300+
# catch database errors and display the error dialog
301+
DlgDbError.showError(e, self)
314302

315303
def unregisterAction(self, action, menuName):
316304
if not hasattr(self, '_registeredDbActions'):

python/plugins/processing/algs/qgis/ui/FieldsCalculatorDialog.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
QgsMapLayerProxyModel,
4141
QgsMessageLog)
4242
from qgis.gui import QgsEncodingFileDialog
43+
from qgis.utils import OverrideCursor
4344

4445
from processing.core.ProcessingConfig import ProcessingConfig
4546
from processing.core.ProcessingLog import ProcessingLog
@@ -220,10 +221,9 @@ def getParamValues(self):
220221

221222
def accept(self):
222223
keepOpen = ProcessingConfig.getSetting(ProcessingConfig.KEEP_DIALOG_OPEN)
223-
try:
224-
parameters = self.getParamValues()
225-
if parameters:
226-
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
224+
parameters = self.getParamValues()
225+
if parameters:
226+
with OverrideCusor(Qt.WaitCursor):
227227
context = dataobjects.createContext()
228228
ProcessingLog.addToLog(self.alg.asPythonCommand(parameters, context))
229229

@@ -235,8 +235,6 @@ def accept(self):
235235
not keepOpen)
236236
if not keepOpen:
237237
QDialog.reject(self)
238-
finally:
239-
QApplication.restoreOverrideCursor()
240238

241239
def reject(self):
242240
self.executed = False

python/plugins/processing/gui/ConfigDialog.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
QgsSpinBox,
5252
QgsOptionsPageWidget)
5353
from qgis.core import NULL, QgsApplication, QgsSettings
54+
from qgis.utils import OverrideCursor
5455

5556
from processing.core.ProcessingConfig import (ProcessingConfig,
5657
settingsWatcher,
@@ -293,10 +294,9 @@ def accept(self):
293294
return
294295
setting.save(qsettings)
295296

296-
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
297-
for p in QgsApplication.processingRegistry().providers():
298-
p.refreshAlgorithms()
299-
QApplication.restoreOverrideCursor()
297+
with OverrideCursor(Qt.WaitCursor):
298+
for p in QgsApplication.processingRegistry().providers():
299+
p.refreshAlgorithms()
300300

301301
settingsWatcher.settingsChanged.emit()
302302

python/utils.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,28 @@ def spatialite_connect(*args, **kwargs):
625625
return dbapi2.connect(*args, **kwargs)
626626

627627

628+
class OverrideCursor():
629+
"""
630+
Executes a code block with a different cursor set and makes sure the cursor
631+
is restored even if exceptions are raised or an intermediate ``return``
632+
statement is hit.
633+
634+
Example:
635+
```
636+
with OverrideCursor(Qt.WaitCursor):
637+
do_a_slow(operation)
638+
```
639+
"""
640+
641+
def __init__(self, cursor):
642+
self.cursor = cursor
643+
644+
def __enter__(self):
645+
QApplication.setOverrideCursor(self.cursor)
646+
647+
def __exit__(self, exc_type, exc_val, exc_tb):
648+
QApplication.restoreOverrideCursor()
649+
628650
#######################
629651
# IMPORT wrapper
630652

0 commit comments

Comments
 (0)