about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorhut <hut@lavabit.com>2013-03-16 19:13:46 +0100
committerhut <hut@lavabit.com>2013-03-16 19:18:25 +0100
commit1f5a29d42745f0ae7c37a96339e8df0185d5f3dd (patch)
treee0b1e7e79959ed0c7d45ed32b53cd6c96931bf5e
parent8a5944e1bd52dd749c34a5b4eda401902531175a (diff)
downloadranger-1f5a29d42745f0ae7c37a96339e8df0185d5f3dd.tar.gz
settings: sanitize in separate signal with higher priority
Some signals may require the sanitized value BEFORE it is actually set
with settings._raw_set. We need to separate sanitizing and _raw_set into
separate signals so other signals can be bound in between those two.
-rw-r--r--ranger/container/settings.py23
1 files changed, 11 insertions, 12 deletions
diff --git a/ranger/container/settings.py b/ranger/container/settings.py
index 2ca77d07..85480d1b 100644
--- a/ranger/container/settings.py
+++ b/ranger/container/settings.py
@@ -72,29 +72,32 @@ class Settings(SignalDispatcher, FileManagerAware):
         self.__dict__['_settings'] = dict()
         for name in ALLOWED_SETTINGS:
             self.signal_bind('setopt.'+name,
+                    self._sanitize, priority=1.0)
+            self.signal_bind('setopt.'+name,
                     self._raw_set_with_signal, priority=0.2)
 
-    def _sanitize(self, name, value):
+    def _sanitize(self, signal):
+        name, value = signal.setting, signal.value
         if name == 'column_ratios':
             # TODO: cover more cases here
             if isinstance(value, tuple):
-                return list(value)
+                signal.value = list(value)
             if not isinstance(value, list) or len(value) < 2:
-                return [1, 1]
+                signal.value = [1, 1]
             else:
-                return [int(i) if str(i).isdigit() else 1 for i in value]
+                signal.value = [int(i) if str(i).isdigit() else 1 \
+                        for i in value]
 
         elif name == 'colorscheme':
-            signal = Signal(value=value, previous="Penis", fm=self.fm)
             _colorscheme_name_to_class(signal)
-            return signal.value
 
         elif name == 'preview_script':
             if isinstance(value, str):
                 result = os.path.expanduser(value)
                 if os.path.exists(result):
-                    return result
-                return None
+                    signal.value = result
+                else:
+                    signal.value = None
 
         elif name == 'use_preview_script':
             if self._settings['preview_script'] is None and value \
@@ -102,9 +105,6 @@ class Settings(SignalDispatcher, FileManagerAware):
                 self.fm.notify("Preview script undefined or not found!",
                         bad=True)
 
-        # fallback:
-        return value
-
     def set(self, name, value, path=None):
         assert name in ALLOWED_SETTINGS, "No such setting: {0}!".format(name)
         if name not in self._settings:
@@ -183,7 +183,6 @@ class Settings(SignalDispatcher, FileManagerAware):
     __setitem__ = __setattr__
 
     def _raw_set(self, name, value, path):
-        value = self._sanitize(name, value)
         if path:
             if not path in self._localsettings:
                 try: