[libchamplain] Fix markers reordering if marker's position is updated after being added to the layer



commit 533de1a720742c75ddde5b5797a41cc594673a78
Author: Pierre-Luc Beaudoin <pierre-luc pierlux com>
Date:   Sun Jun 14 13:14:24 2009 -0400

    Fix markers reordering if marker's position is updated after being added to the layer

 champlain/champlain-layer.c |   48 ++++++++++++++++++++++++++++++++++++------
 1 files changed, 41 insertions(+), 7 deletions(-)
---
diff --git a/champlain/champlain-layer.c b/champlain/champlain-layer.c
index 0f802b6..76a8297 100644
--- a/champlain/champlain-layer.c
+++ b/champlain/champlain-layer.c
@@ -56,6 +56,9 @@ struct _ChamplainLayerPrivate {
 static void layer_add_cb (ClutterGroup *layer,
     ClutterActor *marker,
     gpointer data);
+static void layer_remove_cb (ClutterGroup *layer,
+    ClutterActor *marker,
+    gpointer data);
 
 static void
 champlain_layer_get_property (GObject *object,
@@ -99,7 +102,10 @@ champlain_layer_class_init (ChamplainLayerClass *klass)
 static void
 champlain_layer_init (ChamplainLayer *self)
 {
-  g_signal_connect_after(G_OBJECT(self), "actor-added", G_CALLBACK(layer_add_cb), NULL);
+  g_signal_connect_after(G_OBJECT(self), "actor-added",
+      G_CALLBACK(layer_add_cb), NULL);
+  g_signal_connect_after(G_OBJECT(self), "actor-removed",
+      G_CALLBACK(layer_remove_cb), NULL);
 }
 
 /* This callback serves to keep the markers ordered by their latitude.
@@ -108,9 +114,8 @@ champlain_layer_init (ChamplainLayer *self)
  * where the most north you are, the farther you are.
  */
 static void
-layer_add_cb (ClutterGroup *layer,
-    ClutterActor *marker,
-    gpointer data)
+reorder_marker (ClutterGroup *layer,
+    ChamplainBaseMarker *marker)
 {
   GList* markers = clutter_container_get_children (CLUTTER_CONTAINER(layer));
   gint size, i;
@@ -118,7 +123,7 @@ layer_add_cb (ClutterGroup *layer,
   ChamplainBaseMarker *lowest = NULL;
 
   size = g_list_length (markers);
-  g_object_get(G_OBJECT(marker), "latitude", &y, NULL);
+  g_object_get (G_OBJECT (marker), "latitude", &y, NULL);
   y = 90 - y;
   low_y = G_MAXDOUBLE;
 
@@ -139,8 +144,37 @@ layer_add_cb (ClutterGroup *layer,
     }
 
   if (lowest)
-    clutter_container_lower_child(CLUTTER_CONTAINER(layer),
-        CLUTTER_ACTOR(marker), CLUTTER_ACTOR(lowest));
+    clutter_container_lower_child (CLUTTER_CONTAINER(layer),
+        CLUTTER_ACTOR (marker), CLUTTER_ACTOR (lowest));
+}
+
+static void
+marker_position_notify (GObject *gobject,
+    GParamSpec *pspec,
+    gpointer user_data)
+{
+  reorder_marker (CLUTTER_GROUP (user_data), CHAMPLAIN_BASE_MARKER (gobject));
+}
+
+static void
+layer_add_cb (ClutterGroup *layer,
+    ClutterActor *actor,
+    gpointer data)
+{
+  ChamplainBaseMarker *marker = CHAMPLAIN_BASE_MARKER (actor);
+  reorder_marker (layer, marker);
+
+  g_signal_connect (G_OBJECT (marker), "notify::latitude",
+      G_CALLBACK (marker_position_notify), layer);
+}
+
+static void
+layer_remove_cb (ClutterGroup *layer,
+    ClutterActor *actor,
+    gpointer data)
+{
+  g_signal_handlers_disconnect_by_func (G_OBJECT (actor),
+      G_CALLBACK (marker_position_notify), layer);
 }
 
 /**



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]