working filters in Person view
svn: r5802
This commit is contained in:
		@@ -1,4 +1,8 @@
 | 
			
		||||
2006-01-17 Richard Taylor <rjt-gramps@thegrindstone.me.uk>
 | 
			
		||||
2006-01-19 Richard Taylor <rjt-gramps@thegrindstone.me.uk>
 | 
			
		||||
	* src/ObjectSelector/_PersonFilterFrame.py, src/ObjectSelector/_PersonFrame.py
 | 
			
		||||
	  src/ObjectSelector/_PersonTreeFrame.py: filters in Person view just about work.
 | 
			
		||||
	
 | 
			
		||||
2006-01-19 Richard Taylor <rjt-gramps@thegrindstone.me.uk>
 | 
			
		||||
       * src/ObjectSelector/_FamilyFilterFrame.py, src/ObjectSelector/_ObjectSelectorWindow.py
 | 
			
		||||
         src/ObjectSelector/_PersonFilterFrame.py: ground work for filters
 | 
			
		||||
	* src/ObjectSelector/_FilterFrameBase.py: new file
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,14 @@
 | 
			
		||||
import gtk
 | 
			
		||||
import gobject
 | 
			
		||||
from gettext import gettext as _
 | 
			
		||||
from logging import getLogger
 | 
			
		||||
 | 
			
		||||
log = getLogger(".ObjectSelector")
 | 
			
		||||
 | 
			
		||||
from GrampsWidgets import IntEdit
 | 
			
		||||
from _FilterFrameBase import FilterFrameBase
 | 
			
		||||
import GenericFilter
 | 
			
		||||
import RelLib
 | 
			
		||||
 | 
			
		||||
class PersonFilterFrame(FilterFrameBase):
 | 
			
		||||
    
 | 
			
		||||
@@ -42,10 +47,21 @@ class PersonFilterFrame(FilterFrameBase):
 | 
			
		||||
        gender_label = gtk.Label("Gender")
 | 
			
		||||
        gender_label.set_alignment(xalign=0,yalign=0.5)
 | 
			
		||||
 | 
			
		||||
        self._gender_combo = gtk.combo_box_new_text()
 | 
			
		||||
        self._gender_combo.append_text("Male")
 | 
			
		||||
        self._gender_combo.append_text("Female")
 | 
			
		||||
        self._gender_combo.append_text("Unknown")
 | 
			
		||||
        self._gender_list = gtk.ListStore(str,int)
 | 
			
		||||
 | 
			
		||||
        genders=[[_("Male"),RelLib.Person.MALE],
 | 
			
		||||
                 [_("Female"),RelLib.Person.FEMALE],
 | 
			
		||||
                 [_("Unknown"),RelLib.Person.UNKNOWN]]
 | 
			
		||||
        
 | 
			
		||||
        for gender in genders:        
 | 
			
		||||
            self._gender_list.append(gender)
 | 
			
		||||
        
 | 
			
		||||
        self._gender_combo = gtk.ComboBox(self._gender_list)
 | 
			
		||||
        
 | 
			
		||||
        label_cell = gtk.CellRendererText()
 | 
			
		||||
        
 | 
			
		||||
        self._gender_combo.pack_start(label_cell, True)
 | 
			
		||||
        self._gender_combo.add_attribute(label_cell, 'text', 0)
 | 
			
		||||
        self._gender_combo.set_active(2)
 | 
			
		||||
        self._gender_combo.set_sensitive(False)
 | 
			
		||||
 | 
			
		||||
@@ -118,15 +134,55 @@ class PersonFilterFrame(FilterFrameBase):
 | 
			
		||||
        filter_label = gtk.Label("Filter")
 | 
			
		||||
        filter_label.set_alignment(xalign=0,yalign=0.5)
 | 
			
		||||
 | 
			
		||||
        self._filter_combo = gtk.combo_box_new_text()
 | 
			
		||||
        self._filter_combo.append_text("Male")
 | 
			
		||||
        self._filter_combo.append_text("Female")
 | 
			
		||||
        self._filter_combo.append_text("Unknown")
 | 
			
		||||
        self._filter_combo.set_active(2)
 | 
			
		||||
        default_filters = [
 | 
			
		||||
            GenericFilter.Everyone,
 | 
			
		||||
            GenericFilter.IsFemale,
 | 
			
		||||
            GenericFilter.IsMale,
 | 
			
		||||
            GenericFilter.HasUnknownGender,
 | 
			
		||||
            GenericFilter.Disconnected,
 | 
			
		||||
            GenericFilter.SearchName,
 | 
			
		||||
            GenericFilter.HaveAltFamilies,
 | 
			
		||||
            GenericFilter.HavePhotos,
 | 
			
		||||
            GenericFilter.IncompleteNames,
 | 
			
		||||
            GenericFilter.HaveChildren,
 | 
			
		||||
            GenericFilter.NeverMarried,
 | 
			
		||||
            GenericFilter.MultipleMarriages,
 | 
			
		||||
            GenericFilter.NoBirthdate,
 | 
			
		||||
            GenericFilter.PersonWithIncompleteEvent,
 | 
			
		||||
            GenericFilter.FamilyWithIncompleteEvent,
 | 
			
		||||
            GenericFilter.ProbablyAlive,
 | 
			
		||||
            GenericFilter.PeoplePrivate,
 | 
			
		||||
            GenericFilter.IsWitness, 
 | 
			
		||||
            GenericFilter.HasTextMatchingSubstringOf, 
 | 
			
		||||
            GenericFilter.HasTextMatchingRegexpOf, 
 | 
			
		||||
            GenericFilter.HasNote, 
 | 
			
		||||
            GenericFilter.HasNoteMatchingSubstringOf, 
 | 
			
		||||
            GenericFilter.IsFemale,
 | 
			
		||||
            ]
 | 
			
		||||
 | 
			
		||||
        self._filter_list = gtk.ListStore(object,str)
 | 
			
		||||
 | 
			
		||||
        for filter in default_filters:
 | 
			
		||||
            if not hasattr(filter,'labels') or len(filter.labels) == 0:
 | 
			
		||||
                # don't currently support filters that need an attribute.
 | 
			
		||||
                self._filter_list.append([filter,filter.name])
 | 
			
		||||
        
 | 
			
		||||
        self._filter_combo = gtk.ComboBox(self._filter_list)
 | 
			
		||||
        
 | 
			
		||||
        label_cell = gtk.CellRendererText()
 | 
			
		||||
        
 | 
			
		||||
        self._filter_combo.pack_start(label_cell, True)
 | 
			
		||||
        self._filter_combo.add_attribute(label_cell, 'text', 1)
 | 
			
		||||
        self._filter_combo.set_active(0)
 | 
			
		||||
        self._filter_combo.set_sensitive(False)
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        self._filter_check.connect('toggled',lambda b: self._filter_combo.set_sensitive(self._filter_check.get_active()))
 | 
			
		||||
 | 
			
		||||
        self._filter_entry_label = gtk.Label()
 | 
			
		||||
        self._filter_entry_label.set_sensitive(False)
 | 
			
		||||
        
 | 
			
		||||
        self._filter_entry_edit = gtk.Entry()
 | 
			
		||||
        self._filter_entry_edit.set_sensitive(False)
 | 
			
		||||
        
 | 
			
		||||
        # table layout
 | 
			
		||||
        
 | 
			
		||||
@@ -207,6 +263,45 @@ class PersonFilterFrame(FilterFrameBase):
 | 
			
		||||
        if self._id_check.get_active():
 | 
			
		||||
            filter.add_rule(GenericFilter.HasIdOf([self._id_edit.get_text()]))
 | 
			
		||||
 | 
			
		||||
        if self._name_check.get_active():
 | 
			
		||||
            filter.add_rule(GenericFilter.SearchName([self._name_edit.get_text()]))
 | 
			
		||||
 | 
			
		||||
        if self._gender_check.get_active():
 | 
			
		||||
            gender = self._gender_list.get_value(self._gender_combo.get_active_iter(),1)
 | 
			
		||||
            if gender == RelLib.Person.MALE:
 | 
			
		||||
                filter.add_rule(GenericFilter.IsMale([]))
 | 
			
		||||
            elif gender == RelLib.Person.FEMALE:
 | 
			
		||||
                filter.add_rule(GenericFilter.IsFemale([]))
 | 
			
		||||
            elif gender == RelLib.Person.UNKNOWN:
 | 
			
		||||
                filter.add_rule(GenericFilter.HasUnknownGender([]))
 | 
			
		||||
            else:
 | 
			
		||||
                log.warn("Received unknown gender from filter widget")
 | 
			
		||||
 | 
			
		||||
        if self._birth_check.get_active():
 | 
			
		||||
            date = ""
 | 
			
		||||
            if self._b_before.get_active():
 | 
			
		||||
                date = "before " + self._b_edit.get_text()
 | 
			
		||||
            elif self._b_after.get_active():
 | 
			
		||||
                date = "after " + self._b_edit.get_text()
 | 
			
		||||
            else:
 | 
			
		||||
                log.warn("neither before or after is selected, this should not happen")
 | 
			
		||||
            filter.add_rule(GenericFilter.HasBirth([date,'','']))
 | 
			
		||||
                
 | 
			
		||||
        if self._death_check.get_active():
 | 
			
		||||
            date = ""
 | 
			
		||||
            if self._d_before.get_active():
 | 
			
		||||
                date = "before " + self._d_edit.get_text()
 | 
			
		||||
            elif self._d_after.get_active():
 | 
			
		||||
                date = "after " + self._d_edit.get_text()
 | 
			
		||||
            else:
 | 
			
		||||
                log.warn("neither before or after is selected, this should not happen")
 | 
			
		||||
            filter.add_rule(GenericFilter.HasDeath([date,'','']))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if self._filter_check.get_active():
 | 
			
		||||
            filter.add_rule(self._filter_list.get_value(self._filter_combo.get_active_iter(),0)([]))
 | 
			
		||||
 | 
			
		||||
            
 | 
			
		||||
	self.emit('apply-filter',filter)
 | 
			
		||||
    
 | 
			
		||||
if gtk.pygtk_version < (2,8,0):
 | 
			
		||||
 
 | 
			
		||||
@@ -57,6 +57,8 @@ class PersonFrame(ObjectFrameBase):
 | 
			
		||||
        self._tree_frame.get_selection().connect('changed',self.set_preview,self.__class__.__person_id_field)
 | 
			
		||||
        self._tree_frame.get_tree().connect('row-activated',self._on_row_activated)
 | 
			
		||||
 | 
			
		||||
        self._filter_frame.connect('apply-filter',lambda w,m: self._tree_frame.set_model(m))
 | 
			
		||||
 | 
			
		||||
    def _on_row_activated(self,widget,path,col):
 | 
			
		||||
        (model, iter) = widget.get_selection().get_selected()
 | 
			
		||||
        if iter and model.get_value(iter,self.__class__.__person_id_field):
 | 
			
		||||
 
 | 
			
		||||
@@ -83,14 +83,14 @@ class PersonTreeFrame(gtk.Frame):
 | 
			
		||||
            self._tree.expand_row(path,False)
 | 
			
		||||
 | 
			
		||||
    def change_db(self,db):
 | 
			
		||||
        self.set_model(db)
 | 
			
		||||
        self.set_model()
 | 
			
		||||
        db.connect('person-add', self.person_added)
 | 
			
		||||
        db.connect('person-update', self.person_updated)
 | 
			
		||||
        db.connect('person-delete', self.person_removed)
 | 
			
		||||
 | 
			
		||||
    def set_model(self,db,data_filter=None):
 | 
			
		||||
    def set_model(self,data_filter=None):
 | 
			
		||||
 | 
			
		||||
        self._model = PeopleModel(db,data_filter=data_filter)
 | 
			
		||||
        self._model = PeopleModel(self._dbstate.db,data_filter=data_filter)
 | 
			
		||||
 | 
			
		||||
        self._tree.set_model(self._model)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user