[meld] Remember state filtering preferences in DirDiff
- From: Kai Willadsen <kaiw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [meld] Remember state filtering preferences in DirDiff
- Date: Sun, 1 Jan 2012 00:38:39 +0000 (UTC)
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]