layer_preview.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. """
  2. /***************************************************************************
  3. Name : DB Manager
  4. Description : Database manager plugin for QGIS
  5. Date : May 23, 2011
  6. copyright : (C) 2011 by Giuseppe Sucameli
  7. email : brush.tyler@gmail.com
  8. ***************************************************************************/
  9. /***************************************************************************
  10. * *
  11. * This program is free software; you can redistribute it and/or modify *
  12. * it under the terms of the GNU General Public License as published by *
  13. * the Free Software Foundation; either version 2 of the License, or *
  14. * (at your option) any later version. *
  15. * *
  16. ***************************************************************************/
  17. """
  18. from qgis.PyQt.QtCore import Qt, QTimer
  19. from qgis.PyQt.QtGui import QColor, QCursor
  20. from qgis.PyQt.QtWidgets import QApplication
  21. from qgis.gui import QgsMapCanvas, QgsMessageBar
  22. from qgis.core import Qgis, QgsVectorLayer, QgsProject, QgsSettings
  23. from qgis.utils import OverrideCursor
  24. from .db_plugins.plugin import Table
  25. class LayerPreview(QgsMapCanvas):
  26. def __init__(self, parent=None):
  27. super().__init__(parent)
  28. self.parent = parent
  29. self.setCanvasColor(QColor(255, 255, 255))
  30. self.item = None
  31. self.dirty = False
  32. self.current_layer = None
  33. # reuse settings from QGIS
  34. settings = QgsSettings()
  35. self.enableAntiAliasing(settings.value("/qgis/enable_anti_aliasing", False, type=bool))
  36. zoomFactor = settings.value("/qgis/zoom_factor", 2, type=float)
  37. self.setWheelFactor(zoomFactor)
  38. def refresh(self):
  39. self.setDirty(True)
  40. self.loadPreview(self.item)
  41. def loadPreview(self, item):
  42. if item == self.item and not self.dirty:
  43. return
  44. if item is None:
  45. return
  46. self._clear()
  47. if isinstance(item, Table) and item.type in [Table.VectorType, Table.RasterType]:
  48. # update the preview, but first let the manager chance to show the canvas
  49. def runPrev():
  50. return self._loadTablePreview(item)
  51. QTimer.singleShot(50, runPrev)
  52. else:
  53. return
  54. self.item = item
  55. self.item.aboutToChange.connect(self.setDirty)
  56. def setDirty(self, val=True):
  57. self.dirty = val
  58. def _clear(self):
  59. """ remove any layers from preview canvas """
  60. if self.item is not None:
  61. # skip exception on RuntimeError fixes #6892
  62. try:
  63. self.item.aboutToChange.disconnect(self.setDirty)
  64. except RuntimeError:
  65. pass
  66. self.item = None
  67. self.dirty = False
  68. self._loadTablePreview(None)
  69. def _loadTablePreview(self, table, limit=False):
  70. """ if has geometry column load to map canvas """
  71. with OverrideCursor(Qt.WaitCursor):
  72. self.freeze()
  73. vl = None
  74. if table and table.geomType:
  75. # limit the query result if required
  76. if limit and table.rowCount > 1000:
  77. uniqueField = table.getValidQgisUniqueFields(True)
  78. if uniqueField is None:
  79. self.parent.tabs.setCurrentWidget(self.parent.info)
  80. self.parent.infoBar.pushMessage(
  81. QApplication.translate("DBManagerPlugin", "Unable to find a valid unique field"),
  82. Qgis.Warning, self.parent.iface.messageTimeout())
  83. return
  84. uri = table.database().uri()
  85. uri.setDataSource("", "(SELECT * FROM %s LIMIT 1000)" % table.quotedName(), table.geomColumn, "",
  86. uniqueField.name)
  87. provider = table.database().dbplugin().providerName()
  88. vl = QgsVectorLayer(uri.uri(False), table.name, provider)
  89. else:
  90. vl = table.toMapLayer()
  91. if vl and not vl.isValid():
  92. vl.deleteLater()
  93. vl = None
  94. if vl and vl.isValid():
  95. self.current_layer = vl
  96. self.setLayers([self.current_layer])
  97. self.zoomToFullExtent()
  98. else:
  99. self.setLayers([])
  100. self.current_layer = None
  101. self.freeze(False)
  102. super().refresh()