Diff of /trunk/src/map-tool.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 136 by harbaum, Mon Oct 19 13:02:41 2009 UTC revision 144 by harbaum, Tue Oct 27 08:38:31 2009 UTC
# Line 80  static const char *get_proxy_uri(appdata Line 80  static const char *get_proxy_uri(appdata
80    
81  static void  static void
82  cb_map_gps(osd_button_t but, map_context_t *context) {  cb_map_gps(osd_button_t but, map_context_t *context) {
83    
84    if(but == OSD_GPS) {    if(but == OSD_GPS) {
85      pos_t *refpos = get_pos(context->appdata);      pos_t *refpos = get_pos(context->appdata);
86      if(refpos && !isnan(refpos->lat) && !isnan(refpos->lon)) {      if(refpos && !isnan(refpos->lat) && !isnan(refpos->lon)) {
# Line 139  static gboolean map_gps_update(gpointer Line 140  static gboolean map_gps_update(gpointer
140    return TRUE;    return TRUE;
141  }  }
142    
143    static void map_draw_cache(GtkWidget *map, cache_t *cache) {
144      GdkPixbuf *icon = icon_get(ICON_CACHE_TYPE, cache->type);
145    
146      /* check if there's also an overwritten coordinate */
147      if(cache->notes && cache->notes->override) {
148        GdkPixbuf *over = icon_get(ICON_MISC, 1);
149    
150        osm_gps_map_add_image(OSM_GPS_MAP(map),
151              cache->notes->pos.lat, cache->notes->pos.lon, icon);
152    
153        osm_gps_map_add_image(OSM_GPS_MAP(map),
154              cache->notes->pos.lat, cache->notes->pos.lon, over);
155      } else {
156        if(!isnan(cache->pos.lat) && !isnan(cache->pos.lon))
157          osm_gps_map_add_image(OSM_GPS_MAP(map),
158                                cache->pos.lat, cache->pos.lon, icon);
159      }
160    }
161    
162    static void map_draw_gpx(appdata_t *appdata, GtkWidget *map, gpx_t *gpx) {
163      if(!gpx->notes_loaded) {
164        notes_load_all(appdata, gpx);
165        gpx->notes_loaded = TRUE;
166      }
167    
168      cache_t *cache = gpx->cache;
169      while(cache) {
170        map_draw_cache(map, cache);
171        cache = cache->next;
172      }
173    }
174    
175    /* draw geocaches and set window title */
176    static void map_setup(map_context_t *context) {
177      char *name = NULL;
178    
179      if(!context->appdata->cur_gpx && !context->appdata->cur_cache) {
180        if(context->state != MAP_ALL) {
181          printf("map_setup(ALL)\n");
182    
183    #ifdef OSD_NAV
184          /* no navigation in this mode */
185          osm_gps_map_osd_clear_nav (OSM_GPS_MAP(context->widget));
186    #endif
187    
188          /* clear all existing ccahe images */
189          osm_gps_map_clear_images (OSM_GPS_MAP(context->widget));
190    
191          /* draw all geocaches */
192          gpx_t *gpx = context->appdata->gpx;
193          while(gpx) {
194            map_draw_gpx(context->appdata, context->widget, gpx);
195            gpx = gpx->next;
196          }
197          name = g_strdup(_("all"));
198          context->state = MAP_ALL;
199        }
200      } else if(!context->appdata->cur_cache) {
201        if(context->state != MAP_GPX) {
202          printf("map_setup(GPX)\n");
203    
204    #ifdef OSD_NAV
205          /* no navigation in this mode */
206          osm_gps_map_osd_clear_nav (OSM_GPS_MAP(context->widget));
207    #endif
208    
209          /* clear all existing ccahe images */
210          osm_gps_map_clear_images (OSM_GPS_MAP(context->widget));
211    
212          map_draw_gpx(context->appdata, context->widget,
213                       context->appdata->cur_gpx);
214          name = g_strdup(context->appdata->cur_gpx->name);
215          context->state = MAP_GPX;
216        }
217      } else {
218        cache_t *cache = context->appdata->cur_cache;
219    
220        printf("map_setp(CACHE)\n");
221    
222        /* no balloons in this mode */
223        context->balloon = NULL;
224        osm_gps_map_osd_clear_balloon (OSM_GPS_MAP(context->widget));
225    
226        /* clear all existing ccahe images */
227        osm_gps_map_clear_images (OSM_GPS_MAP(context->widget));
228    
229        map_draw_cache(context->widget, cache);
230        name = g_strdup(cache->name);
231        context->state = MAP_CACHE;
232    
233        /* navigation in this mode! */
234        pos_t cpos = gpx_cache_pos(cache);
235    
236    #ifdef OSD_NAV
237        osm_gps_map_osd_draw_nav (OSM_GPS_MAP(context->widget),
238                                  context->appdata->imperial,
239                                  cpos.lat, cpos.lon, cache->name);
240    #else
241    #warning OSD_NAV not defined!
242    #endif
243      }
244    
245      if(name) {
246        char *title = g_strdup_printf(_("Map - %s"), name);
247        g_free(name);
248    
249        gtk_window_set_title(GTK_WINDOW(context->window), title);
250    
251        g_free(title);
252      } else
253        printf("map_setup(keep)\n");
254    }
255    
256  static gboolean on_map_configure(GtkWidget *widget,  static gboolean on_map_configure(GtkWidget *widget,
257                                   GdkEventConfigure *event,                                   GdkEventConfigure *event,
258                                   map_context_t *context) {                                   map_context_t *context) {
259    
260    if(!context->map_complete) {    /* for some reason there's a configure event with 1/1 */
261      /* on diablo. We just ignore this! */
262    
263      printf("on_map_configure %d %d\n",
264             widget->allocation.width,
265             widget->allocation.height);
266    
267      if(!context->map_complete &&
268         (widget->allocation.width > 100) &&
269         (widget->allocation.height > 100)) {
270    
271        /* setup cache state */
272        map_setup(context);
273    
274      /* set default values if they are invalid */      /* set default values if they are invalid */
275      if(!context->appdata->map.zoom ||      if(!context->appdata->map.zoom ||
# Line 153  static gboolean on_map_configure(GtkWidg Line 279  static gboolean on_map_configure(GtkWidg
279    
280        pos_t *refpos = get_pos(context->appdata);        pos_t *refpos = get_pos(context->appdata);
281        if(refpos && !isnan(refpos->lat) && !isnan(refpos->lon)) {        if(refpos && !isnan(refpos->lat) && !isnan(refpos->lon)) {
282            printf("use refpos\n");
283    
284          /* use gps position if present */          /* use gps position if present */
285          context->appdata->map.pos = *refpos;          context->appdata->map.pos = *refpos;
286          context->appdata->map.zoom = GPS_DEFAULT_ZOOM;          context->appdata->map.zoom = GPS_DEFAULT_ZOOM;
287        } else {        } else {
288            printf("use zero pos\n");
289    
290          /* use world map otherwise */          /* use world map otherwise */
291          context->appdata->map.pos.lat = 0.0;          context->appdata->map.pos.lat = 0.0;
292          context->appdata->map.pos.lon = 0.0;          context->appdata->map.pos.lon = 0.0;
# Line 165  static gboolean on_map_configure(GtkWidg Line 295  static gboolean on_map_configure(GtkWidg
295      }      }
296    
297      /* jump to initial position */      /* jump to initial position */
298        printf("osm_gps_map_set_mapcenter(%f,%f,%d)\n",
299               context->appdata->map.pos.lat,
300               context->appdata->map.pos.lon,
301               context->appdata->map.zoom);
302    
303      osm_gps_map_set_mapcenter(OSM_GPS_MAP(context->widget),      osm_gps_map_set_mapcenter(OSM_GPS_MAP(context->widget),
304                                context->appdata->map.pos.lat,                                context->appdata->map.pos.lat,
305                                context->appdata->map.pos.lon,                                context->appdata->map.pos.lon,
# Line 175  static gboolean on_map_configure(GtkWidg Line 310  static gboolean on_map_configure(GtkWidg
310    return FALSE;    return FALSE;
311  }  }
312    
 static void map_draw_cache(GtkWidget *map, cache_t *cache) {  
   GdkPixbuf *icon = icon_get(ICON_CACHE_TYPE, cache->type);  
   
   /* check if there's also an overwritten coordinate */  
   if(cache->notes && cache->notes->override) {  
     GdkPixbuf *over = icon_get(ICON_MISC, 1);  
   
     osm_gps_map_add_image(OSM_GPS_MAP(map),  
           cache->notes->pos.lat, cache->notes->pos.lon, icon);  
   
     osm_gps_map_add_image(OSM_GPS_MAP(map),  
           cache->notes->pos.lat, cache->notes->pos.lon, over);  
   } else  
     osm_gps_map_add_image(OSM_GPS_MAP(map),  
                           cache->pos.lat, cache->pos.lon, icon);  
   
 }  
   
 static void map_draw_gpx(appdata_t *appdata, GtkWidget *map, gpx_t *gpx) {  
   if(!gpx->notes_loaded) {  
     notes_load_all(appdata, gpx);  
     gpx->notes_loaded = TRUE;  
   }  
   
   cache_t *cache = gpx->cache;  
   while(cache) {  
     map_draw_cache(map, cache);  
     cache = cache->next;  
   }  
 }  
   
313  static void  static void
314  map_cachelist_nearest(cache_t *cache, pos_t *pos,  map_cachelist_nearest(cache_t *cache, pos_t *pos,
315                        cache_t **result, float *distance) {                        cache_t **result, float *distance) {
316    
317    while(cache) {    while(cache) {
318      pos_t cpos = gpx_cache_pos(cache);      pos_t cpos = gpx_cache_pos(cache);
319    
# Line 258  pos_t coord2pos(coord_t coo) { Line 363  pos_t coord2pos(coord_t coo) {
363  static gboolean  static gboolean
364  on_map_button_press_event(GtkWidget *widget,  on_map_button_press_event(GtkWidget *widget,
365                              GdkEventButton *event, map_context_t *context) {                              GdkEventButton *event, map_context_t *context) {
366    
367    OsmGpsMap *map = OSM_GPS_MAP(context->widget);    OsmGpsMap *map = OSM_GPS_MAP(context->widget);
368    
369    /* check if we actually clicked parts of the OSD */    /* check if we actually clicked parts of the OSD */
370    if(osm_gps_map_osd_check(map, event->x, event->y) != OSD_NONE)    if(osm_gps_map_osd_check(map, event->x, event->y) != OSD_NONE)
371      return FALSE;      return FALSE;
372    
373    /* got a press event without release event? eat it! */    /* got a press event without release event? eat it! */
# Line 316  cairo_draw_pixbuf(cairo_t *cr, GdkPixbuf Line 422  cairo_draw_pixbuf(cairo_t *cr, GdkPixbuf
422    
423  static void  static void
424  balloon_cb(osm_gps_map_balloon_event_t *event, gpointer data) {  balloon_cb(osm_gps_map_balloon_event_t *event, gpointer data) {
425      printf("balloon event: ");
426    
427    map_context_t *context = (map_context_t*)data;    map_context_t *context = (map_context_t*)data;
428    cache_t *cache = context->balloon;    cache_t *cache = context->balloon;
429    
   printf("balloon event: ");  
   
430    if(event->type == OSM_GPS_MAP_BALLOON_EVENT_TYPE_DRAW) {    if(event->type == OSM_GPS_MAP_BALLOON_EVENT_TYPE_DRAW) {
431      printf("draw\n");      printf("draw\n");
432    
# Line 444  balloon_cb(osm_gps_map_balloon_event_t * Line 550  balloon_cb(osm_gps_map_balloon_event_t *
550             event->data.click.down?"down":"up",             event->data.click.down?"down":"up",
551             event->data.click.x, event->data.click.y);             event->data.click.x, event->data.click.y);
552    
553        /* make the main screen jump to that cache */
554        if(!event->data.click.down) {
555          if(context->appdata->cur_cache) {
556            printf("ERROR: no current cache should be visible!\n");
557          } else {
558            gpx_t *is_in = NULL;
559    
560            if(!context->appdata->cur_gpx) {
561              printf("click while in \"all\" view\n");
562    
563              /* we first need to figure out which gpx file this cache */
564              /* is in so we can open it first */
565              gpx_t *gpx = context->appdata->gpx;
566              while(gpx && !is_in) {
567                cache_t *cur = gpx->cache;
568                while(cur && !is_in) {
569                  if(cur == cache)
570                    is_in = gpx;
571                  cur = cur->next;
572                }
573                gpx = gpx->next;
574              }
575    
576              if(is_in)
577                gpxlist_goto_cachelist(context->appdata, is_in);
578    
579            } else
580              /* the simple case: there already is an open gpx file and */
581              /* we just jump into the "cache" view */
582              is_in = context->appdata->cur_gpx;
583    
584            if(is_in) {
585              printf("selecting %s in %s\n",
586                     cache->id,
587                     context->appdata->cur_gpx->name);
588    
589              cachelist_goto_cache(context->appdata, cache);
590    
591              /* give focus to main screen (important for maemo) */
592              printf("raising main window\n");
593              gtk_window_present(GTK_WINDOW(context->appdata->window));
594            }
595          }
596        }
597    } else if(event->type == OSM_GPS_MAP_BALLOON_EVENT_TYPE_REMOVED) {    } else if(event->type == OSM_GPS_MAP_BALLOON_EVENT_TYPE_REMOVED) {
598      printf("removed\n");      printf("removed\n");
599      context->balloon = NULL;      context->balloon = NULL;
# Line 493  on_map_button_release_event(GtkWidget *w Line 643  on_map_button_release_event(GtkWidget *w
643  static void on_window_destroy(GtkWidget *widget, map_context_t *context) {  static void on_window_destroy(GtkWidget *widget, map_context_t *context) {
644    appdata_t *appdata = context->appdata;    appdata_t *appdata = context->appdata;
645    
   printf("destroy map window\n");  
   
646    /* save map parameters */    /* save map parameters */
647    OsmGpsMap *map = OSM_GPS_MAP(context->widget);    OsmGpsMap *map = OSM_GPS_MAP(context->widget);
648    gint zoom;    gint zoom;
# Line 540  on_window_realize(GtkWidget *widget, gpo Line 688  on_window_realize(GtkWidget *widget, gpo
688  }  }
689  #endif  #endif
690    
691  /* draw geocaches and set window title */  /* on maemo a window is either on top or completely invisible. this */
692  static void map_setup(map_context_t *context) {  /* means that we only need to update the map window if its raised.  */
693    char *name = NULL;  /* on ordinary desktops this is different and we always update */
   
   if(!context->appdata->cur_gpx && !context->appdata->cur_cache) {  
     if(context->state != MAP_ALL) {  
       printf("map_setp(ALL)\n");  
   
       /* no navigation in this mode */  
       osm_gps_map_osd_clear_nav (OSM_GPS_MAP(context->widget));  
   
       /* clear all existing ccahe images */  
       osm_gps_map_clear_images (OSM_GPS_MAP(context->widget));  
   
       /* draw all geocaches */  
       gpx_t *gpx = context->appdata->gpx;  
       while(gpx) {  
         map_draw_gpx(context->appdata, context->widget, gpx);  
         gpx = gpx->next;  
       }  
       name = g_strdup(_("all"));  
       context->state = MAP_ALL;  
     }  
   } else if(!context->appdata->cur_cache) {  
     if(context->state != MAP_GPX) {  
       printf("map_setp(GPX)\n");  
   
       /* no navigation in this mode */  
       osm_gps_map_osd_clear_nav (OSM_GPS_MAP(context->widget));  
   
       /* clear all existing ccahe images */  
       osm_gps_map_clear_images (OSM_GPS_MAP(context->widget));  
694    
       map_draw_gpx(context->appdata, context->widget,  
                    context->appdata->cur_gpx);  
       name = g_strdup(context->appdata->cur_gpx->name);  
       context->state = MAP_GPX;  
     }  
   } else {  
     cache_t *cache = context->appdata->cur_cache;  
   
     printf("map_setp(CACHE)\n");  
   
     /* no balloons in this mode */  
     context->balloon = NULL;  
     osm_gps_map_osd_clear_balloon (OSM_GPS_MAP(context->widget));  
   
     /* clear all existing ccahe images */  
     osm_gps_map_clear_images (OSM_GPS_MAP(context->widget));  
   
     map_draw_cache(context->widget, cache);  
     name = g_strdup(cache->name);  
     context->state = MAP_CACHE;  
   
     /* navigation in this mode! */  
     pos_t cpos = gpx_cache_pos(cache);  
     osm_gps_map_osd_draw_nav (OSM_GPS_MAP(context->widget),  
                               context->appdata->imperial,  
                               cpos.lat, cpos.lon, cache->name);  
   }  
   
   if(name) {  
     char *title = g_strdup_printf(_("Map - %s"), name);  
     g_free(name);  
   
     gtk_window_set_title(GTK_WINDOW(context->window), title);  
   
     g_free(title);  
   } else  
     printf("map_setup(keep)\n");  
 }  
   
 /* on maemo a window is either on top or completely invisible. this means that */  
 /* we only need to update the map window if its raised. on ordinary desktops this */  
 /* is different and we always update */  
695  static gboolean on_focus_in(GtkWidget *widget, GdkEventFocus *event,  static gboolean on_focus_in(GtkWidget *widget, GdkEventFocus *event,
696                           gpointer data) {                           gpointer data) {
697    printf("map got focus\n");    printf("map got focus\n");
# Line 623  static gboolean on_focus_in(GtkWidget *w Line 700  static gboolean on_focus_in(GtkWidget *w
700  }  }
701    
702  void map_update(appdata_t *appdata) {  void map_update(appdata_t *appdata) {
703      printf("map_update\n");
704  #ifndef USE_MAEMO  #ifndef USE_MAEMO
705    if(appdata->map.context)    if(appdata->map.context)
706      map_setup(appdata->map.context);      map_setup(appdata->map.context);
# Line 701  void map(appdata_t *appdata) { Line 779  void map(appdata_t *appdata) {
779    context->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);    context->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
780  #endif  #endif
781    
   /* setup cache state */  
   map_setup(context);  
   
782  #ifndef USE_MAEMO  #ifndef USE_MAEMO
783    gtk_window_set_default_size(GTK_WINDOW(context->window), 640, 480);    gtk_window_set_default_size(GTK_WINDOW(context->window), 640, 480);
784  #endif  #endif

Legend:
Removed from v.136  
changed lines
  Added in v.144