Skip to content
Snippets Groups Projects
mapvisualization.py 64.1 KiB
Newer Older
  • Learn to ignore specific revisions
  •     def registerMapCanvas(self, mapView, mapCanvas):
    
            from timeseriesviewer.mapcanvas import MapCanvas
            assert isinstance(mapCanvas, MapCanvas)
    
            assert isinstance(mapView, MapView)
    
            self.mapCanvases[mapView] = mapCanvas
    
    
    
            mapView.sigTitleChanged[unicode].connect(lambda title : mapCanvas.setSaveFileName('{}_{}'.format(self.TSD.date, title)))
    
            mapCanvas.layerModel().setRasterLayerSources([self.TSD.pathImg])
    
    
            self.ui.layout().insertWidget(self.wOffset + len(self.mapCanvases), mapCanvas)
    
            self.ui.update()
    
            #register signals handled on (this) DV level
            mapCanvas.renderStarting.connect(lambda: self.sigLoadingStarted.emit(mapView, self.TSD))
            mapCanvas.mapCanvasRefreshed.connect(lambda: self.sigLoadingFinished.emit(mapView, self.TSD))
    
            mapCanvas.sigShowProfiles.connect(lambda c, t : mapView.sigShowProfiles.emit(c,mapCanvas, t))
    
            mapCanvas.sigChangeDVRequest.connect(self.onMapCanvasRequest)
    
        def onMapCanvasRequest(self, mapCanvas, key):
    
            if key == 'hide_date':
                self.TSD.setVisibility(False)
    
            if key == 'copy_sensor':
                QApplication.clipboard().setText(self.TSD.sensor.name())
            if key == 'copy_date':
                QApplication.clipboard().setText(str(self.TSD.date))
            if key == 'copy_path':
                QApplication.clipboard().setText(str(self.TSD.pathImg))
    
        def __lt__(self, other):
            assert isinstance(other, DatumView)
            return self.TSD < other.TSD
    
            assert isinstance(other, DatumView)
            return self.TSD == other.TSD
    
        sigLoadingStarted = pyqtSignal(DatumView, MapView)
        sigLoadingFinished = pyqtSignal(DatumView, MapView)
    
        sigShowProfiles = pyqtSignal(SpatialPoint, MapCanvas, str)
    
        sigShowMapLayerInfo = pyqtSignal(dict)
        sigSpatialExtentChanged = pyqtSignal(SpatialExtent)
    
        sigMapSizeChanged = pyqtSignal(QSize)
    
        sigCRSChanged = pyqtSignal(QgsCoordinateReferenceSystem)
    
        sigActivateMapTool = pyqtSignal(str)
    
    
        def __init__(self, timeSeriesViewer):
            super(SpatialTemporalVisualization, self).__init__()
    
            #assert isinstance(timeSeriesViewer, TimeSeriesViewer), timeSeriesViewer
    
            self.mBlockCanvasSignals = False
    
            self.mSpatialExtent = SpatialExtent.world()
    
            self.mCRS = self.mSpatialExtent.crs()
            self.mSize = QSize(200,200)
            self.mColor = Qt.black
    
            self.mMapCanvases = []
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
    
            #map-tool handling
            self.mMapToolActivator = None
            self.mMapTools = []
    
            assert isinstance(self.scrollArea, MapViewScrollArea)
    
    
    
            self.mRefreshTimer = QTimer(self)
            self.mRefreshTimer.setInterval(1000)
            self.mRefreshTimer.timeout.connect(self.refresh)
    
            self.scrollArea.sigResized.connect(self.mRefreshTimer.start)
            self.scrollArea.horizontalScrollBar().valueChanged.connect(self.mRefreshTimer.start)
    
            self.TSV = timeSeriesViewer
            self.TS = timeSeriesViewer.TS
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
            self.ui.dockMapViews.setTimeSeries(self.TS)
    
            self.targetLayout = self.ui.scrollAreaSubsetContent.layout()
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
            #self.MVC = MapViewCollection(self)
            #self.MVC.sigShowProfiles.connect(self.sigShowProfiles.emit)
    
            self.MVC = self.ui.dockMapViews
    
    benjamin.jakimow@geo.hu-berlin.de's avatar
    benjamin.jakimow@geo.hu-berlin.de committed
            assert isinstance(self.MVC, MapViewCollectionDock)
    
            self.MVC.sigShowProfiles.connect(self.sigShowProfiles.emit)
    
            self.vectorOverlay = None
    
    
            self.DVC = DateViewCollection(self)
    
            self.DVC.sigResizeRequired.connect(self.adjustScrollArea)
            self.DVC.sigLoadingStarted.connect(self.ui.dockRendering.addStartedWork)
            self.DVC.sigLoadingFinished.connect(self.ui.dockRendering.addFinishedWork)
            #self.timeSeriesDateViewCollection.sigSpatialExtentChanged.connect(self.setSpatialExtent)
            self.TS.sigTimeSeriesDatesAdded.connect(self.DVC.addDates)
            self.TS.sigTimeSeriesDatesRemoved.connect(self.DVC.removeDates)
    
            self.DVC.addDates(self.TS[:])
    
            if len(self.TS) > 0:
                self.setSpatialExtent(self.TS.getMaxSpatialExtent())
    
            #self.setSubsetSize(QSize(100,50))
    
        def registerMapCanvas(self, mapCanvas):
            from timeseriesviewer.mapcanvas import MapCanvas
            assert isinstance(mapCanvas, MapCanvas)
    
    
            self.mMapCanvases.append(mapCanvas)
    
            #set general canvas properties
            mapCanvas.setFixedSize(self.mSize)
            mapCanvas.setCrs(self.mCRS)
            mapCanvas.setSpatialExtent(self.mSpatialExtent)
    
    
            #register on map canvas signals
            mapCanvas.sigSpatialExtentChanged.connect(lambda e: self.setSpatialExtent(e, mapCanvas))
    
    
    
    
            from timeseriesviewer.mapcanvas import MapCanvas
            for mapCanvas in self.mMapCanvases:
                assert isinstance(mapCanvas, MapCanvas)
                mapCanvas.setCrosshairStyle(crosshairStyle)
    
            #self.MVC.setCrosshairStyle(crosshairStyle)
    
    
        def setShowCrosshair(self, b):
            self.MVC.setShowCrosshair(b)
    
        def setVectorLayer(self, lyr):
            self.MVC.setVectorLayer(lyr)
    
    
    
    
        def setMapSize(self, size):
    
            self.mSize = size
    
            from timeseriesviewer.mapcanvas import MapCanvas
            for mapCanvas in self.mMapCanvases:
                assert isinstance(mapCanvas, MapCanvas)
                mapCanvas.setFixedSize(size)
    
            self.sigMapSizeChanged.emit(self.mSize)
    
        def subsetSize(self):
            return QSize(self.mSize)
    
    
            #print('STV REFRESH')
    
            for tsdView in self.DVC:
    
            self.mRefreshTimer.stop()
    
    
        def adjustScrollArea(self):
            #adjust scroll area widget to fit all visible widgets
            m = self.targetLayout.contentsMargins()
    
            nX = len(self.DVC)
    
            tsdViews = [v for v in self.DVC if v.ui.isVisible()]
    
            mapViews = [v for v in self.MVC if v.isVisible()]
            nX = len(tsdViews)
            nY = len(mapViews)
    
            spacing = self.targetLayout.spacing()
            margins = self.targetLayout.contentsMargins()
    
            sizeX = 1
            sizeY = 50
            if nX > 0:
                s = tsdViews[0].ui.sizeHint().width()
                s = nX * (s + spacing) + margins.left() + margins.right()
                sizeX = s
            if nY > 0:
                if nX > 0:
                    s = tsdViews[0].ui.sizeHint().height()
                    s = s + margins.top() + margins.bottom()
                else:
                    s = 50
                sizeY = s
    
                #s = tsdViews[0].ui.sizeHint()
                #s = QSize(nX * (s.width() + spacing) + margins.left() + margins.right(),
                #          s.height() + margins.top() + margins.bottom())
    
            self.targetLayout.parentWidget().setFixedSize(QSize(sizeX, sizeY))
    
        def setMapTool(self, mapToolKey, *args, **kwds):
            # filter map tools
            self.mMapToolActivator = self.sender()
            del self.mMapTools[:]
    
            from timeseriesviewer.mapcanvas import MapTools, CursorLocationMapTool, SpectralProfileMapTool, TemporalProfileMapTool
            for canvas in self.mMapCanvases:
                mt = None
                if mapToolKey in MapTools.mapToolKeys():
                    mt = MapTools.create(mapToolKey, canvas, *args, **kwds)
    
                if isinstance(mapToolKey, QgsMapTool):
                    mt = MapTools.copy(mapToolKey, canvas, *args, **kwds)
    
                if isinstance(mt, QgsMapTool):
                    canvas.setMapTool(mt)
                    self.mMapTools.append(mt)
    
                    #if required, link map-tool with specific EnMAP-Box slots
                    if isinstance(mt, CursorLocationMapTool):
                        mt.sigLocationRequest[SpatialPoint, QgsMapCanvas].connect(lambda c, m : self.sigShowProfiles.emit(c,m, mapToolKey))
    
            return self.mMapTools
    
        def setSpatialCenter(self, center, mapCanvas0=None):
            if self.mBlockCanvasSignals:
                return True
    
            assert isinstance(center, SpatialPoint)
            center = center.toCrs(self.mCRS)
            if not isinstance(center, SpatialPoint):
                return
    
            self.mBlockCanvasSignals = True
            self.mSpatialExtent.setCenter(center)
            for mapCanvas in self.mMapCanvases:
                if mapCanvas != mapCanvas0:
                    oldState = mapCanvas.blockSignals(True)
                    mapCanvas.setCenter(center)
                    mapCanvas.blockSignals(oldState)
            self.mBlockCanvasSignals = False
    
            self.sigSpatialExtentChanged.emit(self.mSpatialExtent)
    
    
    
        def setSpatialExtent(self, extent, mapCanvas0=None):
            if self.mBlockCanvasSignals:
                return True
    
            assert isinstance(extent, SpatialExtent)
            extent = extent.toCrs(self.mCRS)
            if not isinstance(extent, SpatialExtent) \
                or extent.isEmpty() or not extent.isFinite() \
                or extent.width() <= 0 \
                or extent.height() <= 0 \
                or extent == self.mSpatialExtent:
    
    
            self.mBlockCanvasSignals = True
            self.mSpatialExtent = extent
            for mapCanvas in self.mMapCanvases:
                if mapCanvas != mapCanvas0:
                    oldState = mapCanvas.blockSignals(True)
                    mapCanvas.setExtent(extent)
                    mapCanvas.blockSignals(oldState)
    
            self.mBlockCanvasSignals = False
    
            #for mapCanvas in self.mMapCanvases:
            #    mapCanvas.refresh()
    
            self.mRefreshTimer.start()
    
            self.sigSpatialExtentChanged.emit(extent)
    
        def setBackgroundColor(self, color):
            assert isinstance(color, QColor)
            self.mColor = color
    
            for mapCanvas in self.mMapCanvases:
                assert isinstance(mapCanvas, MapCanvas)
                mapCanvas.setCanvasColor(color)
                mapCanvas.refresh()
    
    
        def backgroundColor(self):
            return self.mColor
    
    
        def mapCanvasIterator(self):
            return self.mMapCanvases[:]
    
        def setCrs(self, crs):
            assert isinstance(crs, QgsCoordinateReferenceSystem)
    
    
            if self.mCRS != crs:
    
                from timeseriesviewer.utils import saveTransform
                if saveTransform(self.mSpatialExtent, self.mCRS, crs):
                    self.mCRS = crs
                    for mapCanvas in self.mapCanvasIterator():
    
                        #print(('STV set CRS {} {}', str(mapCanvas), self.mCRS.description()))
    
                        mapCanvas.setCrs(crs)
                else:
                    pass
    
                self.sigCRSChanged.emit(self.mCRS)
    
    
    
        def crs(self):
    
    
    
        def navigateToTSD(self, TSD):
            assert isinstance(TSD, TimeSeriesDatum)
            #get widget related to TSD
    
            tsdv = self.DVC.tsdView(TSD)
    
            assert isinstance(self.scrollArea, QScrollArea)
            self.scrollArea.ensureWidgetVisible(tsdv.ui)
    
    
    class DateViewCollection(QObject):
    
    
        sigResizeRequired = pyqtSignal()
        sigLoadingStarted = pyqtSignal(MapView, TimeSeriesDatum)
        sigLoadingFinished = pyqtSignal(MapView, TimeSeriesDatum)
    
        sigShowProfiles = pyqtSignal(SpatialPoint)
        sigSpatialExtentChanged = pyqtSignal(SpatialExtent)
    
    
        def __init__(self, STViz):
            assert isinstance(STViz, SpatialTemporalVisualization)
    
            super(DateViewCollection, self).__init__()
    
            self.STV = STViz
            self.ui = self.STV.targetLayout.parentWidget()
    
            self.scrollArea = self.ui.parentWidget().parentWidget()
            #potentially there are many more dates than views.
            #therefore we implement the addinng/removing of mapviews here
            #we reduce the number of layout refresh calls by
            #suspending signals, adding the new map view canvases, and sending sigResizeRequired
    
    
            self.STV.MVC.sigMapViewAdded.connect(self.addMapView)
            self.STV.MVC.sigMapViewRemoved.connect(self.removeMapView)
    
        def tsdFromMapCanvas(self, mapCanvas):
            assert isinstance(mapCanvas, MapCanvas)
            for view in self.views:
                assert isinstance(view, DatumView)
                if mapCanvas in view.mapCanvases.values():
                    return view.TSD
            return None
    
    
        def tsdView(self, tsd):
            r = [v for v in self.views if v.TSD == tsd]
            if len(r) == 1:
                return r[0]
            else:
                raise Exception('TSD not in list')
    
        def addMapView(self, mapView):
            assert isinstance(mapView, MapView)
            w = self.ui
            w.setUpdatesEnabled(False)
            for tsdv in self.views:
                tsdv.ui.setUpdatesEnabled(False)
    
            for tsdv in self.views:
                tsdv.insertMapView(mapView)
    
            for tsdv in self.views:
                tsdv.ui.setUpdatesEnabled(True)
    
    
            #mapView.sigSensorRendererChanged.connect(lambda *args : self.setRasterRenderer(mapView, *args))
    
    benjamin.jakimow@geo.hu-berlin.de's avatar
    benjamin.jakimow@geo.hu-berlin.de committed
            mapView.sigMapViewVisibility.connect(lambda: self.sigResizeRequired.emit())
    
            mapView.sigShowProfiles.connect(self.sigShowProfiles.emit)
    
            self.sigResizeRequired.emit()
    
        def removeMapView(self, mapView):
            assert isinstance(mapView, MapView)
            for tsdv in self.views:
                tsdv.removeMapView(mapView)
            self.sigResizeRequired.emit()
    
    
    
        def highlightDate(self, tsd):
            """
            Highlights a time series data for a specific time our
            :param tsd:
            :return:
            """
            tsdView = self.tsdView(tsd)
            if isinstance(tsdView, DatumView):
                tsdView.setHighlight(True)
    
    
        def setFocusView(self, tsd):
            self.focusView = tsd
    
        def orderedViews(self):
            #returns the
            if self.focusView is not None:
    
                assert isinstance(self.focusView, DatumView)
    
                return sorted(self.views,key=lambda v: np.abs(v.TSD.date - self.focusView.TSD.date))
            else:
                return self.views
    
    
        def setSubsetSize(self, size):
            assert isinstance(size, QSize)
            self.subsetSize = size
    
            for tsdView in self.orderedViews():
                tsdView.blockSignals(True)
    
            for tsdView in self.orderedViews():
                tsdView.setSubsetSize(size)
    
            for tsdView in self.orderedViews():
                tsdView.blockSignals(False)
    
    
    
        def addDates(self, tsdList):
            """
            Create a new TSDView
            :param tsdList:
            :return:
            """
            for tsd in tsdList:
                assert isinstance(tsd, TimeSeriesDatum)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
                DV = DatumView(tsd, self.STV, parent=self.ui)
    
                #tsdView.setSubsetSize(self.subsetSize)
    
                DV.sigLoadingStarted.connect(self.sigLoadingStarted.emit)
                DV.sigLoadingFinished.connect(self.sigLoadingFinished.emit)
                DV.sigVisibilityChanged.connect(lambda: self.STV.adjustScrollArea())
    
                for i, mapView in enumerate(self.STV.MVC):
                    DV.insertMapView(mapView)
    
                bisect.insort(self.views, DV)
                i = self.views.index(DV)
    
                DV.ui.setParent(self.STV.targetLayout.parentWidget())
                self.STV.targetLayout.insertWidget(i, DV.ui)
                DV.ui.show()
    
    
            if len(tsdList) > 0:
                self.sigResizeRequired.emit()
    
        def removeDates(self, tsdList):
            toRemove = [v for v in self.views if v.TSD in tsdList]
            removedDates = []
    
            for DV in toRemove:
                self.views.remove(DV)
    
    
                for mapCanvas in DV.mapCanvases.values():
                    toRemove = mapCanvas.layers()
                    mapCanvas.setLayers([])
                    toRemove = [l for l in toRemove if isinstance(l, QgsRasterLayer)]
                    if len(toRemove) > 0:
    
                        QgsProject.instance().removeMapLayers(toRemove)
    
                DV.ui.parent().layout().removeWidget(DV.ui)
                DV.ui.hide()
                DV.ui.close()
                removedDates.append(DV.TSD)
                del DV
    
    
            if len(removedDates) > 0:
                self.sigResizeRequired.emit()
    
        def __len__(self):
            return len(self.views)
    
        def __iter__(self):
            return iter(self.views)
    
        def __getitem__(self, slice):
            return self.views[slice]
    
        def __delitem__(self, slice):
            self.removeDates(self.views[slice])
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
    class MapViewListModel(QAbstractListModel):
        """
        A model to keep a list of map views.
    
        """
        sigMapViewsAdded = pyqtSignal(list)
        sigMapViewsRemoved = pyqtSignal(list)
    
        def __init__(self, parent=None):
            super(MapViewListModel, self).__init__(parent)
            self.mMapViewList = []
    
    
        def addMapView(self, mapView):
            i = len(self.mMapViewList)
            self.insertMapView(i, mapView)
    
        def insertMapView(self, i, mapView):
            self.insertMapViews(i, [mapView])
    
        def insertMapViews(self, i, mapViews):
            assert isinstance(mapViews, list)
            assert i >= 0 and i <= len(self.mMapViewList)
    
            self.beginInsertRows(QModelIndex(), i, i + len(mapViews) - 1)
    
            for j in range(len(mapViews)):
                mapView = mapViews[j]
                assert isinstance(mapView, MapView)
                mapView.sigTitleChanged.connect(
                    lambda : self.doRefresh([mapView])
                )
                self.mMapViewList.insert(i + j, mapView)
            self.endInsertRows()
            self.sigMapViewsAdded.emit(mapViews)
    
    
        def doRefresh(self, mapViews):
            for mapView in mapViews:
                idx = self.mapView2idx(mapView)
                self.dataChanged.emit(idx, idx)
    
        def removeMapView(self, mapView):
            self.removeMapViews([mapView])
    
        def removeMapViews(self, mapViews):
            assert isinstance(mapViews, list)
            for mv in mapViews:
                assert mv in self.mMapViewList
                idx = self.mapView2idx(mv)
                self.beginRemoveRows(idx.parent(), idx.row(), idx.row())
                self.mMapViewList.remove(mv)
                self.endRemoveRows()
            self.sigMapViewsRemoved.emit(mapViews)
    
        def rowCount(self, parent=None, *args, **kwargs):
            return len(self.mMapViewList)
    
        def columnCount(self, QModelIndex_parent=None, *args, **kwargs):
            return 1
    
    
        def idx2MapView(self, index):
            if isinstance(index, QModelIndex):
                if index.isValid():
                    index = index.row()
                else:
                    return None
            assert index >= 0 and index < len(self.mMapViewList)
            return self.mMapViewList[index]
    
    
        def mapView2idx(self, mapView):
            assert isinstance(mapView, MapView)
            row = self.mMapViewList.index(mapView)
            return self.createIndex(row, 0, mapView)
    
        def __len__(self):
            return len(self.mMapViewList)
    
        def __iter__(self):
            return iter(self.mMapViewList)
    
    
        def __getitem__(self, slice):
            return self.mMapViewList[slice]
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
        def data(self, index, role=Qt.DisplayRole):
            if not index.isValid():
                return None
    
            if (index.row() >= len(self.mMapViewList)) or (index.row() < 0):
                return None
    
            mapView = self.idx2MapView(index)
            assert isinstance(mapView, MapView)
    
            value = None
    
            if role == Qt.DisplayRole:
                value = '{} {}'.format(index.row() +1 , mapView.title())
            #if role == Qt.DecorationRole:
                #value = classInfo.icon(QSize(20,20))
            if role == Qt.UserRole:
                value = mapView
            return value
    
    class MapViewCollectionDock(QgsDockWidget, loadUI('mapviewdock.ui')):
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
        sigMapViewAdded = pyqtSignal(MapView)
        sigMapViewRemoved = pyqtSignal(MapView)
    
        sigShowProfiles = pyqtSignal(SpatialPoint, MapCanvas, str)
    
        def setTimeSeries(self, timeSeries):
    
            assert isinstance(timeSeries, TimeSeries)
            self.TS = timeSeries
            self.TS.sigSensorAdded.connect(self.addSensor)
            self.TS.sigSensorRemoved.connect(self.removeSensor)
    
    
        def __init__(self, parent=None):
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
            super(MapViewCollectionDock, self).__init__(parent)
    
            self.setupUi(self)
    
    
            self.mMapViews = MapViewListModel()
    
            self.baseTitle = self.windowTitle()
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
            self.btnAddMapView.setDefaultAction(self.actionAddMapView)
    
            self.btnRemoveMapView.setDefaultAction(self.actionRemoveMapView)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
            self.btnRefresh.setDefaultAction(self.actionApplyStyles)
    
            self.btnHighlightMapView.setDefaultAction(self.actionHighlightMapView)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
            self.actionAddMapView.triggered.connect(self.createMapView)
    
            self.actionRemoveMapView.triggered.connect(lambda : self.removeMapView(self.currentMapView()) if self.currentMapView() else None)
            self.actionHighlightMapView.triggered.connect(lambda : self.currentMapView().setHighlighted(True) if self.currentMapView() else None)
            self.actionApplyStyles.triggered.connect(self.refreshCurrentMapView)
            #self.actionApplyStyles.triggered.connect(self.dummySlot)
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
            self.mMapViews.sigMapViewsRemoved.connect(self.onMapViewsRemoved)
            self.mMapViews.sigMapViewsAdded.connect(self.onMapViewsAdded)
    
            self.mMapViews.sigMapViewsAdded.connect(self.updateButtons)
            self.mMapViews.sigMapViewsRemoved.connect(self.updateButtons)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
            self.cbMapView.setModel(self.mMapViews)
    
    benjamin.jakimow@geo.hu-berlin.de's avatar
    benjamin.jakimow@geo.hu-berlin.de committed
            self.cbMapView.currentIndexChanged[int].connect(lambda i : None if i < 0 else self.setCurrentMapView(self.mMapViews.idx2MapView(i)) )
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
            self.TS = None
    
    
    
        def refreshCurrentMapView(self, *args):
            mv = self.currentMapView()
            if isinstance(mv, MapView):
                mv.refreshMapView()
            else:
                s  =""
        def dummySlot(self):
            s  =""
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
        def onMapViewsRemoved(self, mapViews):
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
            for mapView in mapViews:
                idx = self.stackedWidget.indexOf(mapView.ui)
                if idx >= 0:
                    self.stackedWidget.removeWidget(mapView.ui)
                    mapView.ui.close()
                else:
                    s = ""
    
    
            self.actionRemoveMapView.setEnabled(len(self.mMapViews) > 0)
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
        def onMapViewsAdded(self, mapViews):
            nextShown = None
            for mapView in mapViews:
                self.stackedWidget.addWidget(mapView.ui)
                if nextShown is None:
                    nextShown = mapView
    
                contents = mapView.ui.scrollAreaWidgetContents
                size = contents.size()
                hint = contents.sizeHint()
                #mapView.ui.scrollArea.update()
                s = ""
                #setMinimumSize(mapView.ui.scrollAreaWidgetContents.sizeHint())
                #hint = contents.sizeHint()
                #contents.setMinimumSize(hint)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
            if isinstance(nextShown, MapView):
                self.setCurrentMapView(nextShown)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
    
        def updateButtons(self, *args):
            b = len(self.mMapViews) > 0
            self.actionRemoveMapView.setEnabled(b)
            self.actionApplyStyles.setEnabled(b)
            self.actionHighlightMapView.setEnabled(b)
    
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
        def createMapView(self):
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
            mapView = MapView(self)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
            n = len(self.mMapViews) + 1
            title = 'Map View {}'.format(n)
            while title in [m.title() for m in self.mMapViews]:
                n += 1
                title = 'Map View {}'.format(n)
            mapView.setTitle(title)
    
            mapView.sigShowProfiles.connect(self.sigShowProfiles)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
            self.mMapViews.addMapView(mapView)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
            self.sigMapViewAdded.emit(mapView)
    
    benjamin.jakimow@geo.hu-berlin.de's avatar
    benjamin.jakimow@geo.hu-berlin.de committed
            return mapView
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
        def updateFromMapView(self, mapView):
            assert isinstance(mapView, MapView)
            self.btnToggleMapViewVisibility.setChecked(mapView)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
        def removeMapView(self, mapView):
    
            if isinstance(mapView, MapView):
                assert mapView in self.mMapViews
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
    
                i = self.mMapViews.mapView2idx(mapView)
                if not i == self.stackedWidget.indexOf(mapView.ui):
                    s = ""
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
    
                self.mMapViews.removeMapView(mapView)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
    
                self.sigMapViewRemoved.emit(mapView)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
        def __len__(self):
            return len(self.mMapViews)
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
        def __iter__(self):
            return iter(self.mMapViews)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
    
        def __getitem__(self, slice):
            return self.mMapViews[slice]
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
        def __contains__(self, mapView):
            return mapView in self.mMapViews
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
        def index(self, mapView):
            assert isinstance(mapView, MapView)
            return self.mMapViews.index(mapView)
    
        def setVectorLayer(self, lyr):
            for mapView in self.mMapViews:
                assert isinstance(mapView, MapView)
                mapView.setVectorLayer(lyr)
    
        def addSensor(self, sensor):
            for mapView in self.mMapViews:
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
        def removeSensor(self, sensor):
            for mapView in self.mMapViews:
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
        def applyStyles(self):
            for mapView in self.mMapViews:
                mapView.applyStyles()
    
        def setCrosshairStyle(self, crosshairStyle):
            for mapView in self.mMapViews:
                mapView.setCrosshairStyle(crosshairStyle)
    
        def setShowCrosshair(self, b):
            for mapView in self.mMapViews:
                mapView.setShowCrosshair(b)
    
        def index(self, mapView):
            assert isinstance(mapView, MapView)
            return self.mapViewsDefinitions.index(mapView)
    
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
        def setCurrentMapView(self, mapView):
            assert isinstance(mapView, MapView) and mapView in self.mMapViews
            idx = self.stackedWidget.indexOf(mapView.ui)
            if idx >= 0:
                self.stackedWidget.setCurrentIndex(idx)
                self.cbMapView.setCurrentIndex(self.mMapViews.mapView2idx(mapView).row())
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
        def currentMapView(self):
    
            if len(self.mMapViews) == 0:
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
                return None
            else:
                i = self.cbMapView.currentIndex()
    
                if i >= 0:
                    return self.mMapViews.idx2MapView(i)
                else:
                    return None
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    """
    
    class MapViewDockUI(QgsDockWidget, loadUi('mapviewdock.ui')):
    
        def __init__(self, parent=None):
            super(MapViewDockUI, self).__init__(parent)
            self.setupUi(self)
    
            self.baseTitle = self.windowTitle()
            self.btnApplyStyles.setDefaultAction(self.actionApplyStyles)
    
            #self.dockLocationChanged.connect(self.adjustLayouts)
    
    
        def toggleLayout(self, p):
            newLayout = None
            l = p.layout()
            print('toggle layout {}'.format(str(p.objectName())))
            tmp = QWidget()
            tmp.setLayout(l)
            sMax = p.maximumSize()
            sMax.transpose()
            sMin = p.minimumSize()
            sMin.transpose()
            p.setMaximumSize(sMax)
            p.setMinimumSize(sMin)
            if isinstance(l, QVBoxLayout):
                newLayout = QHBoxLayout()
            else:
                newLayout = QVBoxLayout()
            print(l, '->', newLayout)
    
            while l.count() > 0:
                item = l.itemAt(0)
                l.removeItem(item)
    
                newLayout.addItem(item)
    
    
            p.setLayout(newLayout)
            return newLayout
    
        def adjustLayouts(self, area):
            return
            lOld = self.scrollAreaMapsViewDockContent.layout()
            if area in [Qt.LeftDockWidgetArea, Qt.RightDockWidgetArea] \
                and isinstance(lOld, QVBoxLayout) or \
            area in [Qt.TopDockWidgetArea, Qt.BottomDockWidgetArea] \
                            and isinstance(lOld, QHBoxLayout):
    
                #self.toogleLayout(self.scrollAreaMapsViewDockContent)
                self.toggleLayout(self.BVButtonList)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    """