* src/PedView.py: Use ReportUtils to generate text; highlight selected person; enable Tooltips; Optionally show peoples images
svn: r5646
This commit is contained in:
		@@ -1,5 +1,7 @@
 | 
			
		||||
2005-12-30  Martin Hawlisch  <Martin.Hawlisch@gmx.de>
 | 
			
		||||
	* 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>
 | 
			
		||||
	* src/GrampsLocale.py: handle platform specific locale issues
 | 
			
		||||
 
 | 
			
		||||
@@ -49,6 +49,8 @@ import Relationship
 | 
			
		||||
import NameDisplay
 | 
			
		||||
import Utils
 | 
			
		||||
import DateHandler
 | 
			
		||||
import ImgManip
 | 
			
		||||
import ReportUtils
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
@@ -64,49 +66,74 @@ _BURI = _('bur.')
 | 
			
		||||
_CREM = _('crem.')
 | 
			
		||||
 | 
			
		||||
class PersonBoxWidget_old( gtk.Button):
 | 
			
		||||
    def __init__(self,fh,person,maxlines):
 | 
			
		||||
        print "PersonBoxWidget"
 | 
			
		||||
        print person
 | 
			
		||||
        gtk.Button.__init__(self, fh.format_person(person, maxlines))
 | 
			
		||||
    def __init__(self,fh,person,maxlines,image=None):
 | 
			
		||||
        if person:
 | 
			
		||||
            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.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")
 | 
			
		||||
        self.modify_bg( gtk.STATE_ACTIVE, white)
 | 
			
		||||
        self.modify_bg( gtk.STATE_PRELIGHT, white)
 | 
			
		||||
        self.modify_bg( gtk.STATE_SELECTED, white)
 | 
			
		||||
 | 
			
		||||
class PersonBoxWidget( gtk.DrawingArea):
 | 
			
		||||
    def __init__(self,fh,person,maxlines):
 | 
			
		||||
    def __init__(self,fh,person,maxlines,image=None):
 | 
			
		||||
        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.person = person
 | 
			
		||||
        self.maxlines = maxlines
 | 
			
		||||
        self.image = image
 | 
			
		||||
        self.init_done = False
 | 
			
		||||
        self.connect("expose_event", self.expose)
 | 
			
		||||
        text = ""
 | 
			
		||||
        if self.person:
 | 
			
		||||
            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)
 | 
			
		||||
        s = self.textlayout.get_pixel_size()
 | 
			
		||||
        xmin = s[0] + 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))
 | 
			
		||||
    
 | 
			
		||||
    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):
 | 
			
		||||
        if not self.init_done:
 | 
			
		||||
            self.bg_gc = self.window.new_gc()
 | 
			
		||||
            self.text_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_width = 3
 | 
			
		||||
            self.border_gc.line_width = 1
 | 
			
		||||
            self.shadow_gc = self.window.new_gc()
 | 
			
		||||
            self.shadow_gc.line_style = gtk.gdk.LINE_SOLID
 | 
			
		||||
            self.shadow_gc.line_width = 3
 | 
			
		||||
@@ -127,13 +154,21 @@ class PersonBoxWidget( gtk.DrawingArea):
 | 
			
		||||
        self.window.draw_rectangle(self.bg_gc, True, 1, 1, alloc.width-5, alloc.height-5)
 | 
			
		||||
        if self.person:
 | 
			
		||||
            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, alloc.width-1, 3, alloc.width-1, alloc.height-1)
 | 
			
		||||
 | 
			
		||||
class FormattingHelper:
 | 
			
		||||
    def __init__(self,db):
 | 
			
		||||
        self.db = db
 | 
			
		||||
    
 | 
			
		||||
    def change_db(self,db):
 | 
			
		||||
        self.db = db
 | 
			
		||||
        
 | 
			
		||||
    def format_relation( self, family, line_count):
 | 
			
		||||
        text = ""
 | 
			
		||||
@@ -172,26 +207,12 @@ class FormattingHelper:
 | 
			
		||||
        name = NameDisplay.displayer.display(person)
 | 
			
		||||
        if line_count < 3:
 | 
			
		||||
            return name
 | 
			
		||||
        birth_ref = person.get_birth_ref()
 | 
			
		||||
        bd=""
 | 
			
		||||
        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())
 | 
			
		||||
        bdate,bplace,bdate_full,bdate_mod,ddate,dplace,ddate_full,ddate_mod = \
 | 
			
		||||
                        ReportUtils.get_birth_death_strings(self.db,person)
 | 
			
		||||
        if line_count < 5:
 | 
			
		||||
            return "%s\n* %s\n+ %s" % (name,bd,dd)
 | 
			
		||||
            return "%s\n* %s\n+ %s" % (name,bdate,ddate)
 | 
			
		||||
        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)
 | 
			
		||||
        self.force_size = 0 # Automatic resize
 | 
			
		||||
        self.tree_style = 0 # Nice tree
 | 
			
		||||
        self.show_images = True # Show photos of persons
 | 
			
		||||
        self.db = dbstate.db
 | 
			
		||||
        self.format_helper = FormattingHelper( self.db)
 | 
			
		||||
 | 
			
		||||
