From: Kim Shinwoo <kimcinoo.efl@gmail.com>
authorKim Shinwoo <kimcinoo.efl@gmail.com>
Mon, 17 Sep 2012 03:01:46 +0000 (03:01 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Mon, 17 Sep 2012 03:01:46 +0000 (03:01 +0000)
Subject: [E-devel] [patch][elementary] access - activate widget
Subject: [E-devel] [Patch][elementary] scroller, slider - access
activate feature

the previous activate function just get object only. to activate scroller
or slider etc.. it needs more information. so the patch changed previous
activate(Evas_Object *obj) to activate(Evas_Object *obj, Elm_Activate act);
the Elm_Activate can be one of ELM_ACTIVATE_DEFAULT, UP, DOWN, RIGHT, and
LEFT.. you can add more if it is necessary.

I have attached two patches. one is for the slider and the other is for the
scoller.
this patch would support those who wants change value of slider or content
position of scroller on remote side.
this would be useful to the access side or voice control side also.

SVN revision: 76717

src/lib/elm_access.c
src/lib/elm_button.c
src/lib/elm_scroller.c
src/lib/elm_slider.c
src/lib/elm_widget.c
src/lib/elm_widget.h
src/lib/elm_win.c

index 5224882..8b55500 100644 (file)
@@ -294,11 +294,11 @@ _elm_access_on_highlight_hook_set(Elm_Access_Info           *ac,
 }
 
 EAPI void
-_elm_access_highlight_object_activate(Evas_Object *obj)
+_elm_access_highlight_object_activate(Evas_Object *obj, Elm_Activate act)
 {
    Evas_Object *highlight_obj;
    highlight_obj = elm_widget_focused_object_get(obj);
-   elm_widget_activate(highlight_obj);
+   elm_widget_activate(highlight_obj, act);
 }
 
 EAPI char *
index ed9183b..1f1cfed 100644 (file)
@@ -73,11 +73,15 @@ _elm_button_smart_sizing_eval(Evas_Object *obj)
    evas_object_size_hint_min_set(obj, minw, minh);
 }
 
