Geography : Add ID property to some new sources.

Add a new layer which permit to display messages over the map
            Modify plugins to use this new functionality
            Remove the person's name in geoclose and geofamclose.


svn: r19851
This commit is contained in:
Serge Noiraud 2012-06-16 17:50:24 +00:00
parent 4ae2c9610c
commit df06be53df
16 changed files with 294 additions and 49 deletions

View File

@ -10,6 +10,7 @@ pkgpython_PYTHON = \
__init__.py\
lifewaylayer.py\
markerlayer.py\
messagelayer.py\
osmGps.py\
placeselection.py\
selectionlayer.py

View File

@ -20,7 +20,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id: grampsmaps.py 18399 2011-11-02 17:15:20Z noirauds $
# $Id$
#-------------------------------------------------------------------------
#

View File

@ -20,7 +20,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id: grampsmaps.py 18399 2011-11-02 17:15:20Z noirauds $
# $Id$
#-------------------------------------------------------------------------
#

View File

@ -20,7 +20,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id: grampsmaps.py 18399 2011-11-02 17:15:20Z noirauds $
# $Id$
#-------------------------------------------------------------------------
#

View File

@ -20,7 +20,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id: grampsmaps.py 18399 2011-11-02 17:15:20Z noirauds $
# $Id$
#-------------------------------------------------------------------------
#
@ -77,7 +77,6 @@ class LifeWayLayer(gobject.GObject, osmgpsmap.GpsMapLayer):
gobject.GObject.__init__(self)
self.lifeways_ref = []
self.lifeways = []
self.lifeways_comment = []
self.comments = []
def clear_ways(self):
@ -86,7 +85,6 @@ class LifeWayLayer(gobject.GObject, osmgpsmap.GpsMapLayer):
"""
self.lifeways_ref = []
self.lifeways = []
self.lifeways_comment = []
self.comments = []
def add_way_ref(self, points, color, radius):
@ -103,12 +101,6 @@ class LifeWayLayer(gobject.GObject, osmgpsmap.GpsMapLayer):
"""
self.lifeways.append((points, color))
def add_text(self, points, text):
"""
Add a text to the track or life way.
"""
self.lifeways_comment.append((points, text))
def do_draw(self, gpsmap, drawable):
"""
Draw all tracks or life ways.
@ -181,23 +173,6 @@ class LifeWayLayer(gobject.GObject, osmgpsmap.GpsMapLayer):
ctx.line_to(crdx + 1, crdy + 1)
ctx.stroke()
for comment in self.lifeways_comment:
ctx = drawable.cairo_create()
# Does the following font is available for all language ? Is it the good one ?
ctx.select_font_face("Purisa",
cairo.FONT_SLANT_NORMAL,
cairo.FONT_WEIGHT_NORMAL)
ctx.set_font_size(13)
points = comment[0]
conv_pt = osmgpsmap.point_new_degrees(points[0][0], points[0][1])
if len(points) > 1 :
crd_x = -(points[0][0] - points[len(points)-1][0] )/2
crd_y = -(points[0][1] - points[len(points)-1][1] )/2
conv_pt = osmgpsmap.point_new_degrees(points[0][0]+crd_x, points[0][1]+crd_y)
coord_x, coord_y = gpsmap.convert_geographic_to_screen(conv_pt)
ctx.move_to(coord_x, coord_y)
ctx.show_text(comment[1])
def do_render(self, gpsmap):
"""
render the layer

View File

@ -20,7 +20,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id: grampsmaps.py 18399 2011-11-02 17:15:20Z noirauds $
# $Id$
#-------------------------------------------------------------------------
#

View File

@ -0,0 +1,171 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2011-2012 Serge Noiraud
#
# 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$
#-------------------------------------------------------------------------
#
# Python modules
#
#-------------------------------------------------------------------------
import os
import gobject
import operator
from math import *
#------------------------------------------------------------------------
#
# Set up logging
#
#------------------------------------------------------------------------
import logging
_LOG = logging.getLogger("maps.messagelayer")
#-------------------------------------------------------------------------
#
# GTK/Gnome modules
#
#-------------------------------------------------------------------------
import gtk
#-------------------------------------------------------------------------
#
# Gramps Modules
#
#-------------------------------------------------------------------------
import const
import cairo
import pango
import pangocairo
#-------------------------------------------------------------------------
#
# osmGpsMap
#
#-------------------------------------------------------------------------
try:
import osmgpsmap
except:
raise
class MessageLayer(gobject.GObject, osmgpsmap.GpsMapLayer):
"""
This is the layer used to display messages over the map
"""
def __init__(self):
"""
Initialize the layer
"""
gobject.GObject.__init__(self)
self.message = []
self.color = "black"
self.font = "Arial"
self.size = 18
#font_map = pangocairo.cairo_font_map_get_default()
#families = font_map.list_families()
def clear_messages(self):
"""
reset the layer attributes.
"""
self.message = []
def clear_font_attributes(self):
"""
reset the font attributes.
"""
self.color = "black"
self.font = "Arial"
self.size = 18
def set_font_attributes(self, font, size, color):
"""
Set the font color, size and name
"""
if color is not None:
self.color = color
if font is not None:
self.font = font
if size is not None:
self.size = size
def add_message(self, message):
"""
Add a message
"""
self.message.append(message)
def do_draw(self, gpsmap, drawable):
"""
Draw the two extreme dates
"""
ctx = drawable.cairo_create()
ctx.select_font_face(self.font,
cairo.FONT_SLANT_NORMAL,
cairo.FONT_WEIGHT_NORMAL)
ctx.set_font_size(int(self.size))
color = gtk.gdk.color_parse(self.color)
ctx.set_source_rgba(float(color.red / 65535.0),
float(color.green / 65535.0),
float(color.blue / 65535.0),
0.6) # transparency
coord_x = 100
coord_y = int(self.size) # Show the first line under the zoom button
(d_width, d_height) = drawable.get_size()
d_width -= 100
for line in self.message:
line_to_print = line
(x_bearing, y_bearing, width, height, x_advance, y_advance) = ctx.text_extents(line_to_print)
while ( width > d_width):
line_length = len(line_to_print)
character_length = int(width/line_length) + 1
max_length = int(d_width / character_length) - 5
ctx.move_to(coord_x, coord_y)
ctx.show_text(line_to_print[:max_length])
line_to_print = line_to_print[max_length:]
(x_bearing, y_bearing, width, height, x_advance, y_advance) = ctx.text_extents(line_to_print)
coord_y += int(self.size) # calculate the next line position
ctx.move_to(coord_x, coord_y)
ctx.show_text(line_to_print)
coord_y += int(self.size) # calculate the next line position
def do_render(self, gpsmap):
"""
render the layer
"""
pass
def do_busy(self):
"""
set the layer busy
"""
return False
def do_button_press(self, gpsmap, gdkeventbutton):
"""
When we press a button.
"""
return False
gobject.type_register(MessageLayer)

View File

@ -20,7 +20,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id: grampsmaps.py 18399 2011-11-02 17:15:20Z noirauds $
# $Id$
#-------------------------------------------------------------------------
#
@ -59,6 +59,7 @@ from selectionlayer import SelectionLayer
from lifewaylayer import LifeWayLayer
from markerlayer import MarkerLayer
from datelayer import DateLayer
from messagelayer import MessageLayer
from gen.ggettext import sgettext as _
from gen.config import config
from gui.dialog import ErrorDialog
@ -88,6 +89,7 @@ class OsmGps():
self.lifeway_layer = None
self.marker_layer = None
self.date_layer = None
self.message_layer = None
self.context_id = 0
self.begin_selection = None
self.end_selection = None
@ -143,6 +145,7 @@ class OsmGps():
self.lifeway_layer = self.add_lifeway_layer()
self.marker_layer = self.add_marker_layer()
self.date_layer = self.add_date_layer()
self.message_layer = self.add_message_layer()
self.cross_map = osmgpsmap.GpsMapOsd( show_crosshair=False)
self.set_crosshair(config.get("geography.show_cross"))
self.osm.set_center_and_zoom(config.get("geography.center-lat"),
@ -171,9 +174,23 @@ class OsmGps():
"""
return self.selection_layer
def add_message_layer(self):
"""
add the message layer to the map
"""
message_layer = MessageLayer()
self.osm.layer_add(message_layer)
return message_layer
def get_message_layer(self):
"""
get the message layer
"""
return self.message_layer
def add_date_layer(self):
"""
add the track or life ways layer
add the date layer to the map
"""
date_layer = DateLayer()
self.osm.layer_add(date_layer)
@ -181,7 +198,7 @@ class OsmGps():
def get_date_layer(self):
"""
get the track or life ways layer
get the date layer
"""
return self.date_layer

View File

@ -20,7 +20,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id: geography.py 18338 2011-10-16 20:21:22Z paul-franklin $
# $Id$
#-------------------------------------------------------------------------
#

View File

@ -20,7 +20,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id: grampsmaps.py 18399 2011-11-02 17:15:20Z noirauds $
# $Id$
#-------------------------------------------------------------------------
#

View File

@ -20,7 +20,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id: geoperson.py 18338 2011-10-16 20:21:22Z paul-franklin $
# $Id$
"""
Geography for two persons
@ -204,15 +204,23 @@ class GeoClose(GeoGraphyView):
self.remove_all_gps()
self.remove_all_markers()
self.lifeway_layer.clear_ways()
if self.refperson:
color = self._config.get('geography.color1')
self._createmap(self.refperson, color, self.place_list_ref, True)
self.message_layer.clear_messages()
active = self.get_active()
if active:
p1 = self.dbstate.db.get_person_from_handle(active)
self.change_active(active)
color = self._config.get('geography.color2')
self._createmap(p1, color, self.place_list_active, False)
if self.refperson:
color = self._config.get('geography.color1')
self.message_layer.add_message(_("Reference : %s" % _nd.display(self.refperson)))
self.message_layer.add_message(_("The other : %s" % _nd.display(p1)))
self._createmap(self.refperson, color, self.place_list_ref, True)
else:
self.message_layer.add_message(_("You must choose one reference person."))
self.message_layer.add_message(_("Go to the person view and select "
"the people you want to compare. "
"Return to this view and use the history."))
self.possible_meeting(self.place_list_ref, self.place_list_active)
self.uistate.modify_statusbar(self.dbstate)
@ -273,8 +281,6 @@ class GeoClose(GeoGraphyView):
if reference:
self.lifeway_layer.add_way_ref(points, color,
float(self._config.get("geography.maximum_meeting_zone")) / 10)
if mark:
self.lifeway_layer.add_text(points, mark[1])
return False
def possible_meeting(self, place_list_ref, place_list_active):

View File

@ -20,7 +20,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id:$
# $Id$
"""
Geography for two families
@ -191,6 +191,36 @@ class GeoFamClose(GeoGraphyView):
"""
return self.dbstate.db.get_bookmarks()
def family_label(self,family):
if family is None:
return "Unknown"
f = self.dbstate.db.get_person_from_handle(
family.get_father_handle())
m = self.dbstate.db.get_person_from_handle(
family.get_mother_handle())
if f and m:
label = _("%(gramps_id)s : %(father)s and %(mother)s") % {
'father' : _nd.display(f),
'mother' : _nd.display(m),
'gramps_id' : family.gramps_id,
}
elif f:
label = "%(gramps_id)s : %(father)s" % {
'father' : _nd.display(f),
'gramps_id' : family.gramps_id,
}
elif m:
label = "%(gramps_id)s : %(mother)s" % {
'mother' : _nd.display(m),
'gramps_id' : family.gramps_id,
}
else:
# No translation for bare gramps_id
label = "%(gramps_id)s :" % {
'gramps_id' : family.gramps_id,
}
return label
def goto_handle(self, handle=None):
"""
Rebuild the tree with the given family handle as reference.
@ -204,9 +234,7 @@ class GeoFamClose(GeoGraphyView):
self.remove_all_gps()
self.remove_all_markers()
self.lifeway_layer.clear_ways()
if self.reffamily:
color = self._config.get('geography.color1')
self._createmap(self.reffamily, color, self.place_list_ref, True)
self.message_layer.clear_messages()
active = self.get_active()
f1 = None
if active:
@ -214,6 +242,16 @@ class GeoFamClose(GeoGraphyView):
self.change_active(active)
color = self._config.get('geography.color2')
self._createmap(f1, color, self.place_list_active, False)
if self.reffamily:
color = self._config.get('geography.color1')
self._createmap(self.reffamily, color, self.place_list_ref, True)
self.message_layer.add_message(_("Family reference : %s" % self.family_label(self.reffamily)))
self.message_layer.add_message(_("The other family : %s" % self.family_label(f1)))
else:
self.message_layer.add_message(_("You must choose one reference family."))
self.message_layer.add_message(_("Go to the family view and select "
"the families you want to compare. "
"Return to this view and use the history."))
if f1 is not None:
self._possible_family_meeting(self.reffamily, f1)
self.uistate.modify_statusbar(self.dbstate)
@ -251,7 +289,6 @@ class GeoFamClose(GeoGraphyView):
"""
active = self.get_active()
family = self.dbstate.db.get_family_from_handle(active)
self.lifeway_layer.clear_ways()
self.goto_handle(handle=family)
def draw(self, menu, marks, color, reference):
@ -273,8 +310,6 @@ class GeoFamClose(GeoGraphyView):
if reference:
self.lifeway_layer.add_way_ref(points, color,
float(self._config.get("geography.maximum_meeting_zone")) / 10)
if mark:
self.lifeway_layer.add_text(points, mark[1])
return False
def _place_list_for_person(self, person):

View File

@ -272,11 +272,42 @@ class GeoFamily(GeoGraphyView):
else:
self._append_to_places_without_coord( place.gramps_id, descr)
def family_label(self,family):
if family is None:
return "Unknown"
f = self.dbstate.db.get_person_from_handle(
family.get_father_handle())
m = self.dbstate.db.get_person_from_handle(
family.get_mother_handle())
if f and m:
label = _("%(gramps_id)s : %(father)s and %(mother)s") % {
'father' : _nd.display(f),
'mother' : _nd.display(m),
'gramps_id' : family.gramps_id,
}
elif f:
label = "%(gramps_id)s : %(father)s" % {
'father' : _nd.display(f),
'gramps_id' : family.gramps_id,
}
elif m:
label = "%(gramps_id)s : %(mother)s" % {
'mother' : _nd.display(m),
'gramps_id' : family.gramps_id,
}
else:
# No translation for bare gramps_id
label = "%(gramps_id)s :" % {
'gramps_id' : family.gramps_id,
}
return label
def _createmap_for_one_family(self, family):
"""
Create all markers for one family : all event's places with a lat/lon.
"""
dbstate = self.dbstate
self.message_layer.add_message(_("Family places for %s" % self.family_label(family)))
try:
person = dbstate.db.get_person_from_handle(family.get_father_handle())
except:
@ -337,6 +368,7 @@ class GeoFamily(GeoGraphyView):
self.minlat = self.maxlat = self.minlon = self.maxlon = 0.0
self.minyear = 9999
self.maxyear = 0
self.message_layer.clear_messages()
family = self.dbstate.db.get_family_from_handle(family_x)
if family is None:
person = self.dbstate.db.get_person_from_handle(self.uistate.get_active('Person'))

View File

@ -20,7 +20,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id:$
# $Id$
"""
Geography for one person and all his descendant
@ -235,6 +235,7 @@ class GeoMoves(GeoGraphyView):
self.remove_all_markers()
self.lifeway_layer.clear_ways()
self.date_layer.clear_dates()
self.message_layer.clear_messages()
def draw(self, menu, marks, color):
"""
@ -459,12 +460,14 @@ class GeoMoves(GeoGraphyView):
self.minlat = self.maxlat = self.minlon = self.maxlon = 0.0
latitude = ""
longitude = ""
self.message_layer.clear_messages()
self.place_without_coordinates = []
self.minlat = self.maxlat = self.minlon = self.maxlon = 0.0
if person is None:
person = self.dbstate.db.get_person_from_handle(self.uistate.get_active('Person'))
if not person:
return
self.message_layer.add_message(_("All descendance for %s" % _nd.display(person)))
color = gtk.gdk.color_parse(self._config.get('geography.color_base'))
gobject.timeout_add(int(self._config.get("geography.generation_interval")),
self.animate_moves, 0, person, color)

View File

@ -302,10 +302,12 @@ class GeoPerson(GeoGraphyView):
self.maxyear = 0
latitude = ""
longitude = ""
self.message_layer.clear_messages()
person_handle = self.uistate.get_active('Person')
person = dbstate.db.get_person_from_handle(person_handle)
if person is not None:
# For each event, if we have a place, set a marker.
self.message_layer.add_message(_("Person places for %s" % _nd.display(person)))
for event_ref in person.get_event_ref_list():
if not event_ref:
continue

View File

@ -239,6 +239,8 @@ class GeoPlaces(GeoGraphyView):
self.without = 0
latitude = ""
longitude = ""
self.nbmarkers = 0
self.message_layer.clear_messages()
self.no_show_places_in_status_bar = False
# base "villes de france" : 38101 places :
# createmap : 8'50"; create_markers : 1'23"
@ -279,6 +281,7 @@ class GeoPlaces(GeoGraphyView):
_LOG.debug("%s" % time.strftime(" end sort : "
"%a %d %b %Y %H:%M:%S", time.gmtime()))
if self.nbmarkers > 500 : # performance issue. Is it the good value ?
self.message_layer.add_message(_("The place name in the status bar is disabled."))
self.no_show_places_in_status_bar = True
self._create_markers()