@@ -245,6 +267,9 @@ class PedView(PageView.PersonNavView):
 | 
			
		||||
        contains the interface. This containter will be inserted into
 | 
			
		||||
        a gtk.Notebook page.
 | 
			
		||||
        """
 | 
			
		||||
        self.tooltips = gtk.Tooltips()
 | 
			
		||||
        self.tooltips.enable()
 | 
			
		||||
        
 | 
			
		||||
        self.notebook = gtk.Notebook()
 | 
			
		||||
        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)
 | 
			
		||||
@@ -323,6 +348,7 @@ class PedView(PageView.PersonNavView):
 | 
			
		||||
        from self.state.db
 | 
			
		||||
        """
 | 
			
		||||
        self.db = db
 | 
			
		||||
        self.format_helper.change_db(db)
 | 
			
		||||
        db.connect('person-add', self.person_updated_cb)
 | 
			
		||||
        db.connect('person-update', self.person_updated_cb)
 | 
			
		||||
        db.connect('person-delete', self.person_updated_cb)
 | 
			
		||||
@@ -499,8 +525,6 @@ class PedView(PageView.PersonNavView):
 | 
			
		||||
            child.destroy()
 | 
			
		||||
        table_widget.resize(1,1)
 | 
			
		||||
        
 | 
			
		||||
        tooltip = gtk.Tooltips()
 | 
			
		||||
        
 | 
			
		||||
        debug = False
 | 
			
		||||
        if debug:
 | 
			
		||||
            xmax = 0
 | 
			
		||||
@@ -532,7 +556,7 @@ class PedView(PageView.PersonNavView):
 | 
			
		||||
                h = positions[i][0][3]
 | 
			
		||||
                if not lst[i]:
 | 
			
		||||
                    # 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:
 | 
			
		||||
                        table_widget.attach(pw,x,x+w,y,y+h,gtk.FILL,gtk.FILL,0,0)
 | 
			
		||||
                    else:
 | 
			
		||||
@@ -542,9 +566,21 @@ class PedView(PageView.PersonNavView):
 | 
			
		||||
                    if y+h > ymax:
 | 
			
		||||
                        ymax = y+h
 | 
			
		||||
                else:
 | 
			
		||||
                    pw = PersonBoxWidget( self.format_helper, lst[i][0], positions[i][0][3]);
 | 
			
		||||
                    if i > 0 and positions[i][2] < 3:
 | 
			
		||||
                        tooltip.set_tip(pw, self.format_helper.format_person(lst[i][0], 11))
 | 
			
		||||
                    # Get foto
 | 
			
		||||
                    image = None
 | 
			
		||||
                    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.connect("button-press-event", self.build_full_nav_menu_cb)
 | 
			
		||||
@@ -643,8 +679,7 @@ class PedView(PageView.PersonNavView):
 | 
			
		||||
        table_widget.show_all()
 | 
			
		||||
 | 
			
		||||
    def line_expose_cb(self, area, event):
 | 
			
		||||
        style = area.get_style()
 | 
			
		||||
        gc = style.fg_gc[gtk.STATE_NORMAL]
 | 
			
		||||
        gc = area.window.new_gc()
 | 
			
		||||
        alloc = area.get_allocation()
 | 
			
		||||
        idx = area.get_data("idx")
 | 
			
		||||
        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)
 | 
			
		||||
 | 
			
		||||
    def tree_expose_cb(self, area, event):
 | 
			
		||||
        style = area.get_style()
 | 
			
		||||
        gc = style.fg_gc[gtk.STATE_NORMAL]
 | 
			
		||||
        gc = area.window.new_gc()
 | 
			
		||||
        alloc = area.get_allocation()
 | 
			
		||||
        h = area.get_data("height")
 | 
			
		||||
        gap = alloc.height / (h*2)
 | 
			
		||||
@@ -765,6 +799,10 @@ class PedView(PageView.PersonNavView):
 | 
			
		||||
                self.tree_style = data
 | 
			
		||||
                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):
 | 
			
		||||
        """Recursively build a list of ancestors"""
 | 
			
		||||
 | 
			
		||||
@@ -826,6 +864,15 @@ class PedView(PageView.PersonNavView):
 | 
			
		||||
            menu.append(item)
 | 
			
		||||
 | 
			
		||||
    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.set_submenu(gtk.Menu())
 | 
			
		||||
        style_menu = item.get_submenu()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user