From: Kim Shinwoo <kimcinoo.efl@gmail.com>

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
This commit is contained in:
Kim Shinwoo 2012-09-17 03:01:46 +00:00 committed by Carsten Haitzler
parent 32be0e5640
commit fdaf625316
7 changed files with 124 additions and 18 deletions

View 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 *

View 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

View 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;

View 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;

View 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;
}
/**

View File

@ -389,6 +389,17 @@
#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);

View 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);
}
}
}