forked from enlightenment/efl
ctxpopup: Add get_items, get_last_item, get_first_item, get_next_item and get_prev_item API
Summary: API to get list of ctxpopup items and give the possibility to iterate the ctxpopup items Reviewers: stanluk, z.kosinski, Hermet, seoz, raster CC: Hermet, seoz Differential Revision: https://phab.enlightenment.org/D1055
This commit is contained in:
parent
2b8e6862ac
commit
bf3fe85b0d
|
@ -35,6 +35,10 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
|
||||||
|
|
||||||
static Eina_Bool _key_action_move(Evas_Object *obj, const char *params);
|
static Eina_Bool _key_action_move(Evas_Object *obj, const char *params);
|
||||||
static Eina_Bool _key_action_escape(Evas_Object *obj, const char *params);
|
static Eina_Bool _key_action_escape(Evas_Object *obj, const char *params);
|
||||||
|
static Elm_Ctxpopup_Item* _item_new(Eo *obj,
|
||||||
|
Elm_Ctxpopup_Data *sd,
|
||||||
|
Evas_Smart_Cb func,
|
||||||
|
const void *data);
|
||||||
|
|
||||||
static const Elm_Action key_actions[] = {
|
static const Elm_Action key_actions[] = {
|
||||||
{"move", _key_action_move},
|
{"move", _key_action_move},
|
||||||
|
@ -1254,41 +1258,13 @@ _elm_ctxpopup_item_append(Eo *obj, Elm_Ctxpopup_Data *sd, const char *label, Eva
|
||||||
{
|
{
|
||||||
Elm_Ctxpopup_Item *item;
|
Elm_Ctxpopup_Item *item;
|
||||||
|
|
||||||
|
item = _item_new(obj, sd, func, data);
|
||||||
item = elm_widget_item_new(obj, Elm_Ctxpopup_Item);
|
|
||||||
if (!item) return NULL;
|
if (!item) return NULL;
|
||||||
|
|
||||||
elm_widget_item_del_pre_hook_set(item, _item_del_pre_hook);
|
|
||||||
elm_widget_item_disable_hook_set(item, _item_disable_hook);
|
|
||||||
elm_widget_item_text_set_hook_set(item, _item_text_set_hook);
|
|
||||||
elm_widget_item_text_get_hook_set(item, _item_text_get_hook);
|
|
||||||
elm_widget_item_content_set_hook_set(item, _item_content_set_hook);
|
|
||||||
elm_widget_item_content_get_hook_set(item, _item_content_get_hook);
|
|
||||||
elm_widget_item_signal_emit_hook_set(item, _item_signal_emit_hook);
|
|
||||||
|
|
||||||
if (!sd->list)
|
|
||||||
{
|
|
||||||
//The first item is appended.
|
|
||||||
sd->list = elm_list_add(obj);
|
|
||||||
if (!strncmp(elm_object_style_get(obj), "default", strlen("default")))
|
|
||||||
elm_object_style_set(sd->list, "ctxpopup");
|
|
||||||
else elm_object_style_set(sd->list, elm_object_style_get(obj));
|
|
||||||
elm_list_mode_set(sd->list, ELM_LIST_EXPAND);
|
|
||||||
elm_list_horizontal_set(sd->list, sd->horizontal);
|
|
||||||
evas_object_event_callback_add
|
|
||||||
(sd->list, EVAS_CALLBACK_RESIZE, _list_resize_cb, obj);
|
|
||||||
elm_layout_content_set(obj, "default", sd->list);
|
|
||||||
}
|
|
||||||
|
|
||||||
item->wcb.org_func_cb = func;
|
|
||||||
item->wcb.org_data = data;
|
|
||||||
item->wcb.cobj = obj;
|
|
||||||
item->list_item =
|
item->list_item =
|
||||||
elm_list_item_append(sd->list, label, icon, NULL, _item_wrap_cb, item);
|
elm_list_item_append(sd->list, label, icon, NULL, _item_wrap_cb, item);
|
||||||
sd->items = eina_list_append(sd->items, item);
|
sd->items = eina_list_append(sd->items, item);
|
||||||
|
|
||||||
sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
|
|
||||||
|
|
||||||
if (sd->visible) elm_layout_sizing_eval(obj);
|
if (sd->visible) elm_layout_sizing_eval(obj);
|
||||||
|
|
||||||
return (Elm_Object_Item *)item;
|
return (Elm_Object_Item *)item;
|
||||||
|
@ -1346,4 +1322,118 @@ _elm_ctxpopup_class_constructor(Eo_Class *klass)
|
||||||
evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
|
evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EOLIAN static const Eina_List*
|
||||||
|
_elm_ctxpopup_items_get(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *sd)
|
||||||
|
{
|
||||||
|
return sd->items;
|
||||||
|
}
|
||||||
|
|
||||||
|
EOLIAN static Elm_Object_Item*
|
||||||
|
_elm_ctxpopup_first_item_get(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *sd)
|
||||||
|
{
|
||||||
|
if (!sd->items) return NULL;
|
||||||
|
|
||||||
|
return eina_list_data_get(sd->items);
|
||||||
|
}
|
||||||
|
|
||||||
|
EOLIAN static Elm_Object_Item*
|
||||||
|
_elm_ctxpopup_last_item_get(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *sd)
|
||||||
|
{
|
||||||
|
if (!sd->items) return NULL;
|
||||||
|
|
||||||
|
return eina_list_data_get(eina_list_last(sd->items));
|
||||||
|
}
|
||||||
|
|
||||||
|
EOLIAN static Elm_Object_Item*
|
||||||
|
_elm_ctxpopup_item_prepend(Eo *obj, Elm_Ctxpopup_Data *sd, const char *label, Evas_Object *icon, Evas_Smart_Cb func, const void *data)
|
||||||
|
{
|
||||||
|
Elm_Ctxpopup_Item *item;
|
||||||
|
|
||||||
|
item = _item_new(obj, sd, func, data);
|
||||||
|
if (!item) return NULL;
|
||||||
|
|
||||||
|
item->list_item =
|
||||||
|
elm_list_item_prepend(sd->list, label, icon, NULL, _item_wrap_cb, item);
|
||||||
|
sd->items = eina_list_prepend(sd->items, item);
|
||||||
|
|
||||||
|
if (sd->visible) elm_layout_sizing_eval(obj);
|
||||||
|
|
||||||
|
return (Elm_Object_Item *)item;
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI Elm_Object_Item *
|
||||||
|
elm_ctxpopup_item_prev_get(const Elm_Object_Item *it)
|
||||||
|
{
|
||||||
|
Eina_List *l;
|
||||||
|
Elm_Ctxpopup_Item *item = (Elm_Ctxpopup_Item *)it;
|
||||||
|
|
||||||
|
ELM_CTXPOPUP_ITEM_CHECK_OR_RETURN(it, NULL);
|
||||||
|
ELM_CTXPOPUP_DATA_GET(WIDGET(item), sd);
|
||||||
|
|
||||||
|
if (!sd->items) return NULL;
|
||||||
|
|
||||||
|
l = eina_list_data_find_list(sd->items, it);
|
||||||
|
if (l && l->prev) return eina_list_data_get(l->prev);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI Elm_Object_Item *
|
||||||
|
elm_ctxpopup_item_next_get(const Elm_Object_Item *it)
|
||||||
|
{
|
||||||
|
Eina_List *l;
|
||||||
|
Elm_Ctxpopup_Item *item = (Elm_Ctxpopup_Item *)it;
|
||||||
|
|
||||||
|
ELM_CTXPOPUP_ITEM_CHECK_OR_RETURN(it, NULL);
|
||||||
|
ELM_CTXPOPUP_DATA_GET(WIDGET(item), sd);
|
||||||
|
|
||||||
|
if (!sd->items) return NULL;
|
||||||
|
|
||||||
|
l = eina_list_data_find_list(sd->items, it);
|
||||||
|
if (l && l->next) return eina_list_data_get(l->next);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Elm_Ctxpopup_Item*
|
||||||
|
_item_new(Eo *obj,
|
||||||
|
Elm_Ctxpopup_Data *sd,
|
||||||
|
Evas_Smart_Cb func,
|
||||||
|
const void *data)
|
||||||
|
{
|
||||||
|
Elm_Ctxpopup_Item *item;
|
||||||
|
|
||||||
|
item = elm_widget_item_new(obj, Elm_Ctxpopup_Item);
|
||||||
|
if (!item) return NULL;
|
||||||
|
|
||||||
|
elm_widget_item_del_pre_hook_set(item, _item_del_pre_hook);
|
||||||
|
elm_widget_item_disable_hook_set(item, _item_disable_hook);
|
||||||
|
elm_widget_item_text_set_hook_set(item, _item_text_set_hook);
|
||||||
|
elm_widget_item_text_get_hook_set(item, _item_text_get_hook);
|
||||||
|
elm_widget_item_content_set_hook_set(item, _item_content_set_hook);
|
||||||
|
elm_widget_item_content_get_hook_set(item, _item_content_get_hook);
|
||||||
|
elm_widget_item_signal_emit_hook_set(item, _item_signal_emit_hook);
|
||||||
|
|
||||||
|
if (!sd->list)
|
||||||
|
{
|
||||||
|
sd->list = elm_list_add(obj);
|
||||||
|
if (!strncmp(elm_object_style_get(obj), "default", strlen("default")))
|
||||||
|
elm_object_style_set(sd->list, "ctxpopup");
|
||||||
|
else elm_object_style_set(sd->list, elm_object_style_get(obj));
|
||||||
|
elm_list_mode_set(sd->list, ELM_LIST_EXPAND);
|
||||||
|
elm_list_horizontal_set(sd->list, sd->horizontal);
|
||||||
|
evas_object_event_callback_add
|
||||||
|
(sd->list, EVAS_CALLBACK_RESIZE, _list_resize_cb, obj);
|
||||||
|
elm_layout_content_set(obj, "default", sd->list);
|
||||||
|
}
|
||||||
|
|
||||||
|
item->wcb.org_func_cb = func;
|
||||||
|
item->wcb.org_data = data;
|
||||||
|
item->wcb.cobj = obj;
|
||||||
|
|
||||||
|
sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
#include "elc_ctxpopup.eo.c"
|
#include "elc_ctxpopup.eo.c"
|
||||||
|
|
|
@ -124,6 +124,63 @@ class Elm_Ctxpopup (Elm_Layout)
|
||||||
return Elm_Ctxpopup_Direction;
|
return Elm_Ctxpopup_Direction;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
items {
|
||||||
|
get {
|
||||||
|
/*@
|
||||||
|
@brief Get the internal list of items in a given ctxpopup widget.
|
||||||
|
@since 1.11
|
||||||
|
|
||||||
|
@return The list of items (#Elm_Object_Item as data) or
|
||||||
|
@c NULL on errors.
|
||||||
|
|
||||||
|
This list is @b not to be modified in any way and must not be
|
||||||
|
freed. Use the list members with functions like
|
||||||
|
elm_object_item_text_set(),
|
||||||
|
elm_object_item_text_get(),
|
||||||
|
elm_object_item_del().
|
||||||
|
|
||||||
|
@warning This list is only valid until @p obj object's internal
|
||||||
|
items list is changed. It should be fetched again with another
|
||||||
|
call to this function when changes happen.
|
||||||
|
|
||||||
|
@ingroup Ctxpopup */
|
||||||
|
return const(Eina_List)*;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
first_item {
|
||||||
|
get {
|
||||||
|
/*@
|
||||||
|
Get the first item in the given ctxpopup widget's list of
|
||||||
|
items.
|
||||||
|
@since 1.11
|
||||||
|
|
||||||
|
@return The first item or @c NULL, if it has no items (and on
|
||||||
|
errors)
|
||||||
|
|
||||||
|
@see elm_ctxpopup_item_append()
|
||||||
|
@see elm_ctxpopup_last_item_get()
|
||||||
|
|
||||||
|
@ingroup Ctxpopup */
|
||||||
|
return Elm_Object_Item *;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
last_item {
|
||||||
|
get {
|
||||||
|
/*@
|
||||||
|
Get the last item in the given ctxpopup widget's list of
|
||||||
|
items.
|
||||||
|
@since 1.11
|
||||||
|
|
||||||
|
@return The last item or @c NULL, if it has no items (and on
|
||||||
|
errors)
|
||||||
|
|
||||||
|
@see elm_ctxpopup_item_prepend()
|
||||||
|
@see elm_ctxpopup_first_item_get()
|
||||||
|
|
||||||
|
@ingroup Ctxpopup */
|
||||||
|
return Elm_Object_Item *;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
methods {
|
methods {
|
||||||
dismiss {
|
dismiss {
|
||||||
|
@ -155,6 +212,28 @@ class Elm_Ctxpopup (Elm_Layout)
|
||||||
|
|
||||||
@ingroup Ctxpopup */
|
@ingroup Ctxpopup */
|
||||||
|
|
||||||
|
return Elm_Object_Item *;
|
||||||
|
params {
|
||||||
|
@in const(char)* label; /*@ The Label of the new item */
|
||||||
|
@in Evas_Object *icon; /*@ Icon to be set on new item */
|
||||||
|
@in Evas_Smart_Cb func; /*@ Convenience function called when item selected */
|
||||||
|
@in const(void)* data; /*@ Data passed to @p func */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
item_prepend {
|
||||||
|
/*@
|
||||||
|
@brief Prepend a new item to a ctxpopup object.
|
||||||
|
@since 1.11
|
||||||
|
|
||||||
|
@return A handle to the item added or @c NULL, on errors
|
||||||
|
|
||||||
|
@warning Ctxpopup can't hold both an item list and a content at the same
|
||||||
|
time. When an item is added, any previous content will be removed.
|
||||||
|
|
||||||
|
@see elm_object_content_set()
|
||||||
|
|
||||||
|
@ingroup Ctxpopup */
|
||||||
|
|
||||||
return Elm_Object_Item *;
|
return Elm_Object_Item *;
|
||||||
params {
|
params {
|
||||||
@in const(char)* label; /*@ The Label of the new item */
|
@in const(char)* label; /*@ The Label of the new item */
|
||||||
|
|
|
@ -7,3 +7,33 @@ typedef enum
|
||||||
ELM_CTXPOPUP_DIRECTION_UNKNOWN, /**< ctxpopup does not determine it's direction yet*/
|
ELM_CTXPOPUP_DIRECTION_UNKNOWN, /**< ctxpopup does not determine it's direction yet*/
|
||||||
} Elm_Ctxpopup_Direction; /**< Direction in which to show the popup */
|
} Elm_Ctxpopup_Direction; /**< Direction in which to show the popup */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the item before @p it in a ctxpopup widget's internal list of
|
||||||
|
* items.
|
||||||
|
*
|
||||||
|
* @param it The item to fetch previous from
|
||||||
|
* @return The item before the @p it in its parent's list. If there is no
|
||||||
|
* previous item for @p it or there's an error, @c NULL is returned.
|
||||||
|
*
|
||||||
|
* @see elm_ctxpopup_item_next_get()
|
||||||
|
*
|
||||||
|
* @since 1.11
|
||||||
|
* @ingroup Ctxpopup
|
||||||
|
*/
|
||||||
|
EAPI Elm_Object_Item *elm_ctxpopup_item_prev_get(const Elm_Object_Item *it);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the item after @p it in a ctxpopup widget's
|
||||||
|
* internal list of items.
|
||||||
|
*
|
||||||
|
* @param it The item to fetch next from
|
||||||
|
* @return The item after the @p it in its parent's list. If there is no next
|
||||||
|
* item for @p it or there's an error, @c NULL is returned.
|
||||||
|
*
|
||||||
|
* @see elm_ctxpopup_item_prev_get()
|
||||||
|
*
|
||||||
|
* @since 1.11
|
||||||
|
* @ingroup Ctxpopup
|
||||||
|
*/
|
||||||
|
EAPI Elm_Object_Item *elm_ctxpopup_item_next_get(const Elm_Object_Item *it);
|
||||||
|
|
||||||
|
|
|
@ -85,4 +85,8 @@ struct _Elm_Ctxpopup_Data
|
||||||
if (EINA_UNLIKELY(!eo_isa((obj), ELM_CTXPOPUP_CLASS))) \
|
if (EINA_UNLIKELY(!eo_isa((obj), ELM_CTXPOPUP_CLASS))) \
|
||||||
return
|
return
|
||||||
|
|
||||||
|
#define ELM_CTXPOPUP_ITEM_CHECK_OR_RETURN(it, ...) \
|
||||||
|
ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, __VA_ARGS__); \
|
||||||
|
ELM_CTXPOPUP_CHECK(it->base.widget) __VA_ARGS__;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue