]> err.no Git - libchamplain/commitdiff
anchor is a view property
authorPierre-Luc Beaudoin <pierre-luc@pierlux.com>
Sat, 28 Feb 2009 09:56:38 +0000 (11:56 +0200)
committerPierre-Luc Beaudoin <pierre-luc@pierlux.com>
Wed, 4 Mar 2009 21:05:37 +0000 (23:05 +0200)
champlain/champlain-map.c
champlain/champlain-tile.c
champlain/champlain-view.c

index 800a6b6c35db6543d8d9bf57d8385823709bcaf8..ca99e81e6a6ee10d7db057c5c3d9e85cd50034e8 100644 (file)
@@ -84,11 +84,8 @@ map_load_visible_tiles (Map *map, ChamplainRectangle viewport, gboolean offline)
   gint x_count = ceil((float)viewport.width / map->tile_size) + 1;
   gint y_count = ceil((float)viewport.height / map->tile_size) + 1;
 
-  ChamplainPoint anchor; //XXX
-  anchor.x = 0;
-  anchor.y = 0;
-  gint x_first = (anchor.x + viewport.x) / map->tile_size;
-  gint y_first = (anchor.y + viewport.y) / map->tile_size;
+  gint x_first = viewport.x / map->tile_size;
+  gint y_first = viewport.y / map->tile_size;
 
   x_count += x_first;
   y_count += y_first;
