File: layer_preview.py

package info (click to toggle)
qgis 2.4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 374,696 kB
  • ctags: 66,263
  • sloc: cpp: 396,139; ansic: 241,070; python: 130,609; xml: 14,884; perl: 1,290; sh: 1,287; sql: 500; yacc: 268; lex: 242; makefile: 168
file content (123 lines) | stat: -rw-r--r-- 4,355 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# -*- coding: utf-8 -*-

"""
/***************************************************************************
Name                 : DB Manager
Description          : Database manager plugin for QGIS
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 PyQt4.QtCore import *
from PyQt4.QtGui import *

from qgis.gui import QgsMapCanvas, QgsMapCanvasLayer
from qgis.core import QgsVectorLayer, QgsMapLayerRegistry

from .db_plugins.plugin import DbError, Table

class LayerPreview(QgsMapCanvas):
  def __init__(self, parent=None):
    QgsMapCanvas.__init__(self, 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 == None:
          QMessageBox.warning(self, QApplication.translate("DBManagerPlugin", "Sorry"), QApplication.translate("DBManagerPlugin", "Unable to find a valid unique field"))
          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()