Add :reset-config command to reset canto-curses settings
authorJack Miller <jack@codezen.org>
Fri, 17 Oct 2014 18:58:43 +0000 (13:58 -0500)
committerJack Miller <jack@codezen.org>
Fri, 17 Oct 2014 19:32:49 +0000 (14:32 -0500)
canto_curses/config.py
canto_curses/gui.py
canto_curses/guibase.py

index 4f38093..957cf33 100644 (file)
@@ -206,7 +206,7 @@ class CantoCursesConfig(SubThread):
         for i in range(0, 256):
             self.validators["color"][str(i)] = self.validate_color
 
-        self.config = {
+        self.template_config = {
             "browser" :
             {
                 "path" : "firefox",
@@ -445,7 +445,9 @@ class CantoCursesConfig(SubThread):
         }
 
         for i in range(8, 256):
-            self.config["color"][str(i)] = i
+            self.template_config["color"][str(i)] = i
+
+        self.config = eval(repr(self.template_config))
 
         self.tag_validators = {
             "enumerated" : self.validate_bool,
@@ -575,15 +577,6 @@ class CantoCursesConfig(SubThread):
             if type(val[key]) != str:
                 return (False, False)
 
-        # For keys, because we don't want to specify each and every possible
-        # key explicitly, so we merge in default keys. If a user wants to
-        # ignore a default key, he can set it to None and it won't be merged
-        # over.
-
-        for key in list(d.keys()):
-            if key not in val:
-                val[key] = d[key]
-
         return (True, val)
 
     def validate_color(self, val, d, dict_ok=True):
@@ -698,7 +691,7 @@ class CantoCursesConfig(SubThread):
             # are actual changes.
 
             elif type(v[key]) == dict:
-                chgs, dels =  self.validate_config(c[key], d[key], v[key])
+                chgs, dels = self.validate_config(c[key], d[key], v[key])
                 if chgs:
                     changes[key] = chgs
                 if dels:
@@ -711,10 +704,15 @@ class CantoCursesConfig(SubThread):
                 # Value is good, pass on
                 if good:
                     if val != d[key]:
+                        dels = {}
                         if type(val) == list:
                             chgs, dels, = self._list_diff(val, d[key])
-                            if dels:
-                                deletions[key] = dels
+                        elif type(val) == dict and type(d[key]) == dict:
+                            for d_key in d[key].keys():
+                                if d_key not in c[key].keys():
+                                    dels[d_key] = "DELETE"
+                        if dels:
+                            deletions[key] = dels
                         changes[key] = val
                     c[key] = val
 
@@ -732,6 +730,10 @@ class CantoCursesConfig(SubThread):
                     changes[key] = d[key]
                     c[key] = d[key]
 
+        for key in list(d.keys()):
+            if key not in c and key not in v:
+                deletions[key] = "DELETE"
+
         return changes, deletions
 
     # We use strtags to validate tag order, and also to populate the
index aa60b28..4d42955 100644 (file)
@@ -18,6 +18,7 @@ from .config import config
 from .screen import Screen
 
 from threading import Thread, Event
+import traceback
 import logging
 
 log = logging.getLogger("GUI")
@@ -157,6 +158,7 @@ class CantoCursesGui(CommandHandler):
             return r
         except Exception as e:
             log.error("Exception: %s" % e)
+            log.error(traceback.format_exc())
         finally:
             sync_lock.release_write()
 
index 70d388f..e093cf8 100644 (file)
@@ -13,7 +13,7 @@ from canto_next.remote import assign_to_dict, access_dict
 from .command import CommandHandler, register_commands, register_arg_types, unregister_all, _string, register_aliases, commands, command_help
 from .tagcore import tag_updater
 from .parser import prep_for_display
-from .config import needs_eval
+from .config import needs_eval, config
 
 import logging
 
@@ -52,6 +52,7 @@ class GuiBase(CommandHandler):
             "destroy": (self.cmd_destroy, [], "Destroy this %s" % self.get_opt_name()),
             "set" : (self.cmd_set, ["config-option", "string"], "Set configuration options"),
             "set browser.path" : (lambda x : self.cmd_set("browser.path", x), ["executable"], "Set desired browser"),
+            "reset-config" : (self.cmd_reset_config, [], "Reset canto-curses config (won't touch daemon / feed settings)")
         }
 
         help_cmds = {
@@ -435,3 +436,7 @@ class GuiBase(CommandHandler):
             log.error("Full conf: %s" % conf)
         else:
             log.info("%s = %s" % (opt, val))
+
+    def cmd_reset_config(self):
+        log.info("Resetting to defaults")
+        self.callbacks["set_conf"](config.template_config)