* src/MapView.py: Corrected coordinate handling; Show all location in map; fetch locations from xearth config file

svn: r5059
This commit is contained in:
Martin Hawlisch 2005-08-12 11:29:06 +00:00
parent a02d60a6db
commit 6356e91983
2 changed files with 80 additions and 36 deletions

View File

@ -1,4 +1,8 @@
2005-05-27 Richard Taylor <rjt-gramps@thegrindstone.me.uk> 2005-08-12 Martin Hawlisch <Martin.Hawlisch@gmx.de>
* src/MapView.py: Corrected coordinate handling; Show all location in map;
fetch locations from xearth config file
2005-08-12 Richard Taylor <rjt-gramps@thegrindstone.me.uk>
* src/EditRepository.py: changes to work with ViewManager changes * src/EditRepository.py: changes to work with ViewManager changes
2005-08-11 Don Allingham <don@gramps-project.org> 2005-08-11 Don Allingham <don@gramps-project.org>

View File

@ -27,6 +27,7 @@
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gettext import gettext as _ from gettext import gettext as _
import gc import gc
import re
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -77,15 +78,11 @@ class GuideMap(gtk.DrawingArea):
# Set hightlight region # Set hightlight region
def hightlight_area( self, area): def hightlight_area( self, area):
print "GuideMap.hightlight_area"
print area
self.current_area = area self.current_area = area
self.queue_draw() self.queue_draw()
# Redraw the image # Redraw the image
def expose_cb(self,widget,event): def expose_cb(self,widget,event):
a = widget.get_allocation()
print "GuideMap.expose_cb (%dx%d)" % (a.width,a.height)
if not self.gc: if not self.gc:
self.gc = self.window.new_gc() self.gc = self.window.new_gc()
self.gc.set_foreground( self.get_colormap().alloc_color("red")) self.gc.set_foreground( self.get_colormap().alloc_color("red"))
@ -102,8 +99,6 @@ class GuideMap(gtk.DrawingArea):
# Scale backbuffer # Scale backbuffer
def size_allocate_cb(self,widget,allocation): def size_allocate_cb(self,widget,allocation):
a = allocation
print "GuideMap.size_allocate_cb (%dx%d)" % (a.width,a.height)
# Always request a height, that is half of the width # Always request a height, that is half of the width
w = max( 128,allocation.width) w = max( 128,allocation.width)
self.set_size_request(-1,w/2) self.set_size_request(-1,w/2)
@ -142,15 +137,20 @@ class ZoomMap( gtk.DrawingArea):
self.current_area = (0,0,0,0) self.current_area = (0,0,0,0)
self.magnifer = 0.5 self.magnifer = 0.5
self.guide = None self.guide = None
self.textlayout = self.create_pango_layout("")
# Set the guide map that should follow the zoom area # Set the guide map that should follow the zoom area
def set_guide( self, guide): def set_guide( self, guide):
self.guide = guide self.guide = guide
def set_location_model( self, model, idx_name, idx_long, idx_lat):
self.location_model = model
self.idx_name = idx_name
self.idx_long = idx_long
self.idx_lat = idx_lat
# Redraw the image # Redraw the image
def expose_cb(self,widget,event): def expose_cb(self,widget,event):
a = widget.get_allocation()
print "GuideMap.expose_cb (%dx%d)" % (a.width,a.height)
if not self.gc: if not self.gc:
self.gc = self.window.new_gc() self.gc = self.window.new_gc()
self.gc.set_foreground( self.get_colormap().alloc_color("red")) self.gc.set_foreground( self.get_colormap().alloc_color("red"))
@ -159,10 +159,29 @@ class ZoomMap( gtk.DrawingArea):
self.size_allocate_cb( self,self.get_allocation()) self.size_allocate_cb( self,self.get_allocation())
if self.backbuf and self.gc: if self.backbuf and self.gc:
self.window.draw_pixbuf( self.gc, self.backbuf, 0,0, 0,0, -1,-1) self.window.draw_pixbuf( self.gc, self.backbuf, 0,0, 0,0, -1,-1)
px = int((float(self.zoom_pos[1]) + 180.0) / 360.0
* self.backbuf.get_width()) # draw all available locations
py = int((90-float(self.zoom_pos[0])) / 180.0 if self.location_model:
* self.backbuf.get_height()) iter = self.location_model.get_iter_first()
while iter:
(n,x,y) = self.location_model.get( iter, self.idx_name, self.idx_long, self.idx_lat)
(px,py) = self.map_to_screen( x, y)
self.window.draw_pixbuf(
self.gc,
self.place_marker_pixbuf,
0,0,
px-self.place_marker_pixbuf.get_width()/2,
py-self.place_marker_pixbuf.get_height()/2,
-1,-1)
self.textlayout.set_text(n)
self.window.draw_layout(
self.gc,
px,py,
self.textlayout)
iter = self.location_model.iter_next( iter)
# hightlight current location
(px,py) = self.map_to_screen( self.zoom_pos[0], self.zoom_pos[1])
self.window.draw_pixbuf( self.window.draw_pixbuf(
self.gc, self.gc,
self.hightlight_marker_pixbuf, self.hightlight_marker_pixbuf,
@ -170,13 +189,17 @@ class ZoomMap( gtk.DrawingArea):
px-self.hightlight_marker_pixbuf.get_width()/2, px-self.hightlight_marker_pixbuf.get_width()/2,
py-self.hightlight_marker_pixbuf.get_height()/2, py-self.hightlight_marker_pixbuf.get_height()/2,
-1,-1) -1,-1)
self.window.draw_rectangle( self.gc, False, px-3,py-3, 6,6) #self.window.draw_rectangle( self.gc, False, px-3,py-3, 6,6)
def map_to_screen( self, long, lat):
px = int(self.backbuf.get_width() / self.current_map_area[2] *
(float(long) - self.current_map_area[0]))
py = int(self.backbuf.get_height() / self.current_map_area[3] *
(-float(lat) + self.current_map_area[1]))
return( px, py)
# Scale backbuffer # Scale backbuffer
def size_allocate_cb(self,widget,allocation): def size_allocate_cb(self,widget,allocation):
a = allocation
print "GuideMap.size_allocate_cb (%dx%d)" % (a.width,a.height)
# only create new backbuffer if size is different # only create new backbuffer if size is different
new_size = (allocation.width,allocation.height) new_size = (allocation.width,allocation.height)
if new_size is not self.old_size or not self.backbuf: if new_size is not self.old_size or not self.backbuf:
@ -186,36 +209,35 @@ class ZoomMap( gtk.DrawingArea):
pw = int(self.old_size[0]*self.magnifer) pw = int(self.old_size[0]*self.magnifer)
ph = int(self.old_size[1]*self.magnifer) ph = int(self.old_size[1]*self.magnifer)
px = int((float(self.zoom_pos[1]) + 180.0) / 360.0 px = int((float(self.zoom_pos[0]) + 180.0) / 360.0
* self.map_pixbuf.get_width()) * self.map_pixbuf.get_width())
py = int((90-float(self.zoom_pos[0])) / 180.0 py = int((90-float(self.zoom_pos[1])) / 180.0
* self.map_pixbuf.get_height()) * self.map_pixbuf.get_height())
px = max( pw/2, px) px = max( pw/2, px)
py = max( ph/2, py) py = max( ph/2, py)
px = min( px, self.map_pixbuf.get_width()-pw/2) px = min( px, self.map_pixbuf.get_width()-1-pw/2)
py = min( py, self.map_pixbuf.get_height()-ph/2) py = min( py, self.map_pixbuf.get_height()-1-ph/2)
zoomebuf = self.map_pixbuf.subpixbuf( int(px-pw/2), zoomebuf = self.map_pixbuf.subpixbuf( int(px-pw/2),
int(py-ph/2), pw,ph) int(py-ph/2), pw,ph)
print ( px-pw/2, py-ph/2, pw,ph)
self.backbuf = zoomebuf.scale_simple(self.old_size[0], self.backbuf = zoomebuf.scale_simple(self.old_size[0],
self.old_size[1], self.old_size[1],
gtk.gdk.INTERP_BILINEAR) gtk.gdk.INTERP_BILINEAR)
gc.collect() gc.collect()
if self.guide: mx = 360.0 / self.map_pixbuf.get_width() * (px-pw/2.0) - 180.0
mx = 360.0 / self.map_pixbuf.get_width() * (px-pw/2.0) - 180.0 my = 90.0 - 180.0 / self.map_pixbuf.get_height() * (py-ph/2.0)
my = 90.0 - 180.0 / self.map_pixbuf.get_height() * (py-ph/2.0) mw = 360.0 / self.map_pixbuf.get_width() * pw
mw = 360.0 / self.map_pixbuf.get_width() * pw mh = 180.0 / self.map_pixbuf.get_height() * ph
mh = 180.0 / self.map_pixbuf.get_height() * ph
self.guide.hightlight_area( (mx,my,mw,mh))
self.current_area = (px-pw/2, py-ph/2, pw,ph) self.current_area = (px-pw/2, py-ph/2, pw,ph)
self.current_map_area = (mx, my, mw, mh)
if self.guide:
self.guide.hightlight_area( (mx,my,mw,mh))
# Scroll to requested position # Scroll to requested position
def scroll_to( self, lat, lon): def scroll_to( self, long, lat):
self.zoom_pos = ( min(90,(max(-90,lon))), min(180,(max(-180,lat)))) self.zoom_pos = ( min(180,(max(-180,long))), min(90,(max(-90,lat))))
self.backbuf = None self.backbuf = None
self.queue_draw() self.queue_draw()
@ -281,11 +303,9 @@ class MapView(PageView.PageView):
self.current_marker = None self.current_marker = None
def navigation_type(self): def navigation_type(self):
print "MapView.navigation_type"
return PageView.NAVIGATION_NONE return PageView.NAVIGATION_NONE
def define_actions(self): def define_actions(self):
print "MapView.define_actions"
self.add_action('ZoomIn',gtk.STOCK_ZOOM_IN, self.add_action('ZoomIn',gtk.STOCK_ZOOM_IN,
"Zoom _In",callback=self.zoom_in_cb) "Zoom _In",callback=self.zoom_in_cb)
self.add_action('ZoomOut',gtk.STOCK_ZOOM_OUT, self.add_action('ZoomOut',gtk.STOCK_ZOOM_OUT,
@ -303,6 +323,22 @@ class MapView(PageView.PageView):
""" """
return 'gramps-map' return 'gramps-map'
# For debugging: Reads in location from xearth
def get_xearth_markers(self):
data = []
f = open("/etc/xearth/xearth.markers")
l = f.readline()
#linere = re.compile('[^0-9.-]*(-?[0-9]+\.[0-9]+)[^0-9.-]*(-?[0-9]+\.[0-9]+).*"([^"])".*', "I")
while l:
if not l[0] == "#":
l = l.strip().replace('"',"").replace(" "," ").replace(" "," ").replace(" "," ").replace(" # ",", ")
m = l.split( None, 2)
if len(m) == 3:
data.append( (m[2],float(m[1]),float(m[0])))
l = f.readline()
return data
def build_widget(self): def build_widget(self):
hbox = gtk.HBox( False, 4) hbox = gtk.HBox( False, 4)
hbox.set_border_width( 4) hbox.set_border_width( 4)
@ -328,12 +364,17 @@ class MapView(PageView.PageView):
self.zoom_map.set_guide(self.guide_map) self.zoom_map.set_guide(self.guide_map)
# And the place list # And the place list
self.place_list_view = MapPlacesList( data) d = self.get_xearth_markers()
if not d:
d = data
self.place_list_view = MapPlacesList( d)
self.place_list_view.set_size_request(128,-1) self.place_list_view.set_size_request(128,-1)
vport = gtk.ScrolledWindow() vport = gtk.ScrolledWindow()
vbox.pack_start(vport,True,True,0) vbox.pack_start(vport,True,True,0)
vport.add( self.place_list_view) vport.add( self.place_list_view)
self.zoom_map.set_location_model(self.place_list_view.get_model(), 0,1,2)
self.place_list_view.connect("cursor-changed", self.entry_select_cb) self.place_list_view.connect("cursor-changed", self.entry_select_cb)
return hbox return hbox
@ -353,7 +394,6 @@ class MapView(PageView.PageView):
</ui>''' </ui>'''
def change_db(self,db): def change_db(self,db):
print "MapView.change_db"
""" """
Callback associated with DbState. Whenenver the database Callback associated with DbState. Whenenver the database
changes, this task is called. In this case, we rebuild the changes, this task is called. In this case, we rebuild the