From ddbc7e800fd5238ce26ceb876476738132825da8 Mon Sep 17 00:00:00 2001
From: Benjamin Jakimow <benjamin.jakimow@geo.hu-berlin.de>
Date: Thu, 23 Jul 2020 14:21:13 +0200
Subject: [PATCH] mapvisualization.py - QgsProject saves visibility of time
 series sources

Signed-off-by: Benjamin Jakimow <benjamin.jakimow@geo.hu-berlin.de>
---
 doc/source/changelog.rst               |  6 ++--
 eotimeseriesviewer/main.py             |  1 +
 eotimeseriesviewer/mapvisualization.py |  4 +--
 eotimeseriesviewer/timeseries.py       | 40 +++++++++++++++++++-------
 4 files changed, 37 insertions(+), 14 deletions(-)

diff --git a/doc/source/changelog.rst b/doc/source/changelog.rst
index 666a5211..f75636b7 100644
--- a/doc/source/changelog.rst
+++ b/doc/source/changelog.rst
@@ -1,8 +1,10 @@
 ==============
 Changelog
 ==============
-2020-07-13 (version 1.13):
-    * fixed CRS translation bug
+2020-07-23 (version 1.13):
+    * time series and map settings can be stored to and reloaded from QGIS Projects
+    * refactored layer styling and default raster stretching
+    * fixed CRS translation bug and other smaller bugs
     * quick labels can be used to write date / datetime data into vector fields of type QDate or QDateTime
     * refactored context menus, e.g. in map view layer tree view, fixed `#106 <https://bitbucket.org/jakimowb/eo-time-series-viewer/issues/106>`_
 
diff --git a/eotimeseriesviewer/main.py b/eotimeseriesviewer/main.py
index ed438ab6..b299dac9 100644
--- a/eotimeseriesviewer/main.py
+++ b/eotimeseriesviewer/main.py
@@ -722,6 +722,7 @@ class EOTimeSeriesViewer(QgisInterface, QObject):
                 dt64 = datetime64(mwNode.attribute('mapDate'))
                 if isinstance(dt64, np.datetime64):
                     self.mPostDataLoadingArgs['mapDate'] = dt64
+
             self.timeSeries().sigLoadingTaskFinished.connect(self.onPostDataLoading)
             self.timeSeries().readXml(node)
 
diff --git a/eotimeseriesviewer/mapvisualization.py b/eotimeseriesviewer/mapvisualization.py
index 7fda2507..58ef68d7 100644
--- a/eotimeseriesviewer/mapvisualization.py
+++ b/eotimeseriesviewer/mapvisualization.py
@@ -218,7 +218,7 @@ class MapView(QFrame):
             lyr = mapView.sensorProxyLayer(sensor)
             lyr.setMapLayerStyle(style)
 
-            lyrNode = lyrNode.nextSibling().toElement()
+            lyrNode = lyrNode.nextSiblingElement()
         return mapView
 
     def writeXml(self, node: QDomNode, doc: QDomDocument):
@@ -1330,7 +1330,7 @@ class MapWidget(QFrame):
 
                 self.addMapView(mapView)
 
-            mvNode = mvNode.nextSibling().toElement()
+            mvNode = mvNode.nextSiblingElement()
 
     def usedLayers(self) -> typing.List[QgsMapLayer]:
         layers = set()
diff --git a/eotimeseriesviewer/timeseries.py b/eotimeseriesviewer/timeseries.py
index 5e4f6cbb..0af066f7 100644
--- a/eotimeseriesviewer/timeseries.py
+++ b/eotimeseriesviewer/timeseries.py
@@ -1261,6 +1261,7 @@ class TimeSeriesLoadingTask(QgsTask):
 
     def __init__(self,
                  files: typing.List[str],
+                 visibility: typing.List[bool] = None,
                  description: str = "Load Images",
                  callback=None,
                  progress_interval: int = 3):
@@ -1270,6 +1271,11 @@ class TimeSeriesLoadingTask(QgsTask):
         assert progress_interval >= 1
 
         self.mFiles: typing.List[str] = files
