[meld] Remember state filtering preferences in DirDiff



commit 0ab828124597a143289d033d69cf9bac01c319d3
Author: Kai Willadsen <kai willadsen gmail com>
Date:   Sat Dec 31 11:40:39 2011 +1000

    Remember state filtering preferences in DirDiff
    
    This patch also includes the necessary hackery to get our preferences
    shim to read and write lists of strings from GConf.

 meld/dirdiff.py     |   49 +++++++++++++++++++++++++++----------------------
 meld/preferences.py |    4 +++-
 meld/util/prefs.py  |   42 +++++++++++++++++++++++++++++-------------
 3 files changed, 59 insertions(+), 36 deletions(-)
---
diff --git a/meld/dirdiff.py b/meld/dirdiff.py
index 2432de7..274b0ae 100644
--- a/meld/dirdiff.py
+++ b/meld/dirdiff.py
@@ -218,6 +218,12 @@ class DirDiff(melddoc.MeldDoc, gnomeglade.Component):
         tree.STATE_MISSING: "delete",
     }
 
+    state_actions = {
+        tree.STATE_NORMAL: ("normal", "ShowSame"),
+        tree.STATE_NEW: ("new", "ShowNew"),
+        tree.STATE_MODIFIED: ("modified", "ShowModified"),
+    }
+
     def __init__(self, prefs, num_panes):
         melddoc.MeldDoc.__init__(self, prefs)
         gnomeglade.Component.__init__(self, paths.ui_dir("dirdiff.ui"), "dirdiff")
@@ -232,9 +238,9 @@ class DirDiff(melddoc.MeldDoc, gnomeglade.Component):
 
         toggleactions = (
             ("IgnoreCase",   gtk.STOCK_ITALIC,  _("Case"),     None, _("Ignore case of entries"), self.on_button_ignore_case_toggled, False),
-            ("ShowSame",     gtk.STOCK_APPLY,   _("Same"),     None, _("Show identical"), self.on_filter_state_normal_toggled, True),
-            ("ShowNew",      gtk.STOCK_ADD,     _("New"),      None, _("Show new"), self.on_filter_state_new_toggled, True),
-            ("ShowModified", gtk.STOCK_REMOVE,  _("Modified"), None, _("Show modified"), self.on_filter_state_modified_toggled, True),
+            ("ShowSame",     gtk.STOCK_APPLY,   _("Same"),     None, _("Show identical"), self.on_filter_state_toggled, False),
+            ("ShowNew",      gtk.STOCK_ADD,     _("New"),      None, _("Show new"), self.on_filter_state_toggled, False),
+            ("ShowModified", gtk.STOCK_REMOVE,  _("Modified"), None, _("Show modified"), self.on_filter_state_toggled, False),
 
             ("CustomFilterMenu", None, _("Filters"), None, _("Set active filters"), self.on_custom_filter_menu_toggled, False),
         )
@@ -285,11 +291,13 @@ class DirDiff(melddoc.MeldDoc, gnomeglade.Component):
             self.scrolledwindow[i].get_vadjustment().connect("value-changed", self._sync_vscroll )
             self.scrolledwindow[i].get_hadjustment().connect("value-changed", self._sync_hscroll )
         self.linediffs = [[], []]
-        self.state_filters = [
-            tree.STATE_NORMAL,
-            tree.STATE_MODIFIED,
-            tree.STATE_NEW,
-        ]
+
+        self.state_filters = []
+        for s in self.state_actions:
+            if self.state_actions[s][0] in self.prefs.dir_status_filters:
+                self.state_filters.append(s)
+                action_name = self.state_actions[s][1]
+                self.actiongroup.get_action(action_name).set_active(True)
 
     def on_custom_filter_menu_toggled(self, item):
         if item.get_active():
@@ -831,21 +839,18 @@ class DirDiff(melddoc.MeldDoc, gnomeglade.Component):
     def on_button_ignore_case_toggled(self, button):
         self.refresh()
 
-    def _update_state_filter(self, state, active):
-        assert state in (tree.STATE_NEW, tree.STATE_MODIFIED, tree.STATE_NORMAL)
-        try:
-            self.state_filters.remove( state )
-        except ValueError:
-            pass
-        if active:
-            self.state_filters.append( state )
+    def on_filter_state_toggled(self, button):
+        active_action = lambda a: self.actiongroup.get_action(a).get_active()
+        active_filters = [a for a in self.state_actions if \
+                          active_action(self.state_actions[a][1])]
+
+        if set(active_filters) == set(self.state_filters):
+            return
+
+        state_strs = [self.state_actions[s][0] for s in active_filters]
+        self.state_filters = active_filters
+        self.prefs.dir_status_filters = state_strs
         self.refresh()
