예제 #1
0
 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)
예제 #3
0
    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))