Skip to content
Snippets Groups Projects
labeling.py 39.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • 
            if isinstance(self.mEditor, ClassificationSchemeComboBox):
                cs = self.mEditor.classificationScheme()
                if isinstance(cs, ClassificationScheme) and len(cs) > 0:
                    i = cs.classIndexFromValue(value)
                    self.mEditor.setCurrentIndex(max(i, 0))
            elif isinstance(self.mEditor, QLineEdit):
    
                if value in [QVariant(), None]:
                    self.mEditor.setText(None)
                else:
                    self.mEditor.setText(str(value))
    
    
    class LabelShortcutWidgetFactory(QgsEditorWidgetFactory):
    
        def __init__(self, name:str):
    
            super(LabelShortcutWidgetFactory, self).__init__(name)
    
            self.mConfigurations = {}
    
    
        def configWidget(self, layer:QgsVectorLayer, fieldIdx:int, parent=QWidget)->LabelShortcutEditorConfigWidget:
            """
            Returns a SpectralProfileEditorConfigWidget
            :param layer: QgsVectorLayer
            :param fieldIdx: int
            :param parent: QWidget
            :return: SpectralProfileEditorConfigWidget
            """
    
            w = LabelShortcutEditorConfigWidget(layer, fieldIdx, parent)
            key = self.configKey(layer, fieldIdx)
            w.setConfig(self.readConfig(key))
            w.changed.connect(lambda : self.writeConfig(key, w.config()))
            return w
    
        def configKey(self, layer:QgsVectorLayer, fieldIdx:int):
            """
            Returns a tuple to be used as dictionary key to identify a layer field configuration.
            :param layer: QgsVectorLayer
            :param fieldIdx: int
            :return: (str, int)
            """
            return (layer.id(), fieldIdx)
    
    
        def create(self, layer:QgsVectorLayer, fieldIdx:int, editor:QWidget, parent:QWidget)->LabelShortcutEditorWidgetWrapper:
    
            """
            Create a ClassificationSchemeEditorWidgetWrapper
            :param layer: QgsVectorLayer
            :param fieldIdx: int
            :param editor: QWidget
            :param parent: QWidget
            :return: ClassificationSchemeEditorWidgetWrapper
            """
    
            w = LabelShortcutEditorWidgetWrapper(layer, fieldIdx, editor, parent)
    
            return w
    
        def writeConfig(self, key:tuple, config:dict):
            """
            :param key: tuple (str, int), as created with .configKey(layer, fieldIdx)
            :param config: dict with config values
            """
            self.mConfigurations[key] = config
    
        def readConfig(self, key:tuple):
            """
            :param key: tuple (str, int), as created with .configKey(layer, fieldIdx)
            :return: {}
            """
            if key in self.mConfigurations.keys():
                conf = self.mConfigurations[key]
            else:
                #return the very default configuration
                conf = {}
            return conf
    
        def fieldScore(self, vl:QgsVectorLayer, fieldIdx:int)->int:
            """
            This method allows disabling this editor widget type for a certain field.
            0: not supported: none String fields
            5: maybe support String fields with length <= 400
            20: specialized support: String fields with length > 400
    
            :param vl: QgsVectorLayer
            :param fieldIdx: int
            :return: int
            """
            #log(' fieldScore()')
            if fieldIdx < 0:
                return 0
            field = vl.fields().at(fieldIdx)
            assert isinstance(field, QgsField)
    
            if field.type() in [QVariant.String, QVariant.Int]:
    
                return 5
    
                return 0 # no support
    
        def supportsField(self, vl:QgsVectorLayer, idx:int)->True:
            """
            :param vl: vectorlayers
            :param idx:
            :return: bool
            """
    
            field = vl.fields().at(idx)
            if isinstance(field, QgsField) and field.type() in [QVariant.Int, QVariant.String]:
                return True
            return False
    
    
    
    
    EDITOR_WIDGET_REGISTRY_KEY = 'EOTSV_Labeling'
    labelEditorWidgetFactory = None
    
    def registerLabelShortcutEditorWidget():
    
        reg = QgsGui.editorWidgetRegistry()
        if not EDITOR_WIDGET_REGISTRY_KEY in reg.factories().keys():
    
            labelEditorWidgetFactory = LabelShortcutWidgetFactory(EDITOR_WIDGET_REGISTRY_KEY)
            reg.registerWidget(EDITOR_WIDGET_REGISTRY_KEY, labelEditorWidgetFactory)
    
        else:
            labelEditorWidgetFactory = reg.factories()[EDITOR_WIDGET_REGISTRY_KEY]