* src/PedView.py: Use ReportUtils to generate text; highlight selected person; enable Tooltips; Optionally show peoples images
svn: r5646
This commit is contained in:
parent
a0c8752fb0
commit
e91d774f2a
@ -1,5 +1,7 @@
|
|||||||
2005-12-30 Martin Hawlisch <Martin.Hawlisch@gmx.de>
|
2005-12-30 Martin Hawlisch <Martin.Hawlisch@gmx.de>
|
||||||
* src/ReportUtils.py: Use new RelLib API
|
* src/ReportUtils.py: Use new RelLib API
|
||||||
|
* src/PedView.py: Use ReportUtils to generate text; highlight selected
|
||||||
|
person; enable Tooltips; Optionally show peoples images
|
||||||
|
|
||||||
2005-12-29 Don Allingham <don@gramps-project.org>
|
2005-12-29 Don Allingham <don@gramps-project.org>
|
||||||
* src/GrampsLocale.py: handle platform specific locale issues
|
* src/GrampsLocale.py: handle platform specific locale issues
|
||||||
|
133
src/PedView.py
133
src/PedView.py
@ -49,6 +49,8 @@ import Relationship
|
|||||||
import NameDisplay
|
import NameDisplay
|
||||||
import Utils
|
import Utils
|
||||||
import DateHandler
|
import DateHandler
|
||||||
|
import ImgManip
|
||||||
|
import ReportUtils
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -64,49 +66,74 @@ _BURI = _('bur.')
|
|||||||
_CREM = _('crem.')
|
_CREM = _('crem.')
|
||||||
|
|
||||||
class PersonBoxWidget_old( gtk.Button):
|
class PersonBoxWidget_old( gtk.Button):
|
||||||
def __init__(self,fh,person,maxlines):
|
def __init__(self,fh,person,maxlines,image=None):
|
||||||
print "PersonBoxWidget"
|
if person:
|
||||||
print person
|
gtk.Button.__init__(self, fh.format_person(person, maxlines))
|
||||||
gtk.Button.__init__(self, fh.format_person(person, maxlines))
|
gender = person.get_gender()
|
||||||
|
if gender == RelLib.Person.MALE:
|
||||||
|
self.modify_bg( gtk.STATE_NORMAL, self.get_colormap().alloc_color("#F5FFFF"))
|
||||||
|
elif gender == RelLib.Person.FEMALE:
|
||||||
|
self.modify_bg( gtk.STATE_NORMAL, self.get_colormap().alloc_color("#FFF5FF"))
|
||||||
|
else:
|
||||||
|
self.modify_bg( gtk.STATE_NORMAL, self.get_colormap().alloc_color("#FFFFF5"))
|
||||||
|
else:
|
||||||
|
gtk.Button.__init__(self, " ")
|
||||||
|
#self.set_sensitive(False)
|
||||||
self.fh = fh
|
self.fh = fh
|
||||||
self.set_alignment(0.0,0.0)
|
self.set_alignment(0.0,0.0)
|
||||||
gender = person.get_gender()
|
|
||||||
if gender == RelLib.Person.MALE:
|
|
||||||
self.modify_bg( gtk.STATE_NORMAL, self.get_colormap().alloc_color("#F5FFFF"))
|
|
||||||
elif gender == RelLib.Person.FEMALE:
|
|
||||||
self.modify_bg( gtk.STATE_NORMAL, self.get_colormap().alloc_color("#FFF5FF"))
|
|
||||||
else:
|
|
||||||
self.modify_bg( gtk.STATE_NORMAL, self.get_colormap().alloc_color("#FFFFF5"))
|
|
||||||
white = self.get_colormap().alloc_color("white")
|
white = self.get_colormap().alloc_color("white")
|
||||||
self.modify_bg( gtk.STATE_ACTIVE, white)
|
self.modify_bg( gtk.STATE_ACTIVE, white)
|
||||||
self.modify_bg( gtk.STATE_PRELIGHT, white)
|
self.modify_bg( gtk.STATE_PRELIGHT, white)
|
||||||
self.modify_bg( gtk.STATE_SELECTED, white)
|
self.modify_bg( gtk.STATE_SELECTED, white)
|
||||||
|
|
||||||
class PersonBoxWidget( gtk.DrawingArea):
|
class PersonBoxWidget( gtk.DrawingArea):
|
||||||
def __init__(self,fh,person,maxlines):
|
def __init__(self,fh,person,maxlines,image=None):
|
||||||
gtk.DrawingArea.__init__(self)
|
gtk.DrawingArea.__init__(self)
|
||||||
self.add_events(gtk.gdk.BUTTON_PRESS_MASK)
|
self.add_events(gtk.gdk.BUTTON_PRESS_MASK) # Required for popup menu
|
||||||
|
self.add_events(gtk.gdk.ENTER_NOTIFY_MASK) # Required for tooltip and mouse-over
|
||||||
|
self.add_events(gtk.gdk.LEAVE_NOTIFY_MASK) # Required for tooltip and mouse-over
|
||||||
self.fh = fh
|
self.fh = fh
|
||||||
self.person = person
|
self.person = person
|
||||||
self.maxlines = maxlines
|
self.maxlines = maxlines
|
||||||
|
self.image = image
|
||||||
self.init_done = False
|
self.init_done = False
|
||||||
self.connect("expose_event", self.expose)
|
self.connect("expose_event", self.expose)
|
||||||
text = ""
|
text = ""
|
||||||
if self.person:
|
if self.person:
|
||||||
text = self.fh.format_person(self.person,self.maxlines)
|
text = self.fh.format_person(self.person,self.maxlines)
|
||||||
|
self.connect("enter-notify-event", self.on_enter_cb) # enable mouse-over
|
||||||
|
self.connect("leave-notify-event", self.on_leave_cb)
|
||||||
self.textlayout = self.create_pango_layout(text)
|
self.textlayout = self.create_pango_layout(text)
|
||||||
s = self.textlayout.get_pixel_size()
|
s = self.textlayout.get_pixel_size()
|
||||||
xmin = s[0] + 11
|
xmin = s[0] + 11
|
||||||
ymin = s[1] + 11
|
ymin = s[1] + 11
|
||||||
|
if image:
|
||||||
|
xmin += image.get_width()
|
||||||
|
ymin = max( ymin,image.get_height())
|
||||||
self.set_size_request(max(xmin,120),max(ymin,25))
|
self.set_size_request(max(xmin,120),max(ymin,25))
|
||||||
|
|
||||||
|
def on_enter_cb(self,widget,event):
|
||||||
|
'''' On mouse-over hightlight border'''
|
||||||
|
try:
|
||||||
|
self.border_gc.line_width = 3
|
||||||
|
self.queue_draw()
|
||||||
|
except AttributeError:
|
||||||
|
pass # ignore missing self.border_gc because we are not yet exposed
|
||||||
|
|
||||||
|
def on_leave_cb(self,widget,event):
|
||||||
|
try:
|
||||||
|
self.border_gc.line_width = 1
|
||||||
|
self.queue_draw()
|
||||||
|
except AttributeError:
|
||||||
|
pass # ignore missing self.border_gc because we are not yet exposed
|
||||||
|
|
||||||
def expose(self,widget,event):
|
def expose(self,widget,event):
|
||||||
if not self.init_done:
|
if not self.init_done:
|
||||||
self.bg_gc = self.window.new_gc()
|
self.bg_gc = self.window.new_gc()
|
||||||
self.text_gc = self.window.new_gc()
|
self.text_gc = self.window.new_gc()
|
||||||
self.border_gc = self.window.new_gc()
|
self.border_gc = self.window.new_gc()
|
||||||
self.border_gc.line_style = gtk.gdk.LINE_SOLID
|
self.border_gc.line_style = gtk.gdk.LINE_SOLID
|
||||||
self.border_gc.line_width = 3
|
self.border_gc.line_width = 1
|
||||||
self.shadow_gc = self.window.new_gc()
|
self.shadow_gc = self.window.new_gc()
|
||||||
self.shadow_gc.line_style = gtk.gdk.LINE_SOLID
|
self.shadow_gc.line_style = gtk.gdk.LINE_SOLID
|
||||||
self.shadow_gc.line_width = 3
|
self.shadow_gc.line_width = 3
|
||||||
@ -127,7 +154,12 @@ class PersonBoxWidget( gtk.DrawingArea):
|
|||||||
self.window.draw_rectangle(self.bg_gc, True, 1, 1, alloc.width-5, alloc.height-5)
|
self.window.draw_rectangle(self.bg_gc, True, 1, 1, alloc.width-5, alloc.height-5)
|
||||||
if self.person:
|
if self.person:
|
||||||
self.window.draw_layout( self.text_gc, 5,5, self.textlayout)
|
self.window.draw_layout( self.text_gc, 5,5, self.textlayout)
|
||||||
self.window.draw_rectangle(self.border_gc, False, 1, 1, alloc.width-5, alloc.height-5)
|
if self.image:
|
||||||
|
self.window.draw_pixbuf( self.text_gc, self.image, 0,0, alloc.width-4-self.image.get_width(),1)
|
||||||
|
if self.border_gc.line_width > 1:
|
||||||
|
self.window.draw_rectangle(self.border_gc, False, 1, 1, alloc.width-5, alloc.height-5)
|
||||||
|
else:
|
||||||
|
self.window.draw_rectangle(self.border_gc, False, 0, 0, alloc.width-3, alloc.height-3)
|
||||||
self.window.draw_line(self.shadow_gc, 3, alloc.height-1, alloc.width-1, alloc.height-1)
|
self.window.draw_line(self.shadow_gc, 3, alloc.height-1, alloc.width-1, alloc.height-1)
|
||||||
self.window.draw_line(self.shadow_gc, alloc.width-1, 3, alloc.width-1, alloc.height-1)
|
self.window.draw_line(self.shadow_gc, alloc.width-1, 3, alloc.width-1, alloc.height-1)
|
||||||
|
|
||||||
@ -135,6 +167,9 @@ class FormattingHelper:
|
|||||||
def __init__(self,db):
|
def __init__(self,db):
|
||||||
self.db = db
|
self.db = db
|
||||||
|
|
||||||
|
def change_db(self,db):
|
||||||
|
self.db = db
|
||||||
|
|
||||||
def format_relation( self, family, line_count):
|
def format_relation( self, family, line_count):
|
||||||
text = ""
|
text = ""
|
||||||
for event_ref in family.get_event_ref_list():
|
for event_ref in family.get_event_ref_list():
|
||||||
@ -172,26 +207,12 @@ class FormattingHelper:
|
|||||||
name = NameDisplay.displayer.display(person)
|
name = NameDisplay.displayer.display(person)
|
||||||
if line_count < 3:
|
if line_count < 3:
|
||||||
return name
|
return name
|
||||||
birth_ref = person.get_birth_ref()
|
bdate,bplace,bdate_full,bdate_mod,ddate,dplace,ddate_full,ddate_mod = \
|
||||||
bd=""
|
ReportUtils.get_birth_death_strings(self.db,person)
|
||||||
bp=""
|
|
||||||
if birth_ref:
|
|
||||||
birth = self.db.get_event_from_handle(birth_ref.ref)
|
|
||||||
if birth:
|
|
||||||
bd = DateHandler.get_date(birth)
|
|
||||||
bp = self.get_place_name(birth.get_place_handle())
|
|
||||||
death_ref = person.get_death_ref()
|
|
||||||
dd=""
|
|
||||||
dp=""
|
|
||||||
if death_ref:
|
|
||||||
death = self.db.get_event_from_handle(death_ref.ref)
|
|
||||||
if death:
|
|
||||||
dd = DateHandler.get_date(death)
|
|
||||||
dp = self.get_place_name(death.get_place_handle())
|
|
||||||
if line_count < 5:
|
if line_count < 5:
|
||||||
return "%s\n* %s\n+ %s" % (name,bd,dd)
|
return "%s\n* %s\n+ %s" % (name,bdate,ddate)
|
||||||
else:
|
else:
|
||||||
return "%s\n* %s\n %s\n+ %s\n %s" % (name,bd,bp,dd,dp)
|
return "%s\n* %s\n %s\n+ %s\n %s" % (name,bdate,bplace,ddate,dplace)
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -206,6 +227,7 @@ class PedView(PageView.PersonNavView):
|
|||||||
dbstate.connect('active-changed',self.goto_active_person)
|
dbstate.connect('active-changed',self.goto_active_person)
|
||||||
self.force_size = 0 # Automatic resize
|
self.force_size = 0 # Automatic resize
|
||||||
self.tree_style = 0 # Nice tree
|
self.tree_style = 0 # Nice tree
|
||||||
|
self.show_images = True # Show photos of persons
|
||||||
self.db = dbstate.db
|
self.db = dbstate.db
|
||||||
self.format_helper = FormattingHelper( self.db)
|
self.format_helper = FormattingHelper( self.db)
|
||||||
|
|
||||||
@ -245,6 +267,9 @@ class PedView(PageView.PersonNavView):
|
|||||||
contains the interface. This containter will be inserted into
|
contains the interface. This containter will be inserted into
|
||||||
a gtk.Notebook page.
|
a gtk.Notebook page.
|
||||||
"""
|
"""
|
||||||
|
self.tooltips = gtk.Tooltips()
|
||||||
|
self.tooltips.enable()
|
||||||
|
|
||||||
self.notebook = gtk.Notebook()
|
self.notebook = gtk.Notebook()
|
||||||
self.notebook.connect("button-press-event", self.on_show_option_menu_cb)
|
self.notebook.connect("button-press-event", self.on_show_option_menu_cb)
|
||||||
self.bootstrap_handler = self.notebook.connect("expose-event", self.init_parent_signals_cb)
|
self.bootstrap_handler = self.notebook.connect("expose-event", self.init_parent_signals_cb)
|
||||||
@ -323,6 +348,7 @@ class PedView(PageView.PersonNavView):
|
|||||||
from self.state.db
|
from self.state.db
|
||||||
"""
|
"""
|
||||||
self.db = db
|
self.db = db
|
||||||
|
self.format_helper.change_db(db)
|
||||||
db.connect('person-add', self.person_updated_cb)
|
db.connect('person-add', self.person_updated_cb)
|
||||||
db.connect('person-update', self.person_updated_cb)
|
db.connect('person-update', self.person_updated_cb)
|
||||||
db.connect('person-delete', self.person_updated_cb)
|
db.connect('person-delete', self.person_updated_cb)
|
||||||
@ -499,8 +525,6 @@ class PedView(PageView.PersonNavView):
|
|||||||
child.destroy()
|
child.destroy()
|
||||||
table_widget.resize(1,1)
|
table_widget.resize(1,1)
|
||||||
|
|
||||||
tooltip = gtk.Tooltips()
|
|
||||||
|
|
||||||
debug = False
|
debug = False
|
||||||
if debug:
|
if debug:
|
||||||
xmax = 0
|
xmax = 0
|
||||||
@ -532,7 +556,7 @@ class PedView(PageView.PersonNavView):
|
|||||||
h = positions[i][0][3]
|
h = positions[i][0][3]
|
||||||
if not lst[i]:
|
if not lst[i]:
|
||||||
# No person -> show empty box
|
# No person -> show empty box
|
||||||
pw = PersonBoxWidget( self.format_helper, None, 0);
|
pw = PersonBoxWidget( self.format_helper, None, 0, None);
|
||||||
if positions[i][0][2] > 1:
|
if positions[i][0][2] > 1:
|
||||||
table_widget.attach(pw,x,x+w,y,y+h,gtk.FILL,gtk.FILL,0,0)
|
table_widget.attach(pw,x,x+w,y,y+h,gtk.FILL,gtk.FILL,0,0)
|
||||||
else:
|
else:
|
||||||
@ -542,9 +566,21 @@ class PedView(PageView.PersonNavView):
|
|||||||
if y+h > ymax:
|
if y+h > ymax:
|
||||||
ymax = y+h
|
ymax = y+h
|
||||||
else:
|
else:
|
||||||
pw = PersonBoxWidget( self.format_helper, lst[i][0], positions[i][0][3]);
|
# Get foto
|
||||||
if i > 0 and positions[i][2] < 3:
|
image = None
|
||||||
tooltip.set_tip(pw, self.format_helper.format_person(lst[i][0], 11))
|
if self.show_images and i < ((len(positions)-1)/2) and positions[i][0][3] > 1:
|
||||||
|
media_list = lst[i][0].get_media_list()
|
||||||
|
if media_list:
|
||||||
|
ph = media_list[0]
|
||||||
|
object_handle = ph.get_reference_handle()
|
||||||
|
obj = self.db.get_object_from_handle(object_handle)
|
||||||
|
if obj:
|
||||||
|
mtype = obj.get_mime_type()
|
||||||
|
if mtype[0:5] == "image":
|
||||||
|
image = ImgManip.get_thumbnail_image(obj.get_path())
|
||||||
|
pw = PersonBoxWidget( self.format_helper, lst[i][0], positions[i][0][3], image);
|
||||||
|
if positions[i][0][3] < 7:
|
||||||
|
self.tooltips.set_tip(pw, self.format_helper.format_person(lst[i][0], 11))
|
||||||
|
|
||||||
pw.set_data(_PERSON,lst[i][0].get_handle())
|
pw.set_data(_PERSON,lst[i][0].get_handle())
|
||||||
pw.connect("button-press-event", self.build_full_nav_menu_cb)
|
pw.connect("button-press-event", self.build_full_nav_menu_cb)
|
||||||
@ -643,8 +679,7 @@ class PedView(PageView.PersonNavView):
|
|||||||
table_widget.show_all()
|
table_widget.show_all()
|
||||||
|
|
||||||
def line_expose_cb(self, area, event):
|
def line_expose_cb(self, area, event):
|
||||||
style = area.get_style()
|
gc = area.window.new_gc()
|
||||||
gc = style.fg_gc[gtk.STATE_NORMAL]
|
|
||||||
alloc = area.get_allocation()
|
alloc = area.get_allocation()
|
||||||
idx = area.get_data("idx")
|
idx = area.get_data("idx")
|
||||||
rela = area.get_data("rela")
|
rela = area.get_data("rela")
|
||||||
@ -661,8 +696,7 @@ class PedView(PageView.PersonNavView):
|
|||||||
area.window.draw_line(gc, alloc.width/2, alloc.height, alloc.width/2,alloc.height/2)
|
area.window.draw_line(gc, alloc.width/2, alloc.height, alloc.width/2,alloc.height/2)
|
||||||
|
|
||||||
def tree_expose_cb(self, area, event):
|
def tree_expose_cb(self, area, event):
|
||||||
style = area.get_style()
|
gc = area.window.new_gc()
|
||||||
gc = style.fg_gc[gtk.STATE_NORMAL]
|
|
||||||
alloc = area.get_allocation()
|
alloc = area.get_allocation()
|
||||||
h = area.get_data("height")
|
h = area.get_data("height")
|
||||||
gap = alloc.height / (h*2)
|
gap = alloc.height / (h*2)
|
||||||
@ -765,6 +799,10 @@ class PedView(PageView.PersonNavView):
|
|||||||
self.tree_style = data
|
self.tree_style = data
|
||||||
self.rebuild_trees(self.dbstate.active) # Rebuild using new style
|
self.rebuild_trees(self.dbstate.active) # Rebuild using new style
|
||||||
|
|
||||||
|
def change_show_images_cb(self,event):
|
||||||
|
self.show_images = not self.show_images
|
||||||
|
self.rebuild_trees(self.dbstate.active) # Rebuild using new style
|
||||||
|
|
||||||
def find_tree(self,person,index,depth,lst,val=0):
|
def find_tree(self,person,index,depth,lst,val=0):
|
||||||
"""Recursively build a list of ancestors"""
|
"""Recursively build a list of ancestors"""
|
||||||
|
|
||||||
@ -826,6 +864,15 @@ class PedView(PageView.PersonNavView):
|
|||||||
menu.append(item)
|
menu.append(item)
|
||||||
|
|
||||||
def add_settings_to_menu(self,menu):
|
def add_settings_to_menu(self,menu):
|
||||||
|
entry = gtk.ImageMenuItem(_("Show images"))
|
||||||
|
if self.show_images:
|
||||||
|
current_show_images_image = gtk.image_new_from_stock(gtk.STOCK_APPLY,gtk.ICON_SIZE_MENU)
|
||||||
|
current_show_images_image.show()
|
||||||
|
entry.set_image(current_show_images_image)
|
||||||
|
entry.connect("activate", self.change_show_images_cb)
|
||||||
|
entry.show()
|
||||||
|
menu.append(entry)
|
||||||
|
|
||||||
item = gtk.MenuItem(_("Tree style"))
|
item = gtk.MenuItem(_("Tree style"))
|
||||||
item.set_submenu(gtk.Menu())
|
item.set_submenu(gtk.Menu())
|
||||||
style_menu = item.get_submenu()
|
style_menu = item.get_submenu()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user