-    def on_filter_state_normal_toggled(self, button):
-        self._update_state_filter( tree.STATE_NORMAL, button.get_active() )
-    def on_filter_state_new_toggled(self, button):
-        self._update_state_filter( tree.STATE_NEW, button.get_active() )
-    def on_filter_state_modified_toggled(self, button):
-        self._update_state_filter( tree.STATE_MODIFIED, button.get_active() )
 
     def _update_name_filter(self, button, idx):
         self.name_filters[idx].active = button.get_active()
diff --git a/meld/preferences.py b/meld/preferences.py
index 683760d..5fe7430 100644
--- a/meld/preferences.py
+++ b/meld/preferences.py
@@ -248,7 +248,9 @@ class MeldPreferences(prefs.Preferences):
             _("Script comment\t0\t#.*")),
         "ignore_blank_lines" : prefs.Value(prefs.BOOL, False),
         "toolbar_visible" : prefs.Value(prefs.BOOL, True),
-        "statusbar_visible" : prefs.Value(prefs.BOOL, True)
+        "statusbar_visible" : prefs.Value(prefs.BOOL, True),
+        "dir_status_filters": prefs.Value(prefs.LIST,
+                                          ['normal', 'modified', 'new']),
     }
 
     def __init__(self):
diff --git a/meld/util/prefs.py b/meld/util/prefs.py
index 5ab49f6..300b96e 100644
--- a/meld/util/prefs.py
+++ b/meld/util/prefs.py
@@ -1,4 +1,5 @@
 ### Copyright (C) 2002-2006 Stephen Kennedy <stevek gnome org>
+### Copyright (C) 2011-2012 Kai Willadsen <kai willadsen gmail com>
 
 ### This program is free software; you can redistribute it and/or modify
 ### it under the terms of the GNU General Public License as published by
@@ -59,7 +60,7 @@ BOOL = "bool"
 INT = "int"
 STRING = "string"
 FLOAT = "float"
-# LIST = "list"
+LIST = "list"
 # PAIR = "pair"
 
 ##
@@ -96,7 +97,12 @@ class GConfPreferences(object):
         for key, value in self._prefs.items():
             gval = self._gconf.get_without_default("%s/%s" % (rootkey, key) )
             if gval is not None:
-                value.current = getattr( gval, "get_%s" % value.type )()
+                if value.type == LIST:
+                    # We only use/support str lists at the moment
+                    val_tuple = getattr(gval, "get_%s" % value.type)()
+                    value.current = [v.get_string() for v in val_tuple]
+                else:
+                    value.current = getattr(gval, "get_%s" % value.type)()
 
     def __getattr__(self, attr):
         return self._prefs[attr].current
@@ -109,7 +115,12 @@ class GConfPreferences(object):
         if value.current != val:
             value.current = val
             setfunc = getattr(self._gconf, "set_%s" % value.type)
-            setfunc("%s/%s" % (self._rootkey, attr), val)
+            if value.type == LIST:
+                # We only use/support str lists at the moment
+                setfunc("%s/%s" % (self._rootkey, attr), gconf.VALUE_STRING,
+                        val)
+            else:
+                setfunc("%s/%s" % (self._rootkey, attr), val)
             try:
                 for l in self._listeners:
                     l(attr,val)
@@ -119,15 +130,19 @@ class GConfPreferences(object):
     def _on_preference_changed(self, client, timestamp, entry, extra):
         attr = entry.key[entry.key.rfind("/") + 1:]
         try:
-            valuestruct = self._prefs[attr]
+            value = self._prefs[attr]
         except KeyError: # unknown key, we don't care about it
             pass
         else:
-            if entry.value is not None: # value has changed
-                newval = getattr(entry.value, "get_%s" % valuestruct.type)()
-                setattr( self, attr, newval)
-            else: # value has been deleted
-                setattr( self, attr, valuestruct.default )
+            if entry.value is not None:
+                val = getattr(entry.value, "get_%s" % value.type)()
+                if value.type == LIST:
+                    # We only use/support str lists at the moment
+                    val = [v.get_string() for v in val]
+                setattr(self, attr, val)
+            # Setting a value to None deletes it and uses the default value
+            else:
+                setattr(self, attr, value.default)
 
     def notify_add(self, callback):
         """Register a callback to be called when a preference changes.
@@ -166,10 +181,11 @@ class ConfigParserPreferences(object):
         self.__dict__["_listeners"] = []
         self.__dict__["_prefs"] = initial
         self.__dict__["_type_mappings"] = {
-            BOOL   : self._parser.getboolean,
-            INT    : self._parser.getint,
-            STRING : self._parser.get,
-            FLOAT  : self._parser.getfloat
+            BOOL: self._parser.getboolean,
+            INT: self._parser.getint,
+            STRING: self._parser.get,
+            FLOAT: self._parser.getfloat,
+            LIST: self._parser.get,
         }
 
         if sys.platform == "win32":



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]