eric7/Preferences/ThemeManager.py

branch
eric7
changeset 8820
149f941d072e
parent 8819
982fb074be98
child 8842
80ce644a6067
--- a/eric7/Preferences/ThemeManager.py	Thu Dec 09 20:07:08 2021 +0100
+++ b/eric7/Preferences/ThemeManager.py	Sat Dec 11 16:04:36 2021 +0100
@@ -15,14 +15,17 @@
 
 from EricWidgets import EricMessageBox, EricFileDialog
 
+import Globals
 import Preferences
 
+from eric7config import getConfig
+
 
 class ThemeManager(QObject):
     """
     Class implementing a manager object for color themes.
     """
-    KeyPatternList = [
+    ColorKeyPatternList = [
         "Diff/.*Color",
         "Editor/Colour/",
         "IRC/.*Colou?r",
@@ -31,7 +34,7 @@
         "Scintilla/.*paper",
         "WebBrowser/.*Colou?r",
     ]
-    KeyList = [
+    ColorKeyList = [
         "Debugger/BgColorChanged",
         "Debugger/BgColorNew",
         "UI/IconBarColor",
@@ -51,16 +54,78 @@
         """
         super().__init__(parent)
     
-    def importTheme(self: "ThemeManager"):
+    def importTheme(self: "ThemeManager") -> bool:
         """
         Public method to import a theme file and set the colors.
-        """
-        # TODO: not yet implemented
         
-        # TODO: add entry for the current QSS file
-        #       - on import save it in the eric configuration directory
-        #         if such file does not exist already
-        #       - on import set stylesheet key to the saved file
+        @return flag indicating a successful import
+        @rtype bool
+        """
+        filename = EricFileDialog.getOpenFileName(
+            None,
+            self.tr("Import Theme"),
+            getConfig("ericThemesDir"),
+            self.tr("eric Theme Files (*.ethj);;All Files(*)")
+        )
+        if filename:
+            try:
+                with open(filename, "r") as f:
+                    jsonString = f.read()
+                themeDict = json.loads(jsonString)
+            except (TypeError, OSError) as err:
+                EricMessageBox.critical(
+                    None,
+                    self.tr("Import Theme"),
+                    self.tr(
+                        "<p>The theme file <b>{0}</b> could not"
+                        " be read.</p><p>Reason: {1}</p>"
+                    ).format(filename, str(err))
+                )
+                return False
+            
+            # step 1: process stylesheet data
+            stylesheetDict = themeDict["stylesheet"]
+            if stylesheetDict["name"]:
+                stylesheetsDir = os.path.join(
+                    Globals.getConfigDir(), "stylesheets")
+                if not os.path.exists(stylesheetsDir):
+                    os.makedirs(stylesheetsDir)
+                stylesheetFile = os.path.join(
+                    stylesheetsDir, stylesheetDict["name"])
+                ok = EricMessageBox.yesNo(
+                    None,
+                    self.tr("Import Theme"),
+                    self.tr(
+                        "The stylesheet file {0} exists already."
+                        " Shall it be overwritten?"
+                    ).format(stylesheetDict["name"])
+                ) if os.path.exists(stylesheetFile) else True
+                if ok:
+                    try:
+                        with open(stylesheetFile, "w") as f:
+                            f.write(stylesheetDict["contents"])
+                    except OSError as err:
+                        EricMessageBox.critical(
+                            None,
+                            self.tr("Import Theme"),
+                            self.tr(
+                                "<p>The stylesheet file <b>{0}</b> could"
+                                " not be written.</p><p>Reason: {1}</p>"
+                            ).format(stylesheetFile, str(err))
+                        )
+                        stylesheetFile = ""
+                Preferences.setUI("StyleSheet", stylesheetFile)
+            
+            # step 2: transfer the color entries
+            settings = Preferences.getSettings()
+            colorsDict = themeDict["colors"]
+            for key, value in colorsDict.items():
+                settings.setValue(key, value)
+            
+            Preferences.syncPreferences()
+            return True
+        
+        return False
     
     def exportTheme(self: "ThemeManager"):
         """
@@ -70,7 +135,7 @@
             None,
             self.tr("Export Theme"),
             os.path.expanduser("~"),
-            self.tr("eric Theme Files (*.ethj);;All Files (*)"),
+            self.tr("eric Theme Files (*.ethj)"),
             "",
             EricFileDialog.DontConfirmOverwrite
         )
@@ -95,10 +160,13 @@
             if ok:
                 # step 1: generate a dictionary with all color settings
                 settings = Preferences.getSettings()
-                keyFilterRe = re.compile("|".join(
-                    ThemeManager.KeyPatternList + ThemeManager.KeyList))
+                colorKeyFilterRe = re.compile("|".join(
+                    ThemeManager.ColorKeyPatternList +
+                    ThemeManager.ColorKeyList
+                ))
                 
-                keys = [k for k in settings.allKeys() if keyFilterRe.match(k)]
+                keys = [k for k in settings.allKeys()
+                        if colorKeyFilterRe.match(k)]
                 colorsDict = {}
                 for key in keys:
                     colorsDict[key] = settings.value(key)
@@ -119,7 +187,7 @@
                             None,
                             self.tr("Export Theme"),
                             self.tr(
-                                "<p>The styleshhet file <b>{0}</b> could not"
+                                "<p>The stylesheet file <b>{0}</b> could not"
                                 " be read.</p><p>Reason: {1}</p>"
                             ).format(stylesheet, str(err))
                         )

eric ide

mercurial