From 0e54c3b30af19adb4e35d60e12abff88fc26baa9 Mon Sep 17 00:00:00 2001
From: "Benjamin Jakimow benjamin.jakimow@geo.hu-berlin.de"
 <benjamin.jakimow@geo.hu-berlin.de>
Date: Wed, 22 Jan 2020 10:32:53 +0100
Subject: [PATCH] addresses #103: fixed serialization of QgsTextFormat in EOTSV
 settings

Signed-off-by: Benjamin Jakimow benjamin.jakimow@geo.hu-berlin.de <benjamin.jakimow@geo.hu-berlin.de>
---
 eotimeseriesviewer/settings.py | 23 ++++++++++++++-----
 tests/test_settings.py         | 41 ++++++++++++++++++++++++++++++++++
 2 files changed, 58 insertions(+), 6 deletions(-)

diff --git a/eotimeseriesviewer/settings.py b/eotimeseriesviewer/settings.py
index 15a652c8..7de69363 100644
--- a/eotimeseriesviewer/settings.py
+++ b/eotimeseriesviewer/settings.py
@@ -1,5 +1,5 @@
 
-import os, enum, pathlib, re, json
+import os, enum, pathlib, re, json, pickle
 from collections import namedtuple
 from qgis.core import *
 from qgis.gui import *
@@ -102,8 +102,14 @@ def value(key:Keys, default=None):
         if value == QVariant():
             value = None
 
-        if value and key == Keys.MapTextFormat:
-           s = ""
+        if key == Keys.MapTextFormat:
+            if isinstance(value, QByteArray):
+                doc = QDomDocument()
+                doc.setContent(value)
+                value = QgsTextFormat()
+                value.readXml(doc.documentElement(), QgsReadWriteContext())
+
+
 
         if key == Keys.SensorSpecs:
             # check sensor specs
@@ -130,6 +136,8 @@ def value(key:Keys, default=None):
         value = None
         settings().setValue(key.value, None)
         print(error, file=sys.stderr)
+    except Exception as otherError:
+        s = ""
     return value
 
 
@@ -176,9 +184,13 @@ def setValue(key:Keys, value):
     """
     assert isinstance(key, Keys)
     assert isinstance(key.value, str)
-    if isinstance(value, QgsTextFormat):
-        value = value.toMimeData()
 
+    if isinstance(value, QgsTextFormat):
+        # make QgsTextFormat pickable
+        doc = QDomDocument()
+        doc.appendChild(value.writeXml(doc, QgsReadWriteContext()))
+        value = doc.toByteArray()
+        
     if key == Keys.SensorSpecs:
         s = ""
     #if isinstance(value, dict) and key == Keys.SensorSpecs:
@@ -206,7 +218,6 @@ def values()->dict:
     :rtype: dict
     """
     d = dict()
-    s = settings()
     for key in Keys:
         assert isinstance(key, Keys)
         d[key] = value(key)
diff --git a/tests/test_settings.py b/tests/test_settings.py
index 0d6fc143..e7dfc95b 100644
--- a/tests/test_settings.py
+++ b/tests/test_settings.py
@@ -113,6 +113,47 @@ class testclassSettingsTest(unittest.TestCase):
         if SHOW_GUI:
             QGIS_APP.exec_()
 
+    def test_MapTextFormat(self):
+
+        from qgis.core import QgsTextFormat
+        from qgis.PyQt.Qt import QSettings
+        from qgis.PyQt.QtXml import QDomDocument
+        key = Keys.MapTextFormat
+
+        format1 = defaultValues()[key]
+        self.assertIsInstance(format1, QgsTextFormat)
+        color1 = QColor('yellow')
+        format1.setColor(color1)
+
+        doc = QDomDocument()
+        doc.appendChild(format1.writeXml(doc, QgsReadWriteContext()))
+        docBA = doc.toByteArray()
+        docStr = doc.toString()
+
+        doc2 = QDomDocument()
+        doc2.setContent(docBA)
+        format2 = QgsTextFormat()
+        format2.readXml(doc2.documentElement(), QgsReadWriteContext())
+        color2 = format2.color()
+        self.assertEqual(color1, color2)
+
+        QS = QSettings('TEST')
+        QS.setValue(key.value, doc.toByteArray())
+
+        docBA3 = QS.value(key.value)
+        self.assertIsInstance(docBA3, QByteArray)
+        doc3 = QDomDocument()
+        doc3.setContent(docBA3)
+        format3 = QgsTextFormat()
+        format3.readXml(doc3.documentElement(), QgsReadWriteContext())
+        self.assertEqual(color1, format3.color())
+
+        setValue(key, format1)
+        self.assertEqual(format1.color(), value(key).color())
+
+        s = ""
+
+
     def test_saveAndRestoreSensorNames(self):
 
         from example.Images import Img_2014_01_15_LC82270652014015LGN00_BOA
-- 
GitLab