index 5f83180bac5af31d7beb920eda1c655238b62d17..b948eac8777d92fb86cfe85f372f7ac078a2b2bc 100644 (file)
@@ -450,26 +450,6 @@ typedef struct {
 #define CACHE_DIR "champlain"
 static SoupSession * soup_session;
 
-void
-tile_set_position(Map* map, ChamplainTile* tile)
-{
-  ClutterActor *actor;
-  gint x;
-  gint y;
-  guint size;
-  g_object_get (G_OBJECT (tile), "actor", &actor,
-      "x", &x, "y", &y,
-      "size", &size, NULL);
-  ChamplainPoint anchor; //XXX
-  anchor.x = 0;
-  anchor.y = 0;
-  clutter_actor_set_position (actor,
-    (x * size) - anchor.x,
-    (y * size) - anchor.y);
-  clutter_actor_set_size (actor, size, size); //XXX Move elsewhere
-  clutter_actor_show (actor);
-}
-
 void
 tile_setup_animation (ChamplainTile* tile)
 {
@@ -488,9 +468,10 @@ create_error_tile(Map* map, ChamplainTile* tile)
     return;
 
   champlain_tile_set_actor (tile, actor);
-  tile_set_position (map, tile);
+  clutter_actor_show (actor);
 
   clutter_container_add (CLUTTER_CONTAINER (champlain_zoom_level_get_actor (map->current_level)), actor, NULL);
+  clutter_actor_show (actor);
   tile_setup_animation (tile);
 
   champlain_tile_set_state (tile, CHAMPLAIN_STATE_DONE);
@@ -587,7 +568,8 @@ file_loaded_cb (SoupSession *session,
       3, 0, NULL);
   champlain_tile_set_actor (tile, actor);
 
-  tile_set_position (map, tile);
+  clutter_actor_set_size (actor, champlain_tile_get_size (tile), champlain_tile_get_size (tile));
+  clutter_actor_show (actor);
 
   clutter_container_add (CLUTTER_CONTAINER (champlain_zoom_level_get_actor (map->current_level)), actor, NULL);
   tile_setup_animation (tile);
@@ -625,9 +607,10 @@ tile_load (Map* map, gint zoom_level, gint x, gint y, gboolean offline)
     {
       ClutterActor *actor = clutter_texture_new_from_file (filename, NULL);
       champlain_tile_set_actor (tile, actor);
-      tile_set_position (map, tile);
+      clutter_actor_show (actor);
 
       clutter_container_add (CLUTTER_CONTAINER (champlain_zoom_level_get_actor (map->current_level)), actor, NULL);
+      champlain_tile_set_state (tile, CHAMPLAIN_STATE_DONE);
       // Do not animate since it is local and fast
     }
   else if (!offline)
index b98a5bc0f36dc73233fff47d10dfc9ca848a4d05..4572f7fead37de0affd68905b32556b12d9c8330 100644 (file)
@@ -99,12 +99,15 @@ struct _ChamplainViewPrivate
 
   ChamplainMapSource map_source;
   ChamplainScrollMode scroll_mode;
-  gint zoom_level;
+  gint zoom_level; /* Holds the current zoom level number */
 
   /* Represents the (lat, lon) at the center of the viewport */
   gdouble longitude;
   gdouble latitude;
 
+  /* Hack to get smaller x,y coordinates as the clutter limit is G_MAXINT16 */
+  ChamplainPoint anchor;
+
   ClutterActor *map_layer;
   ClutterActor *viewport;
   ClutterActor *finger_scroll;
@@ -152,6 +155,9 @@ static gboolean finger_scroll_button_press_cb (ClutterActor *actor,
     ClutterButtonEvent *event, ChamplainView *view);
 static void update_license (ChamplainView *view);
 static void license_set_position (ChamplainView *view);
+static void view_load_visible_tiles (ChamplainView *view);
+static void view_position_tile (ChamplainView* view, ChamplainTile* tile);
+static void view_tiles_reposition (ChamplainView* view);
 
 static gdouble
 viewport_get_longitude_at (ChamplainViewPrivate *priv, gint x)
@@ -170,10 +176,7 @@ viewport_get_current_longitude (ChamplainViewPrivate *priv)
   if (!priv->map)
     return 0.0;
 
-  ChamplainPoint anchor; //XXX
-      anchor.x = 0;
-      anchor.y = 0;
-  return viewport_get_longitude_at (priv, anchor.x +
+  return viewport_get_longitude_at (priv, priv->anchor.x +
       priv->viewport_size.x + priv->viewport_size.width / 2.0);
 }
 
@@ -194,12 +197,8 @@ viewport_get_current_latitude (ChamplainViewPrivate *priv)
   if (!priv->map)
     return 0.0;
 
-  ChamplainPoint anchor; //XXX
-      anchor.x = 0;
-      anchor.y = 0;
-
   return viewport_get_latitude_at (priv,
-      anchor.y + priv->viewport_size.y +
+      priv->anchor.y + priv->viewport_size.y +
       priv->viewport_size.height / 2.0);
 }
 
@@ -223,13 +222,10 @@ scroll_event (ClutterActor *actor,
   rel_y = event->y - actor_y;
 
   /* Keep the lon, lat where the mouse is */
-  ChamplainPoint anchor; //XXX
-      anchor.x = 0;
-      anchor.y = 0;
   lon = viewport_get_longitude_at (priv,
-    priv->viewport_size.x + rel_x + anchor.x);
+    priv->viewport_size.x + rel_x + priv->anchor.x);
   lat = viewport_get_latitude_at (priv,
-    priv->viewport_size.y + rel_y + anchor.y);
+    priv->viewport_size.y + rel_y + priv->anchor.y);
 
   /* How far was it from the center of the viewport (in px) */
   x_diff = priv->viewport_size.width / 2 - rel_x;
@@ -278,9 +274,6 @@ marker_reposition_cb (ChamplainMarker *marker,
 
   gint level;
   gint x, y;
-  ChamplainPoint anchor; //XXX
-      anchor.x = 0;
-      anchor.y = 0;
 
   if (priv->map)
     {
@@ -288,8 +281,8 @@ marker_reposition_cb (ChamplainMarker *marker,
       y = priv->map->latitude_to_y (priv->map, marker_priv->lat, priv->zoom_level);
 
       clutter_actor_set_position (CLUTTER_ACTOR (marker),
-        x - anchor.x,
-        y - anchor.y);
+        x - priv->anchor.x,
+        y - priv->anchor.y);
     }
 }
 
@@ -350,6 +343,7 @@ create_initial_map (ChamplainView *view)
   clutter_container_add_actor (CLUTTER_CONTAINER (priv->map_layer), group);
 
   g_idle_add (marker_reposition, view);
+  view_tiles_reposition (view);
   update_license (view);
 
   g_object_notify (G_OBJECT (view), "zoom-level");
@@ -542,13 +536,13 @@ champlain_view_set_property (GObject *object,
                 map_load_level (priv->map, priv->zoom_level);
                 group = champlain_zoom_level_get_actor (priv->map->current_level);
 
-                map_load_visible_tiles (priv->map, priv->viewport_size,
-                    priv->offline);
+                view_load_visible_tiles (view);
                 clutter_container_add_actor (CLUTTER_CONTAINER (priv->map_layer),
                     group);
 
                 update_license (view);
                 g_idle_add (marker_reposition, view);
+                view_tiles_reposition (view);
                 champlain_view_center_on (view, priv->latitude, priv->longitude);
               }
           }
@@ -753,6 +747,8 @@ champlain_view_init (ChamplainView *view)
   priv->viewport_size.y = 0;
   priv->viewport_size.width = 0;
   priv->viewport_size.height = 0;
+  priv->anchor.x = 0;
+  priv->anchor.y = 0;
 
 
   /* Setup viewport */
@@ -815,7 +811,8 @@ viewport_x_changed_cb (GObject *gobject,
   priv->viewport_size.x = rect.x;
   priv->viewport_size.y = rect.y;
 
-  map_load_visible_tiles (priv->map, priv->viewport_size, priv->offline);
+  view_load_visible_tiles (view);
+  view_tiles_reposition (view);
 
   g_object_notify (G_OBJECT (view), "longitude");
   g_object_notify (G_OBJECT (view), "latitude");
@@ -840,7 +837,7 @@ champlain_view_set_size (ChamplainView *view,
   if (priv->keep_center_on_resize)
     champlain_view_center_on (view, priv->latitude, priv->longitude);
   else
-    map_load_visible_tiles (priv->map, priv->viewport_size, priv->offline);
+    view_load_visible_tiles (view);
 }
 
 static void
@@ -884,13 +881,10 @@ finger_scroll_button_press_cb (ClutterActor *actor,
 
       ClutterActor *group = champlain_zoom_level_get_actor (priv->map->current_level);
       /* Keep the lon, lat where the mouse is */
-      ChamplainPoint anchor; //XXX
-      anchor.x = 0;
-      anchor.y = 0;
       gdouble lon = viewport_get_longitude_at (priv,
-        priv->viewport_size.x + rel_x + anchor.x);
+        priv->viewport_size.x + rel_x + priv->anchor.x);
       gdouble lat = viewport_get_latitude_at (priv,
-        priv->viewport_size.y + rel_y + anchor.y);
+        priv->viewport_size.y + rel_y + priv->anchor.y);
 
       /* How far was it from the center of the viewport (in px) */
       gint x_diff = priv->viewport_size.width / 2 - rel_x;
