Skip to content
Snippets Groups Projects
labeling.py 42 KiB
Newer Older
  • Learn to ignore specific revisions
  • 
        def initWidget(self, editor:QWidget):
            #log(' initWidget')
    
    
            #if isinstance(editor, ClassificationSchemeComboBox):
            #    cs = self.configClassificationScheme()
            #    if isinstance(cs, ClassificationScheme):
            #        self.mEditor.setClassificationScheme(cs)
            #        self.mEditor.currentIndexChanged.connect(self.onValueChanged)
    
            #if isinstance(editor, QLineEdit):
            self.mEditor = editor
            self.mEditor.textChanged.connect(self.onValueChanged)
    
    
        def onValueChanged(self, *args):
            self.valueChanged.emit(self.value())
            s = ""
    
        def valid(self, *args, **kwargs)->bool:
    
            """
            Returns True if a valid editor widget exists
            :param args:
            :param kwargs:
            :return: bool
            """
    
            #return isinstance(self.mEditor, (ClassificationSchemeComboBox, QLineEdit))
            return isinstance(self.mEditor, QLineEdit)
    
    
        def value(self, *args, **kwargs):
    
            """
            Reuturns the value
            :param args:
            :param kwargs:
            :return:
            """
    
            typeCode = self.field().type()
    
            txt = self.mEditor.text()
    
            if len(txt) == '':
                return self.defaultValue()
    
            if typeCode == QVariant.String:
                return txt
    
                if typeCode == QVariant.Int:
                    return int(txt)
    
                if typeCode == QVariant.Double:
                    return float(txt)
    
            except Exception as e:
                return txt
    
    
                return self.mLineEdit.text()
    
    
            return self.defaultValue()
    
    
    
        def setEnabled(self, enabled:bool):
    
            if isinstance(self.mEditor, QWidget):
                self.mEditor.setEnabled(enabled)
    
    
        def setValue(self, value):
    
    
            #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 = {}
    
    
            return EDITOR_WIDGET_REGISTRY_KEY
    
        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
    
    
    
    
    class LabelingDock(QgsDockWidget):
        """
        A QgsDockWidget with a LabelingWidget
        """
        def __init__(self, parent=None, canvas=None):
            super(LabelingDock, self).__init__(parent=parent)
    
            self.mLabelingWidget = LabelingWidget(canvas=canvas)
            self.setWindowTitle(self.mLabelingWidget.windowTitle())
            self.setWidget(self.mLabelingWidget)
    
        def labelingWidget(self)->LabelingWidget:
            return self.mLabelingWidget
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
        def canvas(self)->QgsMapCanvas:
            """
            Returns the QgsMapCanvase
            :return:
            """
            return self.mLabelingWidget.canvas()
    
    
    EDITOR_WIDGET_REGISTRY_KEY = 'EOTSV_Quick Label'
    
    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]