-static void
-_elm_button_smart_activate(Evas_Object *obj)
+static Eina_Bool
+_elm_button_smart_activate(Evas_Object *obj, Elm_Activate act)
 {
+   if (act != ELM_ACTIVATE_DEFAULT) return EINA_FALSE;
+
    evas_object_smart_callback_call(obj, SIG_CLICKED, NULL);
    elm_layout_signal_emit(obj, "elm,anim,activate", "elm");
+
+   return EINA_TRUE;
 }
 
 /* FIXME: replicated from elm_layout just because button's icon spot
index cd3386d..7cdac94 100644 (file)
@@ -1,7 +1,6 @@
 #include <Elementary.h>
 #include "elm_priv.h"
 #include "elm_widget_scroller.h"
-
 EAPI const char ELM_SCROLLER_SMART_NAME[] = "elm_scroller";
 
 static const char SIG_SCROLL[] = "scroll";
@@ -236,6 +235,58 @@ _elm_scroller_smart_event(Evas_Object *obj,
    return EINA_TRUE;
 }
 
+static Eina_Bool
+_elm_scroller_smart_activate(Evas_Object *obj, Elm_Activate act)
+{
+   Evas_Coord x = 0;
+   Evas_Coord y = 0;
+   Evas_Coord v_w = 0;
+   Evas_Coord v_h = 0;
+   Evas_Coord page_x = 0;
+   Evas_Coord page_y = 0;
+
+   ELM_SCROLLER_DATA_GET(obj, sd);
+
+   if ((elm_widget_disabled_get(obj)) ||
+       (act == ELM_ACTIVATE_DEFAULT)) return EINA_FALSE;
+
+   sd->s_iface->content_pos_get(obj, &x, &y);
+   sd->s_iface->page_size_get(obj, &page_x, &page_y);
+   sd->s_iface->content_viewport_size_get(obj, &v_w, &v_h);
+
+   if (act == ELM_ACTIVATE_UP)
+     {
+        if (page_y < 0)
+          y -= -(page_y * v_h) / 100;
+        else
+          y -= page_y;
+     }
+   else if (act == ELM_ACTIVATE_DOWN)
+     {
+        if (page_y < 0)
+          y += -(page_y * v_h) / 100;
+        else
+          y += page_y;
+     }
+   else if (act == ELM_ACTIVATE_LEFT)
+     {
+        if (page_x < 0)
+          x -= -(page_x * v_w) / 100;
+        else
+          x -= page_x;
+     }
+   else if (act == ELM_ACTIVATE_RIGHT)
+     {
+        if (page_x < 0)
+          x += -(page_x * v_w) / 100;
+        else
+          x += page_x;
+     }
+
+   sd->s_iface->content_pos_set(obj, x, y);
+   return EINA_TRUE;
+}
+
 static void
 _elm_scroller_smart_sizing_eval(Evas_Object *obj)
 {
@@ -627,6 +678,7 @@ _elm_scroller_smart_set_user(Elm_Scroller_Smart_Class *sc)
    ELM_WIDGET_CLASS(sc)->focus_next = _elm_scroller_smart_focus_next;
    ELM_WIDGET_CLASS(sc)->event = _elm_scroller_smart_event;
    ELM_WIDGET_CLASS(sc)->focus_direction = NULL;
+   ELM_WIDGET_CLASS(sc)->activate = _elm_scroller_smart_activate;
 
    ELM_CONTAINER_CLASS(sc)->content_set = _elm_scroller_smart_content_set;
    ELM_CONTAINER_CLASS(sc)->content_get = _elm_scroller_smart_content_get;
index e5420ab..9fbd38c 100644 (file)
@@ -378,6 +378,32 @@ success:
    return EINA_TRUE;
 }
 
+static Eina_Bool
+_elm_slider_smart_activate(Evas_Object *obj, Elm_Activate act)
+{
+   ELM_SLIDER_DATA_GET(obj, sd);
+
+   if ((elm_widget_disabled_get(obj)) ||
+       (act == ELM_ACTIVATE_DEFAULT)) return EINA_FALSE;
+
+   if ((act == ELM_ACTIVATE_UP) ||
+       (act == ELM_ACTIVATE_RIGHT))
+     {
+        if (sd->inverted) _drag_up(obj, NULL, NULL, NULL);
+        else _drag_down(obj, NULL, NULL, NULL);
+     }
+   else if ((act == ELM_ACTIVATE_DOWN) ||
+            (act == ELM_ACTIVATE_LEFT))
+     {
+        if (sd->inverted) _drag_down(obj, NULL, NULL, NULL);
+        else _drag_up(obj, NULL, NULL, NULL);
+     }
+
+   _slider_update(obj);
+
+   return EINA_TRUE;
+}
+
 static void
 _visuals_refresh(Evas_Object *obj)
 {
@@ -805,6 +831,7 @@ _elm_slider_smart_set_user(Elm_Slider_Smart_Class *sc)
 
    ELM_WIDGET_CLASS(sc)->theme = _elm_slider_smart_theme;
    ELM_WIDGET_CLASS(sc)->event = _elm_slider_smart_event;
+   ELM_WIDGET_CLASS(sc)->activate = _elm_slider_smart_activate;
 
    /* not a 'focus chain manager' */
    ELM_WIDGET_CLASS(sc)->focus_next = NULL;
index c94b3f7..c45065f 100644 (file)
@@ -3507,14 +3507,25 @@ elm_widget_focus_order_get(const Evas_Object *obj)
    return sd->focus_order;
 }
 
-EAPI void 
-elm_widget_activate(Evas_Object *obj)
+EAPI void
+elm_widget_activate(Evas_Object *obj, Elm_Activate act)
 {
+   Evas_Object *parent;
+   Eina_Bool ret;
+
    API_ENTRY return;
 
-   if (!sd->api->activate) return;
+   ret = EINA_FALSE;
+   if (sd->api->activate)
+     ret = sd->api->activate(obj, act);
 
-   sd->api->activate(obj);
+   if (ret) return;
+
+   parent = elm_widget_parent_get(obj);
+   if (parent)
+     elm_widget_activate(parent, act);
+
+   return;
 }
 
 /**
index 5dcebdf..96ab2f4 100644 (file)
 #define ELM_WIDGET_SMART_CLASS_INIT_NAME_VERSION(name) \
   ELM_WIDGET_SMART_CLASS_INIT(EVAS_SMART_CLASS_INIT_NAME_VERSION(name))
 
+/* Elm_Activate is used in 'Virtual' function Eina_Bool (*activate)
+ * (Evas_Object *obj, Elm_Activate act); of Elm_Widget_Smart_Class */
+typedef enum
+{
+   ELM_ACTIVATE_DEFAULT = 0,
+   ELM_ACTIVATE_UP,
+   ELM_ACTIVATE_DOWN,
+   ELM_ACTIVATE_RIGHT,
+   ELM_ACTIVATE_LEFT
+} Elm_Activate;
+
 /* Please, ALWAYS update the ELM_WIDGET_SMART_CLASS_INIT macro
  * whenever you change the following struct! */
 