@@ -968,43 +962,34 @@ champlain_view_center_on (ChamplainView *view,
 
   x = priv->map->longitude_to_x (priv->map, longitude, priv->zoom_level);
   y = priv->map->latitude_to_y (priv->map, latitude, priv->zoom_level);
-  ChamplainPoint* anchor = g_new0 (ChamplainPoint, 1); //XXX
 
   if (priv->zoom_level >= 8)
     {
       gdouble max;
 
-      anchor->x = x - G_MAXINT16 / 2;
-      anchor->y = y - G_MAXINT16 / 2;
+      priv->anchor.x = x - G_MAXINT16 / 2;
+      priv->anchor.y = y - G_MAXINT16 / 2;
 
-      if ( anchor->x < 0 )
-        anchor->x = 0;
-      if ( anchor->y < 0 )
-        anchor->y = 0;
+      if ( priv->anchor.x < 0 )
+        priv->anchor.x = 0;
+      if ( priv->anchor.y < 0 )
+        priv->anchor.y = 0;
 
       max = champlain_zoom_level_get_width (priv->map->current_level)*256 - //XXX
           (G_MAXINT16 / 2);
-      if (anchor->x > max)
-        anchor->x = max;
-      if (anchor->y > max)
-        anchor->y = max;
+      if (priv->anchor.x > max)
+        priv->anchor.x = max;
+      if (priv->anchor.y > max)
+        priv->anchor.y = max;
 
-      x -= anchor->x;
-      y -= anchor->y;
+      x -= priv->anchor.x;
+      y -= priv->anchor.y;
     }
   else
     {
-      anchor->x = 0;
-      anchor->y = 0;
-    }
-/*
-  for (i = 0; i < champlain_zoom_level_tile_count (priv->map->current_level); i++)
-    {
-      ChamplainTile *tile = champlain_zoom_level_get_nth_tile (priv->map->current_level, i);
-      if (champlain_tile_get_state (tile) == CHAMPLAIN_STATE_DONE)
-        tile_set_position (priv->map, tile);
+      priv->anchor.x = 0;
+      priv->anchor.y = 0;
     }
-*/
 
   tidy_viewport_set_origin (TIDY_VIEWPORT (priv->viewport),
     x - priv->viewport_size.width / 2.0,
@@ -1014,7 +999,8 @@ champlain_view_center_on (ChamplainView *view,
   g_object_notify (G_OBJECT (view), "longitude");
   g_object_notify (G_OBJECT (view), "latitude");
 
-  map_load_visible_tiles (priv->map, priv->viewport_size, priv->offline);
+  view_load_visible_tiles (view);
+  view_tiles_reposition (view);
   marker_reposition (view);
 }
 
@@ -1176,15 +1162,57 @@ champlain_view_get_coords_from_event (ChamplainView *view,
   rel_x = x - actor_x;
   rel_y = y - actor_y;
 
-  ChamplainPoint anchor; //XXX
-      anchor.x = 0;
-      anchor.y = 0;
   if (latitude)
     *latitude = viewport_get_latitude_at (priv,
-        priv->viewport_size.y + rel_y + anchor.y);
+        priv->viewport_size.y + rel_y + priv->anchor.y);
   if (longitude)
     *longitude = viewport_get_longitude_at (priv,
-        priv->viewport_size.x + rel_x + anchor.x);
+        priv->viewport_size.x + rel_x + priv->anchor.x);
 
   return TRUE;
 }
+
+static void
+view_load_visible_tiles (ChamplainView *view)
+{
+  ChamplainViewPrivate *priv = GET_PRIVATE (view);
+  ChamplainRectangle viewport = priv->viewport_size;
+
+  viewport.x += priv->anchor.x;
+  viewport.y += priv->anchor.y;
+
+  map_load_visible_tiles (priv->map, viewport, priv->offline);
+}
+
+static void
+view_position_tile (ChamplainView* view, ChamplainTile* tile)
+{
+  ChamplainViewPrivate *priv = GET_PRIVATE (view);
+
+  ClutterActor *actor;
+  gint x;
+  gint y;
+  guint size;
+
+  g_object_get (G_OBJECT (tile), "actor", &actor,
+      "x", &x, "y", &y,
+      "size", &size, NULL);
+  clutter_actor_set_position (actor,
+    (x * size) - priv->anchor.x,
+    (y * size) - priv->anchor.y);
+}
+
+//FIXME: This isn't called  when tiles are done loading
+static void
+view_tiles_reposition (ChamplainView* view)
+{
+  ChamplainViewPrivate *priv = GET_PRIVATE (view);
+  gint i;
+
+  for (i = 0; i < champlain_zoom_level_tile_count (priv->map->current_level); i++)
+    {
+      ChamplainTile *tile = champlain_zoom_level_get_nth_tile (priv->map->current_level, i);
+      if (champlain_tile_get_state (tile) == CHAMPLAIN_STATE_DONE)
+        view_position_tile (view, tile);
+    }
+}