* src/PeopleModel.py: New GenericTreeView based model
* src/RelLib.py: metadata/people model support * src/gramps_main.py: PeopleModel support * src/PeopleView.py: PeopleModel support svn: r2978
This commit is contained in:
@ -45,7 +45,7 @@ _sel_mode = gtk.SELECTION_MULTIPLE
|
||||
# gtk
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import PeopleStore
|
||||
import PeopleModel
|
||||
import Filter
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
@ -59,94 +59,83 @@ class PeopleView:
|
||||
self.parent = parent
|
||||
|
||||
self.DataFilter = Filter.Filter("")
|
||||
self.ptabs = self.parent.gtop.get_widget("ptabs")
|
||||
self.pl_other = self.parent.gtop.get_widget("pl_other")
|
||||
|
||||
self.ptabs.set_show_tabs(0)
|
||||
|
||||
self.pl_page = [
|
||||
PeopleStore.PeopleStore(self.pl_other, self, self.row_changed,
|
||||
self.alpha_event, _sel_mode),
|
||||
]
|
||||
|
||||
self.person_tree = self.pl_page[0]
|
||||
self.person_list = self.pl_page[0].tree
|
||||
self.person_model = self.pl_page[0].model
|
||||
self.person_list.connect('button-press-event',self.on_plist_button_press)
|
||||
self.pscroll = self.parent.gtop.get_widget("pscroll")
|
||||
self.person_tree = self.parent.gtop.get_widget("person_tree")
|
||||
self.person_tree.set_rules_hint(gtk.TRUE)
|
||||
|
||||
self.default_list = self.pl_page[-1]
|
||||
renderer = gtk.CellRendererText()
|
||||
|
||||
column_n = gtk.TreeViewColumn(_('Name'), renderer,text=0)
|
||||
column_n.set_resizable(gtk.TRUE)
|
||||
column_n.set_clickable(gtk.TRUE)
|
||||
column_n.set_min_width(225)
|
||||
self.person_tree.append_column(column_n)
|
||||
|
||||
self.alpha_page = {}
|
||||
self.model2page = {}
|
||||
self.model_used = {}
|
||||
self.tab_list = []
|
||||
self.clearing_tabs = 0
|
||||
column_i = gtk.TreeViewColumn(_('ID'), renderer,text=1)
|
||||
column_i.set_resizable(gtk.TRUE)
|
||||
column_i.set_clickable(gtk.TRUE)
|
||||
column_i.set_min_width(75)
|
||||
self.person_tree.append_column(column_i)
|
||||
|
||||
column_g = gtk.TreeViewColumn(_('Gender'), renderer,text=2)
|
||||
column_g.set_resizable(gtk.TRUE)
|
||||
column_g.set_clickable(gtk.TRUE)
|
||||
column_g.set_min_width(75)
|
||||
self.person_tree.append_column(column_g)
|
||||
|
||||
column_b = gtk.TreeViewColumn(_('Birth Date'), renderer,text=3)
|
||||
column_b.set_resizable(gtk.TRUE)
|
||||
column_b.set_clickable(gtk.TRUE)
|
||||
column_b.set_min_width(150)
|
||||
self.person_tree.append_column(column_b)
|
||||
|
||||
column_d = gtk.TreeViewColumn(_('Death Date'), renderer,text=4)
|
||||
column_d.set_resizable(gtk.TRUE)
|
||||
column_d.set_clickable(gtk.TRUE)
|
||||
column_d.set_min_width(150)
|
||||
self.person_tree.append_column(column_d)
|
||||
self.build_tree()
|
||||
|
||||
def build_tree(self):
|
||||
self.person_tree.set_model(None)
|
||||
self.person_model = PeopleModel.PeopleModel(self.parent.db)
|
||||
self.person_tree.set_model(self.person_model)
|
||||
|
||||
self.person_selection = self.person_tree.get_selection()
|
||||
self.person_selection.connect('changed',self.row_changed)
|
||||
self.person_tree.connect('row_activated', self.alpha_event)
|
||||
self.person_tree.connect('button-press-event',self.on_plist_button_press)
|
||||
|
||||
def blist(self,store,path,iter,id_list):
|
||||
id_list.append(self.person_model.get_value(iter,1))
|
||||
|
||||
def get_selected_objects(self):
|
||||
mlist = []
|
||||
self.person_selection.selected_foreach(self.blist,mlist)
|
||||
return mlist
|
||||
|
||||
def row_changed(self,obj):
|
||||
"""Called with a row is changed. Check the selected objects from the person_tree
|
||||
to get the IDs of the selected objects. Set the active person to the first person
|
||||
in the list. If no one is selected, set the active person to None"""
|
||||
selected_id_list = self.person_tree.get_selected_objects()
|
||||
selected_id_list = self.get_selected_objects()
|
||||
if selected_id_list and selected_id_list[0]:
|
||||
try:
|
||||
self.parent.change_active_person(self.parent.db.get_person(selected_id_list[0]))
|
||||
person = self.parent.db.get_person(selected_id_list[0])
|
||||
self.parent.change_active_person(person)
|
||||
except:
|
||||
self.parent.change_active_person(None)
|
||||
self.person_tree.unselect()
|
||||
|
||||
def change_alpha_page(self,obj,junk,page):
|
||||
"""Change the page. Be careful not to take action while the pages
|
||||
are begin removed. If clearing_tabs is set, then we don't do anything"""
|
||||
|
||||
if self.clearing_tabs:
|
||||
return
|
||||
self.person_tree = self.pl_page[page]
|
||||
self.person_list = self.pl_page[page].tree
|
||||
self.person_model = self.pl_page[page].model
|
||||
if not self.model_used.has_key(self.person_tree) or self.model_used[self.person_tree] == 0:
|
||||
self.model_used[self.person_tree] = 1
|
||||
self.apply_filter(self.person_tree)
|
||||
self.person_list.connect('button-press-event',self.on_plist_button_press)
|
||||
|
||||
def clear_person_tabs(self):
|
||||
self.clearing_tabs = 1
|
||||
self.ptabs.hide()
|
||||
for i in range(0,len(self.tab_list)):
|
||||
self.ptabs.remove_page(0)
|
||||
self.ptabs.set_show_tabs(0)
|
||||
self.ptabs.show()
|
||||
self.clearing_tabs = 0
|
||||
|
||||
self.default_list.clear()
|
||||
|
||||
for page in self.pl_page[0:-1]:
|
||||
del page
|
||||
|
||||
self.pl_page = [
|
||||
self.default_list
|
||||
]
|
||||
|
||||
self.person_tree = self.pl_page[-1]
|
||||
self.person_list = self.pl_page[-1].tree
|
||||
self.person_model = self.pl_page[-1].model
|
||||
|
||||
self.id2col = {}
|
||||
self.tab_list = []
|
||||
self.alpha_page = {}
|
||||
self.model2page = {self.default_list : 0}
|
||||
self.model_used = {}
|
||||
|
||||
def change_db(self,db):
|
||||
self.id2col = {}
|
||||
self.build_tree()
|
||||
|
||||
def clear(self):
|
||||
for model in self.pl_page:
|
||||
model.clear()
|
||||
pass
|
||||
|
||||
def remove_from_person_list(self,person,old_id=None):
|
||||
"""Remove the selected person from the list. A person object is expected,
|
||||
not an ID"""
|
||||
|
||||
person_id = person.get_id()
|
||||
if old_id:
|
||||
del_id = old_id
|
||||
@ -235,168 +224,24 @@ class PeopleView:
|
||||
|
||||
def goto_active_person(self,first=0):
|
||||
if not self.parent.active_person:
|
||||
if first:
|
||||
page = 0
|
||||
else:
|
||||
page = self.ptabs.get_current_page()
|
||||
|
||||
self.person_tree = self.pl_page[page]
|
||||
self.person_list = self.pl_page[page].tree
|
||||
self.person_model = self.pl_page[page].model
|
||||
self.ptabs.set_current_page(page)
|
||||
return
|
||||
|
||||
id = self.parent.active_person.get_id()
|
||||
val = self.parent.db.get_person_display(id)
|
||||
if self.id2col.has_key(id):
|
||||
(model,iter) = self.id2col[id]
|
||||
else:
|
||||
pg = val[5]
|
||||
if pg and pg != '@':
|
||||
pg = pg[0]
|
||||
else:
|
||||
pg = ''
|
||||
if not self.alpha_page.has_key(pg):
|
||||
self.create_new_panel(pg)
|
||||
model = self.alpha_page[pg]
|
||||
iter = None
|
||||
p = self.parent.active_person
|
||||
id = p.get_id()
|
||||
path = self.person_model.find_path(id)
|
||||
top_path = self.person_model.find_path(p.get_primary_name().get_surname())
|
||||
self.person_tree.expand_row(top_path,1)
|
||||
self.person_selection.select_path(path)
|
||||
self.person_tree.scroll_to_cell(path,None,1,0.5,0)
|
||||
|
||||
self.ptabs.set_current_page(self.model2page[model])
|
||||
# itpath = model.model.get_path(iter)
|
||||
# col = model.tree.get_column(0)
|
||||
|
||||
if not self.model_used.has_key(model) or self.model_used[model] == 0 or not iter:
|
||||
self.model_used[model] = 1
|
||||
self.apply_filter(model)
|
||||
try:
|
||||
(model,iter) = self.id2col[id]
|
||||
except KeyError:
|
||||
return
|
||||
|
||||
if not iter:
|
||||
self.parent.status_text(_('Updating display...'))
|
||||
model.fill_row(val[-1])
|
||||
(m,iter) = self.id2col[id]
|
||||
self.parent.modify_statusbar()
|
||||
|
||||
try:
|
||||
model.selection.unselect_all()
|
||||
model.selection.select_iter(iter)
|
||||
except:
|
||||
print iter
|
||||
|
||||
itpath = model.model.get_path(iter)
|
||||
col = model.tree.get_column(0)
|
||||
model.tree.scroll_to_cell(itpath,col,1,0.5,0)
|
||||
|
||||
def alpha_event(self,obj):
|
||||
def alpha_event(self,obj,a,b):
|
||||
self.parent.load_person(self.parent.active_person)
|
||||
|
||||
def apply_filter(self,current_model=None):
|
||||
|
||||
self.parent.status_text(_('Updating display...'))
|
||||
|
||||
datacomp = self.DataFilter.compare
|
||||
if current_model == None:
|
||||
self.id2col = {}
|
||||
|
||||
for key in self.parent.db.sort_person_keys():
|
||||
person = self.parent.db.get_person(key)
|
||||
val = self.parent.db.get_person_display(key)
|
||||
pg = val[5]
|
||||
if pg and pg != '@':
|
||||
pg = pg[0]
|
||||
else:
|
||||
pg = ''
|
||||
|
||||
if datacomp(person):
|
||||
if self.id2col.has_key(key):
|
||||
continue
|
||||
if pg and pg != '@':
|
||||
if not self.alpha_page.has_key(pg):
|
||||
self.create_new_panel(pg)
|
||||
model = self.alpha_page[pg]
|
||||
else:
|
||||
model = self.default_list
|
||||
|
||||
if current_model == model:
|
||||
if val[3]:
|
||||
bdate_obj = self.parent.db.find_event_from_id(val[3])
|
||||
if bdate_obj:
|
||||
bdate = bdate_obj.get_date()
|
||||
else:
|
||||
bdate = ""
|
||||
else:
|
||||
bdate = ""
|
||||
|
||||
if val[4]:
|
||||
ddate_obj = self.parent.db.find_event_from_id(val[4])
|
||||
if ddate_obj:
|
||||
ddate = ddate_obj.get_date()
|
||||
else:
|
||||
ddate = ""
|
||||
else:
|
||||
ddate = ""
|
||||
iter = model.add([val[0],val[1],val[2],bdate,ddate,val[5],
|
||||
val[6],val[7],val[8]])
|
||||
self.id2col[key] = (model,iter)
|
||||
else:
|
||||
if self.id2col.has_key(key):
|
||||
(model,iter) = self.id2col[key]
|
||||
if iter:
|
||||
model.remove(iter)
|
||||
del self.id2col[key]
|
||||
|
||||
for i in self.pl_page:
|
||||
i.sort()
|
||||
|
||||
self.parent.modify_statusbar()
|
||||
|
||||
def create_new_panel(self,pg):
|
||||
|
||||
display = gtk.ScrolledWindow()
|
||||
display.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC)
|
||||
tree = gtk.TreeView()
|
||||
tree.show()
|
||||
display.add(tree)
|
||||
display.show()
|
||||
model = PeopleStore.PeopleStore(tree, self, self.row_changed,
|
||||
self.alpha_event,_sel_mode)
|
||||
self.alpha_page[pg] = model
|
||||
for index in range(0,len(self.tab_list)):
|
||||
try:
|
||||
if pg < self.tab_list[index]:
|
||||
self.ptabs.insert_page(display,gtk.Label(pg),index)
|
||||
self.ptabs.set_show_tabs(1)
|
||||
self.tab_list.insert(index,pg)
|
||||
self.pl_page.insert(index,model)
|
||||
break
|
||||
except:
|
||||
print index
|
||||
else:
|
||||
#added by EARNEY on 5/5/2003
|
||||
#modified the block below because sometimes certain
|
||||
#letters under people panel
|
||||
#will not load properly after a quick add
|
||||
#(ie, adding a parent under the family panel)
|
||||
index=len(self.tab_list)
|
||||
self.ptabs.insert_page(display,gtk.Label(pg),index)
|
||||
self.ptabs.set_show_tabs(1)
|
||||
self.tab_list.insert(index,pg)
|
||||
self.pl_page.insert(index,model)
|
||||
|
||||
#instead of the following..
|
||||
#self.ptabs.insert_page(display,gtk.Label(pg),len(self.tab_list))
|
||||
#self.ptabs.set_show_tabs(1)
|
||||
#self.tab_list.append(pg)
|
||||
#self.pl_page = self.pl_page[0:-1] + [model,self.default_list]
|
||||
|
||||
|
||||
for index in range(0,len(self.tab_list)):
|
||||
model = self.alpha_page[self.tab_list[index]]
|
||||
self.model2page[model] = index
|
||||
self.model_used[model] = 0
|
||||
self.model2page[self.default_list] = len(self.tab_list)
|
||||
self.model_used[self.default_list] = 0
|
||||
|
||||
|
||||
def on_plist_button_press(self,obj,event):
|
||||
if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3:
|
||||
@ -443,21 +288,7 @@ class PeopleView:
|
||||
menu.popup(None,None,None,event.button,event.time)
|
||||
|
||||
def redisplay_person_list(self,person):
|
||||
self.add_to_person_list(person,1)
|
||||
self.person_model.rebuild_data()
|
||||
|
||||
def update_person_list(self,person,old_id):
|
||||
key = person.get_id()
|
||||
if old_id != key:
|
||||
(model,iter) = self.id2col[old_id]
|
||||
del self.id2col[old_id]
|
||||
self.id2col[key] = (model,iter)
|
||||
else:
|
||||
(model,iter) = self.id2col[key]
|
||||
|
||||
val = self.parent.db.get_person_display(person.get_id())
|
||||
pg = unicode(val[5])[0]
|
||||
if self.DataFilter.compare(person):
|
||||
col = 0
|
||||
for object in val[:-1]:
|
||||
model.model.set_value(iter,col,object)
|
||||
col = col + 1
|
||||
self.person_model.rebuild_data()
|
||||
|
Reference in New Issue
Block a user