inverted searches

svn: r6611
This commit is contained in:
Don Allingham 2006-05-10 20:56:22 +00:00
parent 124a5ecac8
commit 40ec7acd41
7 changed files with 49 additions and 22 deletions

View File

@ -1,3 +1,11 @@
2006-05-10 Don Allingham <don@gramps-project.org>
* src/DataViews/_PersonView.py: support for inverted searchs
* src/PeopleModel.py: support for inverted searchs
* src/DisplayModel.py: support for inverted searchs
* src/PageView.py: support for inverted searchs, correct col index
* src/Filters/_SearchBar.py: support for inverted searchs
* src/Filters/_SearchFilter.py: support for inverted searchs
2006-05-10 Alex Roitman <shura@gramps-project.org> 2006-05-10 Alex Roitman <shura@gramps-project.org>
* src/GrampsDb/_ReadGedcom.py (func_person_attr): Typos. * src/GrampsDb/_ReadGedcom.py (func_person_attr): Typos.
@ -7,7 +15,7 @@
* src/DisplayModels.py: handle search filter * src/DisplayModels.py: handle search filter
* src/PageView.py: search bar support * src/PageView.py: search bar support
* src/Filters/_SearchBar.py: remove SearchFilter to separate file, * src/Filters/_SearchBar.py: remove SearchFilter to separate file,
fix status bar message fix status bar message, improved buttons.
* src/Filters/_SearchFilter.py: added * src/Filters/_SearchFilter.py: added
* src/Filters/__init__.py: added SearchBar * src/Filters/__init__.py: added SearchBar

View File

@ -333,7 +333,6 @@ class PersonView(PageView.PersonNavView):
db.connect('person-delete', self.person_removed) db.connect('person-delete', self.person_removed)
db.connect('person-rebuild', self.build_tree) db.connect('person-rebuild', self.build_tree)
self.build_tree() self.build_tree()
#self.search_bar.apply_filter()
self.goto_active_person() self.goto_active_person()
self.bookmarks.update_bookmarks(db.get_bookmarks()) self.bookmarks.update_bookmarks(db.get_bookmarks())
if self.active: if self.active:
@ -399,11 +398,11 @@ class PersonView(PageView.PersonNavView):
""" """
cols = [] cols = []
cols.append(_("Name")) cols.append((_("Name"),0))
for pair in self.dbstate.db.get_person_column_order(): for pair in self.dbstate.db.get_person_column_order():
if not pair[0]: if not pair[0]:
continue continue
cols.append(column_names[pair[1]]) cols.append((column_names[pair[1]],pair[1]))
self.search_bar.setup_filter(cols) self.search_bar.setup_filter(cols)
@ -415,7 +414,7 @@ class PersonView(PageView.PersonNavView):
if self.active: if self.active:
if Config.get(Config.FILTER): if Config.get(Config.FILTER):
search = (0, '') search = (0, '', False)
else: else:
search = self.search_bar.get_value() search = self.search_bar.get_value()

View File

@ -81,8 +81,9 @@ class BaseModel(gtk.GenericTreeModel):
if search: if search:
col = search[0] col = search[0]
text = search[1] text = search[1]
func = lambda x: self.on_get_value(x, col) inv = search[2]
self.search = SearchFilter(func, text) func = lambda x: self.on_get_value(x, col) or u""
self.search = SearchFilter(func, text, inv)
else: else:
self.search = None self.search = None

View File

