158 |
|
|
159 |
guint is_disposed : 1; |
guint is_disposed : 1; |
160 |
guint dragging : 1; |
guint dragging : 1; |
|
guint center_coord_set : 1; |
|
161 |
}; |
}; |
162 |
|
|
163 |
#define OSM_GPS_MAP_PRIVATE(o) (OSM_GPS_MAP (o)->priv) |
#define OSM_GPS_MAP_PRIVATE(o) (OSM_GPS_MAP (o)->priv) |
1283 |
priv->redraw_cycle++; |
priv->redraw_cycle++; |
1284 |
|
|
1285 |
/* draw white background to initialise pixmap */ |
/* draw white background to initialise pixmap */ |
1286 |
gdk_draw_rectangle ( |
gdk_draw_rectangle (priv->pixmap, |
|
priv->pixmap, |
|
1287 |
GTK_WIDGET(map)->style->white_gc, |
GTK_WIDGET(map)->style->white_gc, |
1288 |
TRUE, |
TRUE, |
1289 |
0, 0, |
0, 0, |
1317 |
priv->idle_map_redraw = g_idle_add ((GSourceFunc)osm_gps_map_map_redraw, map); |
priv->idle_map_redraw = g_idle_add ((GSourceFunc)osm_gps_map_map_redraw, map); |
1318 |
} |
} |
1319 |
|
|
1320 |
|
static void |
1321 |
|
center_coord_update(GtkWidget *widget) { |
1322 |
|
OsmGpsMapPrivate *priv = OSM_GPS_MAP_PRIVATE(widget); |
1323 |
|
|
1324 |
|
// pixel_x,y, offsets |
1325 |
|
gint pixel_x = priv->map_x + widget->allocation.width/2; |
1326 |
|
gint pixel_y = priv->map_y + widget->allocation.height/2; |
1327 |
|
|
1328 |
|
priv->center_rlon = pixel2lon(priv->map_zoom, pixel_x); |
1329 |
|
priv->center_rlat = pixel2lat(priv->map_zoom, pixel_y); |
1330 |
|
} |
1331 |
|
|
1332 |
#ifdef OSM_GPS_MAP_KEYS |
#ifdef OSM_GPS_MAP_KEYS |
1333 |
static gboolean |
static gboolean |
1334 |
on_window_key_press(GtkWidget *widget, |
on_window_key_press(GtkWidget *widget, |
1368 |
#ifdef OSM_GPS_MAP_KEY_UP |
#ifdef OSM_GPS_MAP_KEY_UP |
1369 |
case OSM_GPS_MAP_KEY_UP: |
case OSM_GPS_MAP_KEY_UP: |
1370 |
priv->map_y -= step; |
priv->map_y -= step; |
1371 |
priv->center_coord_set = FALSE; |
center_coord_update(widget); |
1372 |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
1373 |
handled = TRUE; |
handled = TRUE; |
1374 |
break; |
break; |
1377 |
#ifdef OSM_GPS_MAP_KEY_DOWN |
#ifdef OSM_GPS_MAP_KEY_DOWN |
1378 |
case OSM_GPS_MAP_KEY_DOWN: |
case OSM_GPS_MAP_KEY_DOWN: |
1379 |
priv->map_y += step; |
priv->map_y += step; |
1380 |
priv->center_coord_set = FALSE; |
center_coord_update(widget); |
1381 |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
1382 |
handled = TRUE; |
handled = TRUE; |
1383 |
break; |
break; |
1386 |
#ifdef OSM_GPS_MAP_KEY_LEFT |
#ifdef OSM_GPS_MAP_KEY_LEFT |
1387 |
case OSM_GPS_MAP_KEY_LEFT: |
case OSM_GPS_MAP_KEY_LEFT: |
1388 |
priv->map_x -= step; |
priv->map_x -= step; |
1389 |
priv->center_coord_set = FALSE; |
center_coord_update(widget); |
1390 |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
1391 |
handled = TRUE; |
handled = TRUE; |
1392 |
break; |
break; |
1395 |
#ifdef OSM_GPS_MAP_KEY_RIGHT |
#ifdef OSM_GPS_MAP_KEY_RIGHT |
1396 |
case OSM_GPS_MAP_KEY_RIGHT: |
case OSM_GPS_MAP_KEY_RIGHT: |
1397 |
priv->map_x += step; |
priv->map_x += step; |
1398 |
priv->center_coord_set = FALSE; |
center_coord_update(widget); |
1399 |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
1400 |
handled = TRUE; |
handled = TRUE; |
1401 |
break; |
break; |
1448 |
|
|
1449 |
#ifndef LIBSOUP22 |
#ifndef LIBSOUP22 |
1450 |
//Change naumber of concurrent connections option? |
//Change naumber of concurrent connections option? |
1451 |
priv->soup_session = |
priv->soup_session = |
1452 |
soup_session_async_new_with_options(SOUP_SESSION_USER_AGENT, |
soup_session_async_new_with_options(SOUP_SESSION_USER_AGENT, |
1453 |
USER_AGENT, NULL); |
USER_AGENT, NULL); |
1454 |
#else |
#else |
1456 |
/* set it seperately as an extra header field for each reuest */ |
/* set it seperately as an extra header field for each reuest */ |
1457 |
priv->soup_session = soup_session_async_new(); |
priv->soup_session = soup_session_async_new(); |
1458 |
#endif |
#endif |
|
|
|
1459 |
//Hash table which maps tile d/l URIs to SoupMessage requests |
//Hash table which maps tile d/l URIs to SoupMessage requests |
1460 |
priv->tile_queue = g_hash_table_new (g_str_hash, g_str_equal); |
priv->tile_queue = g_hash_table_new (g_str_hash, g_str_equal); |
1461 |
|
|
1665 |
break; |
break; |
1666 |
case PROP_MAP_X: |
case PROP_MAP_X: |
1667 |
priv->map_x = g_value_get_int (value); |
priv->map_x = g_value_get_int (value); |
1668 |
priv->center_coord_set = FALSE; |
center_coord_update(GTK_WIDGET(object)); |
1669 |
break; |
break; |
1670 |
case PROP_MAP_Y: |
case PROP_MAP_Y: |
1671 |
priv->map_y = g_value_get_int (value); |
priv->map_y = g_value_get_int (value); |
1672 |
priv->center_coord_set = FALSE; |
center_coord_update(GTK_WIDGET(object)); |
1673 |
break; |
break; |
1674 |
case PROP_GPS_TRACK_WIDTH: |
case PROP_GPS_TRACK_WIDTH: |
1675 |
priv->ui_gps_track_width = g_value_get_int (value); |
priv->ui_gps_track_width = g_value_get_int (value); |
1832 |
switch(but) { |
switch(but) { |
1833 |
case OSD_UP: |
case OSD_UP: |
1834 |
priv->map_y -= step; |
priv->map_y -= step; |
1835 |
priv->center_coord_set = FALSE; |
center_coord_update(widget); |
1836 |
g_object_set(G_OBJECT(widget), "auto-center", FALSE, NULL); |
g_object_set(G_OBJECT(widget), "auto-center", FALSE, NULL); |
1837 |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
1838 |
break; |
break; |
1839 |
|
|
1840 |
case OSD_DOWN: |
case OSD_DOWN: |
1841 |
priv->map_y += step; |
priv->map_y += step; |
1842 |
priv->center_coord_set = FALSE; |
center_coord_update(widget); |
1843 |
g_object_set(G_OBJECT(widget), "auto-center", FALSE, NULL); |
g_object_set(G_OBJECT(widget), "auto-center", FALSE, NULL); |
1844 |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
1845 |
break; |
break; |
1846 |
|
|
1847 |
case OSD_LEFT: |
case OSD_LEFT: |
1848 |
priv->map_x -= step; |
priv->map_x -= step; |
1849 |
priv->center_coord_set = FALSE; |
center_coord_update(widget); |
1850 |
g_object_set(G_OBJECT(widget), "auto-center", FALSE, NULL); |
g_object_set(G_OBJECT(widget), "auto-center", FALSE, NULL); |
1851 |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
1852 |
break; |
break; |
1853 |
|
|
1854 |
case OSD_RIGHT: |
case OSD_RIGHT: |
1855 |
priv->map_x += step; |
priv->map_x += step; |
1856 |
priv->center_coord_set = FALSE; |
center_coord_update(widget); |
1857 |
g_object_set(G_OBJECT(widget), "auto-center", FALSE, NULL); |
g_object_set(G_OBJECT(widget), "auto-center", FALSE, NULL); |
1858 |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
1859 |
break; |
break; |
1902 |
priv->map_x += (priv->drag_start_mouse_x - (int) event->x); |
priv->map_x += (priv->drag_start_mouse_x - (int) event->x); |
1903 |
priv->map_y += (priv->drag_start_mouse_y - (int) event->y); |
priv->map_y += (priv->drag_start_mouse_y - (int) event->y); |
1904 |
|
|
1905 |
priv->center_coord_set = FALSE; |
center_coord_update(widget); |
1906 |
|
|
1907 |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); |
1908 |
} |
} |
1997 |
widget->allocation.height + EXTRA_BORDER * 2, |
widget->allocation.height + EXTRA_BORDER * 2, |
1998 |
-1); |
-1); |
1999 |
|
|
2000 |
|
// pixel_x,y, offsets |
2001 |
|
gint pixel_x = lon2pixel(priv->map_zoom, priv->center_rlon); |
2002 |
|
gint pixel_y = lat2pixel(priv->map_zoom, priv->center_rlat); |
2003 |
|
|
2004 |
|
priv->map_x = pixel_x - widget->allocation.width/2; |
2005 |
|
priv->map_y = pixel_y - widget->allocation.height/2; |
2006 |
|
|
2007 |
#ifdef ENABLE_OSD |
#ifdef ENABLE_OSD |
2008 |
|
|
2009 |
#ifdef OSD_DOUBLE_BUFFER |
#ifdef OSD_DOUBLE_BUFFER |
2576 |
|
|
2577 |
priv->center_rlat = deg2rad(latitude); |
priv->center_rlat = deg2rad(latitude); |
2578 |
priv->center_rlon = deg2rad(longitude); |
priv->center_rlon = deg2rad(longitude); |
|
priv->center_coord_set = TRUE; |
|
2579 |
|
|
2580 |
// pixel_x,y, offsets |
// pixel_x,y, offsets |
2581 |
pixel_x = lon2pixel(priv->map_zoom, priv->center_rlon); |
pixel_x = lon2pixel(priv->map_zoom, priv->center_rlon); |
2607 |
//constrain zoom min_zoom -> max_zoom |
//constrain zoom min_zoom -> max_zoom |
2608 |
priv->map_zoom = CLAMP(zoom, priv->min_zoom, priv->max_zoom); |
priv->map_zoom = CLAMP(zoom, priv->min_zoom, priv->max_zoom); |
2609 |
|
|
2610 |
if (priv->center_coord_set) |
priv->map_x = lon2pixel(priv->map_zoom, priv->center_rlon) - width_center; |
2611 |
{ |
priv->map_y = lat2pixel(priv->map_zoom, priv->center_rlat) - height_center; |
|
priv->map_x = lon2pixel(priv->map_zoom, priv->center_rlon) - width_center; |
|
|
priv->map_y = lat2pixel(priv->map_zoom, priv->center_rlat) - height_center; |
|
|
} |
|
|
else |
|
|
{ |
|
|
factor = exp(priv->map_zoom * M_LN2)/exp(zoom_old * M_LN2); |
|
|
priv->map_x = ((priv->map_x + width_center) * factor) - width_center; |
|
|
priv->map_y = ((priv->map_y + height_center) * factor) - height_center; |
|
|
} |
|
2612 |
|
|
2613 |
g_debug("Zoom changed from %d to %d factor:%f x:%d", |
g_debug("Zoom changed from %d to %d factor:%f x:%d", |
2614 |
zoom_old, priv->map_zoom, factor, priv->map_x); |
zoom_old, priv->map_zoom, factor, priv->map_x); |
2746 |
|
|
2747 |
priv->map_x = pixel_x - GTK_WIDGET(map)->allocation.width/2; |
priv->map_x = pixel_x - GTK_WIDGET(map)->allocation.width/2; |
2748 |
priv->map_y = pixel_y - GTK_WIDGET(map)->allocation.height/2; |
priv->map_y = pixel_y - GTK_WIDGET(map)->allocation.height/2; |
2749 |
priv->center_coord_set = FALSE; |
center_coord_update(GTK_WIDGET(map)); |
2750 |
} |
} |
2751 |
} |
} |
2752 |
|
|
2820 |
g_return_if_fail (OSM_IS_GPS_MAP (map)); |
g_return_if_fail (OSM_IS_GPS_MAP (map)); |
2821 |
priv = map->priv; |
priv = map->priv; |
2822 |
|
|
|
priv->center_coord_set = FALSE; |
|
2823 |
priv->map_x += dx; |
priv->map_x += dx; |
2824 |
priv->map_y += dy; |
priv->map_y += dy; |
2825 |
|
center_coord_update(GTK_WIDGET(map)); |
2826 |
|
|
2827 |
#ifdef ENABLE_OSD |
#ifdef ENABLE_OSD |
2828 |
/* OSD may contain a coordinate, so we may have to re-render it */ |
/* OSD may contain a coordinate, so we may have to re-render it */ |