[libchamplain] Emit a signal if MapDataSource has changed



commit a6a62450de219e18eea83bda58ed605096af183d
Author: Simon Wenner <simon wenner ch>
Date:   Fri Jun 26 12:12:59 2009 +0200

    Emit a signal if MapDataSource has changed

 champlain/champlain-local-map-data-source.c |    3 +++
 champlain/champlain-map-data-source.c       |   23 +++++++++++++++++++++++
 champlain/champlain-memphis-map-source.c    |   26 ++++++++++++++++++++++++--
 3 files changed, 50 insertions(+), 2 deletions(-)
---
diff --git a/champlain/champlain-local-map-data-source.c b/champlain/champlain-local-map-data-source.c
index 9f8c6ed..146f1a4 100644
--- a/champlain/champlain-local-map-data-source.c
+++ b/champlain/champlain-local-map-data-source.c
@@ -119,4 +119,7 @@ champlain_local_map_data_source_load_map_data (ChamplainLocalMapDataSource *self
   ChamplainLocalMapDataSourcePrivate *priv = GET_PRIVATE(self);
 
   memphis_map_load_from_file (priv->map, map_path);
+
+  g_signal_emit_by_name (CHAMPLAIN_MAP_DATA_SOURCE (self),
+      "map-data-changed", NULL);
 }
diff --git a/champlain/champlain-map-data-source.c b/champlain/champlain-map-data-source.c
index 1210aef..bb78462 100644
--- a/champlain/champlain-map-data-source.c
+++ b/champlain/champlain-map-data-source.c
@@ -28,6 +28,12 @@ G_DEFINE_TYPE (ChamplainMapDataSource, champlain_map_data_source, G_TYPE_OBJECT)
 
 enum
 {
+  MAP_DATA_CHANGED,
+  LAST_SIGNAL
+};
+
+enum
+{
   PROP_0,
   PROP_ID,
   PROP_NAME,
@@ -37,6 +43,8 @@ enum
   PROP_MAX_ZOOM_LEVEL
 };
 
+static guint signals[LAST_SIGNAL] = { 0, };
+
 typedef struct _ChamplainMapDataSourcePrivate ChamplainMapDataSourcePrivate;
 
 struct _ChamplainMapDataSourcePrivate {
@@ -101,6 +109,21 @@ champlain_map_data_source_class_init (ChamplainMapDataSourceClass *klass)
   object_class->finalize = champlain_map_data_source_finalize;
 
   klass->get_map_data = champlain_map_data_source_real_get_map_data;
+
+  /**
+  * ChamplainView::map-data-changed:
+  * @map_data_source: the #ChamplainMapDataSource that received the signal
+  *
+  * The ::map-data-changed signal is emitted when the map data was
+  * replaced or modified
+  *
+  * Since: 0.6
+  */
+  signals[MAP_DATA_CHANGED] =
+      g_signal_new ("map-data-changed", G_OBJECT_CLASS_TYPE (object_class),
+          G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+          g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE,
+          1, CHAMPLAIN_TYPE_MAP_DATA_SOURCE);
 }
 
 static void
diff --git a/champlain/champlain-memphis-map-source.c b/champlain/champlain-memphis-map-source.c
index 722cd09..0efa3f7 100644
--- a/champlain/champlain-memphis-map-source.c
+++ b/champlain/champlain-memphis-map-source.c
@@ -25,7 +25,6 @@
 #include "champlain-cache.h"
 #include "champlain-defines.h"
 #include "champlain-enum-types.h"
-#include "champlain-marshal.h"
 #include "champlain-private.h"
 
 #include <clutter-cairo.h>
@@ -119,6 +118,26 @@ champlain_memphis_map_source_finalize (GObject *object)
 }
 
 static void
+map_data_changed_cb (ChamplainMapDataSource *map_data_source,
+    GParamSpec *arg1,
+    ChamplainMemphisMapSource *map_source)
+{
+  g_assert (CHAMPLAIN_IS_MAP_DATA_SOURCE (map_data_source) &&
+      CHAMPLAIN_IS_MEMPHIS_MAP_SOURCE (map_source));
+
+  MemphisMap *map;
+  ChamplainMemphisMapSourcePrivate *priv = GET_PRIVATE(map_source);
+
+  map = champlain_map_data_source_get_map_data (map_data_source);
+
+  DEBUG ("DataSource has been changed!");
+
+  g_static_rw_lock_writer_lock (&MemphisLock);
+  memphis_renderer_set_map (priv->renderer, map);
+  g_static_rw_lock_writer_unlock (&MemphisLock);
+}
+
+static void
 fill_tile (ChamplainMapSource *map_source, ChamplainTile *tile)
 {
   ChamplainMemphisMapSourcePrivate *priv = GET_PRIVATE(map_source);
@@ -291,10 +310,13 @@ champlain_memphis_map_source_new_full (ChamplainMapSourceDesc *desc,
   priv->thpool = g_thread_pool_new (memphis_worker_thread, priv->renderer,
       MAX_THREADS, FALSE, NULL);
 
+  g_signal_connect (priv->map_data_source, "map-data-changed",
+      G_CALLBACK (map_data_changed_cb), source);
+
   return source;
 }
 
-void
+void // TODO: this is a dangerous function! Remove it?
 champlain_memphis_map_source_set_tile_size (ChamplainMemphisMapSource *self,
     guint size)
 {



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