gramps/gramps2/src/PeopleView.py
2003-12-25 04:14:51 +00:00

426 lines
14 KiB
Python

# -*- coding: utf-8 -*-
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000-2003 Donald N. Allingham
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id$
#-------------------------------------------------------------------------
#
# internationalization
#
#-------------------------------------------------------------------------
from gettext import gettext as _
#-------------------------------------------------------------------------
#
# gtk
#
#-------------------------------------------------------------------------
import gtk
import gtk.glade
from gtk.gdk import ACTION_COPY, BUTTON1_MASK
_sel_mode = gtk.SELECTION_MULTIPLE
#-------------------------------------------------------------------------
#
# gtk
#
#-------------------------------------------------------------------------
import PeopleStore
import Filter
#-------------------------------------------------------------------------
#
# PeopleView
#
#-------------------------------------------------------------------------
class PeopleView:
def __init__(self,parent):
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.default_list = self.pl_page[-1]
self.alpha_page = {}
self.model2page = {}
self.model_used = {}
self.tab_list = []
self.clearing_tabs = 0
def row_changed(self,obj):
mlist = self.person_tree.get_selected_objects()
if mlist and mlist[0]:
try:
self.parent.change_active_person(self.parent.db.getPerson(mlist[0]))
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)
mlist = self.person_tree.get_selected_objects()
if mlist:
self.parent.set_buttons(1)
else:
self.parent.set_buttons(0)
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 = {}
def clear(self):
for model in self.pl_page:
model.clear()
def remove_from_person_list(self,person,old_id=None):
pid = person.getId()
if old_id:
del_id = old_id
else:
del_id = pid
if self.id2col.has_key(del_id):
(model,iter) = self.id2col[del_id]
if iter:
model.remove(iter)
del self.id2col[del_id]
if person == self.parent.active_person:
self.parent.active_person = None
def remove_from_history(self,person,old_id=None):
pid = person.getId()
if old_id:
del_id = old_id
else:
del_id = pid
hc = self.parent.history.count(del_id)
for c in range(hc):
self.parent.history.remove(del_id)
self.parent.hindex = self.parent.hindex - 1
mhc = self.parent.mhistory.count(del_id)
for c in range(mhc):
self.parent.mhistory.remove(del_id)
def apply_filter_clicked(self):
invert_filter = self.parent.filter_inv.get_active()
qualifer = unicode(self.parent.filter_text.get_text())
mi = self.parent.filter_list.get_menu().get_active()
class_init = mi.get_data("function")
self.DataFilter = class_init(qualifer)
self.DataFilter.set_invert(invert_filter)
self.model_used = {}
self.clear_person_tabs()
self.apply_filter(self.person_tree)
self.goto_active_person()
def add_to_person_list(self,person,change):
key = person.getId()
val = self.parent.db.getPersonDisplay(person.getId())
pg = unicode(val[5])
pg = pg[0]
if self.DataFilter.compare(person):
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
iter = model.add([val[0],val[1],val[2],val[3],val[4],val[5],
val[6],val[7],val[8]],1)
self.id2col[key] = (model,iter)
if change:
self.parent.change_active_person(person)
self.goto_active_person()
model.enable_sort()
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.getId()
val = self.parent.db.getPersonDisplay(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
self.ptabs.set_current_page(self.model2page[model])
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.expand_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):
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.sortPersonKeys():
person = self.parent.db.getPerson(key)
val = self.parent.db.getPersonDisplay(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:
iter = model.add([val[0],val[1],val[2],val[3],val[4],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:
self.build_people_context_menu(event)
def build_people_context_menu(self,event):
"""Builds the menu with navigation and
editing operations on the people's list"""
back_sensitivity = self.parent.hindex > 0
fwd_sensitivity = self.parent.hindex + 1 < len(self.parent.history)
mlist = self.person_tree.get_selected_objects()
if mlist:
sel_sensitivity = 1
else:
sel_sensitivity = 0
entries = [
(gtk.STOCK_GO_BACK,self.parent.back_clicked,back_sensitivity),
(gtk.STOCK_GO_FORWARD,self.parent.fwd_clicked,fwd_sensitivity),
#FIXME: revert to stock item when German gtk translation is fixed
#(gtk.STOCK_HOME,self.parent.on_home_clicked,1),
(_("Home"),self.parent.on_home_clicked,1),
(_("Add Bookmark"),self.parent.on_add_bookmark_activate,sel_sensitivity),
(None,None,0),
(gtk.STOCK_ADD, self.parent.add_button_clicked,1),
(gtk.STOCK_REMOVE, self.parent.remove_button_clicked,sel_sensitivity),
(_("Edit"), self.parent.edit_button_clicked,sel_sensitivity),
]
menu = gtk.Menu()
menu.set_title(_('People Menu'))
for stock_id,callback,sensitivity in entries:
item = gtk.ImageMenuItem(stock_id)
#FIXME: remove when German gtk translation is fixed
if stock_id == _("Home"):
im = gtk.image_new_from_stock(gtk.STOCK_HOME,gtk.ICON_SIZE_MENU)
im.show()
item.set_image(im)
if callback:
item.connect("activate",callback)
item.set_sensitive(sensitivity)
item.show()
menu.append(item)
menu.popup(None,None,None,event.button,event.time)
def redisplay_person_list(self,person):
self.add_to_person_list(person,1)
def update_person_list(self,person,old_id):
key = person.getId()
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.getPersonDisplay(person.getId())
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