QGIS/python/plugins/db_manager/layer_preview.py

136 lines
4.9 KiB
Python
Raw Normal View History

2012-04-16 13:19:40 +02:00
# -*- coding: utf-8 -*-
"""
/***************************************************************************
Name : DB Manager
2013-06-09 18:28:52 +02:00
Description : Database manager plugin for QGIS
2012-04-16 13:19:40 +02:00
Date : May 23, 2011
copyright : (C) 2011 by Giuseppe Sucameli
email : brush.tyler@gmail.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.QtCore import Qt, QTimer
2016-04-22 10:38:48 +02:00
from qgis.PyQt.QtGui import QColor, QCursor
from qgis.PyQt.QtWidgets import QApplication
2012-04-16 13:19:40 +02:00
from qgis.gui import QgsMapCanvas, QgsMessageBar
from qgis.core import Qgis, QgsVectorLayer, QgsProject, QgsSettings
2017-07-30 22:42:57 +02:00
from qgis.utils import OverrideCursor
2012-04-16 13:19:40 +02:00
from .db_plugins.plugin import Table
2012-04-16 13:19:40 +02:00
2012-04-16 13:19:40 +02:00
class LayerPreview(QgsMapCanvas):
def __init__(self, parent=None):
super(LayerPreview, self).__init__(parent)
self.parent = parent
self.setCanvasColor(QColor(255, 255, 255))
self.item = None
self.dirty = False
self.currentLayer = None
# reuse settings from QGIS
settings = QgsSettings()
self.enableAntiAliasing(settings.value("/qgis/enable_anti_aliasing", False, type=bool))
zoomFactor = settings.value("/qgis/zoom_factor", 2, type=float)
2016-06-07 22:28:22 +02:00
self.setWheelFactor(zoomFactor)
def refresh(self):
self.setDirty(True)
self.loadPreview(self.item)
def loadPreview(self, item):
if item == self.item and not self.dirty:
return
if item is None:
return
self._clear()
if isinstance(item, Table) and item.type in [Table.VectorType, Table.RasterType]:
# update the preview, but first let the manager chance to show the canvas
2016-03-21 04:51:10 +01:00
def runPrev():
return self._loadTablePreview(item)
QTimer.singleShot(50, runPrev)
else:
return
self.item = item
self.item.aboutToChange.connect(self.setDirty)
def setDirty(self, val=True):
self.dirty = val
def _clear(self):
""" remove any layers from preview canvas """
if self.item is not None:
2017-03-03 20:44:03 +01:00
# skip exception on RuntimeError fixes #6892
try:
self.item.aboutToChange.disconnect(self.setDirty)
except RuntimeError:
pass
self.item = None
self.dirty = False
self._loadTablePreview(None)
def _loadTablePreview(self, table, limit=False):
""" if has geometry column load to map canvas """
2017-07-30 22:18:25 +02:00
with OverrideCursor(Qt.WaitCursor):
self.freeze()
vl = None
if table and table.geomType:
# limit the query result if required
if limit and table.rowCount > 1000:
uniqueField = table.getValidQgisUniqueFields(True)
if uniqueField is None:
self.parent.tabs.setCurrentWidget(self.parent.info)
self.parent.infoBar.pushMessage(
QApplication.translate("DBManagerPlugin", "Unable to find a valid unique field"),
Qgis.Warning, self.parent.iface.messageTimeout())
2017-07-30 22:18:25 +02:00
return
uri = table.database().uri()
uri.setDataSource("", u"(SELECT * FROM %s LIMIT 1000)" % table.quotedName(), table.geomColumn, "",
uniqueField.name)
provider = table.database().dbplugin().providerName()
vl = QgsVectorLayer(uri.uri(False), table.name, provider)
else:
vl = table.toMapLayer()
if vl and not vl.isValid():
2017-07-30 22:18:25 +02:00
vl.deleteLater()
vl = None
# remove old layer (if any) and set new
if self.currentLayer:
if not QgsProject.instance().layerTreeRoot().findLayer(self.currentLayer.id()):
QgsProject.instance().removeMapLayers([self.currentLayer.id()])
2017-07-30 22:18:25 +02:00
if vl and vl.isValid():
2017-07-30 22:18:25 +02:00
self.setLayers([vl])
QgsProject.instance().addMapLayers([vl], False)
self.zoomToFullExtent()
else:
2017-07-30 22:18:25 +02:00
self.setLayers([])
2017-07-30 22:18:25 +02:00
self.currentLayer = vl
2017-07-30 22:18:25 +02:00
self.freeze(False)
super().refresh()