multibutton_entry: improve atspi support

Expose multibutton items as push buttons supported with three
possible actions: activate, longpress and delete.
This commit is contained in:
Lukasz Stanislawski 2015-12-15 16:49:02 +01:00
parent 01f5083cab
commit 8e3b8d947e
4 changed files with 81 additions and 2 deletions

View File

@ -4,6 +4,7 @@
#define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
#define ELM_WIDGET_ITEM_PROTECTED
#define ELM_INTERFACE_ATSPI_WIDGET_ACTION_PROTECTED
#include <Elementary.h>
#include "elm_priv.h"
@ -386,7 +387,6 @@ _item_del(Elm_Multibuttonentry_Item_Data *item)
ELM_MULTIBUTTONENTRY_DATA_GET_OR_RETURN(obj, sd);
sd->items = eina_list_remove(sd->items, EO_OBJ(item));
elm_box_unpack(sd->box, VIEW(item));
eo_do(obj, eo_event_callback_call
@ -540,6 +540,7 @@ _on_item_deleted(void *data,
if (VIEW(temp_it) == obj)
{
eo_do(eo_temp_it, elm_wdg_item_del());
sd->items = eina_list_remove(sd->items, eo_temp_it);
break;
}
}
@ -649,6 +650,8 @@ EOLIAN static void
_elm_multibuttonentry_item_eo_base_destructor(Eo *eo_it,
Elm_Multibuttonentry_Item_Data *it)
{
if (_elm_config->atspi_mode)
elm_interface_atspi_accessible_children_changed_del_signal_emit(WIDGET(it), eo_it);
_item_del(it);
eo_do_super(eo_it, ELM_MULTIBUTTONENTRY_ITEM_CLASS, eo_destructor());
@ -742,9 +745,13 @@ _item_new(Elm_Multibuttonentry_Data *sd,
return NULL;
WIDGET_ITEM_DATA_SET(eo_item, data);
eo_do(eo_item, elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_PUSH_BUTTON));
ELM_MULTIBUTTONENTRY_ITEM_DATA_GET(eo_item, item);
VIEW(item) = elm_layout_add(obj);
eo_do(VIEW(item), elm_interface_atspi_accessible_type_set(ELM_ATSPI_TYPE_DISABLED));
if (!elm_layout_theme_set
(VIEW(item), "multibuttonentry", "btn", elm_widget_style_get(obj)))
CRI("Failed to set layout!");
@ -905,9 +912,16 @@ _item_new(Elm_Multibuttonentry_Data *sd,
default:
break;
}
eo_do(obj, eo_event_callback_call
(ELM_MULTIBUTTONENTRY_EVENT_ITEM_ADDED, eo_item));
if (_elm_config->atspi_mode)
{
elm_interface_atspi_accessible_children_changed_added_signal_emit(obj, eo_item);
elm_interface_atspi_accessible_added(eo_item);
}
return eo_item;
}
@ -1987,5 +2001,61 @@ _elm_multibuttonentry_class_constructor(Eo_Class *klass)
_elm_multibuttonentry_smart_focus_next_enable = EINA_TRUE;
}
EOLIAN static Eina_List*
_elm_multibuttonentry_elm_interface_atspi_accessible_children_get(Eo *obj, Elm_Multibuttonentry_Data *sd)
{
Eina_List *ret;
eo_do_super(obj, ELM_MULTIBUTTONENTRY_CLASS, ret = elm_interface_atspi_accessible_children_get());
return eina_list_merge(eina_list_clone(sd->items), ret);
}
EOLIAN static char*
_elm_multibuttonentry_item_elm_interface_atspi_accessible_name_get(Eo *obj, Elm_Multibuttonentry_Item_Data *item)
{
char *ret;
eo_do_super(obj, ELM_MULTIBUTTONENTRY_ITEM_CLASS, ret = elm_interface_atspi_accessible_name_get());
if (ret) return ret;
const char *txt = elm_object_part_text_get(VIEW(item), "elm.btn.text");
return txt ? strdup(txt) : NULL;
}
static Eina_Bool
_key_action_activate(Eo *obj, const char *params EINA_UNUSED)
{
ELM_MULTIBUTTONENTRY_ITEM_DATA_GET(obj, it);
elm_layout_signal_emit(VIEW(it), "mouse,clicked,1", "elm");
return EINA_TRUE;
}
static Eina_Bool
_key_action_delete(Eo *obj, const char *params EINA_UNUSED)
{
ELM_MULTIBUTTONENTRY_ITEM_DATA_GET(obj, it);
elm_layout_signal_emit(VIEW(it), "elm,deleted", "elm");
return EINA_TRUE;
}
static Eina_Bool
_key_action_longpress(Eo *obj, const char *params EINA_UNUSED)
{
ELM_MULTIBUTTONENTRY_ITEM_DATA_GET(obj, it);
eo_do(WIDGET(it), eo_event_callback_call
(ELM_MULTIBUTTONENTRY_EVENT_ITEM_LONGPRESSED, obj));
return EINA_TRUE;
}
EOLIAN const Elm_Atspi_Action *
_elm_multibuttonentry_item_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUSED, Elm_Multibuttonentry_Item_Data *pd EINA_UNUSED)
{
static Elm_Atspi_Action atspi_actions[] = {
{ "activate", NULL, NULL, _key_action_activate },
{ "delete", NULL, NULL, _key_action_delete},
{ "longpress", NULL, NULL, _key_action_longpress},
{ NULL, NULL, NULL, NULL}
};
return &atspi_actions[0];
}
#include "elm_multibuttonentry_item.eo.c"
#include "elm_multibuttonentry.eo.c"

View File

@ -583,16 +583,21 @@ _elm_interface_atspi_accessible_type_get(Eo *obj EINA_UNUSED, Elm_Interface_Atsp
EOLIAN void
_elm_interface_atspi_accessible_type_set(Eo *obj, Elm_Interface_Atspi_Accessible_Data *pd, Elm_Atspi_Type val)
{
Elm_Interface_Atspi_Accessible *parent;
if (val == pd->type)
return;
eo_do(obj, parent = elm_interface_atspi_accessible_parent_get());
switch (val)
{
case ELM_ATSPI_TYPE_DISABLED:
case ELM_ATSPI_TYPE_SKIPPED:
if (parent) elm_interface_atspi_accessible_children_changed_del_signal_emit(parent, obj);
elm_interface_atspi_accessible_removed(obj);
break;
case ELM_ATSPI_TYPE_REGULAR:
if (parent) elm_interface_atspi_accessible_children_changed_added_signal_emit(parent, obj);
elm_interface_atspi_accessible_added(obj);
}
pd->type = val;

View File

@ -184,6 +184,7 @@ class Elm.Multibuttonentry (Elm.Layout)
Elm.Layout.text_set;
Elm.Layout.text_get;
Elm.Layout.sizing_eval;
Elm_Interface_Atspi_Accessible.children.get;
}
events {
item,selected;

View File

@ -1,4 +1,5 @@
class Elm.Multibuttonentry_Item(Elm.Widget_Item)
class Elm.Multibuttonentry_Item(Elm.Widget_Item,
Elm_Interface_Atspi_Widget_Action)
{
eo_prefix: elm_obj_multibuttonentry_item;
methods {
@ -28,5 +29,7 @@ class Elm.Multibuttonentry_Item(Elm.Widget_Item)
Elm.Widget_Item.part_text.get;
Elm.Widget_Item.part_text.set;
Elm.Widget_Item.disable;
Elm_Interface_Atspi_Accessible.name.get;
Elm_Interface_Atspi_Widget_Action.elm_actions.get;
}
}