--- 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)) )