20
20
***************************************************************************/
21
21
"""
22
22
23
- from PyQt4 .QtCore import Qt , QObject , SIGNAL , qDebug , QByteArray , QMimeData , QDataStream , QIODevice , QFileInfo , \
24
- QAbstractItemModel , QModelIndex
25
- from PyQt4 .QtGui import QApplication , QIcon , QMessageBox
23
+ from PyQt .QtCore import Qt , QObject , qDebug , QByteArray , QMimeData , QDataStream , QIODevice , QFileInfo , QAbstractItemModel , QModelIndex , pyqtSignal
24
+ from PyQt . QtWidgets import QApplication , QMessageBox
25
+ from PyQt .QtGui import QIcon
26
26
27
27
from .db_plugins import supportedDbTypes , createDbPlugin
28
- from .db_plugins .plugin import BaseError , Table
28
+ from .db_plugins .plugin import BaseError , Table , Database
29
29
from .dlg_db_error import DlgDbError
30
30
31
- import qgis .core
31
+ from qgis .core import QgsDataSourceURI , QgsVectorLayer , QgsRasterLayer , QgsMimeDataUtils
32
+
33
+ from . import resources_rc
34
+
35
+ try :
36
+ from qgis .core import QgsVectorLayerImport
37
+ isImportVectorAvail = True
38
+ except :
39
+ isImportVectorAvail = False
32
40
33
41
34
42
class TreeItem (QObject ):
43
+ itemRemoved = pyqtSignal ()
44
+ itemChanged = pyqtSignal ()
35
45
36
46
def __init__ (self , data , parent = None ):
37
47
QObject .__init__ (self , parent )
@@ -41,14 +51,14 @@ def __init__(self, data, parent=None):
41
51
if parent :
42
52
parent .appendChild (self )
43
53
44
- def childRemoved (self , child ):
45
- self .itemChanged ()
54
+ def childRemoved (self ):
55
+ self .itemWasChanged ()
46
56
47
- def itemChanged (self ):
48
- self .emit (SIGNAL ( "itemChanged" ), self )
57
+ def itemWasChanged (self ):
58
+ self .itemChanged . emit ()
49
59
50
- def itemRemoved (self ):
51
- self .emit (SIGNAL ( "itemRemoved" ), self )
60
+ def itemWasRemoved (self ):
61
+ self .itemRemoved . emit ()
52
62
53
63
def populate (self ):
54
64
self .populated = True
@@ -59,15 +69,15 @@ def getItemData(self):
59
69
60
70
def appendChild (self , child ):
61
71
self .childItems .append (child )
62
- self . connect (child , SIGNAL ( "itemRemoved" ), self .childRemoved )
72
+ child . itemRemoved . connect (self .childRemoved )
63
73
64
74
def child (self , row ):
65
75
return self .childItems [row ]
66
76
67
77
def removeChild (self , row ):
68
78
if row >= 0 and row < len (self .childItems ):
69
79
self .childItems [row ].itemData .deleteLater ()
70
- self .disconnect ( self . childItems [row ], SIGNAL ( " itemRemoved" ), self .childRemoved )
80
+ self .childItems [row ]. itemRemoved . disconnect ( self .childRemoved )
71
81
del self .childItems [row ]
72
82
73
83
def childCount (self ):
@@ -129,8 +139,8 @@ class ConnectionItem(TreeItem):
129
139
130
140
def __init__ (self , connection , parent = None ):
131
141
TreeItem .__init__ (self , connection , parent )
132
- self . connect (connection , SIGNAL ( "changed" ), self .itemChanged )
133
- self . connect (connection , SIGNAL ( "deleted" ), self .itemRemoved )
142
+ connection . changed . connect (self .itemChanged )
143
+ connection . deleted . connect (self .itemRemoved )
134
144
135
145
# load (shared) icon with first instance of table item
136
146
if not hasattr (ConnectionItem , 'connectedIcon' ):
@@ -158,8 +168,8 @@ def populate(self):
158
168
return False
159
169
160
170
database = connection .database ()
161
- self . connect (database , SIGNAL ( "changed" ), self .itemChanged )
162
- self . connect (database , SIGNAL ( "deleted" ), self .itemRemoved )
171
+ database . changed . connect (self .itemChanged )
172
+ database . deleted . connect (self .itemRemoved )
163
173
164
174
schemas = database .schemas ()
165
175
if schemas is not None :
@@ -184,8 +194,8 @@ class SchemaItem(TreeItem):
184
194
185
195
def __init__ (self , schema , parent ):
186
196
TreeItem .__init__ (self , schema , parent )
187
- self . connect (schema , SIGNAL ( "changed" ), self .itemChanged )
188
- self . connect (schema , SIGNAL ( "deleted" ), self .itemRemoved )
197
+ schema . changed . connect (self .itemChanged )
198
+ schema . deleted . connect (self .itemRemoved )
189
199
190
200
# load (shared) icon with first instance of schema item
191
201
if not hasattr (SchemaItem , 'schemaIcon' ):
@@ -214,8 +224,8 @@ class TableItem(TreeItem):
214
224
215
225
def __init__ (self , table , parent ):
216
226
TreeItem .__init__ (self , table , parent )
217
- self . connect (table , SIGNAL ( "changed" ), self .itemChanged )
218
- self . connect (table , SIGNAL ( "deleted" ), self .itemRemoved )
227
+ table . changed . connect (self .itemChanged )
228
+ table . deleted . connect (self .itemRemoved )
219
229
self .populate ()
220
230
221
231
# load (shared) icon with first instance of table item
@@ -273,23 +283,26 @@ def path(self):
273
283
274
284
275
285
class DBModel (QAbstractItemModel ):
286
+ importVector = pyqtSignal (QgsVectorLayer , Database , QgsDataSourceURI , QModelIndex )
287
+ notPopulated = pyqtSignal (QModelIndex )
276
288
277
289
def __init__ (self , parent = None ):
290
+ global isImportVectorAvail
291
+
278
292
QAbstractItemModel .__init__ (self , parent )
279
293
self .treeView = parent
280
294
self .header = [self .tr ('Databases' )]
281
295
282
- self .isImportVectorAvail = hasattr (qgis .core , 'QgsVectorLayerImport' )
283
- if self .isImportVectorAvail :
284
- self .connect (self , SIGNAL ("importVector" ), self .importVector )
296
+ if isImportVectorAvail :
297
+ self .importVector .connect (self .vectorImport )
285
298
286
299
self .hasSpatialiteSupport = "spatialite" in supportedDbTypes ()
287
300
288
301
self .rootItem = TreeItem (None , None )
289
302
for dbtype in supportedDbTypes ():
290
303
dbpluginclass = createDbPlugin (dbtype )
291
304
item = PluginItem (dbpluginclass , self .rootItem )
292
- self . connect (item , SIGNAL ( "itemChanged" ), self .refreshItem )
305
+ item . itemChanged . connect (self .refreshItem )
293
306
294
307
def refreshItem (self , item ):
295
308
if isinstance (item , TreeItem ):
@@ -360,6 +373,8 @@ def data(self, index, role):
360
373
return retval
361
374
362
375
def flags (self , index ):
376
+ global isImportVectorAvail
377
+
363
378
if not index .isValid ():
364
379
return Qt .NoItemFlags
365
380
@@ -375,7 +390,7 @@ def flags(self, index):
375
390
flags |= Qt .ItemIsDragEnabled
376
391
377
392
# vectors/tables can be dropped on connected databases to be imported
378
- if self . isImportVectorAvail :
393
+ if isImportVectorAvail :
379
394
if isinstance (item , ConnectionItem ) and item .populated :
380
395
flags |= Qt .ItemIsDropEnabled
381
396
@@ -471,10 +486,10 @@ def _refreshIndex(self, index, force=False):
471
486
if prevPopulated or force :
472
487
if item .populate ():
473
488
for child in item .childItems :
474
- self . connect (child , SIGNAL ( "itemChanged" ), self .refreshItem )
489
+ child . itemChanged . connect (self .refreshItem )
475
490
self ._onDataChanged (index )
476
491
else :
477
- self .emit (SIGNAL ( "notPopulated" ), index )
492
+ self .notPopulated . emit (index )
478
493
479
494
except BaseError as e :
480
495
item .populated = False
@@ -486,7 +501,7 @@ def _refreshIndex(self, index, force=False):
486
501
def _onDataChanged (self , indexFrom , indexTo = None ):
487
502
if indexTo is None :
488
503
indexTo = indexFrom
489
- self .emit (SIGNAL ( 'dataChanged(const QModelIndex &, const QModelIndex &)' ), indexFrom , indexTo )
504
+ self .dataChanged . emit (indexFrom , indexTo )
490
505
491
506
QGIS_URI_MIME = "application/x-vnd.qgis.qgis.uri"
492
507
@@ -511,11 +526,13 @@ def mimeData(self, indexes):
511
526
return mimeData
512
527
513
528
def dropMimeData (self , data , action , row , column , parent ):
529
+ global isImportVectorAvail
530
+
514
531
if action == Qt .IgnoreAction :
515
532
return True
516
533
517
534
# vectors/tables to be imported must be dropped on connected db, schema or table
518
- canImportLayer = self . isImportVectorAvail and parent .isValid () and \
535
+ canImportLayer = isImportVectorAvail and parent .isValid () and \
519
536
(isinstance (parent .internalPointer (), (SchemaItem , TableItem )) or
520
537
(isinstance (parent .internalPointer (), ConnectionItem ) and parent .internalPointer ().populated ))
521
538
@@ -538,15 +555,15 @@ def dropMimeData(self, data, action, row, column, parent):
538
555
item = index .internalPointer ()
539
556
540
557
conn_name = QFileInfo (filename ).fileName ()
541
- uri = qgis . core . QgsDataSourceURI ()
558
+ uri = QgsDataSourceURI ()
542
559
uri .setDatabase (filename )
543
560
item .getItemData ().addConnection (conn_name , uri )
544
- item .emit (SIGNAL ( 'itemChanged' ), item )
561
+ item .itemChanged . emit (item )
545
562
added += 1
546
563
continue
547
564
548
565
if canImportLayer :
549
- if qgis . core . QgsRasterLayer .isValidRasterFileName (filename ):
566
+ if QgsRasterLayer .isValidRasterFileName (filename ):
550
567
layerType = 'raster'
551
568
providerKey = 'gdal'
552
569
else :
@@ -558,22 +575,24 @@ def dropMimeData(self, data, action, row, column, parent):
558
575
added += 1
559
576
560
577
if data .hasFormat (self .QGIS_URI_MIME ):
561
- for uri in qgis . core . QgsMimeDataUtils .decodeUriList (data ):
578
+ for uri in QgsMimeDataUtils .decodeUriList (data ):
562
579
if canImportLayer :
563
580
if self .importLayer (uri .layerType , uri .providerKey , uri .name , uri .uri , parent ):
564
581
added += 1
565
582
566
583
return added > 0
567
584
568
585
def importLayer (self , layerType , providerKey , layerName , uriString , parent ):
569
- if not self .isImportVectorAvail :
586
+ global isImportVectorAvail
587
+
588
+ if not isImportVectorAvail :
570
589
return False
571
590
572
591
if layerType == 'raster' :
573
592
return False # not implemented yet
574
- inLayer = qgis . core . QgsRasterLayer (uriString , layerName , providerKey )
593
+ inLayer = QgsRasterLayer (uriString , layerName , providerKey )
575
594
else :
576
- inLayer = qgis . core . QgsVectorLayer (uriString , layerName , providerKey )
595
+ inLayer = QgsVectorLayer (uriString , layerName , providerKey )
577
596
578
597
if not inLayer .isValid ():
579
598
# invalid layer
@@ -602,24 +621,26 @@ def importLayer(self, layerType, providerKey, layerName, uriString, parent):
602
621
603
622
# default pk and geom field name value
604
623
if providerKey in ['postgres' , 'spatialite' ]:
605
- inUri = qgis . core . QgsDataSourceURI (inLayer .source ())
624
+ inUri = QgsDataSourceURI (inLayer .source ())
606
625
pkCol = inUri .keyColumn ()
607
626
geomCol = inUri .geometryColumn ()
608
627
609
628
outUri = outDb .uri ()
610
629
outUri .setDataSource (schema , layerName , geomCol , "" , pkCol )
611
630
612
- self .emit (SIGNAL ( "importVector" ), inLayer , outDb , outUri , toIndex )
631
+ self .importVector . emit (inLayer , outDb , outUri , toIndex )
613
632
return True
614
633
615
634
return False
616
635
617
- def importVector (self , inLayer , outDb , outUri , parent ):
618
- if not self .isImportVectorAvail :
636
+ def vectorImport (self , inLayer , outDb , outUri , parent ):
637
+ global isImportVectorAvail
638
+
639
+ if not isImportVectorAvail :
619
640
return False
620
641
621
642
try :
622
- from dlg_import_vector import DlgImportVector
643
+ from . dlg_import_vector import DlgImportVector
623
644
624
645
dlg = DlgImportVector (inLayer , outDb , outUri )
625
646
QApplication .restoreOverrideCursor ()
0 commit comments