Add the elm notify external object
authorJonathan Atton <jonathan.atton@gmail.com>
Sun, 11 Jul 2010 21:19:27 +0000 (21:19 +0000)
committerJonathan Atton <jonathan.atton@gmail.com>
Sun, 11 Jul 2010 21:19:27 +0000 (21:19 +0000)
SVN revision: 50180

src/edje_externals/Makefile.am
src/edje_externals/elm_notify.c [new file with mode: 0644]
src/edje_externals/modules.inc
src/lib/Elementary.h.in
src/lib/elm_notify.c

index 44b277a..6b94540 100644 (file)
@@ -49,7 +49,8 @@ elm_slideshow.c \
 elm_spinner.c \
 elm_thumb.c \
 elm_toggle.c \
-elm_toolbar.c
+elm_toolbar.c \
+elm_notify.c
 
 elm_la_LIBADD = $(top_builddir)/src/lib/libelementary.la
 elm_la_LDFLAGS = $(all_libraries) -no-undefined @lt_enable_auto_import@ -module -avoid-version -shared -fPIC
diff --git a/src/edje_externals/elm_notify.c b/src/edje_externals/elm_notify.c
new file mode 100644 (file)
index 0000000..54db415
--- /dev/null
@@ -0,0 +1,206 @@
+#include "private.h"
+#include <assert.h>
+
+
+typedef struct _Elm_Params_Notify Elm_Params_Notify;
+
+struct _Elm_Params_Notify {
+       Elm_Params base;
+       Evas_Object *content; /* part name whose obj is to be set as content */
+       Eina_Bool repeat_events_exists;
+       Eina_Bool repeat_events;
+       Eina_Bool timer_init;
+       Eina_Bool timeout_exists;
+       int timeout;
+
+       const char *orient;
+};
+
+
+static const char *orients[] = {
+               "top",
+               "center",
+               "bottom",
+               "left",
+               "right",
+               "top_left",
+               "top_right",
+               "bottom_left",
+               "bottom_right",
+               NULL
+};
+
+static Elm_Notify_Orient _orient_get(const char *orient)
+{
+   unsigned int i;
+
+   assert(sizeof(orients)/sizeof(orients[0]) ==
+         ELM_NOTIFY_ORIENT_LAST + 1);
+
+   for (i = 0; i < sizeof(orients); i++)
+     if (strcmp(orient, orients[i]) == 0) return i;
+
+   return ELM_NOTIFY_ORIENT_LAST;
+}
+
+static void external_notify_state_set(void *data __UNUSED__,
+               Evas_Object *obj, const void *from_params,
+               const void *to_params, float pos __UNUSED__)
+{
+       const Elm_Params_Notify *p;
+
+       if (to_params) p = to_params;
+       else if (from_params) p = from_params;
+       else return;
+
+       if (p->content) {
+               elm_notify_content_set(obj, p->content);
+       }
+       if(p->repeat_events_exists)
+               elm_notify_repeat_events_set(obj, p->repeat_events);
+       if(p->timeout_exists)
+               elm_notify_timeout_set(obj, p->timeout);
+       if(p->timer_init)
+               elm_notify_timer_init(obj);
+
+       if (p->orient)
+       {
+               Elm_Notify_Orient set = _orient_get(p->orient);
+               if (set == ELM_NOTIFY_ORIENT_LAST) return;
+               elm_notify_orient_set(obj, set);
+       }
+}
+
+static Eina_Bool external_notify_param_set(void *data __UNUSED__,
+               Evas_Object *obj, const Edje_External_Param *param)
+{
+       if (!strcmp(param->name, "content")
+                       && param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
+       {
+               Evas_Object *content = external_common_param_edje_object_get(obj, param);
+               if ((strcmp(param->s, "")) && (!content))
+                       return EINA_FALSE;
+               elm_notify_content_set(obj, content);
+               return EINA_TRUE;
+       }
+       else if (!strcmp(param->name, "repeat_events")
+                       && param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
+       {
+               elm_notify_repeat_events_set(obj, param->i);
+               return EINA_TRUE;
+       }
+       else if (!strcmp(param->name, "timer_init")
+                       && param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
+       {
+               elm_notify_timer_init(obj);
+               return EINA_TRUE;
+       }
+       else if (!strcmp(param->name, "timeout")
+                       && param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
+       {
+               elm_notify_timeout_set(obj, param->i);
+               return EINA_TRUE;
+       }
+       else if (!strcmp(param->name, "orient")
+                       && param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
+       {
+               Elm_Notify_Orient set = _orient_get(param->s);
+               if (set == ELM_NOTIFY_ORIENT_LAST) return;
+               elm_notify_orient_set(obj, set);
+               return EINA_TRUE;
+       }
+
+       ERR("unknown parameter '%s' of type '%s'",
+                       param->name, edje_external_param_type_str(param->type));
+
+       return EINA_FALSE;
+}
+
+static Eina_Bool external_notify_param_get(void *data __UNUSED__,
+               const Evas_Object *obj, Edje_External_Param *param)
+{
+       if (!strcmp(param->name, "content"))
+       {
+               /* not easy to get content name back from live object */
+               return EINA_FALSE;
+       }
+       else if (!strcmp(param->name, "repeat_events")
+                       && param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
+       {
+               param->i = elm_notify_repeat_events_get(obj);
+               return EINA_TRUE;
+       }
+       else if (!strcmp(param->name, "timeout")
+                       && param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
+       {
+               param->i = elm_notify_timeout_get(obj);
+               return EINA_TRUE;
+       }
+       else if (!strcmp(param->name, "orient")
+                       && param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
+       {
+               Elm_Notify_Orient set = elm_notify_orient_get(obj);
+               if (set == ELM_NOTIFY_ORIENT_LAST) return EINA_FALSE;
+               param->s = orients[set];
+               return EINA_TRUE;
+       }
+
+       ERR("unknown parameter '%s' of type '%s'",
+                       param->name, edje_external_param_type_str(param->type));
+
+       return EINA_FALSE;
+}
+
+static void * external_notify_params_parse(void *data, Evas_Object *obj,
+               const Eina_List *params) {
+       Elm_Params_Notify *mem;
+       Edje_External_Param *param;
+       const Eina_List *l;
+
+       mem = external_common_params_parse(Elm_Params_Notify, data, obj, params);
+       if (!mem)
+               return NULL;
+
+       EINA_LIST_FOREACH(params, l, param)
+       {
+               if (!strcmp(param->name, "content"))
+                       mem->content = external_common_param_edje_object_get(obj, param);
+               else if (!strcmp(param->name, "timeout"))
+               {
+                       mem->timeout = param->i;
+                       mem->timeout_exists = EINA_TRUE;
+               }
+               else if (!strcmp(param->name, "timer_init") && param->i > 0)
+               {
+                       mem->timer_init = EINA_TRUE;
+               }
+               else if (!strcmp(param->name, "repeat_events"))
+               {
+                       mem->repeat_events = param->i;
+                       mem->repeat_events_exists = EINA_TRUE;
+               }
+               else if (!strcmp(param->name, "orient"))
+                         mem->orient = eina_stringshare_add(param->s);
+       }
+
+       return mem;
+}
+
+static void external_notify_params_free(void *params) {
+       Elm_Params_Notify *mem = params;
+
+       external_common_params_free(params);
+}
+
+static Edje_External_Param_Info external_notify_params[] = {
+               DEFINE_EXTERNAL_COMMON_PARAMS,
+               EDJE_EXTERNAL_PARAM_INFO_STRING("content"),
+               EDJE_EXTERNAL_PARAM_INFO_BOOL("repeat_events"),
+               EDJE_EXTERNAL_PARAM_INFO_INT("timeout"),
+               EDJE_EXTERNAL_PARAM_INFO_BOOL("timer_init"),
+               EDJE_EXTERNAL_PARAM_INFO_SENTINEL
+};
+
+DEFINE_EXTERNAL_ICON_ADD(notify, "notify");
+DEFINE_EXTERNAL_TYPE_SIMPLE(notify, "Notify")
+;
index ec29508..3dfa71d 100644 (file)
@@ -21,3 +21,4 @@ DEFINE_TYPE(spinner)
 DEFINE_TYPE(thumb)
 DEFINE_TYPE(toggle)
 DEFINE_TYPE(toolbar)
+DEFINE_TYPE(notify)
index b3c8791..bfe21d3 100644 (file)
@@ -672,16 +672,20 @@ extern "C" {
         ELM_NOTIFY_ORIENT_TOP_LEFT,
         ELM_NOTIFY_ORIENT_TOP_RIGHT,
         ELM_NOTIFY_ORIENT_BOTTOM_LEFT,
-        ELM_NOTIFY_ORIENT_BOTTOM_RIGHT
+        ELM_NOTIFY_ORIENT_BOTTOM_RIGHT,
+        ELM_NOTIFY_ORIENT_LAST
      } Elm_Notify_Orient;
    EAPI Evas_Object *elm_notify_add(Evas_Object *parent);
    EAPI void         elm_notify_content_set(Evas_Object *obj, Evas_Object *content);
    EAPI Evas_Object *elm_notify_content_unset(Evas_Object *obj);
    EAPI void        elm_notify_parent_set(Evas_Object *obj, Evas_Object *parent);
    EAPI void        elm_notify_orient_set(Evas_Object *obj, Elm_Notify_Orient orient);
+   EAPI Elm_Notify_Orient          elm_notify_orient_get(const Evas_Object *obj);
    EAPI void         elm_notify_timeout_set(Evas_Object *obj, int timeout);
+   EAPI int          elm_notify_timeout_get(const Evas_Object *obj);
    EAPI void        elm_notify_timer_init(Evas_Object *obj);
    EAPI void        elm_notify_repeat_events_set(Evas_Object *obj, Eina_Bool repeat);
+   EAPI Eina_Bool       elm_notify_repeat_events_get(const Evas_Object *obj);
    /* smart callbacks called:
     */
 
index 385c410..5351d29 100644 (file)
@@ -443,6 +443,19 @@ elm_notify_orient_set(Evas_Object *obj, Elm_Notify_Orient orient)
 }
 
 /**
+ * Return the orientation
+ * @param obj the notify objects
+ */
+EAPI Elm_Notify_Orient
+elm_notify_orient_get(const Evas_Object *obj)
+{
+       ELM_CHECK_WIDTYPE(obj, widtype);
+       Widget_Data *wd = elm_widget_data_get(obj);
+       if (!wd) return;
+       return wd->orient;
+}
+
+/**
  * Set the time before the notify window is hidden. <br>
  * Set a value < 0 to disable the timer
  *
@@ -460,6 +473,19 @@ elm_notify_timeout_set(Evas_Object *obj, int timeout)
 }
 
 /**
+ * Return the timeout value (in seconds)
+ * @param obj the notify object
+ */
+EAPI int
+elm_notify_timeout_get(const Evas_Object *obj)
+{
+       ELM_CHECK_WIDTYPE(obj, widtype);
+       Widget_Data *wd = elm_widget_data_get(obj);
+       if (!wd) return;
+       return wd->timeout;
+}
+
+/**
  * Re-init the timer
  * @param obj The notify object
  */
@@ -504,3 +530,16 @@ elm_notify_repeat_events_set(Evas_Object *obj, Eina_Bool repeat)
      evas_object_del(wd->block_events);
 }
 
+/**
+ * Return true if events are repeat below the notify object
+ * @param obj the notify object
+ */
+EAPI Eina_Bool
+elm_notify_repeat_events_get(const Evas_Object *obj)
+{
+       ELM_CHECK_WIDTYPE(obj, widtype);
+       Widget_Data *wd = elm_widget_data_get(obj);
+       if (!wd) return;
+       return wd->repeat_events;
+}
+