From: Bluezery <ohpowel@gmail.com>
authorBluezery <ohpowel@gmail.com>
Thu, 24 May 2012 10:07:56 +0000 (10:07 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Thu, 24 May 2012 10:07:56 +0000 (10:07 +0000)
Subject: [E-devel] [Patch][elm_map] Add New "loaded" signal

I want to add new "loaded" signal to elementary map. This signal
notify users when all map tiles are loaded. Timer is used for this signal.
Currently "tile,loaded" can be used for each separated tile.  So the
users are hard to know whether all tiles are loaded or not.
Please review this patch.

SVN revision: 71406

ChangeLog
src/bin/test_map.c
src/lib/elm_map.c
src/lib/elm_map.h

index 3103d52..11352f2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -97,3 +97,7 @@
        * Add ability to use cnp helper code on non-elm widget objects by
         falling back to ecore-evas to get the window id.
 
+2012-05-24 Tae-Hwan Kim (Bluezery)
+
+       * Add "loaded" signal for elm_map.
+
index 0a2e0b8..643f66d 100644 (file)
@@ -365,6 +365,12 @@ _map_zoom_change(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event
 }
 
 static void
+_map_loaded(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   printf("loaded\n");
+}
+
+static void
 _map_tile_load(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 {
    printf("tile,load\n");
@@ -1058,6 +1064,7 @@ test_map(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __
         evas_object_smart_callback_add(map, "zoom,start", _map_zoom_start, map);
         evas_object_smart_callback_add(map, "zoom,stop", _map_zoom_stop, map);
         evas_object_smart_callback_add(map, "zoom,change", _map_zoom_change, map);
+        evas_object_smart_callback_add(map, "loaded", _map_loaded, map);
         evas_object_smart_callback_add(map, "tile,load", _map_tile_load, map);
         evas_object_smart_callback_add(map, "tile,loaded", _map_tile_loaded, map);
         evas_object_smart_callback_add(map, "tile,loaded,fail", _map_tile_loaded_fail, map);
index 5e3e0dc..4ecc632 100644 (file)
@@ -410,6 +410,8 @@ struct _Widget_Data
    Ecore_Timer *zoom_timer;
    Ecore_Animator *zoom_animator;
 
+   Ecore_Timer *loaded_timer;
+
    int try_num;
    int finish_num;
    int download_num;
@@ -513,6 +515,7 @@ static const char SIG_SCROLL_ANIM_STOP[] =   "scroll,anim,stop";
 static const char SIG_ZOOM_START[] =         "zoom,start";
 static const char SIG_ZOOM_STOP[] =          "zoom,stop";
 static const char SIG_ZOOM_CHANGE[] =        "zoom,change";
+static const char SIG_LOADED[] =             "loaded";
 static const char SIG_TILE_LOAD[] =          "tile,load";
 static const char SIG_TILE_LOADED[] =        "tile,loaded";
 static const char SIG_TILE_LOADED_FAIL[] =   "tile,loaded,fail";
@@ -536,6 +539,7 @@ static const Evas_Smart_Cb_Description _signals[] = {
        {SIG_ZOOM_START, ""},
        {SIG_ZOOM_STOP, ""},
        {SIG_ZOOM_CHANGE, ""},
+       {SIG_LOADED, ""},
        {SIG_TILE_LOAD, ""},
        {SIG_TILE_LOADED, ""},
        {SIG_TILE_LOADED_FAIL, ""},
@@ -735,6 +739,18 @@ _grid_item_in_viewport(Grid_Item *gi)
    return ELM_RECTS_INTERSECT(x, y, w, h, vx, vy, vw, vh);
 }
 
+static Eina_Bool
+_loaded_timeout(void *data)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE);
+   Widget_Data *wd = data;
+
+   wd->loaded_timer = NULL;
+   if (!(wd->download_num) && !(wd->download_idler))
+      evas_object_smart_callback_call(wd->obj, SIG_LOADED, NULL);
+   return ECORE_CALLBACK_CANCEL;
+}
+
 static void
 _grid_item_update(Grid_Item *gi)
 {
@@ -761,6 +777,9 @@ _grid_item_update(Grid_Item *gi)
         _obj_rotate(gi->wd, gi->img);
         gi->file_have = EINA_TRUE;
      }
+
+   if (gi->wd->loaded_timer) ecore_timer_del(gi->wd->loaded_timer);
+   gi->wd->loaded_timer = ecore_timer_add(0.25, _loaded_timeout, gi->wd);
 }
 
 static void
@@ -3692,6 +3711,11 @@ _del_hook(Evas_Object *obj)
    Widget_Data *wd = elm_widget_data_get(obj);
    EINA_SAFETY_ON_NULL_RETURN(wd);
 
+   if (wd->loaded_timer)
+     {
+        ecore_timer_del(wd->loaded_timer);
+        wd->loaded_timer = NULL;
+     }
    if (wd->map) evas_map_free(wd->map);
    free(wd);
 }
index 383c183..b46974f 100644 (file)
@@ -42,6 +42,7 @@
  * - "name,loaded" - Name request ends.
  * - "name,loaded,fail" - Name request fails.
  * - "overlay,clicked" - A overlay is clicked.
+ * - "loaded" - when a map is finally loaded.
  *
  * Available style for map widget:
  * - @c "default"