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

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

revision 33 by harbaum, Tue Jul 28 13:21:40 2009 UTC revision 40 by harbaum, Sun Aug 2 19:05:24 2009 UTC
# Line 18  Line 18 
18   */   */
19    
20  #include "gpxview.h"  #include "gpxview.h"
21    #include <math.h>    // for isnan
22    
23  #ifdef ENABLE_OSM_GPS_MAP  #ifdef ENABLE_OSM_GPS_MAP
24  #include "osm-gps-map.h"  #include "osm-gps-map.h"
25  #endif  #endif
26    
27  typedef struct {  typedef struct {
28      appdata_t *appdata;
29    GtkWidget *widget;    GtkWidget *widget;
30    GtkWidget *zoomin, *zoomout, *gps;    GtkWidget *zoomin, *zoomout, *gps;
31    gint handler_id;    gint handler_id;
32    #if MAEMO_VERSION_MAJOR == 5
33      GtkWidget *old_view;
34    #endif
35  } map_context_t;  } map_context_t;
36    
37  static const char *get_proxy_uri(void) {  #define PROXY_KEY  "/system/http_proxy/"
38    static char proxy_buffer[64];  
39    static const char *get_proxy_uri(appdata_t *appdata) {
40      static char proxy_buffer[64] = "";
41    
42    /* use environment settings if preset */    /* use environment settings if preset */
43    const char *proxy = g_getenv("http_proxy");    const char *proxy = g_getenv("http_proxy");
# Line 39  static const char *get_proxy_uri(void) { Line 46  static const char *get_proxy_uri(void) {
46      return proxy;      return proxy;
47    }    }
48    
49  #if 0    /* ------------- get proxy settings -------------------- */
50    /* otherwise try settings */    if(gconf_client_get_bool(appdata->gconf_client,
51    if(!settings || !settings->proxy ||                             PROXY_KEY "use_http_proxy", NULL)) {
52       !settings->proxy->host) return NULL;  
53        /* we can savely ignore things like "ignore_hosts" since we */
54    snprintf(proxy_buffer, sizeof(proxy_buffer), "%s%s:%u",      /* are pretty sure not inside the net of one of our map renderers */
55             strncmp(settings->proxy->host, "http://", 7)?"http://":"",      /* (unless the user works at google :-) */
56             settings->proxy->host, settings->proxy->port);  
57        /* get basic settings */
58    proxy_buffer[sizeof(proxy_buffer)-1] = 0;      char *host =
59    printf("gconf_proxy: %s\n", proxy_buffer);        gconf_client_get_string(appdata->gconf_client, PROXY_KEY "host", NULL);
60  #endif      if(host) {
61          int port =
62            gconf_client_get_int(appdata->gconf_client, PROXY_KEY "port", NULL);
63    
64          snprintf(proxy_buffer, sizeof(proxy_buffer),
65                   "http://%s:%u", host, port);
66    
67          g_free(host);
68        }
69        return proxy_buffer;
70      }
71    
72    return proxy_buffer;    return NULL;
73  }  }
74    
75  static void map_zoom(map_context_t *context, int step) {  static void map_zoom(map_context_t *context, int step) {
# Line 80  cb_map_zoomout(GtkButton *button, map_co Line 97  cb_map_zoomout(GtkButton *button, map_co
97    
98  static gboolean  static gboolean
99  cb_map_gps(GtkButton *button, map_context_t *context) {  cb_map_gps(GtkButton *button, map_context_t *context) {
100      pos_t *refpos = get_pos(context->appdata);
101    //  osm_gps_map_set_center(OSM_GPS_MAP(context->widget),    if(refpos && !isnan(refpos->lat) && !isnan(refpos->lon)) {
102    //                     DEG2RAD(pos.lat), DEG2RAD(pos.lon));      osm_gps_map_set_mapcenter(OSM_GPS_MAP(context->widget),
103                                  refpos->lat, refpos->lon, 14);
104      } else {
105        /* no coordinates given: display the entire world */
106        osm_gps_map_set_mapcenter(OSM_GPS_MAP(context->widget),
107                                  0.0, 0.0, 1);
108      }
109    
110    return FALSE;    return FALSE;
111  }  }
# Line 103  static GtkWidget Line 126  static GtkWidget
126  static gboolean map_gps_update(gpointer data) {  static gboolean map_gps_update(gpointer data) {
127    map_context_t *context = (map_context_t*)data;    map_context_t *context = (map_context_t*)data;
128    
129    //  gtk_widget_set_sensitive(context->map.gps, gps_fix);    pos_t *refpos = get_pos(context->appdata);
130      gboolean ok = (refpos!= NULL) && !isnan(refpos->lat) && !isnan(refpos->lon);
131    
132      /* get reference position and go there */
133      gtk_widget_set_sensitive(context->gps, ok);
134    
135    return TRUE;    return TRUE;
136  }  }
137    
138    static gboolean on_map_configure(GtkWidget *widget,
139                                     GdkEventConfigure *event,
140                                     map_context_t *context) {
141    
142      cb_map_gps(NULL, context);
143    
144      return FALSE;
145    }
146    
147    static void map_draw_cachelist(GtkWidget *map, cache_t *cache) {
148      while(cache) {
149        GdkPixbuf *icon = icon_get(ICON_CACHE_TYPE, cache->type);
150    
151        osm_gps_map_add_image(OSM_GPS_MAP(map),
152                              cache->pos.lat, cache->pos.lon, icon);
153    
154        cache = cache->next;
155      }
156    }
157    
158    #if MAEMO_VERSION_MAJOR == 5
159    static void on_window_destroy(GtkWidget *widget, map_context_t *context) {
160      printf("destroy map view\n");
161    
162      /* restore cur_view */
163      context->appdata->cur_view = context->old_view;
164    
165      gtk_timeout_remove(context->handler_id);
166      g_free(context);
167    }
168    #endif
169    
170  void map(appdata_t *appdata) {  void map(appdata_t *appdata) {
171    map_context_t context;    map_context_t *context = g_new0(map_context_t, 1);
172      context->appdata = appdata;
173    
174    #if MAEMO_VERSION_MAJOR == 5
175      GtkWidget *window = hildon_stackable_window_new();
176      gtk_window_set_title(GTK_WINDOW(window), _("Map"));
177    #else
178    GtkWidget *dialog = gtk_dialog_new_with_buttons(_("Map"),    GtkWidget *dialog = gtk_dialog_new_with_buttons(_("Map"),
179                            GTK_WINDOW(appdata->window),                            GTK_WINDOW(appdata->window),
180                            GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,                            GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
# Line 123  void map(appdata_t *appdata) { Line 186  void map(appdata_t *appdata) {
186  #else  #else
187    gtk_window_set_default_size(GTK_WINDOW(dialog), 800, 480);    gtk_window_set_default_size(GTK_WINDOW(dialog), 800, 480);
188  #endif  #endif
189    #endif
190    
191    GtkWidget *hbox = gtk_hbox_new(FALSE, 0);    GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
192    
193    char *path = g_strdup_printf("%s/map/", appdata->image_path);    char *path = g_strdup_printf("%s/map/", appdata->image_path);
194      const char *proxy = get_proxy_uri(appdata);
195    
196    context.widget = g_object_new(OSM_TYPE_GPS_MAP,    context->widget = g_object_new(OSM_TYPE_GPS_MAP,
197                  "repo-uri", MAP_SOURCE_OPENSTREETMAP,                  "repo-uri", MAP_SOURCE_OPENSTREETMAP,
                 "proxy-uri", get_proxy_uri(),  
198                  "tile-cache", path,                  "tile-cache", path,
199                    proxy?"proxy-uri":NULL, proxy,
200                   NULL);                   NULL);
201    
202    g_free(path);    g_free(path);
203    
204      /* draw all geocaches */
205      gpx_t *gpx = appdata->gpx;
206      while(gpx) {
207        map_draw_cachelist(context->widget, gpx->cache);
208        gpx = gpx->next;
209      }
210    
211      g_signal_connect(G_OBJECT(context->widget), "configure-event",
212                       G_CALLBACK(on_map_configure), context);
213  #if 0  #if 0
214    g_signal_connect(G_OBJECT(context.widget), "button-release-event",    g_signal_connect(G_OBJECT(context->widget), "button-release-event",
215                     G_CALLBACK(on_map_button_release_event), &context);                     G_CALLBACK(on_map_button_release_event), context);
216  #endif  #endif
217    
218    gtk_box_pack_start_defaults(GTK_BOX(hbox), context.widget);    gtk_box_pack_start_defaults(GTK_BOX(hbox), context->widget);
219    /* zoom button box */    /* zoom button box */
220    GtkWidget *vbox = gtk_vbox_new(FALSE,0);    GtkWidget *vbox = gtk_vbox_new(FALSE,0);
221    
222    context.zoomin =    context->zoomin =
223      map_add_button(GTK_STOCK_ZOOM_IN, G_CALLBACK(cb_map_zoomin),      map_add_button(GTK_STOCK_ZOOM_IN, G_CALLBACK(cb_map_zoomin),
224                     &context, _("Zoom in"));                     context, _("Zoom in"));
225    gtk_box_pack_start(GTK_BOX(vbox), context.zoomin, FALSE, FALSE, 0);    gtk_box_pack_start(GTK_BOX(vbox), context->zoomin, FALSE, FALSE, 0);
226    
227    context.zoomout =    context->zoomout =
228      map_add_button(GTK_STOCK_ZOOM_OUT, G_CALLBACK(cb_map_zoomout),      map_add_button(GTK_STOCK_ZOOM_OUT, G_CALLBACK(cb_map_zoomout),
229                     &context, _("Zoom out"));                     context, _("Zoom out"));
230    gtk_box_pack_start(GTK_BOX(vbox), context.zoomout, FALSE, FALSE, 0);    gtk_box_pack_start(GTK_BOX(vbox), context->zoomout, FALSE, FALSE, 0);
231    
232    context.gps =    context->gps =
233      map_add_button(GTK_STOCK_HOME, G_CALLBACK(cb_map_gps),      map_add_button(GTK_STOCK_HOME, G_CALLBACK(cb_map_gps),
234                     &context, _("Jump to GPS position"));                     context, _("Jump to GPS position"));
235    gtk_widget_set_sensitive(context.gps, FALSE);    gtk_widget_set_sensitive(context->gps, FALSE);
236    /* install handler for timed updates of the gps button */    /* install handler for timed updates of the gps button */
237    context.handler_id = gtk_timeout_add(1000, map_gps_update, &context);    context->handler_id = gtk_timeout_add(1000, map_gps_update, context);
238    gtk_box_pack_start(GTK_BOX(vbox), context.gps, FALSE, FALSE, 0);    gtk_box_pack_start(GTK_BOX(vbox), context->gps, FALSE, FALSE, 0);
239    
240    gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);    gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
241    
242    #if MAEMO_VERSION_MAJOR == 5
243      /* prevent some of the main screen things */
244      context->old_view = appdata->cur_view;
245      appdata->cur_view = NULL;
246    
247      g_signal_connect(G_OBJECT(window), "destroy",
248                       G_CALLBACK(on_window_destroy), context);
249    
250      gtk_container_add(GTK_CONTAINER(window), hbox);
251      gtk_widget_show_all(GTK_WIDGET(window));
252    
253    #else
254    gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox);    gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox);
   
255    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE);    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE);
   
256    gtk_widget_show_all(dialog);    gtk_widget_show_all(dialog);
   
257    gtk_dialog_run(GTK_DIALOG(dialog));    gtk_dialog_run(GTK_DIALOG(dialog));
258      gtk_timeout_remove(context->handler_id);
259    gtk_widget_destroy(dialog);    gtk_widget_destroy(dialog);
260      g_free(context);
261    #endif
262  }  }

Legend:
Removed from v.33  
changed lines
  Added in v.40