def loadRelations(self): relations = QgsProject.instance().relationManager( ).referencedRelations() newRelationsIds = [relation.id() for relation in relations] # remove actions for relationId in self.mapLayerActions.keys(): if relationId not in newRelationsIds: QgsMapLayerActionRegistry.instance().removeMapLayerAction( self.mapLayerActions[relationId]) del self.mapLayerActions[relationId] # add actions for relation in relations: if relation.id() not in self.mapLayerActions: action = QgsMapLayerAction( "set related feature for %s" % relation.name(), self, relation.referencingLayer(), QgsMapLayerAction.SingleFeature) QgsMapLayerActionRegistry.instance().addMapLayerAction(action) action.triggeredForFeature.connect(self.linkIt) self.mapLayerActions[relation.id()] = action
def add_map_layer_action(self, title: str, relation: QgsRelation, slot, data=None) -> QgsMapLayerAction: def layer_action_triggered(layer: QgsVectorLayer, features: [QgsFeature]): assert layer == relation.referencedLayer() slot(relation, features, data) action = QgsMapLayerAction(title, self.iface.mainWindow(), relation.referencedLayer(), QgsMapLayerAction.MultipleFeatures) if DEBUG: print( 'Adding insert action for relation "{}" in layer "{}"'.format( relation.name(), relation.referencedLayer().name())) QgsGui.instance().mapLayerActionRegistry().addMapLayerAction(action) action.triggeredForFeatures.connect(layer_action_triggered) self.map_layer_actions.append(action)
def testCanRunUsingLayer(self): """ Test that actions correctly indicate when they can run for a layer """ action_all_layers = QgsMapLayerAction('action1', None) self.assertTrue(action_all_layers.canRunUsingLayer(None)) self.assertTrue(action_all_layers.canRunUsingLayer(self.vector_layer)) self.assertTrue(action_all_layers.canRunUsingLayer(self.raster_layer)) action_vector_layers_only = QgsMapLayerAction('action2', None, QgsMapLayer.VectorLayer) self.assertFalse(action_vector_layers_only.canRunUsingLayer(None)) self.assertTrue(action_vector_layers_only.canRunUsingLayer(self.vector_layer)) self.assertFalse(action_vector_layers_only.canRunUsingLayer(self.raster_layer)) action_raster_layers_only = QgsMapLayerAction('action3', None, QgsMapLayer.RasterLayer) self.assertFalse(action_raster_layers_only.canRunUsingLayer(None)) self.assertFalse(action_raster_layers_only.canRunUsingLayer(self.vector_layer)) self.assertTrue(action_raster_layers_only.canRunUsingLayer(self.raster_layer)) action_specific_layer_only = QgsMapLayerAction('action4', None, self.vector_layer) self.assertFalse(action_specific_layer_only.canRunUsingLayer(None)) self.assertTrue(action_specific_layer_only.canRunUsingLayer(self.vector_layer)) self.assertFalse(action_specific_layer_only.canRunUsingLayer(self.vector_layer2)) self.assertFalse(action_specific_layer_only.canRunUsingLayer(self.raster_layer)) action_specific_raster_layer_only = QgsMapLayerAction('action4', None, self.raster_layer) self.assertFalse(action_specific_raster_layer_only.canRunUsingLayer(None)) self.assertFalse(action_specific_raster_layer_only.canRunUsingLayer(self.vector_layer)) self.assertFalse(action_specific_raster_layer_only.canRunUsingLayer(self.vector_layer2)) self.assertTrue(action_specific_raster_layer_only.canRunUsingLayer(self.raster_layer)) action_editable_layer_only = QgsMapLayerAction('action1', None, flags=QgsMapLayerAction.EnabledOnlyWhenEditable) self.assertFalse(action_editable_layer_only.canRunUsingLayer(None)) self.assertFalse(action_editable_layer_only.canRunUsingLayer(self.vector_layer)) self.assertFalse(action_editable_layer_only.canRunUsingLayer(self.vector_layer2)) self.assertFalse(action_editable_layer_only.canRunUsingLayer(self.raster_layer)) self.vector_layer.startEditing() self.assertFalse(action_editable_layer_only.canRunUsingLayer(None)) self.assertTrue(action_editable_layer_only.canRunUsingLayer(self.vector_layer)) self.assertFalse(action_editable_layer_only.canRunUsingLayer(self.vector_layer2)) self.assertFalse(action_editable_layer_only.canRunUsingLayer(self.raster_layer)) self.vector_layer.commitChanges() self.assertFalse(action_editable_layer_only.canRunUsingLayer(None)) self.assertFalse(action_editable_layer_only.canRunUsingLayer(self.vector_layer)) self.assertFalse(action_editable_layer_only.canRunUsingLayer(self.vector_layer2)) self.assertFalse(action_editable_layer_only.canRunUsingLayer(self.raster_layer))