diff --git a/ChangeLog b/ChangeLog index 0284e57d7..9a611f7a7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-06-21 Don Allingham + * src/Filters/__init__.py: include new build_filter_model + * src/Filters/_FilterMenu.py: build_filter_model + * src/Filters/Rules/Person/_MatchesFilter.py: handle custom and + system models properly + * src/Filters/_PersonSidebarFilter.py: add custom filter menu + 2006-06-20 Don Allingham * src/Filters/_SidebarFilter.py: change from CLEAR to RESET * src/DataViews/_PersonView.py (PersonView.person_updated): if surname diff --git a/src/Filters/Rules/Person/_MatchesFilter.py b/src/Filters/Rules/Person/_MatchesFilter.py index 1a469e39b..671f8908d 100644 --- a/src/Filters/Rules/Person/_MatchesFilter.py +++ b/src/Filters/Rules/Person/_MatchesFilter.py @@ -32,7 +32,8 @@ from gettext import gettext as _ # GRAMPS modules # #------------------------------------------------------------------------- -from Filters import SystemFilters, CustomFilters +import Filters +#from Filters import SystemFilters, CustomFilters from Filters.Rules._Rule import Rule #------------------------------------------------------------------------- @@ -49,30 +50,36 @@ class MatchesFilter(Rule): category = _('General filters') def prepare(self,db): - for filt in SystemFilters.get_filters(): - if filt.get_name() == self.list[0]: - for rule in filt.flist: - rule.prepare(db) - for filt in CustomFilters.get_filters(): - if filt.get_name() == self.list[0]: - for rule in filt.flist: - rule.prepare(db) + if Filters.SystemFilters: + for filt in Filters.SystemFilters.get_filters('Person'): + if filt.get_name() == self.list[0]: + for rule in filt.flist: + rule.prepare(db) + if Filters.CustomFilters: + for filt in Filters.CustomFilters.get_filters('Person'): + if filt.get_name() == self.list[0]: + for rule in filt.flist: + rule.prepare(db) def reset(self): - for filt in SystemFilters.get_filters(): - if filt.get_name() == self.list[0]: - for rule in filt.flist: - rule.reset() - for filt in CustomFilters.get_filters(): - if filt.get_name() == self.list[0]: - for rule in filt.flist: - rule.reset() + if Filters.SystemFilters: + for filt in Filters.SystemFilters.get_filters('Person'): + if filt.get_name() == self.list[0]: + for rule in filt.flist: + rule.reset() + if Filters.CustomFilters: + for filt in Filters.CustomFilters.get_filters('Person'): + if filt.get_name() == self.list[0]: + for rule in filt.flist: + rule.reset() def apply(self,db,person): - for filt in SystemFilters.get_filters(): - if filt.get_name() == self.list[0]: - return filt.check(db,person.handle) - for filt in CustomFilters.get_filters(): - if filt.get_name() == self.list[0]: - return filt.check(db,person.handle) + if Filters.SystemFilters: + for filt in Filters.SystemFilters.get_filters('Person'): + if filt.get_name() == self.list[0]: + return filt.check(db,person.handle) + if Filters.CustomFilters: + for filt in Filters.CustomFilters.get_filters('Person'): + if filt.get_name() == self.list[0]: + return filt.check(db,person.handle) return False diff --git a/src/Filters/_FilterMenu.py b/src/Filters/_FilterMenu.py index 2e9ca9aca..0673908b1 100644 --- a/src/Filters/_FilterMenu.py +++ b/src/Filters/_FilterMenu.py @@ -43,26 +43,37 @@ from Filters import SystemFilters, CustomFilters def build_filter_menu(local_filters = [], default=""): menu = gtk.Menu() - cnt = 0 for filt in local_filters: menuitem = gtk.MenuItem(filt.get_name()) menuitem.show() menu.append(menuitem) menuitem.set_data("filter", filt) - cnt += 1 for filt in SystemFilters.get_filters(): menuitem = gtk.MenuItem(_(filt.get_name())) menuitem.show() menu.append(menuitem) menuitem.set_data("filter", filt) - cnt += 1 for filt in CustomFilters.get_filters(): menuitem = gtk.MenuItem(_(filt.get_name())) menuitem.show() menu.append(menuitem) menuitem.set_data("filter", filt) - cnt += 1 return menu + +#------------------------------------------------------------------------- +# +# This is used by plugins to create a menu of available filters +# +#------------------------------------------------------------------------- +def build_filter_model(space, local = [], default=""): + model = gtk.ListStore(str, object) + + flist = local + SystemFilters.get_filters(space) + \ + CustomFilters.get_filters(space) + + for filt in flist: + model.append(row=[filt.get_name(), filt]) + return model diff --git a/src/Filters/_PersonSidebarFilter.py b/src/Filters/_PersonSidebarFilter.py index fa898502b..fa95cdd3b 100644 --- a/src/Filters/_PersonSidebarFilter.py +++ b/src/Filters/_PersonSidebarFilter.py @@ -27,7 +27,7 @@ import RelLib from _SidebarFilter import SidebarFilter from Filters.Rules.Person import * -from Filters import GenericFilter +from Filters import GenericFilter, build_filter_model, Rules class PersonSidebarFilter(SidebarFilter): @@ -57,6 +57,17 @@ class PersonSidebarFilter(SidebarFilter): self.filter_regex = gtk.CheckButton(_('Use regular expressions')) + all = GenericFilter() + all.set_name(_("None")) + all.add_rule(Rules.Person.Everyone([])) + + self.generic = gtk.ComboBox() + cell = gtk.CellRendererText() + self.generic.pack_start(cell, True) + self.generic.add_attribute(cell, 'text', 0) + self.generic.set_model(build_filter_model('Person', [all])) + self.generic.set_active(0) + self.add_text_entry(_('Name'), self.filter_name) self.add_text_entry(_('ID'), self.filter_id) self.add_entry(_('Gender'), self.filter_gender) @@ -64,6 +75,7 @@ class PersonSidebarFilter(SidebarFilter): self.add_text_entry(_('Death date'), self.filter_death) self.add_entry(_('Has Event'), self.etype) self.add_text_entry(_('Note'), self.filter_note) + self.add_entry(_('Custom filter'), self.generic) self.add_entry(None, self.filter_regex) def clear(self, obj): @@ -74,6 +86,7 @@ class PersonSidebarFilter(SidebarFilter): self.filter_note.set_text('') self.filter_gender.set_active(0) self.etype.child.set_text('') + self.generic.set_active(0) def clicked(self, obj): self.clicked_func() @@ -86,10 +99,11 @@ class PersonSidebarFilter(SidebarFilter): note = self.filter_note.get_text().strip() gender = self.filter_gender.get_active() regex = self.filter_regex.get_active() + gen = self.generic.get_active() > 0 if not name and not gid and not birth and not death \ and not str(self.filter_event.get_type()) and \ - not note and not gender > 0: + not note and not gender > 0 and not gen: generic_filter = None else: generic_filter = GenericFilter() @@ -130,5 +144,13 @@ class PersonSidebarFilter(SidebarFilter): else: rule = HasNoteMatchingSubstringOf([note]) generic_filter.add_rule(rule) + + if self.generic.get_active() != 0: + model = self.generic.get_model() + iter = self.generic.get_active_iter() + obj = model.get_value(iter, 0) + rule = MatchesFilter([obj]) + generic_filter.add_rule(rule) + return generic_filter diff --git a/src/Filters/__init__.py b/src/Filters/__init__.py index ef0c18380..ea9910f97 100644 --- a/src/Filters/__init__.py +++ b/src/Filters/__init__.py @@ -52,7 +52,7 @@ if not CustomFilters: from _FilterWidget import FilterWidget from _FilterComboBox import FilterComboBox -from _FilterMenu import build_filter_menu +from _FilterMenu import build_filter_menu, build_filter_model from _FilterStore import FilterStore from _SearchBar import SearchBar from _SearchFilter import SearchFilter