Skip to content
Snippets Groups Projects
mimedata.py 4.47 KiB
Newer Older
  • Learn to ignore specific revisions
  • Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
    
    from qgis.core import *
    from qgis.PyQt.QtCore import *
    from qgis.PyQt.QtXml import *
    import re
    from qgis.gui import *
    
    MDF_DOCKTREEMODELDATA = 'application/enmapbox.docktreemodeldata'
    MDF_DOCKTREEMODELDATA_XML = 'dock_tree_model_data'
    
    MDF_DATASOURCETREEMODELDATA = 'application/enmapbox.datasourcetreemodeldata'
    MDF_DATASOURCETREEMODELDATA_XML = 'data_source_tree_model_data'
    
    MDF_LAYERTREEMODELDATA = 'application/qgis.layertreemodeldata'
    MDF_LAYERTREEMODELDATA_XML = 'layer_tree_model_data'
    
    MDF_PYTHON_OBJECTS = 'application/enmapbox/objectreference'
    MDF_SPECTRALPROFILE = 'application/enmapbox/spectralprofile'
    MDF_SPECTRALLIBRARY = 'application/enmapbox/spectrallibrary'
    MDF_URILIST = 'text/uri-list'
    MDF_TEXT_HTML = 'text/html'
    MDF_TEXT_PLAIN = 'text/plain'
    
    
    def attributesd2dict(attributes):
        d = {}
        assert isinstance(attributes, QDomNamedNodeMap)
        for i in range(attributes.count()):
            attribute = attributes.item(i)
            d[attribute.nodeName()] = attribute.nodeValue()
        return d
    
    
    def fromLayerList(mapLayers):
        """
        Converts a list of QgsMapLayers into a QMimeData object
        :param mapLayers: [list-of-QgsMapLayers]
        :return: QMimeData
        """
        for lyr in mapLayers:
            assert isinstance(lyr, QgsMapLayer)
    
        tree = QgsLayerTree()
        mimeData = QMimeData()
    
        urls = []
        for l in mapLayers:
            tree.addLayer(l)
            urls.append(QUrl.fromLocalFile(l.source()))
        doc = QDomDocument()
        context = QgsReadWriteContext()
        node = doc.createElement(MDF_LAYERTREEMODELDATA_XML)
        doc.appendChild(node)
        for c in tree.children():
            c.writeXml(node, context)
    
        mimeData.setData(MDF_LAYERTREEMODELDATA, doc.toByteArray())
    
        return mimeData
    
    
    
    
    def toLayerList(mimeData):
        """
        Extracts a layer-tree-group from a QMimeData
        :param mimeData: QMimeData
        :return: QgsLayerTree
        """
        supported = [MDF_LAYERTREEMODELDATA, MDF_DATASOURCETREEMODELDATA]
        assert isinstance(mimeData, QMimeData)
        newMapLayers = []
        if MDF_LAYERTREEMODELDATA in mimeData.formats():
            doc = QDomDocument()
            doc.setContent(mimeData.data(MDF_LAYERTREEMODELDATA))
            xml = doc.toString()
            node = doc.firstChildElement(MDF_LAYERTREEMODELDATA_XML)
            context = QgsReadWriteContext()
            #context.setPathResolver(QgsProject.instance().pathResolver())
            layerTree = QgsLayerTree.readXml(node, context)
            lt = QgsLayerTreeGroup.readXml(node, context)
            #layerTree.resolveReferences(QgsProject.instance(), True)
            registeredLayers = QgsProject.instance().mapLayers()
    
    
            attributesLUT= {}
            childs = node.childNodes()
    
            for i in range(childs.count()):
                child = childs.at(i).toElement()
                if child.tagName() == 'layer-tree-layer':
                    attributesLUT[child.attribute('id')] = attributesd2dict(child.attributes())
    
            for treeLayer in layerTree.findLayers():
                assert isinstance(treeLayer, QgsLayerTreeLayer)
    
                mapLayer = treeLayer.layer()
                if isinstance(mapLayer, QgsMapLayer):
                    s = ""
                if not isinstance(mapLayer, QgsMapLayer):
                    id = treeLayer.layerId()
                    if id in registeredLayers.keys():
                        mapLayer = registeredLayers[id]
                    elif id in attributesLUT.keys():
                        attributes = attributesLUT[id]
    
                        if attributes['providerKey'] == 'gdal':
                            mapLayer = QgsRasterLayer(attributes['source'])
                        elif attributes['providerKey'] == 'ogr':
                            mapLayer = QgsVectorLayer(attributes['source'])
                        else:
                            s = ""
    
                        if isinstance(mapLayer, QgsMapLayer):
                            mapLayer.setName(attributes['name'])
    
                if isinstance(mapLayer, QgsMapLayer):
                    newMapLayers.append(mapLayer)
        elif MDF_URILIST in mimeData.formats():
           pass
        else:
            s = ""
    
        return newMapLayers
    
    
    def textToByteArray(text):
        """
        Converts input into a QByteArray
        :param text: bytes or str
        :return: QByteArray
        """
    
        if isinstance(text, QDomDocument):
            return textToByteArray(text.toString())
        else:
            data = QByteArray()
            data.append(text)
            return data
    
    def textFromByteArray(data):
        """
        Decodes a QByteArray into a str
        :param data: QByteArray
        :return: str
        """
        assert isinstance(data, QByteArray)
        s = data.data().decode()
        return s