* 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
This commit is contained in:
		@@ -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"""
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
 
 | 
			
		||||
@@ -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):
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user