Diff of /trunk/src/osm-gps-map.c

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

revision 237 by harbaum, Mon Dec 7 16:14:50 2009 UTC revision 238 by harbaum, Sat Dec 12 12:54:37 2009 UTC
# Line 158  struct _OsmGpsMapPrivate Line 158  struct _OsmGpsMapPrivate
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)
# Line 1284  osm_gps_map_map_redraw (OsmGpsMap *map) Line 1283  osm_gps_map_map_redraw (OsmGpsMap *map)
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,
# Line 1319  osm_gps_map_map_redraw_idle (OsmGpsMap * Line 1317  osm_gps_map_map_redraw_idle (OsmGpsMap *
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,
# Line 1358  on_window_key_press(GtkWidget *widget, Line 1368  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;
# Line 1367  on_window_key_press(GtkWidget *widget, Line 1377  on_window_key_press(GtkWidget *widget,
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;
# Line 1376  on_window_key_press(GtkWidget *widget, Line 1386  on_window_key_press(GtkWidget *widget,
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;
# Line 1385  on_window_key_press(GtkWidget *widget, Line 1395  on_window_key_press(GtkWidget *widget,
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;
# Line 1438  osm_gps_map_init (OsmGpsMap *object) Line 1448  osm_gps_map_init (OsmGpsMap *object)
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
# Line 1446  osm_gps_map_init (OsmGpsMap *object) Line 1456  osm_gps_map_init (OsmGpsMap *object)
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    
# Line 1656  osm_gps_map_set_property (GObject *objec Line 1665  osm_gps_map_set_property (GObject *objec
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);
# Line 1823  osm_gps_map_button_press (GtkWidget *wid Line 1832  osm_gps_map_button_press (GtkWidget *wid
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;
# Line 1893  osm_gps_map_button_release (GtkWidget *w Line 1902  osm_gps_map_button_release (GtkWidget *w
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      }      }
# Line 1988  osm_gps_map_configure (GtkWidget *widget Line 1997  osm_gps_map_configure (GtkWidget *widget
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
# Line 2560  osm_gps_map_set_center (OsmGpsMap *map, Line 2576  osm_gps_map_set_center (OsmGpsMap *map,
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);
# Line 2592  osm_gps_map_set_zoom (OsmGpsMap *map, in Line 2607  osm_gps_map_set_zoom (OsmGpsMap *map, in
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);
# Line 2740  osm_gps_map_draw_gps (OsmGpsMap *map, fl Line 2746  osm_gps_map_draw_gps (OsmGpsMap *map, fl
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    
# Line 2814  osm_gps_map_scroll (OsmGpsMap *map, gint Line 2820  osm_gps_map_scroll (OsmGpsMap *map, gint
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 */

Legend:
Removed from v.237  
changed lines
  Added in v.238