@ -49,6 +49,7 @@ class SearchBar:
self.filterbar = gtk.HBox() self.filterbar = gtk.HBox()
self.filterbar.set_spacing(4) self.filterbar.set_spacing(4)
self.filter_list = gtk.ComboBox() self.filter_list = gtk.ComboBox()
self.filter_list.connect('changed', self.filter_changed)
self.filter_text = gtk.Entry() self.filter_text = gtk.Entry()
self.filter_text.connect('key-press-event',self.key_press) self.filter_text.connect('key-press-event',self.key_press)
@ -69,20 +70,34 @@ class SearchBar:
return self.filterbar return self.filterbar
def setup_filter( self, column_names ): def setup_filter( self, column_data ):
old_value = self.filter_list.get_active()
cell = gtk.CellRendererText() cell = gtk.CellRendererText()
self.filter_list.clear() self.filter_list.clear()
self.filter_list.pack_start(cell,True) self.filter_list.pack_start(cell,True)
self.filter_list.add_attribute(cell,'text',0) self.filter_list.add_attribute(cell,'text',0)
self.filter_model = gtk.ListStore(str) self.filter_model = gtk.ListStore(str, int, bool)
for col in column_names: maxval = 0
rule = _("Search %s") % col for col,index in column_data:
self.filter_model.append(row=[rule]) rule = _("%s contains") % col
self.filter_model.append(row=[rule,index,False])
maxval += 1
rule = _("%s does not contain") % col
self.filter_model.append(row=[rule,index,True])
maxval += 1
self.filter_list.set_model(self.filter_model) self.filter_list.set_model(self.filter_model)
if old_value == -1 or old_value >= maxval:
self.filter_list.set_active(0) self.filter_list.set_active(0)
else:
self.filter_list.set_active(old_value)
def filter_changed(self, obj):
self.filter_button.set_sensitive(True)
self.clear_button.set_sensitive(True)
def text_changed(self, obj): def text_changed(self, obj):
text = obj.get_text() text = obj.get_text()
@ -112,8 +127,10 @@ class SearchBar:
def get_value(self): def get_value(self):
text = self.filter_text.get_text().strip() text = self.filter_text.get_text().strip()
index = self.filter_list.get_active() node = self.filter_list.get_active_iter()
return (index, text) index = self.filter_model.get_value(node,1)
inv = self.filter_model.get_value(node,2)
return (index, text, inv)
def apply_filter(self,current_model=None): def apply_filter(self,current_model=None):
self.apply_text = self.filter_text.get_text() self.apply_text = self.filter_text.get_text()

View File

@ -25,10 +25,11 @@ Package providing filtering framework for GRAMPS.
""" """
class SearchFilter: class SearchFilter:
def __init__(self, func, text): def __init__(self, func, text, invert):
self.func = func self.func = func
self.text = text.upper() self.text = text.upper()
self.invert = invert
def match(self, handle): def match(self, handle):
return self.func(handle).upper().find(self.text) != -1 return self.invert ^ (self.func(handle).upper().find(self.text) != -1)

View File

@ -534,7 +534,7 @@ class ListView(BookMarkView):
""" """
cols = [] cols = []
for pair in [pair for pair in self.column_order() if pair[0]]: for pair in [pair for pair in self.column_order() if pair[0]]:
cols.append(self.colinfo[pair[1]]) cols.append((self.colinfo[pair[1]],pair[1]))
self.search_bar.setup_filter(cols) self.search_bar.setup_filter(cols)
def goto_handle(self, handle): def goto_handle(self, handle):
@ -570,7 +570,7 @@ class ListView(BookMarkView):
handle = self.first_selected() handle = self.first_selected()
if Config.get(Config.FILTER): if Config.get(Config.FILTER):
search = (0, '') search = (0, '', False)
else: else:
search = self.search_bar.get_value() search = self.search_bar.get_value()

View File

@ -151,8 +151,9 @@ class PeopleModel(gtk.GenericTreeModel):
if search: if search:
col = search[0] col = search[0]
text = search[1] text = search[1]
func = lambda x: self.on_get_value(x, col) inv = search[2]
data_filter = SearchFilter(func, text) func = lambda x: self.on_get_value(x, col) or u""
data_filter = SearchFilter(func, text, inv)
self.rebuild_data(data_filter, skip) self.rebuild_data(data_filter, skip)
def rebuild_data(self, data_filter=None, skip=[]): def rebuild_data(self, data_filter=None, skip=[]):