@@ -432,7 +443,8 @@ typedef struct _Elm_Widget_Smart_Class
                                       Evas_Object *sobj); /**< 'Virtual' function handling sub objects being removed */
    void             (*access)(Evas_Object *obj,
                               Eina_Bool is_access); /**< 'Virtual' function on the widget being set access */
-   void             (*activate)(Evas_Object *obj); /**< 'Virtual' function to activate widget  */
+   Eina_Bool        (*activate)(Evas_Object *obj,
+                                Elm_Activate act); /**< 'Virtual' function to activate widget  */
 } Elm_Widget_Smart_Class;
 
 /**
@@ -547,7 +559,6 @@ typedef Eina_Bool             (*Elm_Widget_Del_Pre_Cb)(void *data);
 
 typedef char *(*Elm_Access_Content_Cb)(void *data, Evas_Object *obj, Elm_Widget_Item *item);
 typedef void (*Elm_Access_On_Highlight_Cb)(void *data);
-typedef void (*Elm_Access_Activate_Cb)(Evas_Object *obj, void *data);
 
 struct _Elm_Access_Item
 {
@@ -563,8 +574,6 @@ struct _Elm_Access_Info
    Ecore_Timer               *delay_timer;
    void                      *on_highlight_data;
    Elm_Access_On_Highlight_Cb on_highlight;
-   void                      *activate_data;
-   Elm_Access_Activate_Cb     activate;
 };
 
 EAPI void             _elm_access_clear(Elm_Access_Info *ac);
@@ -588,7 +597,7 @@ EAPI void             _elm_access_edje_object_part_object_unregister(Evas_Object
 EAPI void             _elm_access_widget_item_register(Elm_Widget_Item *item);
 EAPI void             _elm_access_widget_item_unregister(Elm_Widget_Item *item);
 EAPI void             _elm_access_on_highlight_hook_set(Elm_Access_Info *ac, Elm_Access_On_Highlight_Cb func, void *data);
-EAPI void             _elm_access_highlight_object_activate(Evas_Object *obj);
+EAPI void             _elm_access_highlight_object_activate(Evas_Object *obj, Elm_Activate act);
 
 /**< put this as the first member in your widget item struct */
 #define ELM_WIDGET_ITEM       Elm_Widget_Item base
@@ -743,7 +752,7 @@ EAPI void             elm_widget_focus_mouse_up_handle(Evas_Object *obj);
 EAPI void             elm_widget_focus_tree_unfocusable_handle(Evas_Object *obj);
 EAPI void             elm_widget_focus_disabled_handle(Evas_Object *obj);
 EAPI unsigned int     elm_widget_focus_order_get(const Evas_Object *obj);
-EAPI void             elm_widget_activate(Evas_Object *obj);
+EAPI void             elm_widget_activate(Evas_Object *obj, Elm_Activate act);
 EAPI void             elm_widget_text_part_set(Evas_Object *obj, const char *part, const char *label);
 EAPI const char      *elm_widget_text_part_get(const Evas_Object *obj, const char *part);
 EAPI void             elm_widget_domain_translatable_text_part_set(Evas_Object *obj, const char *part, const char *domain, const char *text);
index ae0ecde..2d45bbe 100644 (file)
@@ -1858,7 +1858,8 @@ _elm_win_client_message(void *data,
              else if ((unsigned int)e->data.l[1] ==
                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_ACTIVATE)
                {
-                  _elm_access_highlight_object_activate(ELM_WIDGET_DATA(sd)->obj);
+                  _elm_access_highlight_object_activate
+                    (ELM_WIDGET_DATA(sd)->obj, ELM_ACTIVATE_DEFAULT);
                }
              else if ((unsigned int)e->data.l[1] ==
                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ)
@@ -1878,12 +1879,14 @@ _elm_win_client_message(void *data,
              else if ((unsigned int)e->data.l[1] ==
                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_UP)
                {
-                  // XXX: call right access func
+                  _elm_access_highlight_object_activate
+                    (ELM_WIDGET_DATA(sd)->obj, ELM_ACTIVATE_UP);
                }
              else if ((unsigned int)e->data.l[1] ==
                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_DOWN)
                {
-                  // XXX: call right access func
+                  _elm_access_highlight_object_activate
+                    (ELM_WIDGET_DATA(sd)->obj, ELM_ACTIVATE_DOWN);
                }
           }
      }