From 4c1087a211ecc5bc631497be78d68c5f12d6547f Mon Sep 17 00:00:00 2001 From: Martin Hawlisch Date: Fri, 16 Sep 2005 13:18:52 +0000 Subject: [PATCH] * src/PageView.py (button_press): Catch problem with no loaded database * src/PersonView.py (button_press): Catch problem with no loaded database * src/GrampsDbBase.py (_get_from_handle): Catch problem with no loaded database * src/MapView.py: Updates svn: r5197 --- src/GrampsDbBase.py | 3 +- src/MapView.py | 132 ++++++++++++++++++++++++++++++-------------- src/PageView.py | 5 +- src/PersonView.py | 10 ++-- 4 files changed, 103 insertions(+), 47 deletions(-) diff --git a/src/GrampsDbBase.py b/src/GrampsDbBase.py index 3bb80dbbb..87bb72f6c 100644 --- a/src/GrampsDbBase.py +++ b/src/GrampsDbBase.py @@ -492,6 +492,8 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): return index def _get_from_handle(self, handle, class_type, data_map): + if not data_map: + return data = data_map.get(str(handle)) if data: newobj = class_type() @@ -1199,7 +1201,6 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): instances in the database""" return list(self.family_event_names) - def get_media_attribute_types(self): """returns a list of all Attribute types assocated with Media instances in the database""" diff --git a/src/MapView.py b/src/MapView.py index eb718e50b..d85901073 100644 --- a/src/MapView.py +++ b/src/MapView.py @@ -45,12 +45,14 @@ import gtk.gdk #------------------------------------------------------------------------- import RelLib import PageView +import DisplayTrace -data = (("_Center", 0,0), - ("_North",0,80), - ("_South",0,-80), - ("_West",-170,0), - ("_East",170,0), +glob_loc_data = [ # (Name, longitude, latitude) + ("_Center", 0,0), + ("_North",0,90), + ("_South",0,-90), + ("_West",-180,0), + ("_East",180,0), ("Chicago",-87.75,41.83), ("Berlin",13.42,52.53), ("Honolulu",-157.83,21.32), @@ -61,7 +63,7 @@ data = (("_Center", 0,0), ("Rio de Janeiro",-43.28,-22.88), ("Tokyo",139.75,35.67), ("Cape Town",18.47,-33.93), - ("Anchorage",-150.00,61.17)) + ("Anchorage",-150.00,61.17)] # Draws a map image and tries to allocate space in the correct aspect ratio @@ -71,7 +73,6 @@ class GuideMap(gtk.DrawingArea): self.map_pixbuf = map_pixbuf self.connect("expose-event", self.expose_cb) self.connect("size-allocate", self.size_allocate_cb) - #self.connect("size-request", self.size_request_cb) self.gc = None self.current_area = None self.old_size = (-1,-1) @@ -166,18 +167,20 @@ class ZoomMap( gtk.DrawingArea): 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) + if px > 0 and py > 0 and px < self.backbuf.get_width() and py < self.backbuf.get_height(): + # draw only visible markers + #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 @@ -220,8 +223,9 @@ class ZoomMap( gtk.DrawingArea): px = min( px, self.map_pixbuf.get_width()-1-pw/2) py = min( py, self.map_pixbuf.get_height()-1-ph/2) - zoomebuf = self.map_pixbuf.subpixbuf( int(px-pw/2), - int(py-ph/2), pw,ph) + zoomebuf = self.map_pixbuf.subpixbuf( max(0,int(px-pw/2)),max(0,int(py-ph/2)), + min(self.map_pixbuf.get_width(),pw), + min(self.map_pixbuf.get_height(),ph)) self.backbuf = zoomebuf.scale_simple(self.old_size[0], self.old_size[1], gtk.gdk.INTERP_BILINEAR) @@ -265,19 +269,14 @@ class ZoomMap( gtk.DrawingArea): # Place list widget class MapPlacesList(gtk.TreeView): def __init__(self, data): - lstore = gtk.ListStore( + self.lstore = gtk.ListStore( gobject.TYPE_STRING, gobject.TYPE_FLOAT, gobject.TYPE_FLOAT) - for item in data: - iter = lstore.append() - lstore.set(iter, - 0, item[0], - 1, item[1], - 2, item[2]) + self.change_data( data) - gtk.TreeView.__init__(self, lstore) + gtk.TreeView.__init__(self, self.lstore) self.set_rules_hint(True) self.set_search_column(0) @@ -293,6 +292,15 @@ class MapPlacesList(gtk.TreeView): column.set_sort_column_id(2) self.append_column(column) + def change_data( self, data): + self.lstore.clear() + for item in data: + iter = self.lstore.append() + self.lstore.set(iter, + 0, item[0], + 1, item[1], + 2, item[2]) + # Map View main class @@ -339,6 +347,43 @@ class MapView(PageView.PageView): l = f.readline() return data + # Reads in locations from current GRAMPS database + def get_markers_from_database(self, db): + data = [] + for place_handle in db.get_place_handles(): + place = db.get_place_from_handle( place_handle) + if place: + try: + data.append( (place.get_title(),float(place.get_longitude()),float(place.get_latitude()))) + except (TypeError, ValueError): + # ignore places that dont have usable data + pass + return data + + # Reads in textfiles from NIMA: + # http://earth-info.nga.mil/gns/html/cntry_files.html + def parse_nima_countryfile(self, filename): + import csv + data = [] + csvreader = csv.reader(open(filename), "excel-tab") + try: + l = csvreader.next() # skip header + l = csvreader.next() + line = 1 + while l: + if l[17] == "N" and l[9] == "P": + city = l[22] + lat = float( l[3]) + lon = float( l[4]) + + if line % 10 == 0: + data.append( (city, lon, lat)) + l = csvreader.next() + line = line + 1 + except StopIteration: + pass + return data + def build_widget(self): hbox = gtk.HBox( False, 4) hbox.set_border_width( 4) @@ -363,21 +408,17 @@ class MapView(PageView.PageView): self.zoom_map.set_guide(self.guide_map) - # And the place list - try: - d = self.get_xearth_markers() - self.place_list_view = MapPlacesList( d) - except: - self.place_list_view = MapPlacesList( data) + # and the place list + self.place_list_view = MapPlacesList( []) + 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.set_size_request(128,-1) vport = gtk.ScrolledWindow() vbox.pack_start(vport,True,True,0) 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.rebuild_places() + return hbox def ui_definition(self): @@ -402,7 +443,18 @@ class MapView(PageView.PageView): is no need to store the database, since we will get the value from self.state.db """ - self.db = db + db.connect('place-rebuild',self.rebuild_places) + db.connect('place-update',self.rebuild_places) + + def rebuild_places(self,handle_list=None): + d = glob_loc_data + try: + d = d + self.get_xearth_markers() + #d = self.parse_nima_countryfile("/tmp/gm.txt") + d = d + self.get_markers_from_database( self.dbstate.db) + except: + DisplayTrace.DisplayTrace() + self.place_list_view.change_data( d) def entry_select_cb(self,treeview): s = treeview.get_selection() diff --git a/src/PageView.py b/src/PageView.py index 38b799865..b4da6e22e 100644 --- a/src/PageView.py +++ b/src/PageView.py @@ -402,8 +402,9 @@ class ListView(PageView): return True elif event.type == gtk.gdk.BUTTON_PRESS and event.button == 3: menu = self.uistate.uimanager.get_widget('/Popup') - menu.popup(None,None,None,event.button,event.time) - return True + if menu: + menu.popup(None,None,None,event.button,event.time) + return True return False def key_press(self,obj,event): diff --git a/src/PersonView.py b/src/PersonView.py index d09256c40..e2ea2bc86 100644 --- a/src/PersonView.py +++ b/src/PersonView.py @@ -727,11 +727,13 @@ class PersonView(PageView.PersonNavView): if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1: handle = self.first_selected() person = self.dbstate.db.get_person_from_handle(handle) - EditPerson.EditPerson(self.dbstate, self.uistate,person) - return True + if person: + EditPerson.EditPerson(self.dbstate, self.uistate,person) + return True elif event.type == gtk.gdk.BUTTON_PRESS and event.button == 3: menu = self.uistate.uimanager.get_widget('/Popup') - menu.popup(None,None,None,event.button,event.time) - return True + if menu: + menu.popup(None,None,None,event.button,event.time) + return True return False