Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsvectorlayerfeaturepool.h 3 : : -------------------------------------- 4 : : Date : 18.9.2018 5 : : Copyright : (C) 2018 by Matthias Kuhn 6 : : email : matthias@opengis.ch 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : 16 : : #include "qgsvectorlayerfeaturepool.h" 17 : : #include "qgsthreadingutils.h" 18 : : 19 : : #include "qgsfeaturerequest.h" 20 : : #include "qgsvectorlayer.h" 21 : : 22 : 0 : QgsVectorLayerFeaturePool::QgsVectorLayerFeaturePool( QgsVectorLayer *layer ) 23 : 0 : : QObject() 24 : 0 : , QgsFeaturePool( layer ) 25 : 0 : { 26 : 0 : connect( layer, &QgsVectorLayer::featureDeleted, this, &QgsVectorLayerFeaturePool::onFeatureDeleted ); 27 : 0 : connect( layer, &QgsVectorLayer::geometryChanged, this, &QgsVectorLayerFeaturePool::onGeometryChanged ); 28 : 0 : } 29 : : 30 : 0 : bool QgsVectorLayerFeaturePool::addFeature( QgsFeature &feature, Flags flags ) 31 : : { 32 : : Q_UNUSED( flags ) 33 : : 34 : 0 : bool res = false; 35 : : 36 : 0 : auto addFeatureSynchronized = [ this, &feature, &res ]() 37 : : { 38 : 0 : QgsVectorLayer *lyr = layer(); 39 : 0 : if ( lyr ) 40 : 0 : res = lyr->addFeature( feature ); 41 : 0 : }; 42 : : 43 : 0 : QgsThreadingUtils::runOnMainThread( addFeatureSynchronized ); 44 : : 45 : 0 : if ( !res ) 46 : 0 : return false; 47 : : 48 : : #if 0 49 : : if ( mSelectedOnly ) 50 : : { 51 : : QgsThreadingUtils::runOnMainThread( [ this, feature ]() 52 : : { 53 : : QgsVectorLayer *lyr = layer(); 54 : : if ( lyr ) 55 : : { 56 : : QgsFeatureIds selectedFeatureIds = lyr->selectedFeatureIds(); 57 : : selectedFeatureIds.insert( feature.id() ); 58 : : lyr->selectByIds( selectedFeatureIds ); 59 : : } 60 : : } ); 61 : : } 62 : : #endif 63 : 0 : insertFeature( feature ); 64 : : 65 : 0 : return res; 66 : 0 : } 67 : : 68 : 0 : bool QgsVectorLayerFeaturePool::addFeatures( QgsFeatureList &features, QgsFeatureSink::Flags flags ) 69 : : { 70 : : Q_UNUSED( flags ) 71 : : 72 : 0 : bool res = false; 73 : : 74 : 0 : auto addFeatureSynchronized = [ this, &features, &res ]() 75 : : { 76 : 0 : QgsVectorLayer *lyr = layer(); 77 : 0 : if ( lyr ) 78 : 0 : res = lyr->addFeatures( features ); 79 : 0 : }; 80 : : 81 : 0 : QgsThreadingUtils::runOnMainThread( addFeatureSynchronized ); 82 : : 83 : 0 : if ( !res ) 84 : 0 : return false; 85 : : 86 : : #if 0 87 : : if ( mSelectedOnly ) 88 : : { 89 : : QgsThreadingUtils::runOnMainThread( [ this, features ]() 90 : : { 91 : : QgsVectorLayer *lyr = layer(); 92 : : if ( lyr ) 93 : : { 94 : : QgsFeatureIds selectedFeatureIds = lyr->selectedFeatureIds(); 95 : : for ( const QgsFeature &feature : std::as_const( features ) ) 96 : : selectedFeatureIds.insert( feature.id() ); 97 : : lyr->selectByIds( selectedFeatureIds ); 98 : : } 99 : : } ); 100 : : } 101 : : #endif 102 : : 103 : 0 : for ( const QgsFeature &feature : std::as_const( features ) ) 104 : 0 : insertFeature( feature ); 105 : : 106 : 0 : return res; 107 : 0 : } 108 : : 109 : 0 : void QgsVectorLayerFeaturePool::updateFeature( QgsFeature &feature ) 110 : : { 111 : 0 : QgsThreadingUtils::runOnMainThread( [this, &feature]() 112 : : { 113 : 0 : QgsVectorLayer *lyr = layer(); 114 : 0 : if ( lyr ) 115 : : { 116 : 0 : lyr->updateFeature( feature ); 117 : 0 : } 118 : 0 : } ); 119 : : 120 : 0 : refreshCache( feature ); 121 : 0 : } 122 : : 123 : 0 : void QgsVectorLayerFeaturePool::deleteFeature( QgsFeatureId fid ) 124 : : { 125 : 0 : removeFeature( fid ); 126 : 0 : QgsThreadingUtils::runOnMainThread( [this, fid]() 127 : : { 128 : 0 : QgsVectorLayer *lyr = layer(); 129 : 0 : if ( lyr ) 130 : : { 131 : 0 : lyr->deleteFeatures( QgsFeatureIds() << fid ); 132 : 0 : } 133 : 0 : } ); 134 : 0 : } 135 : : 136 : 0 : void QgsVectorLayerFeaturePool::onGeometryChanged( QgsFeatureId fid, const QgsGeometry &geometry ) 137 : : { 138 : 0 : Q_UNUSED( geometry ) 139 : : 140 : 0 : if ( isFeatureCached( fid ) ) 141 : : { 142 : 0 : QgsFeature feature; 143 : 0 : getFeature( fid, feature ); 144 : 0 : refreshCache( feature ); 145 : 0 : } 146 : 0 : } 147 : : 148 : 0 : void QgsVectorLayerFeaturePool::onFeatureDeleted( QgsFeatureId fid ) 149 : : { 150 : 0 : deleteFeature( fid ); 151 : 0 : }