+        if visibility:
+            assert isinstance(visibility, list) and len(visibility) == len(files)
+            self.mVisibility: typing.List[bool] = [b == True for b in visibility]
+        else:
+            self.mVisibility: typing.List[bool] = [True for f in files]
         self.mSources: typing.List[TimeSeriesSource] = []
         self.mProgressInterval = datetime.timedelta(seconds=progress_interval)
         self.mCallback = callback
@@ -1294,6 +1300,7 @@ class TimeSeriesLoadingTask(QgsTask):
                 try:
                     tss = TimeSeriesSource.create(path)
                     assert isinstance(tss, TimeSeriesSource)
+                    tss.setIsVisible(self.mVisibility[i])
                     self.mSources.append(tss)
                     result_block.append(tss)
                     del tss
@@ -1829,13 +1836,17 @@ class TimeSeries(QAbstractItemModel):
         if len(addedDates) > 0:
             self.sigTimeSeriesDatesAdded.emit(addedDates)
 
-    def addSources(self, sources: list, runAsync: bool = None):
+    def addSources(self,
+                   sources: list,
+                   visibility: typing.List[bool] = None,
+                   runAsync: bool = None):
         """
         Adds source images to the TimeSeries
         :param sources: list of source images, e.g. a list of file paths
         :param runAsync: bool
         """
         from eotimeseriesviewer.settings import value, Keys
+
         if runAsync is None:
             runAsync = value(Keys.QgsTaskAsync, True)
 
@@ -1852,6 +1863,7 @@ class TimeSeries(QAbstractItemModel):
                 sourcePaths.append(path)
 
         qgsTask = TimeSeriesLoadingTask(sourcePaths,
+                                        visibility=visibility,
                                         callback=self.onTaskFinished,
                                         )
         # tid = id(qgsTask)
@@ -2151,7 +2163,7 @@ class TimeSeries(QAbstractItemModel):
         :param doc:
         :return:
         """
-        tsNode = doc.createElement('EOTSV_TIMESERIES')
+        tsNode = doc.createElement('TimeSeries')
 
         for sensor in self.sensors():
             sensorNode = doc.createElement('Sensor')
@@ -2159,15 +2171,17 @@ class TimeSeries(QAbstractItemModel):
             tsNode.appendChild(sensorNode)
 
         for tss in self.sources():
-            tssNode = doc.createElement('TIME_SERIES_SOURCE')
+            assert isinstance(tss, TimeSeriesSource)
+            tssNode = doc.createElement('TimeSeriesSource')
+            tssNode.setAttribute('isVisible', str(tss.isVisible()))
             tssNode.appendChild(doc.createTextNode((tss.uri())))
             tsNode.appendChild(tssNode)
         node.appendChild(tsNode)
         return True
 
     def readXml(self, node: QDomNode):
-        if not node.nodeName() == 'EOTSV_TIMESERIES':
-            node = node.firstChildElement('EOTSV_TIMESERIES')
+        if not node.nodeName() == 'TimeSeries':
+            node = node.firstChildElement('TimeSeries')
         if node.isNull():
             return None
 
@@ -2184,17 +2198,23 @@ class TimeSeries(QAbstractItemModel):
                 sensor = self.sensor(sid)
                 if isinstance(sensor, SensorInstrument):
                     sensor.setName(name)
-            sensorNode = sensorNode.nextSibling()
+            sensorNode = sensorNode.nextSiblingElement()
 
-        tssNode = node.firstChildElement('TIME_SERIES_SOURCE')
+        tssNode = node.firstChildElement('TimeSeriesSource')
         to_add = []
-        while tssNode.nodeName() == 'TIME_SERIES_SOURCE':
+        tss_visibility = []
+        while tssNode.nodeName() == 'TimeSeriesSource':
             uri = tssNode.firstChild().nodeValue()
             to_add.append(uri)
-            tssNode = tssNode.nextSibling()
+            if tssNode.hasAttribute('isVisible'):
+                tss_visibility.append(str(tssNode.attribute('isVisible')).lower() in ['1', 'true'])
+            else:
+                tss_visibility.append(True)
+
+            tssNode = tssNode.nextSiblingElement()
 
         if len(to_add) > 0:
-            self.addSources(to_add, runAsync=True)
+            self.addSources(to_add, visibility=tss_visibility, runAsync=True)
 
     def data(self, index, role):
         """
-- 
GitLab