diff --git a/src/Filters/SideBar/_EventSidebarFilter.py b/src/Filters/SideBar/_EventSidebarFilter.py index 4ac1f771d..062a59a68 100644 --- a/src/Filters/SideBar/_EventSidebarFilter.py +++ b/src/Filters/SideBar/_EventSidebarFilter.py @@ -77,7 +77,7 @@ class EventSidebarFilter(SidebarFilter): self.generic = gtk.ComboBox() - SidebarFilter.__init__(self, dbstate, uistate) + SidebarFilter.__init__(self, dbstate, uistate, "Event") def create_widget(self): cell = gtk.CellRendererText() @@ -93,7 +93,7 @@ class EventSidebarFilter(SidebarFilter): self.add_text_entry(_('Date'), self.filter_date) self.add_text_entry(_('Place'), self.filter_place) self.add_text_entry(_('Note'), self.filter_note) - self.add_entry(_('Custom filter'), self.generic) + self.add_filter_entry(_('Custom filter'), self.generic) self.add_entry(None, self.filter_regex) def clear(self, obj): diff --git a/src/Filters/SideBar/_FamilySidebarFilter.py b/src/Filters/SideBar/_FamilySidebarFilter.py index c4f10c0d9..651737afd 100644 --- a/src/Filters/SideBar/_FamilySidebarFilter.py +++ b/src/Filters/SideBar/_FamilySidebarFilter.py @@ -98,7 +98,7 @@ class FamilySidebarFilter(SidebarFilter): self.generic = gtk.ComboBox() - SidebarFilter.__init__(self, dbstate, uistate) + SidebarFilter.__init__(self, dbstate, uistate, "Family") def create_widget(self): cell = gtk.CellRendererText() @@ -116,7 +116,7 @@ class FamilySidebarFilter(SidebarFilter): self.add_entry(_('Family Event'), self.etype) self.add_entry(_('Marker'), self.mtype) self.add_text_entry(_('Family Note'), self.filter_note) - self.add_entry(_('Custom filter'), self.generic) + self.add_filter_entry(_('Custom filter'), self.generic) self.add_entry(None, self.filter_regex) def clear(self, obj): diff --git a/src/Filters/SideBar/_MediaSidebarFilter.py b/src/Filters/SideBar/_MediaSidebarFilter.py index 1fc18c7f6..f9254af8c 100644 --- a/src/Filters/SideBar/_MediaSidebarFilter.py +++ b/src/Filters/SideBar/_MediaSidebarFilter.py @@ -67,7 +67,7 @@ class MediaSidebarFilter(SidebarFilter): self.generic = gtk.ComboBox() - SidebarFilter.__init__(self, dbstate, uistate) + SidebarFilter.__init__(self, dbstate, uistate, "MediaObject") def create_widget(self): cell = gtk.CellRendererText() @@ -83,7 +83,7 @@ class MediaSidebarFilter(SidebarFilter): self.add_text_entry(_('Path'), self.filter_path) self.add_text_entry(_('Date'), self.filter_date) self.add_text_entry(_('Note'), self.filter_note) - self.add_entry(_('Custom filter'), self.generic) + self.add_filter_entry(_('Custom filter'), self.generic) self.add_entry(None, self.filter_regex) def clear(self, obj): diff --git a/src/Filters/SideBar/_NoteSidebarFilter.py b/src/Filters/SideBar/_NoteSidebarFilter.py index d1c39f272..e949b4f1d 100644 --- a/src/Filters/SideBar/_NoteSidebarFilter.py +++ b/src/Filters/SideBar/_NoteSidebarFilter.py @@ -71,7 +71,7 @@ class NoteSidebarFilter(SidebarFilter): self.generic = gtk.ComboBox() - SidebarFilter.__init__(self, dbstate, uistate) + SidebarFilter.__init__(self, dbstate, uistate, "Note") def create_widget(self): cell = gtk.CellRendererText() @@ -84,7 +84,7 @@ class NoteSidebarFilter(SidebarFilter): self.add_text_entry(_('ID'), self.filter_id) self.add_text_entry(_('Text'), self.filter_text) self.add_entry(_('Type'), self.ntype) - self.add_entry(_('Custom filter'), self.generic) + self.add_filter_entry(_('Custom filter'), self.generic) self.add_entry(None, self.filter_regex) def clear(self, obj): diff --git a/src/Filters/SideBar/_PersonSidebarFilter.py b/src/Filters/SideBar/_PersonSidebarFilter.py index 4855bf873..ebc768e2e 100644 --- a/src/Filters/SideBar/_PersonSidebarFilter.py +++ b/src/Filters/SideBar/_PersonSidebarFilter.py @@ -51,7 +51,6 @@ from Filters.Rules.Person import (RegExpName, SearchName, RegExpIdOf, HasNoteMatchingSubstringOf, MatchesFilter) from Filters import GenericFilter, build_filter_model, Rules - def extract_text(entry_widget): """ Extract the text from the entry widget, strips off any extra spaces, @@ -102,7 +101,7 @@ class PersonSidebarFilter(SidebarFilter): self.generic = gtk.ComboBox() - SidebarFilter.__init__(self, dbstate, uistate) + SidebarFilter.__init__(self, dbstate, uistate, "Person") def create_widget(self): cell = gtk.CellRendererText() @@ -133,7 +132,7 @@ class PersonSidebarFilter(SidebarFilter): self.add_entry(_('Event'), self.etype) self.add_entry(_('Marker'), self.mtype) self.add_text_entry(_('Note'), self.filter_note) - self.add_entry(_('Custom filter'), self.generic) + self.add_filter_entry(_('Custom filter'), self.generic) self.add_entry(None, self.filter_regex) def clear(self, obj): @@ -146,7 +145,7 @@ class PersonSidebarFilter(SidebarFilter): self.etype.child.set_text(u'') self.mtype.child.set_text(u'') self.generic.set_active(0) - + def get_filter(self): """ Extracts the text strings from the sidebar, and uses them to build up diff --git a/src/Filters/SideBar/_PlaceSidebarFilter.py b/src/Filters/SideBar/_PlaceSidebarFilter.py index 566b75370..4688ab48b 100644 --- a/src/Filters/SideBar/_PlaceSidebarFilter.py +++ b/src/Filters/SideBar/_PlaceSidebarFilter.py @@ -70,7 +70,7 @@ class PlaceSidebarFilter(SidebarFilter): self.filter_regex = gtk.CheckButton(_('Use regular expressions')) self.generic = gtk.ComboBox() - SidebarFilter.__init__(self, dbstate, uistate) + SidebarFilter.__init__(self, dbstate, uistate, "Place") def create_widget(self): cell = gtk.CellRendererText() @@ -90,7 +90,7 @@ class PlaceSidebarFilter(SidebarFilter): self.add_text_entry(_('State'), self.filter_state) self.add_text_entry(_('Country'), self.filter_country) self.add_text_entry(_('Note'), self.filter_note) - self.add_entry(_('Custom filter'), self.generic) + self.add_filter_entry(_('Custom filter'), self.generic) self.add_entry(None, self.filter_regex) def clear(self, obj): diff --git a/src/Filters/SideBar/_RepoSidebarFilter.py b/src/Filters/SideBar/_RepoSidebarFilter.py index d2f77d35f..4543017c7 100644 --- a/src/Filters/SideBar/_RepoSidebarFilter.py +++ b/src/Filters/SideBar/_RepoSidebarFilter.py @@ -77,7 +77,7 @@ class RepoSidebarFilter(SidebarFilter): self.generic = gtk.ComboBox() - SidebarFilter.__init__(self, dbstate, uistate) + SidebarFilter.__init__(self, dbstate, uistate, "Repository") def create_widget(self): cell = gtk.CellRendererText() @@ -93,7 +93,7 @@ class RepoSidebarFilter(SidebarFilter): self.add_text_entry(_('Address'), self.filter_address) self.add_text_entry(_('URL'), self.filter_url) self.add_text_entry(_('Note'), self.filter_note) - self.add_entry(_('Custom filter'), self.generic) + self.add_filter_entry(_('Custom filter'), self.generic) self.add_entry(None, self.filter_regex) def clear(self, obj): diff --git a/src/Filters/SideBar/_SidebarFilter.py b/src/Filters/SideBar/_SidebarFilter.py index 8acc3d3ea..cff573e40 100644 --- a/src/Filters/SideBar/_SidebarFilter.py +++ b/src/Filters/SideBar/_SidebarFilter.py @@ -34,7 +34,7 @@ class SidebarFilter(object): _FILTER_WIDTH = 200 _FILTER_ELLIPSIZE = pango.ELLIPSIZE_END - def __init__(self, dbstate, uistate): + def __init__(self, dbstate, uistate, namespace): self.position = 1 self.table = gtk.Table(4, 11) self.table.set_border_width(6) @@ -48,6 +48,7 @@ class SidebarFilter(object): uistate.connect('filters-changed', self.on_filters_changed) self.uistate = uistate self.dbstate = dbstate + self.namespace = namespace def _init_interface(self): self.table.attach(widgets.MarkupLabel(_('Filter')), @@ -138,3 +139,48 @@ class SidebarFilter(object): def on_filters_changed(self, namespace): pass + def add_filter_entry(self, text, widget): + """ + Adds the text and widget to GUI, with an Edit button. + """ + hbox = gtk.HBox() + hbox.pack_start(widget) + hbox.pack_start(widgets.SimpleButton(gtk.STOCK_EDIT, self.edit_filter)) + self.add_entry(text, hbox) + + def edit_filter(self, obj): + """ + Callback which invokes the EditFilter dialog. Will create new + filter if called if none is selected. + """ + from gui.filtereditor import EditFilter + from Filters import FilterList, GenericFilterFactory + import const + the_filter = None + filterdb = FilterList(const.CUSTOM_FILTERS) + filterdb.load() + if self.generic.get_active() != 0: + model = self.generic.get_model() + node = self.generic.get_active_iter() + if node: + sel_filter = model.get_value(node, 1) + # the_filter needs to be a particular object for editor + for filt in filterdb.get_filters(self.namespace): + if filt.get_name() == sel_filter.get_name(): + the_filter = filt + else: + the_filter = GenericFilterFactory(self.namespace)() + if the_filter: + EditFilter(self.namespace, self.dbstate, self.uistate, [], + the_filter, filterdb, + lambda : self.edit_filter_save(filterdb)) + + def edit_filter_save(self, filterdb): + """ + If a filter changed, save them all. Reloads, and also calls callback. + """ + from Filters import reload_custom_filters + filterdb.save() + reload_custom_filters() + self.on_filters_changed(self.namespace) + diff --git a/src/Filters/SideBar/_SourceSidebarFilter.py b/src/Filters/SideBar/_SourceSidebarFilter.py index 9aece9e2f..4db0c1c92 100644 --- a/src/Filters/SideBar/_SourceSidebarFilter.py +++ b/src/Filters/SideBar/_SourceSidebarFilter.py @@ -65,7 +65,7 @@ class SourceSidebarFilter(SidebarFilter): self.generic = gtk.ComboBox() - SidebarFilter.__init__(self, dbstate, uistate) + SidebarFilter.__init__(self, dbstate, uistate, "Source") def create_widget(self): cell = gtk.CellRendererText() @@ -80,7 +80,7 @@ class SourceSidebarFilter(SidebarFilter): self.add_text_entry(_('Author'), self.filter_author) self.add_text_entry(_('Publication'), self.filter_pub) self.add_text_entry(_('Note'), self.filter_note) - self.add_entry(_('Custom filter'), self.generic) + self.add_filter_entry(_('Custom filter'), self.generic) self.add_entry(None, self.filter_regex) def clear(self, obj):