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. *
|
|
|
|
* *
|
|
|
|
***************************************************************************/
|
|
|
|
"""
|
|
|
|
|
fix python pep8 warnings and fix some revealed errors
pep8 --ignore=E111,E128,E201,E202,E203,E211,E221,E222,E225,E226,E227,E231,E241,E261,E265,E272,E302,E303,E501,E701 \
--exclude="ui_*.py,debian/*,python/ext-libs/*" \
.
2015-02-01 14:15:42 +01:00
|
|
|
from PyQt4.QtCore import Qt, QSettings, QTimer, SIGNAL
|
|
|
|
from PyQt4.QtGui import QColor, QApplication, QCursor
|
2012-04-16 13:19:40 +02:00
|
|
|
|
2014-09-25 16:43:53 +02:00
|
|
|
from qgis.gui import QgsMapCanvas, QgsMapCanvasLayer, QgsMessageBar
|
2012-04-16 13:19:40 +02:00
|
|
|
from qgis.core import QgsVectorLayer, QgsMapLayerRegistry
|
|
|
|
|
fix python pep8 warnings and fix some revealed errors
pep8 --ignore=E111,E128,E201,E202,E203,E211,E221,E222,E225,E226,E227,E231,E241,E261,E265,E272,E302,E303,E501,E701 \
--exclude="ui_*.py,debian/*,python/ext-libs/*" \
.
2015-02-01 14:15:42 +01:00
|
|
|
from .db_plugins.plugin import Table
|
2012-04-16 13:19:40 +02:00
|
|
|
|
2015-03-21 10:41:58 +10:00
|
|
|
|
2012-04-16 13:19:40 +02:00
|
|
|
class LayerPreview(QgsMapCanvas):
|
2015-03-21 10:41:58 +10:00
|
|
|
def __init__(self, parent=None):
|
|
|
|
QgsMapCanvas.__init__(self, parent)
|
|
|
|
self.parent = parent
|
|
|
|
self.setCanvasColor(QColor(255, 255, 255))
|
|
|
|
|
|
|
|
self.item = None
|
|
|
|
self.dirty = False
|
|
|
|
|
|
|
|
# reuse settings from QGIS
|
|
|
|
settings = QSettings()
|
|
|
|
self.enableAntiAliasing(settings.value("/qgis/enable_anti_aliasing", False, type=bool))
|
|
|
|
action = settings.value("/qgis/wheel_action", 0, type=float)
|
|
|
|
zoomFactor = settings.value("/qgis/zoom_factor", 2, type=float)
|
|
|
|
self.setWheelAction(QgsMapCanvas.WheelAction(action), zoomFactor)
|
|
|
|
|
|
|
|
self._clear()
|
|
|
|
|
|
|
|
|
|
|
|
def refresh(self):
|
|
|
|
self.setDirty(True)
|
|
|
|
self.loadPreview(self.item)
|
|
|
|
|
|
|
|
def loadPreview(self, item, force=False):
|
|
|
|
if item == self.item and not self.dirty:
|
|
|
|
return
|
|
|
|
self._clear()
|
|
|
|
if item is None:
|
|
|
|
return
|
|
|
|
|
|
|
|
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
|
|
|
|
runPrev = lambda: self._loadTablePreview(item)
|
|
|
|
QTimer.singleShot(50, runPrev)
|
|
|
|
else:
|
|
|
|
return
|
|
|
|
|
|
|
|
self.item = item
|
|
|
|
self.connect(self.item, SIGNAL('aboutToChange'), 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:
|
|
|
|
## skip exception on RuntimeError fixes #6892
|
|
|
|
try:
|
|
|
|
self.disconnect(self.item, SIGNAL('aboutToChange'), self.setDirty)
|
|
|
|
except RuntimeError:
|
|
|
|
pass
|
|
|
|
self.item = None
|
|
|
|
self.dirty = False
|
|
|
|
|
|
|
|
self.currentLayerId = None
|
|
|
|
self.setLayerSet([])
|
|
|
|
|
|
|
|
def _loadTablePreview(self, table, limit=False):
|
|
|
|
""" if has geometry column load to map canvas """
|
|
|
|
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
|
|
|
|
self.setRenderFlag(False)
|
|
|
|
newLayerId = None
|
|
|
|
|
|
|
|
if 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"),
|
|
|
|
QgsMessageBar.WARNING, self.parent.iface.messageTimeout())
|
|
|
|
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(), table.name, provider)
|
|
|
|
else:
|
|
|
|
vl = table.toMapLayer()
|
|
|
|
|
|
|
|
if not vl.isValid():
|
|
|
|
self.setLayerSet([])
|
|
|
|
else:
|
|
|
|
newLayerId = vl.id() if hasattr(vl, 'id') else vl.id()
|
|
|
|
self.setLayerSet([QgsMapCanvasLayer(vl)])
|
|
|
|
QgsMapLayerRegistry.instance().addMapLayers([vl], False)
|
|
|
|
self.zoomToFullExtent()
|
|
|
|
|
|
|
|
# remove old layer (if any) and set new
|
|
|
|
if self.currentLayerId:
|
|
|
|
QgsMapLayerRegistry.instance().removeMapLayers([self.currentLayerId], False)
|
|
|
|
self.currentLayerId = newLayerId
|
|
|
|
|
|
|
|
self.setRenderFlag(True)
|
|
|
|
QApplication.restoreOverrideCursor()
|