Use elm_widget_item common base.

This patch changes all Elm_*_Item to use new infrastructure of
Elm_Widget_Item. This patch is basically a find-and-replace, but even
that was a bit tricky since every code had different names for the
same things, particularly for "view" and "widget" the names ranged
from "o"/"obj" to "base"/"o", quite confusing!

It is worth noting that Genlist and variants that adopted its "item
class" style such as Gengrid and Slideshow already provide a "del()"
callback there and I'm keeping them, however we should reconsider if
it is good to remove them and use elm_widget_item_del_cb_set()
instead. The drawback is that onde would have to set it, while the
other is done automatically when you create the object with the
class. Nonetheless this patch already introduces support to use
elm_widget_item_pre_notify_del(), but it will be void in such code as
nobody ever sets it.

Some new setters and getters were introduced to normalize code... and
they would be required once people write python-bindings for them,
like index and carousel.




SVN revision: 52118
This commit is contained in:
Gustavo Sverzut Barbieri 2010-09-10 02:05:45 +00:00
parent b5aeff5519
commit 9ed8bf92be
10 changed files with 527 additions and 512 deletions

View File

@ -617,11 +617,11 @@ extern "C" {
EAPI void elm_gengrid_bounce_get(const Evas_Object *obj, Eina_Bool *h_bounce, Eina_Bool *v_bounce);
EAPI void elm_gengrid_horizontal_set(Evas_Object *obj, Eina_Bool setting);
EAPI void elm_gengrid_clear(Evas_Object *obj);
EAPI void *elm_gengrid_item_data_get(Elm_Gengrid_Item *item);
EAPI void *elm_gengrid_item_data_get(const Elm_Gengrid_Item *item);
EAPI void elm_gengrid_item_pos_get(const Elm_Gengrid_Item *item, unsigned int *x, unsigned int *y);
EAPI void elm_gengrid_item_selected_set(Elm_Gengrid_Item *item, Eina_Bool selected);
EAPI Eina_Bool elm_gengrid_item_selected_get(const Elm_Gengrid_Item *item);
EAPI const Evas_Object *elm_gengrid_item_object_get(Elm_Gengrid_Item *item);
EAPI const Evas_Object *elm_gengrid_item_object_get(const Elm_Gengrid_Item *item);
EAPI const Eina_List *elm_gengrid_selected_items_get(const Evas_Object *obj);
EAPI const Eina_List *elm_gengrid_items_get(const Evas_Object *obj);
EAPI Elm_Gengrid_Item *elm_gengrid_item_append(Evas_Object *obj, const Elm_Gengrid_Item_Class *gcc, const void *data, Evas_Smart_Cb func, const void *func_data);
@ -1060,7 +1060,10 @@ extern "C" {
EAPI Evas_Object *elm_carousel_add(Evas_Object *parent);
EAPI Elm_Carousel_Item *elm_carousel_item_add(Evas_Object *obj, Evas_Object *icon, const char *label, Evas_Smart_Cb func, const void *data);
EAPI void elm_carousel_item_del(Elm_Carousel_Item *item);
EAPI void elm_carousel_item_select(Elm_Carousel_Item *item);
EAPI void elm_carousel_item_del_cb_set(Elm_Carousel_Item *it, Evas_Smart_Cb func);
EAPI void *elm_carousel_item_data_get(const Elm_Carousel_Item *it);
/* smart callbacks called:
* "clicked" - when the user clicks on a carousel item and becomes selected
*/
@ -1341,6 +1344,7 @@ extern "C" {
EAPI void elm_index_item_go(Evas_Object *obj, int level);
EAPI void *elm_index_item_data_get(const Elm_Index_Item *item);
EAPI void elm_index_item_data_set(Elm_Index_Item *it, const void *data);
EAPI void elm_index_item_del_cb_set(Elm_Index_Item *it, Evas_Smart_Cb func);
EAPI const char *elm_index_item_letter_get(const Elm_Index_Item *item);
/* smart callbacks called:
* "changed" - when the selected index item changes

View File

@ -31,14 +31,12 @@ struct _Widget_Data
struct _Elm_Hoversel_Item
{
Evas_Object *obj;
Elm_Widget_Item base;
const char *label;
const char *icon_file;
const char *icon_group;
Elm_Icon_Type icon_type;
Evas_Smart_Cb func;
Evas_Smart_Cb del_cb;
void *data;
};
static const char *widtype = NULL;
@ -59,11 +57,11 @@ _del_pre_hook(Evas_Object *obj)
elm_hoversel_hover_parent_set(obj, NULL);
EINA_LIST_FREE(wd->items, it)
{
if (it->del_cb) it->del_cb((void *)it->data, it->obj, it);
elm_widget_item_pre_notify_del(it);
eina_stringshare_del(it->label);
eina_stringshare_del(it->icon_file);
eina_stringshare_del(it->icon_group);
free(it);
elm_widget_item_del(it);
}
}
@ -128,10 +126,10 @@ static void
_item_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Elm_Hoversel_Item *it = data;
Evas_Object *obj2 = it->obj;
Evas_Object *obj2 = it->base.widget;
elm_hoversel_hover_end(obj2);
if (it->func) it->func(it->data, obj2, it);
if (it->func) it->func((void *)it->base.data, obj2, it);
evas_object_smart_callback_call(obj2, "selected", it);
}
@ -520,15 +518,14 @@ elm_hoversel_item_add(Evas_Object *obj, const char *label, const char *icon_file
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return NULL;
Elm_Hoversel_Item *it = calloc(1, sizeof(Elm_Hoversel_Item));
Elm_Hoversel_Item *it = elm_widget_item_new(obj, Elm_Hoversel_Item);
if (!it) return NULL;
wd->items = eina_list_append(wd->items, it);
it->obj = obj;
it->label = eina_stringshare_add(label);
it->icon_file = eina_stringshare_add(icon_file);
it->icon_type = icon_type;
it->func = func;
it->data = (void *)data;
it->base.data = data;
return it;
}
@ -547,15 +544,15 @@ EAPI void
elm_hoversel_item_del(Elm_Hoversel_Item *it)
{
if (!it) return;
Widget_Data *wd = elm_widget_data_get(it->obj);
if (it->del_cb) it->del_cb((void *)it->data, it->obj, it);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
if (!wd) return;
elm_hoversel_hover_end(it->obj);
elm_hoversel_hover_end(it->base.widget);
wd->items = eina_list_remove(wd->items, it);
elm_widget_item_pre_notify_del(it);
eina_stringshare_del(it->label);
eina_stringshare_del(it->icon_file);
eina_stringshare_del(it->icon_group);
free(it);
elm_widget_item_del(it);
}
/**
@ -574,8 +571,7 @@ elm_hoversel_item_del(Elm_Hoversel_Item *it)
EAPI void
elm_hoversel_item_del_cb_set(Elm_Hoversel_Item *it, Evas_Smart_Cb func)
{
if (!it) return;
it->del_cb = func;
elm_widget_item_del_cb_set(it, func);
}
/**
@ -590,8 +586,7 @@ elm_hoversel_item_del_cb_set(Elm_Hoversel_Item *it, Evas_Smart_Cb func)
EAPI void *
elm_hoversel_item_data_get(Elm_Hoversel_Item *it)
{
if (!it) return NULL;
return it->data;
return elm_widget_item_data_get(it);
}
/**

View File

@ -14,10 +14,10 @@ struct _Widget_Data
struct _Elm_Carousel_Item
{
Evas_Object *obj, *base, *icon;
Elm_Widget_Item base;
Evas_Object *icon;
const char *label;
Evas_Smart_Cb func;
const void *data;
Eina_Bool selected : 1;
};
@ -29,11 +29,11 @@ static void _sizing_eval(Evas_Object *obj);
static void
_item_show(Elm_Carousel_Item *it)
{
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
Evas_Coord x, y, w, h, bx, by;
if (!wd) return;
evas_object_geometry_get(wd->bx, &bx, &by, NULL, NULL);
evas_object_geometry_get(it->base, &x, &y, &w, &h);
evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
elm_smart_scroller_child_region_show(wd->scr, x - bx, y - by, w, h);
}
@ -41,7 +41,7 @@ static void
_item_select(Elm_Carousel_Item *it)
{
Elm_Carousel_Item *it2;
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
Evas_Object *obj2;
const Eina_List *l;
if (!wd) return;
@ -51,15 +51,15 @@ _item_select(Elm_Carousel_Item *it)
if (it2->selected)
{
it2->selected = EINA_FALSE;
edje_object_signal_emit(it2->base, "elm,state,unselected", "elm");
edje_object_signal_emit(it2->base.view, "elm,state,unselected", "elm");
break;
}
}
it->selected = EINA_TRUE;
edje_object_signal_emit(it->base, "elm,state,selected", "elm");
edje_object_signal_emit(it->base.view, "elm,state,selected", "elm");
_item_show(it);
obj2 = it->obj;
if (it->func) it->func((void *)(it->data), it->obj, it);
obj2 = it->base.widget;
if (it->func) it->func((void *)(it->base.data), it->base.widget, it);
evas_object_smart_callback_call(obj2, "clicked", it);
}
@ -83,20 +83,20 @@ _theme_hook(Evas_Object *obj)
Evas_Coord mw, mh;
if (it->selected)
edje_object_signal_emit(it->base, "elm,state,selected", "elm");
_elm_theme_object_set(obj, it->base, "carousel", "item", elm_widget_style_get(obj));
edje_object_scale_set(it->base, elm_widget_scale_get(obj) * _elm_config->scale);
edje_object_signal_emit(it->base.view, "elm,state,selected", "elm");
_elm_theme_object_set(obj, it->base.view, "carousel", "item", elm_widget_style_get(obj));
edje_object_scale_set(it->base.view, elm_widget_scale_get(obj) * _elm_config->scale);
if (it->icon)
{
edje_extern_object_min_size_set(it->icon,
(double)wd->icon_size * _elm_config->scale,
(double)wd->icon_size * _elm_config->scale);
edje_object_part_swallow(it->base, "elm.swallow.icon", it->icon);
edje_object_part_swallow(it->base.view, "elm.swallow.icon", it->icon);
}
edje_object_part_text_set(it->base, "elm.text", it->label);
edje_object_size_min_calc(it->base, &mw, &mh);
evas_object_size_hint_min_set(it->base, mw, mh);
evas_object_size_hint_max_set(it->base, 9999, mh);
edje_object_part_text_set(it->base.view, "elm.text", it->label);
edje_object_size_min_calc(it->base.view, &mw, &mh);
evas_object_size_hint_min_set(it->base.view, mw, mh);
evas_object_size_hint_max_set(it->base.view, 9999, mh);
}
_sizing_eval(obj);
}
@ -200,37 +200,36 @@ elm_carousel_item_add(Evas_Object *obj, Evas_Object *icon, const char *label, Ev
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return NULL;
Evas_Coord mw, mh;
Elm_Carousel_Item *it = calloc(1, sizeof(Elm_Carousel_Item));
Elm_Carousel_Item *it = elm_widget_item_new(obj, Elm_Carousel_Item);
if (!it) return NULL;
wd->items = eina_list_append(wd->items, it);
it->obj = obj;
it->label = eina_stringshare_add(label);
it->icon = icon;
it->func = func;
it->data = data;
it->base = edje_object_add(evas_object_evas_get(obj));
_elm_theme_object_set(obj, it->base, "carousel", "item", elm_widget_style_get(obj));
edje_object_signal_callback_add(it->base, "elm,action,click", "elm",
it->base.data = data;
it->base.view = edje_object_add(evas_object_evas_get(obj));
_elm_theme_object_set(obj, it->base.view, "carousel", "item", elm_widget_style_get(obj));
edje_object_signal_callback_add(it->base.view, "elm,action,click", "elm",
_select, it);
elm_widget_sub_object_add(obj, it->base);
elm_widget_sub_object_add(obj, it->base.view);
if (it->icon)
{
edje_extern_object_min_size_set(it->icon,
(double)wd->icon_size * _elm_config->scale,
(double)wd->icon_size * _elm_config->scale);
edje_object_part_swallow(it->base, "elm.swallow.icon", it->icon);
edje_object_part_swallow(it->base.view, "elm.swallow.icon", it->icon);
evas_object_show(it->icon);
elm_widget_sub_object_add(obj, it->icon);
}
edje_object_part_text_set(it->base, "elm.text", it->label);
edje_object_size_min_calc(it->base, &mw, &mh);
evas_object_size_hint_weight_set(it->base, 0.0, 0.0);
evas_object_size_hint_align_set(it->base, -1.0, -1.0);
evas_object_size_hint_min_set(it->base, mw, mh);
evas_object_size_hint_max_set(it->base, 9999, mh);
evas_object_box_append(wd->bx, it->base);
evas_object_show(it->base);
edje_object_part_text_set(it->base.view, "elm.text", it->label);
edje_object_size_min_calc(it->base.view, &mw, &mh);
evas_object_size_hint_weight_set(it->base.view, 0.0, 0.0);
evas_object_size_hint_align_set(it->base.view, -1.0, -1.0);
evas_object_size_hint_min_set(it->base.view, mw, mh);
evas_object_size_hint_max_set(it->base.view, 9999, mh);
evas_object_box_append(wd->bx, it->base.view);
evas_object_show(it->base.view);
_sizing_eval(obj);
return it;
}
@ -238,17 +237,45 @@ elm_carousel_item_add(Evas_Object *obj, Evas_Object *icon, const char *label, Ev
EAPI void
elm_carousel_item_del(Elm_Carousel_Item *it)
{
Widget_Data *wd = elm_widget_data_get(it->obj);
Evas_Object *obj2 = it->obj;
Widget_Data *wd = elm_widget_data_get(it->base.widget);
Evas_Object *obj2 = it->base.widget;
if (!wd) return;
wd->items = eina_list_remove(wd->items, it);
eina_stringshare_del(it->label);
if (it->icon) evas_object_del(it->icon);
evas_object_del(it->base);
evas_object_del(it->base.view);
free(it);
_theme_hook(obj2);
}
/**
* Set the function called when a carousel item is freed.
*
* @param it The item to set the callback on
* @param func The function called
*
* @ingroup Carousel
*/
EAPI void
elm_carousel_item_del_cb_set(Elm_Carousel_Item *it, Evas_Smart_Cb func)
{
elm_widget_item_del_cb_set(it, func);
}
/**
* Returns the data associated with the item.
*
* @param it The carousel item
* @return The data associated with @p it
*
* @ingroup Carousel
*/
EAPI void *
elm_carousel_item_data_get(const Elm_Carousel_Item *it)
{
return elm_widget_item_data_get(it);
}
EAPI void
elm_carousel_item_select(Elm_Carousel_Item *item)
{

View File

@ -142,12 +142,12 @@ typedef struct _Pan Pan;
struct _Elm_Gengrid_Item
{
Evas_Object *base, *spacer;
Elm_Widget_Item base;
Evas_Object *spacer;
const Elm_Gengrid_Item_Class *gic;
Ecore_Timer *long_timer;
Widget_Data *wd;
Eina_List *labels, *icons, *states, *icon_objs;
const void *data;
struct
{
Evas_Smart_Cb func;
@ -442,7 +442,7 @@ static void
_item_hilight(Elm_Gengrid_Item *item)
{
if ((item->wd->no_select) || (item->delete_me) || (item->hilighted)) return;
edje_object_signal_emit(item->base, "elm,state,selected", "elm");
edje_object_signal_emit(item->base.view, "elm,state,selected", "elm");
item->hilighted = EINA_TRUE;
}
@ -453,35 +453,35 @@ _item_realize(Elm_Gengrid_Item *item)
char style[1024];
if ((item->realized) || (item->delete_me)) return;
item->base = edje_object_add(evas_object_evas_get(item->wd->self));
edje_object_scale_set(item->base, elm_widget_scale_get(item->wd->self) *
item->base.view = edje_object_add(evas_object_evas_get(item->wd->self));
edje_object_scale_set(item->base.view, elm_widget_scale_get(item->wd->self) *
_elm_config->scale);
evas_object_smart_member_add(item->base, item->wd->pan_smart);
elm_widget_sub_object_add(item->wd->self, item->base);
evas_object_smart_member_add(item->base.view, item->wd->pan_smart);
elm_widget_sub_object_add(item->wd->self, item->base.view);
snprintf(style, sizeof(style), "item/%s",
item->gic->item_style ? item->gic->item_style : "default");
_elm_theme_object_set(item->wd->self, item->base, "gengrid", style,
_elm_theme_object_set(item->wd->self, item->base.view, "gengrid", style,
elm_widget_style_get(item->wd->self));
item->spacer = evas_object_rectangle_add(evas_object_evas_get(item->wd->self));
evas_object_color_set(item->spacer, 0, 0, 0, 0);
elm_widget_sub_object_add(item->wd->self, item->spacer);
evas_object_size_hint_min_set(item->spacer, 2 * _elm_config->scale, 1);
edje_object_part_swallow(item->base, "elm.swallow.pad", item->spacer);
edje_object_part_swallow(item->base.view, "elm.swallow.pad", item->spacer);
if (item->gic->func.label_get)
{
const Eina_List *l;
const char *key;
item->labels = _elm_stringlist_get(edje_object_data_get(item->base,
item->labels = _elm_stringlist_get(edje_object_data_get(item->base.view,
"labels"));
EINA_LIST_FOREACH(item->labels, l, key)
{
char *s = item->gic->func.label_get(item->data, item->wd->self,
char *s = item->gic->func.label_get(item->base.data, item->wd->self,
l->data);
if (s)
{
edje_object_part_text_set(item->base, l->data, s);
edje_object_part_text_set(item->base.view, l->data, s);
free(s);
}
}
@ -492,17 +492,17 @@ _item_realize(Elm_Gengrid_Item *item)
const Eina_List *l;
const char *key;
item->icons = _elm_stringlist_get(edje_object_data_get(item->base,
item->icons = _elm_stringlist_get(edje_object_data_get(item->base.view,
"icons"));
EINA_LIST_FOREACH(item->icons, l, key)
{
Evas_Object *ic = item->gic->func.icon_get(item->data,
Evas_Object *ic = item->gic->func.icon_get(item->base.data,
item->wd->self,
l->data);
if (ic)
{
item->icon_objs = eina_list_append(item->icon_objs, ic);
edje_object_part_swallow(item->base, key, ic);
edje_object_part_swallow(item->base.view, key, ic);
evas_object_show(ic);
elm_widget_sub_object_add(item->wd->self, ic);
}
@ -514,42 +514,42 @@ _item_realize(Elm_Gengrid_Item *item)
const Eina_List *l;
const char *key;
item->states = _elm_stringlist_get(edje_object_data_get(item->base,
item->states = _elm_stringlist_get(edje_object_data_get(item->base.view,
"states"));
EINA_LIST_FOREACH(item->states, l, key)
{
Eina_Bool on = item->gic->func.state_get(item->data,
Eina_Bool on = item->gic->func.state_get(item->base.data,
item->wd->self, l->data);
if (on)
{
snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
edje_object_signal_emit(item->base, buf, "elm");
edje_object_signal_emit(item->base.view, buf, "elm");
}
}
}
if ((!item->wd->item_width) && (!item->wd->item_height))
{
edje_object_size_min_restricted_calc(item->base,
edje_object_size_min_restricted_calc(item->base.view,
&item->wd->item_width, &item->wd->item_height,
item->wd->item_width, item->wd->item_height);
elm_coords_finger_size_adjust(1, &item->wd->item_width,
1, &item->wd->item_height);
}
evas_object_event_callback_add(item->base, EVAS_CALLBACK_MOUSE_DOWN,
evas_object_event_callback_add(item->base.view, EVAS_CALLBACK_MOUSE_DOWN,
_mouse_down, item);
evas_object_event_callback_add(item->base, EVAS_CALLBACK_MOUSE_UP,
evas_object_event_callback_add(item->base.view, EVAS_CALLBACK_MOUSE_UP,
_mouse_up, item);
evas_object_event_callback_add(item->base, EVAS_CALLBACK_MOUSE_MOVE,
evas_object_event_callback_add(item->base.view, EVAS_CALLBACK_MOUSE_MOVE,
_mouse_move, item);
if (item->selected)
edje_object_signal_emit(item->base, "elm,state,selected", "elm");
edje_object_signal_emit(item->base.view, "elm,state,selected", "elm");
if (item->disabled)
edje_object_signal_emit(item->base, "elm,state,disabled", "elm");
edje_object_signal_emit(item->base.view, "elm,state,disabled", "elm");
evas_object_show(item->base);
evas_object_show(item->base.view);
item->realized = EINA_TRUE;
item->want_unrealize = EINA_FALSE;
}
@ -565,8 +565,8 @@ _item_unrealize(Elm_Gengrid_Item *item)
ecore_timer_del(item->long_timer);
item->long_timer = NULL;
}
evas_object_del(item->base);
item->base = NULL;
evas_object_del(item->base.view);
item->base.view = NULL;
evas_object_del(item->spacer);
item->spacer = NULL;
_elm_stringlist_free(item->labels);
@ -644,8 +644,8 @@ _item_place(Elm_Gengrid_Item *item, Evas_Coord cx, Evas_Coord cy)
_item_realize(item);
if (!was_realized)
evas_object_smart_callback_call(item->wd->self, "realized", item);
evas_object_move(item->base, x, y);
evas_object_resize(item->base, item->wd->item_width,
evas_object_move(item->base.view, x, y);
evas_object_resize(item->base.view, item->wd->item_width,
item->wd->item_height);
}
else
@ -657,11 +657,11 @@ _item_create(Widget_Data *wd, const Elm_Gengrid_Item_Class *gic, const void *dat
{
Elm_Gengrid_Item *item;
item = calloc(1, sizeof(*item));
item = elm_widget_item_new(wd->self, Elm_Gengrid_Item);
if (!item) return NULL;
item->wd = wd;
item->gic = gic;
item->data = data;
item->base.data = data;
item->func.func = func;
item->func.data = func_data;
return item;
@ -670,15 +670,16 @@ _item_create(Widget_Data *wd, const Elm_Gengrid_Item_Class *gic, const void *dat
static void
_item_del(Elm_Gengrid_Item *item)
{
elm_widget_item_pre_notify_del(item);
if (item->selected)
item->wd->selected = eina_list_remove(item->wd->selected, item);
if (item->realized) _item_unrealize(item);
if ((!item->delete_me) && (item->gic->func.del))
item->gic->func.del(item->data, item->wd->self);
item->gic->func.del(item->base.data, item->wd->self);
item->delete_me = EINA_TRUE;
item->wd->items = eina_list_remove(item->wd->items, item);
if (item->long_timer) ecore_timer_del(item->long_timer);
free(item);
elm_widget_item_del(item);
}
static void
@ -707,7 +708,7 @@ static void
_item_unselect(Elm_Gengrid_Item *item)
{
if ((item->delete_me) || (!item->hilighted)) return;
edje_object_signal_emit(item->base, "elm,state,unselected", "elm");
edje_object_signal_emit(item->base.view, "elm,state,unselected", "elm");
item->hilighted = EINA_FALSE;
if (item->selected)
{
@ -1150,10 +1151,11 @@ elm_gengrid_item_del(Elm_Gengrid_Item *item)
if ((item->relcount > 0) || (item->walking > 0))
{
item->delete_me = EINA_TRUE;
elm_widget_item_pre_notify_del(item);
if (item->selected)
item->wd->selected = eina_list_remove(item->wd->selected, item);
if (item->gic->func.del)
item->gic->func.del(item->data, item->wd->self);
item->gic->func.del(item->base.data, item->wd->self);
return;
}
@ -1214,11 +1216,12 @@ elm_gengrid_clear(Evas_Object *obj)
EINA_LIST_FOREACH_SAFE(wd->items, l, l_next, item)
{
if (item->realized) _item_unrealize(item);
if (item->gic->func.del) item->gic->func.del(item->data, wd->self);
if (item->long_timer) ecore_timer_del(item->long_timer);
free(item);
wd->items = eina_list_remove_list(wd->items, l);
elm_widget_item_pre_notify_del(item);
if (item->realized) _item_unrealize(item);
if (item->gic->func.del) item->gic->func.del(item->base.data, wd->self);
if (item->long_timer) ecore_timer_del(item->long_timer);
elm_widget_item_del(item);
}
if (wd->selected)
@ -1253,10 +1256,10 @@ elm_gengrid_clear(Evas_Object *obj)
* @ingroup Gengrid
*/
EAPI const Evas_Object *
elm_gengrid_item_object_get(Elm_Gengrid_Item *item)
elm_gengrid_item_object_get(const Elm_Gengrid_Item *item)
{
if (!item) return NULL;
return item->base;
return item->base.view;
}
/**
@ -1274,10 +1277,9 @@ elm_gengrid_item_object_get(Elm_Gengrid_Item *item)
* @ingroup Gengrid
*/
EAPI void *
elm_gengrid_item_data_get(Elm_Gengrid_Item *item)
elm_gengrid_item_data_get(const Elm_Gengrid_Item *item)
{
if (!item) return NULL;
return (void *)item->data;
return elm_widget_item_data_get(item);
}
/**
@ -1455,9 +1457,9 @@ elm_gengrid_item_disabled_set(Elm_Gengrid_Item *item, Eina_Bool disabled)
if (item->realized)
{
if (item->disabled)
edje_object_signal_emit(item->base, "elm,state,disabled", "elm");
edje_object_signal_emit(item->base.view, "elm,state,disabled", "elm");
else
edje_object_signal_emit(item->base, "elm,state,enabled", "elm");
edje_object_signal_emit(item->base.view, "elm,state,enabled", "elm");
}
}

View File

@ -287,13 +287,13 @@ struct _Item_Block
struct _Elm_Genlist_Item
{
Elm_Widget_Item base;
EINA_INLIST;
Widget_Data *wd;
Item_Block *block;
Eina_List *items;
Evas_Coord x, y, w, h, minw, minh;
const Elm_Genlist_Item_Class *itc;
const void *data;
Elm_Genlist_Item *parent;
Elm_Genlist_Item_Flags flags;
struct
@ -302,7 +302,7 @@ struct _Elm_Genlist_Item
const void *data;
} func;
Evas_Object *base, *spacer;
Evas_Object *spacer;
Eina_List *labels, *icons, *states, *icon_objs;
Ecore_Timer *long_timer;
Evas_Coord dx, dy;
@ -436,10 +436,10 @@ _item_hilight(Elm_Genlist_Item *it)
{
const char *selectraise;
if ((it->wd->no_select) || (it->delete_me) || (it->hilighted)) return;
edje_object_signal_emit(it->base, "elm,state,selected", "elm");
selectraise = edje_object_data_get(it->base, "selectraise");
edje_object_signal_emit(it->base.view, "elm,state,selected", "elm");
selectraise = edje_object_data_get(it->base.view, "selectraise");
if ((selectraise) && (!strcmp(selectraise, "on")))
evas_object_raise(it->base);
evas_object_raise(it->base.view);
it->hilighted = EINA_TRUE;
}
@ -510,6 +510,7 @@ _item_block_del(Elm_Genlist_Item *it)
static void
_item_del(Elm_Genlist_Item *it)
{
elm_widget_item_pre_notify_del(it);
elm_genlist_item_subitems_clear(it);
it->wd->walking -= it->walking;
if (it->wd->show_item == it) it->wd->show_item = NULL;
@ -517,7 +518,7 @@ _item_del(Elm_Genlist_Item *it)
if (it->realized) _item_unrealize(it);
if (it->block) _item_block_del(it);
if ((!it->delete_me) && (it->itc->func.del))
it->itc->func.del(it->data, it->wd->obj);
it->itc->func.del(it->base.data, it->base.widget);
it->delete_me = EINA_TRUE;
if (it->queued)
it->wd->queue = eina_list_remove(it->wd->queue, it);
@ -525,7 +526,7 @@ _item_del(Elm_Genlist_Item *it)
if (it->parent)
it->parent->items = eina_list_remove(it->parent->items, it);
if (it->long_timer) ecore_timer_del(it->long_timer);
free(it);
elm_widget_item_del(it);
}
static void
@ -542,13 +543,13 @@ _item_select(Elm_Genlist_Item *it)
call:
it->walking++;
it->wd->walking++;
if (it->func.func) it->func.func((void *)it->func.data, it->wd->obj, it);
if (it->func.func) it->func.func((void *)it->func.data, it->base.widget, it);
if (!it->delete_me)
evas_object_smart_callback_call(it->wd->obj, "selected", it);
evas_object_smart_callback_call(it->base.widget, "selected", it);
it->walking--;
it->wd->walking--;
if ((it->wd->clear_me) && (it->wd->walking == 0))
elm_genlist_clear(it->wd->obj);
elm_genlist_clear(it->base.widget);
else
{
if ((it->walking == 0) && (it->delete_me))
@ -564,20 +565,20 @@ _item_unselect(Elm_Genlist_Item *it)
const char *stacking, *selectraise;
if ((it->delete_me) || (!it->hilighted)) return;
edje_object_signal_emit(it->base, "elm,state,unselected", "elm");
stacking = edje_object_data_get(it->base, "stacking");
selectraise = edje_object_data_get(it->base, "selectraise");
edje_object_signal_emit(it->base.view, "elm,state,unselected", "elm");
stacking = edje_object_data_get(it->base.view, "stacking");
selectraise = edje_object_data_get(it->base.view, "selectraise");
if ((selectraise) && (!strcmp(selectraise, "on")))
{
if ((stacking) && (!strcmp(stacking, "below")))
evas_object_lower(it->base);
evas_object_lower(it->base.view);
}
it->hilighted = EINA_FALSE;
if (it->selected)
{
it->selected = EINA_FALSE;
it->wd->selected = eina_list_remove(it->wd->selected, it);
evas_object_smart_callback_call(it->wd->obj, "unselected", it);
evas_object_smart_callback_call(it->base.widget, "unselected", it);
}
}
@ -604,7 +605,7 @@ _mouse_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_inf
ecore_timer_del(it->long_timer);
it->long_timer = NULL;
}
evas_object_smart_callback_call(it->wd->obj, "drag", it);
evas_object_smart_callback_call(it->base.widget, "drag", it);
return;
}
if ((!it->down)/* || (it->wd->on_hold)*/ || (it->wd->longpressed))
@ -642,29 +643,29 @@ _mouse_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_inf
if (dy < 0)
{
if (ady > adx)
evas_object_smart_callback_call(it->wd->obj, "drag,start,up", it);
evas_object_smart_callback_call(it->base.widget, "drag,start,up", it);
else
{
if (dx < 0)
evas_object_smart_callback_call(it->wd->obj,
evas_object_smart_callback_call(it->base.widget,
"drag,start,left", it);
else
evas_object_smart_callback_call(it->wd->obj,
evas_object_smart_callback_call(it->base.widget,
"drag,start,right", it);
}
}
else
{
if (ady > adx)
evas_object_smart_callback_call(it->wd->obj,
evas_object_smart_callback_call(it->base.widget,
"drag,start,down", it);
else
{
if (dx < 0)
evas_object_smart_callback_call(it->wd->obj,
evas_object_smart_callback_call(it->base.widget,
"drag,start,left", it);
else
evas_object_smart_callback_call(it->wd->obj,
evas_object_smart_callback_call(it->base.widget,
"drag,start,right", it);
}
}
@ -679,7 +680,7 @@ _long_press(void *data)
it->long_timer = NULL;
if ((it->disabled) || (it->dragging)) return ECORE_CALLBACK_CANCEL;
it->wd->longpressed = EINA_TRUE;
evas_object_smart_callback_call(it->wd->obj, "longpressed", it);
evas_object_smart_callback_call(it->base.widget, "longpressed", it);
return ECORE_CALLBACK_CANCEL;
}
@ -703,7 +704,7 @@ _mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_inf
it->wd->wasselected = it->selected;
_item_hilight(it);
if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
evas_object_smart_callback_call(it->wd->obj, "clicked", it);
evas_object_smart_callback_call(it->base.widget, "clicked", it);
if (it->long_timer) ecore_timer_del(it->long_timer);
if (it->realized)
it->long_timer = ecore_timer_add(it->wd->longpress_timeout, _long_press, it);
@ -730,7 +731,7 @@ _mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *
if (it->dragging)
{
it->dragging = 0;
evas_object_smart_callback_call(it->wd->obj, "drag,stop", it);
evas_object_smart_callback_call(it->base.widget, "drag,stop", it);
dragged = 1;
}
if (it->wd->on_hold)
@ -797,9 +798,9 @@ _signal_expand_toggle(void *data, Evas_Object *obj __UNUSED__, const char *emiss
Elm_Genlist_Item *it = data;
if (it->expanded)
evas_object_smart_callback_call(it->wd->obj, "contract,request", it);
evas_object_smart_callback_call(it->base.widget, "contract,request", it);
else
evas_object_smart_callback_call(it->wd->obj, "expand,request", it);
evas_object_smart_callback_call(it->base.widget, "expand,request", it);
}
static void
@ -808,7 +809,7 @@ _signal_expand(void *data, Evas_Object *obj __UNUSED__, const char *emission __U
Elm_Genlist_Item *it = data;
if (!it->expanded)
evas_object_smart_callback_call(it->wd->obj, "expand,request", it);
evas_object_smart_callback_call(it->base.widget, "expand,request", it);
}
static void
@ -817,7 +818,7 @@ _signal_contract(void *data, Evas_Object *obj __UNUSED__, const char *emission _
Elm_Genlist_Item *it = data;
if (it->expanded)
evas_object_smart_callback_call(it->wd->obj, "contract,request", it);
evas_object_smart_callback_call(it->base.widget, "contract,request", it);
}
static void
@ -830,11 +831,11 @@ _item_realize(Elm_Genlist_Item *it, int in, int calc)
int depth, tsize = 20;
if ((it->realized) || (it->delete_me)) return;
it->base = edje_object_add(evas_object_evas_get(it->wd->obj));
edje_object_scale_set(it->base, elm_widget_scale_get(it->wd->obj) *
it->base.view = edje_object_add(evas_object_evas_get(it->base.widget));
edje_object_scale_set(it->base.view, elm_widget_scale_get(it->base.widget) *
_elm_config->scale);
evas_object_smart_member_add(it->base, it->wd->pan_smart);
elm_widget_sub_object_add(it->wd->obj, it->base);
evas_object_smart_member_add(it->base.view, it->wd->pan_smart);
elm_widget_sub_object_add(it->base.widget, it->base.view);
if (it->flags & ELM_GENLIST_ITEM_SUBITEMS) strncpy(buf, "tree", sizeof(buf));
else strncpy(buf, "item", sizeof(buf));
@ -844,42 +845,42 @@ _item_realize(Elm_Genlist_Item *it, int in, int calc)
strncat(buf, "/", sizeof(buf) - strlen(buf));
strncat(buf, it->itc->item_style, sizeof(buf) - strlen(buf));
_elm_theme_object_set(it->wd->obj, it->base, "genlist", buf, elm_widget_style_get(it->wd->obj));
it->spacer = evas_object_rectangle_add(evas_object_evas_get(it->wd->obj));
_elm_theme_object_set(it->base.widget, it->base.view, "genlist", buf, elm_widget_style_get(it->base.widget));
it->spacer = evas_object_rectangle_add(evas_object_evas_get(it->base.widget));
evas_object_color_set(it->spacer, 0, 0, 0, 0);
elm_widget_sub_object_add(it->wd->obj, it->spacer);
elm_widget_sub_object_add(it->base.widget, it->spacer);
for (it2 = it, depth = 0; it2->parent; it2 = it2->parent) depth += 1;
treesize = edje_object_data_get(it->base, "treesize");
treesize = edje_object_data_get(it->base.view, "treesize");
if (treesize) tsize = atoi(treesize);
evas_object_size_hint_min_set(it->spacer,
(depth * tsize) * _elm_config->scale, 1);
edje_object_part_swallow(it->base, "elm.swallow.pad", it->spacer);
edje_object_part_swallow(it->base.view, "elm.swallow.pad", it->spacer);
if (!calc)
{
edje_object_signal_callback_add(it->base, "elm,action,expand,toggle",
edje_object_signal_callback_add(it->base.view, "elm,action,expand,toggle",
"elm", _signal_expand_toggle, it);
edje_object_signal_callback_add(it->base, "elm,action,expand", "elm",
edje_object_signal_callback_add(it->base.view, "elm,action,expand", "elm",
_signal_expand, it);
edje_object_signal_callback_add(it->base, "elm,action,contract",
edje_object_signal_callback_add(it->base.view, "elm,action,contract",
"elm", _signal_contract, it);
stacking = edje_object_data_get(it->base, "stacking");
stacking = edje_object_data_get(it->base.view, "stacking");
if (stacking)
{
if (!strcmp(stacking, "below")) evas_object_lower(it->base);
else if (!strcmp(stacking, "above")) evas_object_raise(it->base);
if (!strcmp(stacking, "below")) evas_object_lower(it->base.view);
else if (!strcmp(stacking, "above")) evas_object_raise(it->base.view);
}
evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
evas_object_event_callback_add(it->base.view, EVAS_CALLBACK_MOUSE_DOWN,
_mouse_down, it);
evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_UP,
evas_object_event_callback_add(it->base.view, EVAS_CALLBACK_MOUSE_UP,
_mouse_up, it);
evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_MOVE,
evas_object_event_callback_add(it->base.view, EVAS_CALLBACK_MOUSE_MOVE,
_mouse_move, it);
if (it->selected)
edje_object_signal_emit(it->base, "elm,state,selected", "elm");
edje_object_signal_emit(it->base.view, "elm,state,selected", "elm");
if (it->disabled)
edje_object_signal_emit(it->base, "elm,state,disabled", "elm");
edje_object_signal_emit(it->base.view, "elm,state,disabled", "elm");
if (it->expanded)
edje_object_signal_emit(it->base, "elm,state,expanded", "elm");
edje_object_signal_emit(it->base.view, "elm,state,expanded", "elm");
}
if (calc && it->wd->homogeneous && it->wd->item_width)
@ -899,14 +900,14 @@ _item_realize(Elm_Genlist_Item *it, int in, int calc)
const Eina_List *l;
const char *key;
it->labels = _elm_stringlist_get(edje_object_data_get(it->base, "labels"));
it->labels = _elm_stringlist_get(edje_object_data_get(it->base.view, "labels"));
EINA_LIST_FOREACH(it->labels, l, key)
{
char *s = it->itc->func.label_get(it->data, it->wd->obj, l->data);
char *s = it->itc->func.label_get(it->base.data, it->base.widget, l->data);
if (s)
{
edje_object_part_text_set(it->base, l->data, s);
edje_object_part_text_set(it->base.view, l->data, s);
free(s);
}
}
@ -916,17 +917,17 @@ _item_realize(Elm_Genlist_Item *it, int in, int calc)
const Eina_List *l;
const char *key;
it->icons = _elm_stringlist_get(edje_object_data_get(it->base, "icons"));
it->icons = _elm_stringlist_get(edje_object_data_get(it->base.view, "icons"));
EINA_LIST_FOREACH(it->icons, l, key)
{
Evas_Object *ic = it->itc->func.icon_get(it->data, it->wd->obj, l->data);
Evas_Object *ic = it->itc->func.icon_get(it->base.data, it->base.widget, l->data);
if (ic)
{
it->icon_objs = eina_list_append(it->icon_objs, ic);
edje_object_part_swallow(it->base, key, ic);
edje_object_part_swallow(it->base.view, key, ic);
evas_object_show(ic);
elm_widget_sub_object_add(it->wd->obj, ic);
elm_widget_sub_object_add(it->base.widget, ic);
}
}
}
@ -935,15 +936,15 @@ _item_realize(Elm_Genlist_Item *it, int in, int calc)
const Eina_List *l;
const char *key;
it->states = _elm_stringlist_get(edje_object_data_get(it->base, "states"));
it->states = _elm_stringlist_get(edje_object_data_get(it->base.view, "states"));
EINA_LIST_FOREACH(it->states, l, key)
{
Eina_Bool on = it->itc->func.state_get(it->data, it->wd->obj, l->data);
Eina_Bool on = it->itc->func.state_get(it->base.data, it->base.widget, l->data);
if (on)
{
snprintf(buf, sizeof(buf), "elm,state,%s,active", key);
edje_object_signal_emit(it->base, buf, "elm");
edje_object_signal_emit(it->base.view, buf, "elm");
}
}
}
@ -953,7 +954,7 @@ _item_realize(Elm_Genlist_Item *it, int in, int calc)
if (!it->display_only)
elm_coords_finger_size_adjust(1, &mw, 1, &mh);
edje_object_size_min_restricted_calc(it->base, &mw, &mh, mw, mh);
edje_object_size_min_restricted_calc(it->base.view, &mw, &mh, mw, mh);
if (!it->display_only)
elm_coords_finger_size_adjust(1, &mw, 1, &mh);
it->w = it->minw = mw;
@ -966,7 +967,7 @@ _item_realize(Elm_Genlist_Item *it, int in, int calc)
it->wd->item_height = mh;
}
}
if (!calc) evas_object_show(it->base);
if (!calc) evas_object_show(it->base.view);
}
it->realized = EINA_TRUE;
it->want_unrealize = EINA_FALSE;
@ -983,8 +984,8 @@ _item_unrealize(Elm_Genlist_Item *it)
ecore_timer_del(it->long_timer);
it->long_timer = NULL;
}
evas_object_del(it->base);
it->base = NULL;
evas_object_del(it->base.view);
it->base.view = NULL;
evas_object_del(it->spacer);
it->spacer = NULL;
_elm_stringlist_free(it->labels);
@ -1038,7 +1039,7 @@ _item_block_recalc(Item_Block *itb, int in, int qadd, int norender)
_item_realize(it, in, 0);
if (!was_realized)
evas_object_smart_callback_call(it->wd->obj, "realized", it);
evas_object_smart_callback_call(it->base.widget, "realized", it);
}
minh += it->minh;
if (minw < it->minw) minw = it->minw;
@ -1071,7 +1072,7 @@ _item_block_realize(Item_Block *itb, int in, int full)
_item_realize(it, in, 0);
if (!was_realized)
evas_object_smart_callback_call(it->wd->obj, "realized", it);
evas_object_smart_callback_call(it->base.widget, "realized", it);
}
in++;
}
@ -1134,7 +1135,7 @@ _item_block_position(Item_Block *itb, int in)
_item_realize(it, in, 0);
if (!was_realized)
evas_object_smart_callback_call(it->wd->obj,
evas_object_smart_callback_call(it->base.widget,
"realized", it);
}
}
@ -1142,11 +1143,11 @@ _item_block_position(Item_Block *itb, int in)
{
if (vis)
{
evas_object_resize(it->base, it->w, it->h);
evas_object_move(it->base,
evas_object_resize(it->base.view, it->w, it->h);
evas_object_move(it->base.view,
ox + itb->x + it->x - itb->wd->pan_x,
oy + itb->y + it->y - itb->wd->pan_y);
evas_object_show(it->base);
evas_object_show(it->base.view);
}
else
{
@ -1279,7 +1280,7 @@ _update_job(void *data)
{
_item_unrealize(it);
_item_realize(it, num, 0);
evas_object_smart_callback_call(it->wd->obj,
evas_object_smart_callback_call(it->base.widget,
"realized", it);
}
else
@ -1556,11 +1557,11 @@ _item_new(Widget_Data *wd, const Elm_Genlist_Item_Class *itc,
{
Elm_Genlist_Item *it;
it = calloc(1, sizeof(Elm_Genlist_Item));
it = elm_widget_item_new(wd->obj, Elm_Genlist_Item);
if (!it) return NULL;
it->wd = wd;
it->itc = itc;
it->data = data;
it->base.data = data;
it->parent = parent;
it->flags = flags;
it->func.func = func;
@ -1988,10 +1989,11 @@ elm_genlist_clear(Evas_Object *obj)
Elm_Genlist_Item *it = ELM_GENLIST_ITEM_FROM_INLIST(wd->items);
wd->items = eina_inlist_remove(wd->items, wd->items);
elm_widget_item_pre_notify_del(it);
if (it->realized) _item_unrealize(it);
if (it->itc->func.del) it->itc->func.del(it->data, it->wd->obj);
if (it->itc->func.del) it->itc->func.del(it->base.data, it->base.widget);
if (it->long_timer) ecore_timer_del(it->long_timer);
free(it);
elm_widget_item_del(it);
}
while (wd->blocks)
{
@ -2330,7 +2332,7 @@ EAPI Evas_Object *
elm_genlist_item_genlist_get(const Elm_Genlist_Item *it)
{
if (!it) return NULL;
return it->wd->obj;
return it->base.widget;
}
/**
@ -2387,7 +2389,7 @@ elm_genlist_item_subitems_clear(Elm_Genlist_Item *it)
EAPI void
elm_genlist_item_selected_set(Elm_Genlist_Item *it, Eina_Bool selected)
{
Widget_Data *wd = elm_widget_data_get(it->wd->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
if (!wd) return;
if (!it) return;
if (it->delete_me) return;
@ -2445,14 +2447,14 @@ elm_genlist_item_expanded_set(Elm_Genlist_Item *it, Eina_Bool expanded)
if (it->expanded)
{
if (it->realized)
edje_object_signal_emit(it->base, "elm,state,expanded", "elm");
evas_object_smart_callback_call(it->wd->obj, "expanded", it);
edje_object_signal_emit(it->base.view, "elm,state,expanded", "elm");
evas_object_smart_callback_call(it->base.widget, "expanded", it);
}
else
{
if (it->realized)
edje_object_signal_emit(it->base, "elm,state,contracted", "elm");
evas_object_smart_callback_call(it->wd->obj, "contracted", it);
edje_object_signal_emit(it->base.view, "elm,state,contracted", "elm");
evas_object_smart_callback_call(it->base.widget, "contracted", it);
}
}
@ -2495,9 +2497,9 @@ elm_genlist_item_disabled_set(Elm_Genlist_Item *it, Eina_Bool disabled)
if (it->realized)
{
if (it->disabled)
edje_object_signal_emit(it->base, "elm,state,disabled", "elm");
edje_object_signal_emit(it->base.view, "elm,state,disabled", "elm");
else
edje_object_signal_emit(it->base, "elm,state,enabled", "elm");
edje_object_signal_emit(it->base.view, "elm,state,enabled", "elm");
}
}
@ -2794,6 +2796,7 @@ elm_genlist_item_del(Elm_Genlist_Item *it)
if (!it) return;
if ((it->relcount > 0) || (it->walking > 0))
{
elm_widget_item_pre_notify_del(it);
elm_genlist_item_subitems_clear(it);
it->delete_me = EINA_TRUE;
if (it->wd->show_item == it) it->wd->show_item = NULL;
@ -2805,7 +2808,7 @@ elm_genlist_item_del(Elm_Genlist_Item *it)
if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
}
if (it->itc->func.del) it->itc->func.del(it->data, it->wd->obj);
if (it->itc->func.del) it->itc->func.del(it->base.data, it->base.widget);
return;
}
_item_del(it);
@ -2827,8 +2830,7 @@ elm_genlist_item_del(Elm_Genlist_Item *it)
EAPI void
elm_genlist_item_data_set(Elm_Genlist_Item *it, const void *data)
{
if (!it) return;
it->data = data;
elm_widget_item_data_set(it, data);
elm_genlist_item_update(it);
}
@ -2846,8 +2848,7 @@ elm_genlist_item_data_set(Elm_Genlist_Item *it, const void *data)
EAPI const void *
elm_genlist_item_data_get(const Elm_Genlist_Item *it)
{
if (!it) return NULL;
return it->data;
return elm_widget_item_data_get(it);
}
/**
@ -2869,7 +2870,7 @@ EAPI const Evas_Object *
elm_genlist_item_object_get(const Elm_Genlist_Item *it)
{
if (!it) return NULL;
return it->base;
return it->base.view;
}
/**

View File

@ -27,11 +27,9 @@ struct _Widget_Data
struct _Elm_Index_Item
{
Evas_Object *obj;
Elm_Widget_Item base;
const char *letter;
const void *data;
int level;
Evas_Object *base;
Eina_Bool selected : 1;
};
@ -169,11 +167,10 @@ _item_new(Evas_Object *obj, const char *letter, const void *item)
Widget_Data *wd = elm_widget_data_get(obj);
Elm_Index_Item *it;
if (!wd) return NULL;
it = calloc(1, sizeof(Elm_Index_Item));
it = elm_widget_item_new(obj, Elm_Index_Item);
if (!it) return NULL;
it->obj = obj;
it->letter = eina_stringshare_add(letter);
it->data = item;
it->base.data = item;
it->level = wd->level;
return it;
}
@ -186,19 +183,19 @@ _item_find(Evas_Object *obj, const void *item)
Elm_Index_Item *it;
if (!wd) return NULL;
EINA_LIST_FOREACH(wd->items, l, it)
if (it->data == item) return it;
if (it->base.data == item) return it;
return NULL;
}
static void
_item_free(Elm_Index_Item *it)
{
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
if (!wd) return;
wd->items = eina_list_remove(wd->items, it);
if (it->base) evas_object_del(it->base);
elm_widget_item_pre_notify_del(it);
eina_stringshare_del(it->letter);
free(it);
elm_widget_item_del(it);
}
// FIXME: always have index filled
@ -220,7 +217,7 @@ _index_box_auto_fill(Evas_Object *obj, Evas_Object *box, int level)
if (it->level != level) continue;
o = edje_object_add(evas_object_evas_get(obj));
it->base = o;
it->base.view = o;
if (i & 0x1)
_elm_theme_object_set(obj, o, "index", "item_odd/vertical", elm_widget_style_get(obj));
else
@ -265,10 +262,10 @@ _index_box_clear(Evas_Object *obj, Evas_Object *box __UNUSED__, int level)
if (!wd->level_active[level]) return;
EINA_LIST_FOREACH(wd->items, l, it)
{
if (!it->base) continue;
if (!it->base.view) continue;
if (it->level != level) continue;
evas_object_del(it->base);
it->base = 0;
evas_object_del(it->base.view);
it->base.view = NULL;
}
wd->level_active[level] = 0;
}
@ -306,8 +303,8 @@ _sel_eval(Evas_Object *obj, Evas_Coord evx, Evas_Coord evy)
evas_object_geometry_get(wd->bx[i], &bx, &by, &bw, &bh);
EINA_LIST_FOREACH(wd->items, l, it)
{
if (!((it->level == i) && (it->base))) continue;
if ((it->base) && (it->level != wd->level))
if (!((it->level == i) && (it->base.view))) continue;
if ((it->base.view) && (it->level != wd->level))
{
if (it->selected)
{
@ -321,7 +318,7 @@ _sel_eval(Evas_Object *obj, Evas_Coord evx, Evas_Coord evy)
it_last = it;
it->selected = 0;
}
evas_object_geometry_get(it->base, &x, &y, &w, &h);
evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
xx = x + (w / 2);
yy = y + (h / 2);
x = evx - xx;
@ -349,13 +346,13 @@ _sel_eval(Evas_Object *obj, Evas_Coord evx, Evas_Coord evy)
const char *stacking, *selectraise;
it = it_last;
edje_object_signal_emit(it->base, "elm,state,inactive", "elm");
stacking = edje_object_data_get(it->base, "stacking");
selectraise = edje_object_data_get(it->base, "selectraise");
edje_object_signal_emit(it->base.view, "elm,state,inactive", "elm");
stacking = edje_object_data_get(it->base.view, "stacking");
selectraise = edje_object_data_get(it->base.view, "selectraise");
if ((selectraise) && (!strcmp(selectraise, "on")))
{
if ((stacking) && (!strcmp(stacking, "below")))
evas_object_lower(it->base);
evas_object_lower(it->base.view);
}
}
if (it_closest)
@ -363,11 +360,11 @@ _sel_eval(Evas_Object *obj, Evas_Coord evx, Evas_Coord evy)
const char *selectraise;
it = it_closest;
edje_object_signal_emit(it->base, "elm,state,active", "elm");
selectraise = edje_object_data_get(it->base, "selectraise");
edje_object_signal_emit(it->base.view, "elm,state,active", "elm");
selectraise = edje_object_data_get(it->base.view, "selectraise");
if ((selectraise) && (!strcmp(selectraise, "on")))
evas_object_raise(it->base);
evas_object_smart_callback_call((void *)obj, "changed", (void *)it->data);
evas_object_raise(it->base.view);
evas_object_smart_callback_call((void *)obj, "changed", (void *)it->base.data);
if (wd->delay) ecore_timer_del(wd->delay);
wd->delay = ecore_timer_add(0.2, _delay_change, obj);
}
@ -646,7 +643,7 @@ elm_index_item_selected_get(const Evas_Object *obj, int level)
Elm_Index_Item *it;
if (!wd) return NULL;
EINA_LIST_FOREACH(wd->items, l, it)
if ((it->selected) && (it->level == level)) return it->data;
if ((it->selected) && (it->level == level)) return it->base.data;
return NULL;
}
@ -813,8 +810,8 @@ elm_index_item_sorted_insert(Evas_Object *obj, const char *letter, const void *i
else
{
Elm_Index_Item *p_it = eina_list_data_get(lnear);
if (cmp_data_func(p_it->data, it->data) >= 0)
p_it->data = it->data;
if (cmp_data_func(p_it->base.data, it->base.data) >= 0)
p_it->base.data = it->base.data;
_item_free(it);
}
}
@ -914,8 +911,7 @@ elm_index_item_go(Evas_Object *obj, int level __UNUSED__)
EAPI void *
elm_index_item_data_get(const Elm_Index_Item *it)
{
if (!it) return NULL;
return (void *)it->data;
return elm_widget_item_data_get(it);
}
/**
@ -931,8 +927,21 @@ elm_index_item_data_get(const Elm_Index_Item *it)
EAPI void
elm_index_item_data_set(Elm_Index_Item *it, const void *data)
{
if (!it) return;
it->data = data;
elm_widget_item_data_set(it, data);
}
/**
* Set the function called when a index item is freed.
*
* @param it The item to set the callback on
* @param func The function called
*
* @ingroup Index
*/
EAPI void
elm_index_item_del_cb_set(Elm_Index_Item *it, Evas_Smart_Cb func)
{
elm_widget_item_del_cb_set(it, func);
}
/**

View File

@ -27,13 +27,11 @@ struct _Widget_Data
struct _Elm_List_Item
{
Elm_Widget_Item base;
Eina_List *node;
Evas_Object *obj, *base;
const char *label;
Evas_Object *icon, *end;
Evas_Smart_Cb func;
Evas_Smart_Cb del_cb;
const void *data;
Ecore_Timer *long_timer;
Eina_Bool deleted : 1;
Eina_Bool even : 1;
@ -72,41 +70,33 @@ static void _mouse_move(void *data, Evas *evas, Evas_Object *obj, void *event_in
return __VA_ARGS__; \
}
static inline void
_elm_list_item_call_del_cb(Elm_List_Item *it)
{
if (it->del_cb) it->del_cb((void *)it->data, it->obj, it);
}
static inline void
_elm_list_item_free(Elm_List_Item *it)
{
evas_object_event_callback_del_full
(it->base, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, it);
(it->base.view, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, it);
evas_object_event_callback_del_full
(it->base, EVAS_CALLBACK_MOUSE_UP, _mouse_up, it);
(it->base.view, EVAS_CALLBACK_MOUSE_UP, _mouse_up, it);
evas_object_event_callback_del_full
(it->base, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move, it);
(it->base.view, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move, it);
if (it->icon)
evas_object_event_callback_del_full
(it->icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
_changed_size_hints, it->obj);
_changed_size_hints, it->base.widget);
if (it->end)
evas_object_event_callback_del_full
(it->end, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
_changed_size_hints, it->obj);
_changed_size_hints, it->base.widget);
eina_stringshare_del(it->label);
if (it->long_timer) ecore_timer_del(it->long_timer);
if (it->icon) evas_object_del(it->icon);
if (it->end) evas_object_del(it->end);
if (it->base) evas_object_del(it->base);
free(it);
elm_widget_item_del(it);
}
static void
@ -118,7 +108,7 @@ _elm_list_process_deletions(Widget_Data *wd)
EINA_LIST_FREE(wd->to_delete, it)
{
_elm_list_item_call_del_cb(it);
elm_widget_item_pre_notify_del(it);
wd->items = eina_list_remove_list(wd->items, it->node);
_elm_list_item_free(it);
@ -174,7 +164,7 @@ _del_hook(Evas_Object *obj)
fprintf(stderr, "ERROR: list deleted while walking.\n");
_elm_list_walk(wd);
EINA_LIST_FOREACH(wd->items, n, it) _elm_list_item_call_del_cb(it);
EINA_LIST_FOREACH(wd->items, n, it) elm_widget_item_pre_notify_del(it);
_elm_list_unwalk(wd);
if (wd->to_delete) fprintf(stderr, "ERROR: leaking nodes!\n");
@ -303,7 +293,7 @@ _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info)
static void
_item_hilight(Elm_List_Item *it)
{
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
const char *selectraise;
if (!wd) return;
@ -311,10 +301,10 @@ _item_hilight(Elm_List_Item *it)
if (it->hilighted) return;
_elm_list_walk(wd);
edje_object_signal_emit(it->base, "elm,state,selected", "elm");
selectraise = edje_object_data_get(it->base, "selectraise");
edje_object_signal_emit(it->base.view, "elm,state,selected", "elm");
selectraise = edje_object_data_get(it->base.view, "selectraise");
if ((selectraise) && (!strcmp(selectraise, "on")))
evas_object_raise(it->base);
evas_object_raise(it->base.view);
it->hilighted = EINA_TRUE;
_elm_list_unwalk(wd);
@ -323,7 +313,7 @@ _item_hilight(Elm_List_Item *it)
static void
_item_select(Elm_List_Item *it)
{
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
if (!wd) return;
ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
@ -337,8 +327,8 @@ _item_select(Elm_List_Item *it)
call:
_elm_list_walk(wd);
if (it->func) it->func((void *)it->data, it->obj, it);
evas_object_smart_callback_call(it->obj, "selected", it);
if (it->func) it->func((void *)it->base.data, it->base.widget, it);
evas_object_smart_callback_call(it->base.widget, "selected", it);
_elm_list_unwalk(wd);
}
@ -346,7 +336,7 @@ _item_select(Elm_List_Item *it)
static void
_item_unselect(Elm_List_Item *it)
{
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
const char *stacking, *selectraise;
if (!wd) return;
@ -354,20 +344,20 @@ _item_unselect(Elm_List_Item *it)
if (!it->hilighted) return;
_elm_list_walk(wd);
edje_object_signal_emit(it->base, "elm,state,unselected", "elm");
stacking = edje_object_data_get(it->base, "stacking");
selectraise = edje_object_data_get(it->base, "selectraise");
edje_object_signal_emit(it->base.view, "elm,state,unselected", "elm");
stacking = edje_object_data_get(it->base.view, "stacking");
selectraise = edje_object_data_get(it->base.view, "selectraise");
if ((selectraise) && (!strcmp(selectraise, "on")))
{
if ((stacking) && (!strcmp(stacking, "below")))
evas_object_lower(it->base);
evas_object_lower(it->base.view);
}
it->hilighted = EINA_FALSE;
if (it->selected)
{
it->selected = EINA_FALSE;
wd->selected = eina_list_remove(wd->selected, it);
evas_object_smart_callback_call(it->obj, "unselected", it);
evas_object_smart_callback_call(it->base.widget, "unselected", it);
}
_elm_list_unwalk(wd);
@ -377,7 +367,7 @@ static void
_mouse_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
{
Elm_List_Item *it = data;
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
Evas_Event_Mouse_Move *ev = event_info;
if (!wd) return;
@ -402,13 +392,13 @@ static Eina_Bool
_long_press(void *data)
{
Elm_List_Item *it = data;
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
if (!wd) return ECORE_CALLBACK_CANCEL;
it->long_timer = NULL;
ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, 0);
wd->longpressed = EINA_TRUE;
evas_object_smart_callback_call(it->obj, "longpressed", it);
evas_object_smart_callback_call(it->base.widget, "longpressed", it);
return ECORE_CALLBACK_CANCEL;
}
@ -416,7 +406,7 @@ static void
_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
{
Elm_List_Item *it = data;
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
Evas_Event_Mouse_Down *ev = event_info;
if (!wd) return;
@ -431,14 +421,14 @@ _mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void
it->long_timer = ecore_timer_add(1.0, _long_press, it);
/* Always call the callbacks last - the user may delete our context! */
if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
evas_object_smart_callback_call(it->obj, "clicked", it);
evas_object_smart_callback_call(it->base.widget, "clicked", it);
}
static void
_mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
{
Elm_List_Item *it = data;
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
Evas_Event_Mouse_Up *ev = event_info;
if (!wd) return;
@ -506,22 +496,21 @@ _item_new(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Object *e
Elm_List_Item *it;
if (!wd) return NULL;
it = calloc(1, sizeof(Elm_List_Item));
it->obj = obj;
it = elm_widget_item_new(obj, Elm_List_Item);
it->label = eina_stringshare_add(label);
it->icon = icon;
it->end = end;
it->func = func;
it->data = data;
it->base = edje_object_add(evas_object_evas_get(obj));
evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
it->base.data = data;
it->base.view = edje_object_add(evas_object_evas_get(obj));
evas_object_event_callback_add(it->base.view, EVAS_CALLBACK_MOUSE_DOWN,
_mouse_down, it);
evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_UP,
evas_object_event_callback_add(it->base.view, EVAS_CALLBACK_MOUSE_UP,
_mouse_up, it);
evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_MOVE,
evas_object_event_callback_add(it->base.view, EVAS_CALLBACK_MOUSE_MOVE,
_mouse_move, it);
evas_object_size_hint_weight_set(it->base, 1.0, 1.0);
evas_object_size_hint_align_set(it->base, -1.0, -1.0);
evas_object_size_hint_weight_set(it->base.view, 1.0, 1.0);
evas_object_size_hint_align_set(it->base.view, -1.0, -1.0);
if (it->icon)
{
elm_widget_sub_object_add(obj, it->icon);
@ -592,39 +581,39 @@ _fix_items(Evas_Object *obj)
const char *stacking;
if (it->is_separator)
_elm_theme_object_set(obj, it->base, "list", "separator", style);
_elm_theme_object_set(obj, it->base.view, "list", "separator", style);
else if (wd->mode == ELM_LIST_COMPRESS)
{
if (it->even)
_elm_theme_object_set(obj, it->base, "list", "item_compress", style);
_elm_theme_object_set(obj, it->base.view, "list", "item_compress", style);
else
_elm_theme_object_set(obj, it->base, "list", "item_compress_odd", style);
_elm_theme_object_set(obj, it->base.view, "list", "item_compress_odd", style);
}
else
{
if (it->even)
_elm_theme_object_set(obj, it->base, "list", "item", style);
_elm_theme_object_set(obj, it->base.view, "list", "item", style);
else
_elm_theme_object_set(obj, it->base, "list", "item_odd", style);
_elm_theme_object_set(obj, it->base.view, "list", "item_odd", style);
}
stacking = edje_object_data_get(it->base, "stacking");
stacking = edje_object_data_get(it->base.view, "stacking");
if (stacking)
{
if (!strcmp(stacking, "below"))
evas_object_lower(it->base);
evas_object_lower(it->base.view);
else if (!strcmp(stacking, "above"))
evas_object_raise(it->base);
evas_object_raise(it->base.view);
}
edje_object_part_text_set(it->base, "elm.text", it->label);
edje_object_part_text_set(it->base.view, "elm.text", it->label);
if ((!it->icon) && (minh[0] > 0))
{
it->icon = evas_object_rectangle_add(evas_object_evas_get(it->base));
it->icon = evas_object_rectangle_add(evas_object_evas_get(it->base.view));
evas_object_color_set(it->icon, 0, 0, 0, 0);
it->dummy_icon = EINA_TRUE;
}
if ((!it->end) && (minh[1] > 0))
{
it->end = evas_object_rectangle_add(evas_object_evas_get(it->base));
it->end = evas_object_rectangle_add(evas_object_evas_get(it->base.view));
evas_object_color_set(it->end, 0, 0, 0, 0);
it->dummy_end = EINA_TRUE;
}
@ -632,28 +621,28 @@ _fix_items(Evas_Object *obj)
{
evas_object_size_hint_min_set(it->icon, minw[0], minh[0]);
evas_object_size_hint_max_set(it->icon, 99999, 99999);
edje_object_part_swallow(it->base, "elm.swallow.icon", it->icon);
edje_object_part_swallow(it->base.view, "elm.swallow.icon", it->icon);
}
if (it->end)
{
evas_object_size_hint_min_set(it->end, minw[1], minh[1]);
evas_object_size_hint_max_set(it->end, 99999, 99999);
edje_object_part_swallow(it->base, "elm.swallow.end", it->end);
edje_object_part_swallow(it->base.view, "elm.swallow.end", it->end);
}
if (!it->fixed)
{
// this may call up user and it may modify the list item
// but we're safe as we're flagged as walking.
// just don't process further
edje_object_message_signal_process(it->base);
edje_object_message_signal_process(it->base.view);
if (it->deleted)
continue;
mw = mh = -1;
elm_coords_finger_size_adjust(1, &mw, 1, &mh);
edje_object_size_min_restricted_calc(it->base, &mw, &mh, mw, mh);
edje_object_size_min_restricted_calc(it->base.view, &mw, &mh, mw, mh);
elm_coords_finger_size_adjust(1, &mw, 1, &mh);
evas_object_size_hint_min_set(it->base, mw, mh);
evas_object_show(it->base);
evas_object_size_hint_min_set(it->base.view, mw, mh);
evas_object_show(it->base.view);
}
if ((it->selected) || (it->hilighted))
{
@ -662,14 +651,14 @@ _fix_items(Evas_Object *obj)
// this may call up user and it may modify the list item
// but we're safe as we're flagged as walking.
// just don't process further
edje_object_signal_emit(it->base, "elm,state,selected", "elm");
edje_object_signal_emit(it->base.view, "elm,state,selected", "elm");
if (it->deleted)
continue;
selectraise = edje_object_data_get(it->base, "selectraise");
selectraise = edje_object_data_get(it->base.view, "selectraise");
if ((selectraise) && (!strcmp(selectraise, "on")))
evas_object_raise(it->base);
stacking = edje_object_data_get(it->base, "stacking");
evas_object_raise(it->base.view);
stacking = edje_object_data_get(it->base.view, "stacking");
}
it->fixed = EINA_TRUE;
it->is_even = it->even;
@ -805,7 +794,7 @@ elm_list_item_append(Evas_Object *obj, const char *label, Evas_Object *icon, Eva
wd->items = eina_list_append(wd->items, it);
it->node = eina_list_last(wd->items);
elm_box_pack_end(wd->box, it->base);
elm_box_pack_end(wd->box, it->base.view);
return it;
}
@ -832,7 +821,7 @@ elm_list_item_prepend(Evas_Object *obj, const char *label, Evas_Object *icon, Ev
wd->items = eina_list_prepend(wd->items, it);
it->node = wd->items;
elm_box_pack_start(wd->box, it->base);
elm_box_pack_start(wd->box, it->base.view);
return it;
}
@ -866,7 +855,7 @@ elm_list_item_insert_before(Evas_Object *obj, Elm_List_Item *before, const char
it = _item_new(obj, label, icon, end, func, data);
wd->items = eina_list_prepend_relative_list(wd->items, it, before->node);
it->node = before->node->prev;
elm_box_pack_before(wd->box, it->base, before->base);
elm_box_pack_before(wd->box, it->base.view, before->base.view);
return it;
}
@ -900,7 +889,7 @@ elm_list_item_insert_after(Evas_Object *obj, Elm_List_Item *after, const char *l
it = _item_new(obj, label, icon, end, func, data);
wd->items = eina_list_append_relative_list(wd->items, it, after->node);
it->node = after->node->next;
elm_box_pack_after(wd->box, it->base, after->base);
elm_box_pack_after(wd->box, it->base.view, after->base.view);
return it;
}
@ -933,13 +922,13 @@ elm_list_item_sorted_insert(Evas_Object *obj, const char *label, Evas_Object *ic
if (!l)
{
it->node = eina_list_last(wd->items);
elm_box_pack_end(wd->box, it->base);
elm_box_pack_end(wd->box, it->base.view);
}
else
{
Elm_List_Item *before = eina_list_data_get(l);
it->node = before->node->prev;
elm_box_pack_before(wd->box, it->base, before->base);
elm_box_pack_before(wd->box, it->base.view, before->base.view);
}
return it;
}
@ -981,7 +970,7 @@ elm_list_clear(Evas_Object *obj)
EINA_LIST_FREE(wd->items, it)
{
_elm_list_item_call_del_cb(it);
elm_widget_item_pre_notify_del(it);
_elm_list_item_free(it);
}
@ -1208,7 +1197,7 @@ elm_list_item_separator_get(const Elm_List_Item *it)
EAPI void
elm_list_item_selected_set(Elm_List_Item *it, Eina_Bool selected)
{
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
if (!wd) return;
ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
selected = !!selected;
@ -1257,13 +1246,13 @@ elm_list_item_selected_get(Elm_List_Item *it)
EAPI void
elm_list_item_show(Elm_List_Item *it)
{
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
Evas_Coord bx, by, bw, bh;
Evas_Coord x, y, w, h;
ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
evas_object_geometry_get(wd->box, &bx, &by, &bw, &bh);
evas_object_geometry_get(it->base, &x, &y, &w, &h);
evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
x -= bx;
y -= by;
if (wd->scr)
@ -1280,7 +1269,7 @@ elm_list_item_show(Elm_List_Item *it)
EAPI void
elm_list_item_del(Elm_List_Item *it)
{
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
if (!wd) return;
ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
@ -1298,7 +1287,7 @@ elm_list_item_del(Elm_List_Item *it)
_elm_list_walk(wd);
_elm_list_item_call_del_cb(it);
elm_widget_item_pre_notify_del(it);
_elm_list_item_free(it);
_elm_list_unwalk(wd);
@ -1316,7 +1305,7 @@ EAPI void
elm_list_item_del_cb_set(Elm_List_Item *it, Evas_Smart_Cb func)
{
ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
it->del_cb = func;
elm_widget_item_del_cb_set(it, func);
}
/**
@ -1331,7 +1320,7 @@ EAPI void *
elm_list_item_data_get(const Elm_List_Item *it)
{
ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, NULL);
return (void *)it->data;
return elm_widget_item_data_get(it);
}
/**
@ -1375,7 +1364,7 @@ elm_list_item_icon_set(Elm_List_Item *it, Evas_Object *icon)
}
if (!icon)
{
icon = evas_object_rectangle_add(evas_object_evas_get(it->obj));
icon = evas_object_rectangle_add(evas_object_evas_get(it->base.widget));
evas_object_color_set(icon, 0, 0, 0, 0);
it->dummy_icon = EINA_TRUE;
}
@ -1385,8 +1374,8 @@ elm_list_item_icon_set(Elm_List_Item *it, Evas_Object *icon)
it->icon = NULL;
}
it->icon = icon;
if (it->base)
edje_object_part_swallow(it->base, "elm.swallow.icon", icon);
if (it->base.view)
edje_object_part_swallow(it->base.view, "elm.swallow.icon", icon);
}
/**
@ -1430,7 +1419,7 @@ elm_list_item_end_set(Elm_List_Item *it, Evas_Object *end)
}
if (!end)
{
end = evas_object_rectangle_add(evas_object_evas_get(it->obj));
end = evas_object_rectangle_add(evas_object_evas_get(it->base.widget));
evas_object_color_set(end, 0, 0, 0, 0);
it->dummy_end = EINA_TRUE;
}
@ -1440,8 +1429,8 @@ elm_list_item_end_set(Elm_List_Item *it, Evas_Object *end)
it->end = NULL;
}
it->end = end;
if (it->base)
edje_object_part_swallow(it->base, "elm.swallow.end", end);
if (it->base.view)
edje_object_part_swallow(it->base.view, "elm.swallow.end", end);
}
/**
@ -1456,7 +1445,7 @@ EAPI Evas_Object *
elm_list_item_base_get(const Elm_List_Item *it)
{
ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, NULL);
return it->base;
return it->base.view;
}
/**
@ -1487,8 +1476,8 @@ elm_list_item_label_set(Elm_List_Item *it, const char *text)
{
ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
if (!eina_stringshare_replace(&it->label, text)) return;
if (it->base)
edje_object_part_text_set(it->base, "elm.text", it->label);
if (it->base.view)
edje_object_part_text_set(it->base.view, "elm.text", it->label);
}
/**

View File

@ -14,8 +14,7 @@ typedef struct _Widget_Data Widget_Data;
struct _Elm_Menu_Item
{
Evas_Object *menu;
Evas_Object *o;
Elm_Widget_Item base;
Elm_Menu_Item *parent;
Eina_Bool separator;
@ -26,8 +25,6 @@ struct _Elm_Menu_Item
const char *label;
Evas_Smart_Cb func;
Evas_Smart_Cb del_cb;
const void *data;
//if submenu
Eina_Bool open;
@ -59,7 +56,7 @@ _del_item(Elm_Menu_Item *item)
{
Elm_Menu_Item *child;
if (item->del_cb) item->del_cb((void*)item->data, item->o, item);
elm_widget_item_pre_notify_del(item);
EINA_LIST_FREE(item->items, child)
_del_item(child);
@ -67,8 +64,7 @@ _del_item(Elm_Menu_Item *item)
if (item->label) eina_stringshare_del(item->label);
if (item->hv) evas_object_del(item->hv);
if (item->location) evas_object_del(item->location);
if (item->o) evas_object_del(item->o);
free(item);
elm_widget_item_del(item);
}
static void
@ -108,28 +104,31 @@ _theme_hook(Evas_Object *obj)
{
ll = eina_list_append(ll, item->items);
if (item->separator)
_elm_theme_object_set(obj, item->o, "menu", "separator",
_elm_theme_object_set(obj, item->base.view, "menu", "separator",
elm_widget_style_get(obj));
else if (item->bx)
{
_elm_theme_object_set(obj, item->o, "menu", "item_with_submenu",
elm_widget_style_get(obj));
_elm_theme_object_set
(obj, item->base.view, "menu", "item_with_submenu",
elm_widget_style_get(obj));
elm_menu_item_label_set(item, item->label);
elm_menu_item_icon_set(item, item->icon);
}
else
{
_elm_theme_object_set(obj, item->o, "menu", "item",
_elm_theme_object_set(obj, item->base.view, "menu", "item",
elm_widget_style_get(obj));
elm_menu_item_label_set(item, item->label);
elm_menu_item_icon_set(item, item->icon);
}
if (item->disabled)
edje_object_signal_emit(item->o, "elm,state,disabled", "elm");
edje_object_signal_emit
(item->base.view, "elm,state,disabled", "elm");
else
edje_object_signal_emit(item->o, "elm,state,enabled", "elm");
edje_object_message_signal_process(item->o);
edje_object_scale_set(item->o, elm_widget_scale_get(obj) *
edje_object_signal_emit
(item->base.view, "elm,state,enabled", "elm");
edje_object_message_signal_process(item->base.view);
edje_object_scale_set(item->base.view, elm_widget_scale_get(obj) *
_elm_config->scale);
}
}
@ -176,11 +175,11 @@ _submenu_sizing_eval(Elm_Menu_Item *parent)
Eina_List *l;
Elm_Menu_Item *item;
Evas_Coord x_p, y_p, w_p, h_p, x2, y2, w2, h2, bx, by, bw, bh, px, py, pw, ph;
Widget_Data *wd = elm_widget_data_get(parent->menu);
Widget_Data *wd = elm_widget_data_get(parent->base.widget);
if (!wd) return;
EINA_LIST_FOREACH(parent->items,l,item) _item_sizing_eval(item);
evas_object_geometry_get(parent->location, &x_p, &y_p, &w_p, &h_p);
evas_object_geometry_get(parent->o, &x2, &y2, &w2, &h2);
evas_object_geometry_get(parent->base.view, &x2, &y2, &w2, &h2);
evas_object_geometry_get(parent->bx, &bx, &by, &bw, &bh);
evas_object_geometry_get(wd->parent, &px, &py, &pw, &ph);
@ -214,11 +213,11 @@ _item_sizing_eval(Elm_Menu_Item *item)
Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
if (!item->separator)
elm_coords_finger_size_adjust(1, &minw, 1, &minh);
edje_object_size_min_restricted_calc(item->o, &minw, &minh, minw, minh);
edje_object_size_min_restricted_calc(item->base.view, &minw, &minh, minw, minh);
if (!item->separator)
elm_coords_finger_size_adjust(1, &minw, 1, &minh);
evas_object_size_hint_min_set(item->o, minw, minh);
evas_object_size_hint_max_set(item->o, maxw, maxh);
evas_object_size_hint_min_set(item->base.view, minw, minh);
evas_object_size_hint_max_set(item->base.view, maxw, maxh);
}
static void
@ -292,9 +291,9 @@ _menu_item_select(void *data, Evas_Object *obj __UNUSED__, const char *emission
else _submenu_hide(it);
}
else
_menu_hide(it->menu, NULL, NULL);
_menu_hide(it->base.widget, NULL, NULL);
if (it->func) it->func((void *)(it->data), it->menu, it);
if (it->func) it->func((void *)(it->base.data), it->base.widget, it);
}
static void
@ -312,7 +311,7 @@ _menu_item_activate(void *data, Evas_Object *obj __UNUSED__, const char *emissio
}
else
{
Widget_Data *wd = elm_widget_data_get(item->menu);
Widget_Data *wd = elm_widget_data_get(item->base.widget);
EINA_LIST_FOREACH(wd->items, l, item2)
{
if ((item2->open) && (item2 != item)) _submenu_hide(item2);
@ -326,7 +325,7 @@ _submenu_open(void *data, Evas_Object *obj __UNUSED__, const char *emission __UN
Elm_Menu_Item *it = data;
it->open = EINA_TRUE;
evas_object_show(it->hv);
_sizing_eval(it->menu);
_sizing_eval(it->base.widget);
}
static void
@ -340,37 +339,37 @@ _show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
static void
_item_obj_create(Elm_Menu_Item *item)
{
Widget_Data *wd = elm_widget_data_get(item->menu);
Widget_Data *wd = elm_widget_data_get(item->base.widget);
if (!wd) return;
item->o = edje_object_add(evas_object_evas_get(wd->bx));
evas_object_size_hint_weight_set(item->o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_fill_set(item->o, EVAS_HINT_FILL, EVAS_HINT_FILL);
_elm_theme_object_set(item->menu, item->o, "menu", "item", elm_widget_style_get(item->menu));
edje_object_signal_callback_add(item->o, "elm,action,click", "",
item->base.view = edje_object_add(evas_object_evas_get(wd->bx));
evas_object_size_hint_weight_set(item->base.view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_fill_set(item->base.view, EVAS_HINT_FILL, EVAS_HINT_FILL);
_elm_theme_object_set(item->base.widget, item->base.view, "menu", "item", elm_widget_style_get(item->base.widget));
edje_object_signal_callback_add(item->base.view, "elm,action,click", "",
_menu_item_select, item);
edje_object_signal_callback_add(item->o, "elm,action,activate", "",
edje_object_signal_callback_add(item->base.view, "elm,action,activate", "",
_menu_item_activate, item);
evas_object_show(item->o);
evas_object_show(item->base.view);
}
static void
_item_separator_obj_create(Elm_Menu_Item *item)
{
Widget_Data *wd = elm_widget_data_get(item->menu);
Widget_Data *wd = elm_widget_data_get(item->base.widget);
if (!wd) return;
item->o = edje_object_add(evas_object_evas_get(wd->bx));
evas_object_size_hint_weight_set(item->o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_fill_set(item->o, EVAS_HINT_FILL, EVAS_HINT_FILL);
_elm_theme_object_set(item->menu, item->o, "menu", "separator", elm_widget_style_get(item->menu));
edje_object_signal_callback_add(item->o, "elm,action,activate", "",
item->base.view = edje_object_add(evas_object_evas_get(wd->bx));
evas_object_size_hint_weight_set(item->base.view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_fill_set(item->base.view, EVAS_HINT_FILL, EVAS_HINT_FILL);
_elm_theme_object_set(item->base.widget, item->base.view, "menu", "separator", elm_widget_style_get(item->base.widget));
edje_object_signal_callback_add(item->base.view, "elm,action,activate", "",
_menu_item_activate, item);
evas_object_show(item->o);
evas_object_show(item->base.view);
}
static void
_item_submenu_obj_create(Elm_Menu_Item *item)
{
Widget_Data *wd = elm_widget_data_get(item->menu);
Widget_Data *wd = elm_widget_data_get(item->base.widget);
if (!wd) return;
item->location = elm_icon_add(wd->bx);
item->hv = elm_hover_add(wd->bx);
@ -383,16 +382,16 @@ _item_submenu_obj_create(Elm_Menu_Item *item)
evas_object_show(item->bx);
elm_hover_content_set(item->hv, elm_hover_best_content_location_get(item->hv, ELM_HOVER_AXIS_VERTICAL), item->bx);
_elm_theme_object_set(item->menu, item->o, "menu", "item_with_submenu", elm_widget_style_get(item->menu));
_elm_theme_object_set(item->base.widget, item->base.view, "menu", "item_with_submenu", elm_widget_style_get(item->base.widget));
elm_menu_item_label_set(item, item->label);
elm_menu_item_icon_set(item, item->icon);
edje_object_signal_callback_add(item->o, "elm,action,open", "",
edje_object_signal_callback_add(item->base.view, "elm,action,open", "",
_submenu_open, item);
evas_object_event_callback_add(item->o, EVAS_CALLBACK_MOVE, _item_move_resize, item);
evas_object_event_callback_add(item->o, EVAS_CALLBACK_RESIZE, _item_move_resize, item);
evas_object_event_callback_add(item->base.view, EVAS_CALLBACK_MOVE, _item_move_resize, item);
evas_object_event_callback_add(item->base.view, EVAS_CALLBACK_RESIZE, _item_move_resize, item);
evas_object_event_callback_add(item->bx, EVAS_CALLBACK_RESIZE, _menu_resize, item->menu);
evas_object_event_callback_add(item->bx, EVAS_CALLBACK_RESIZE, _menu_resize, item->base.widget);
}
/**
@ -509,7 +508,7 @@ elm_menu_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
EAPI Evas_Object *
elm_menu_object_get(const Elm_Menu_Item *it)
{
return it->o;
return it->base.view;
}
/**
@ -532,11 +531,10 @@ elm_menu_item_add(Evas_Object *obj, Elm_Menu_Item *parent, Evas_Object *icon, co
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return NULL;
subitem = ELM_NEW(Elm_Menu_Item);
subitem = elm_widget_item_new(obj, Elm_Menu_Item);
if (!subitem) return NULL;
subitem->base.data = data;
subitem->func = func;
subitem->data = data;
subitem->menu = obj;
subitem->parent = parent;
_item_obj_create(subitem);
@ -546,12 +544,12 @@ elm_menu_item_add(Evas_Object *obj, Elm_Menu_Item *parent, Evas_Object *icon, co
if (parent)
{
if (!parent->bx) _item_submenu_obj_create(parent);
elm_box_pack_end(parent->bx, subitem->o);
elm_box_pack_end(parent->bx, subitem->base.view);
parent->items = eina_list_append(parent->items, subitem);
}
else
{
elm_box_pack_end(wd->bx, subitem->o);
elm_box_pack_end(wd->bx, subitem->base.view);
wd->items = eina_list_append(wd->items, subitem);
}
@ -573,13 +571,13 @@ elm_menu_item_label_set(Elm_Menu_Item *item, const char *label)
eina_stringshare_replace(&item->label, label);
if (label)
edje_object_signal_emit(item->o, "elm,state,text,visible", "elm");
edje_object_signal_emit(item->base.view, "elm,state,text,visible", "elm");
else
edje_object_signal_emit(item->o, "elm,state,text,hidden", "elm");
edje_object_signal_emit(item->base.view, "elm,state,text,hidden", "elm");
edje_object_message_signal_process(item->o);
edje_object_part_text_set(item->o, "elm.text", label);
_sizing_eval(item->menu);
edje_object_message_signal_process(item->base.view);
edje_object_part_text_set(item->base.view, "elm.text", label);
_sizing_eval(item->base.widget);
}
/**
@ -615,14 +613,14 @@ elm_menu_item_icon_set(Elm_Menu_Item *item, Evas_Object *icon)
item->icon = icon;
if (icon)
{
elm_widget_sub_object_add(item->menu, icon);
elm_widget_sub_object_add(item->base.widget, icon);
evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
_changed_size_hints, item->menu);
edje_object_part_swallow(item->o, "elm.swallow.content", icon);
edje_object_signal_emit(item->o, "elm,state,icon,visible", "elm");
edje_object_message_signal_process(item->o);
_changed_size_hints, item->base.widget);
edje_object_part_swallow(item->base.view, "elm.swallow.content", icon);
edje_object_signal_emit(item->base.view, "elm,state,icon,visible", "elm");
edje_object_message_signal_process(item->base.view);
}
_sizing_eval(item->menu);
_sizing_eval(item->base.widget);
}
/**
@ -640,12 +638,12 @@ elm_menu_item_disabled_set(Elm_Menu_Item *item, Eina_Bool disabled)
item->disabled = disabled;
if (disabled)
{
edje_object_signal_emit(item->o, "elm,state,disabled", "elm");
edje_object_signal_emit(item->base.view, "elm,state,disabled", "elm");
if (item->open) _submenu_hide(item);
}
else
edje_object_signal_emit(item->o, "elm,state,enabled", "elm");
edje_object_message_signal_process(item->o);
edje_object_signal_emit(item->base.view, "elm,state,enabled", "elm");
edje_object_message_signal_process(item->base.view);
}
/**
@ -680,20 +678,20 @@ elm_menu_item_separator_add(Evas_Object *obj, Elm_Menu_Item *parent)
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return NULL;
subitem = ELM_NEW(Elm_Menu_Item);
subitem = elm_widget_item_new(obj, Elm_Menu_Item);
if (!subitem) return NULL;
subitem->menu = obj;
subitem->base.widget = obj;
subitem->separator = 1;
_item_separator_obj_create(subitem);
if (!parent)
{
elm_box_pack_end(wd->bx, subitem->o);
elm_box_pack_end(wd->bx, subitem->base.view);
wd->items = eina_list_append(wd->items, subitem);
}
else
{
if (!parent->bx) _item_submenu_obj_create(parent);
elm_box_pack_end(parent->bx, subitem->o);
elm_box_pack_end(parent->bx, subitem->base.view);
parent->items = eina_list_append(parent->items, subitem);
}
_sizing_eval(obj);
@ -745,24 +743,23 @@ elm_menu_item_del(Elm_Menu_Item *item)
Elm_Menu_Item *_item;
if (!item) return;
if (item->del_cb) item->del_cb((void*)item->data, item->o, item);
elm_widget_item_pre_notify_del(item);
EINA_LIST_FREE(item->items, _item) elm_menu_item_del(_item);
if (item->label) eina_stringshare_del(item->label);
if (item->icon) evas_object_del(item->icon);
if (item->hv) evas_object_del(item->hv);
if (item->location) evas_object_del(item->location);
if (item->o) evas_object_del(item->o);
if (item->parent)
item->parent->items = eina_list_remove(item->parent->items, item);
else
{
Widget_Data *wd = elm_widget_data_get(item->menu);
Widget_Data *wd = elm_widget_data_get(item->base.widget);
wd->items = eina_list_remove(wd->items, item);
}
free(item);
elm_widget_item_del(item);
}
/**
@ -776,8 +773,7 @@ elm_menu_item_del(Elm_Menu_Item *item)
EAPI void
elm_menu_item_del_cb_set(Elm_Menu_Item *it, Evas_Smart_Cb func)
{
if (!it) return;
it->del_cb = func;
elm_widget_item_del_cb_set(it, func);
}
/**
@ -791,8 +787,7 @@ elm_menu_item_del_cb_set(Elm_Menu_Item *it, Evas_Smart_Cb func)
EAPI void *
elm_menu_item_data_get(const Elm_Menu_Item *it)
{
if (!it) return NULL;
return (void *)it->data;
return elm_widget_item_data_get(it);
}
/**
@ -806,8 +801,7 @@ elm_menu_item_data_get(const Elm_Menu_Item *it)
EAPI void
elm_menu_item_data_set(Elm_Menu_Item *item, const void *data)
{
if (!item) return;
item->data = data;
elm_widget_item_data_set(item, data);
}
/**

View File

@ -19,14 +19,11 @@ typedef struct _Widget_Data Widget_Data;
struct _Elm_Slideshow_Item
{
Evas_Object *obj;
Elm_Widget_Item base;
Eina_List *l, *l_built;
const void *data;
const Elm_Slideshow_Item_Class *itc;
Evas_Object *o;
};
struct _Widget_Data
@ -99,7 +96,7 @@ _sizing_eval(Evas_Object *obj)
static Elm_Slideshow_Item* _item_prev_get(Elm_Slideshow_Item* item)
{
Widget_Data *wd = elm_widget_data_get(item->obj);
Widget_Data *wd = elm_widget_data_get(item->base.widget);
Elm_Slideshow_Item* prev = eina_list_data_get(eina_list_prev(item->l));
if(!prev && wd->loop)
prev = eina_list_data_get(eina_list_last(item->l));
@ -107,7 +104,7 @@ static Elm_Slideshow_Item* _item_prev_get(Elm_Slideshow_Item* item)
}
static Elm_Slideshow_Item* _item_next_get(Elm_Slideshow_Item* item)
{
Widget_Data *wd = elm_widget_data_get(item->obj);
Widget_Data *wd = elm_widget_data_get(item->base.widget);
Elm_Slideshow_Item* next = eina_list_data_get(eina_list_next(item->l));
if(!next && wd->loop)
next = eina_list_data_get(wd->items);
@ -131,42 +128,42 @@ static void
_item_realize(Elm_Slideshow_Item *item)
{
Elm_Slideshow_Item *_item;
Evas_Object *obj = item->obj;
Evas_Object *obj = item->base.widget;
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
if ((!item->o) && (item->itc->func.get))
if ((!item->base.view) && (item->itc->func.get))
{
item->o = item->itc->func.get((void*)item->data, obj);
evas_object_smart_member_add(item->o, obj);
item->base.view = item->itc->func.get((void*)item->base.data, obj);
evas_object_smart_member_add(item->base.view, obj);
item->l_built = eina_list_append(NULL, item);
wd->items_built = eina_list_merge(wd->items_built, item->l_built);
evas_object_hide(item->o);
evas_object_hide(item->base.view);
}
else if (item->l_built)
wd->items_built = eina_list_demote_list(wd->items_built, item->l_built);
//pre-create previous and next item
_item = _item_next_get(item);
if ((_item) && (!_item->o) && (_item->itc->func.get))
if ((_item) && (!_item->base.view) && (_item->itc->func.get))
{
_item->o = _item->itc->func.get((void*)_item->data, obj);
evas_object_smart_member_add(_item->o, obj);
_item->base.view = _item->itc->func.get((void*)_item->base.data, obj);
evas_object_smart_member_add(_item->base.view, obj);
_item->l_built = eina_list_append(NULL, _item);
wd->items_built = eina_list_merge(wd->items_built, _item->l_built);
evas_object_hide(_item->o);
evas_object_hide(_item->base.view);
}
else if ((_item) && (_item->l_built))
wd->items_built = eina_list_demote_list(wd->items_built, _item->l_built);
_item = _item_prev_get(item);
if ((_item) && (!_item->o) && (_item->itc->func.get))
if ((_item) && (!_item->base.view) && (_item->itc->func.get))
{
_item->o = _item->itc->func.get((void*)_item->data, obj);
evas_object_smart_member_add(_item->o, obj);
_item->base.view = _item->itc->func.get((void*)_item->base.data, obj);
evas_object_smart_member_add(_item->base.view, obj);
_item->l_built = eina_list_append(NULL, _item);
wd->items_built = eina_list_merge(wd->items_built, _item->l_built);
evas_object_hide(_item->o);
evas_object_hide(_item->base.view);
}
else if ((_item) && (_item->l_built))
wd->items_built = eina_list_demote_list(wd->items_built, _item->l_built);
@ -177,9 +174,9 @@ _item_realize(Elm_Slideshow_Item *item)
_item = eina_list_data_get(wd->items_built);
wd->items_built = eina_list_remove_list(wd->items_built, wd->items_built);
if(item->itc->func.del)
item->itc->func.del((void*)item->data, _item->o);
evas_object_del(_item->o);
_item->o = NULL;
item->itc->func.del((void*)item->base.data, _item->base.view);
evas_object_del(_item->base.view);
_item->base.view = NULL;
}
}
@ -193,21 +190,21 @@ _end(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, c
item = wd->previous;
if(item)
{
edje_object_part_unswallow(NULL, item->o);
evas_object_hide(item->o);
edje_object_part_unswallow(NULL, item->base.view);
evas_object_hide(item->base.view);
wd->previous = NULL;
}
item = wd->current;
if (!item || !item->o) return;
if (!item || !item->base.view) return;
_item_realize(item);
edje_object_part_unswallow(NULL, item->o);
evas_object_show(item->o);
edje_object_part_unswallow(NULL, item->base.view);
evas_object_show(item->base.view);
edje_object_signal_emit(wd->slideshow, "anim,end", "slideshow");
edje_object_part_swallow(wd->slideshow, "elm.swallow.1", item->o);
edje_object_part_swallow(wd->slideshow, "elm.swallow.1", item->base.view);
}
@ -293,10 +290,9 @@ elm_slideshow_item_add(Evas_Object *obj, const Elm_Slideshow_Item_Class *itc, co
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return NULL;
item = calloc(1, sizeof(Elm_Slideshow_Item));
item->data = data;
item = elm_widget_item_new(obj, Elm_Slideshow_Item);
item->base.data = data;
item->itc = itc;
item->obj = obj;
item->l = eina_list_append(item->l, item);
wd->items = eina_list_merge(wd->items, item->l);
@ -322,22 +318,22 @@ elm_slideshow_show(Elm_Slideshow_Item *item)
Widget_Data *wd;
if (!item)
return;
ELM_CHECK_WIDTYPE(item->obj, widtype);
wd = elm_widget_data_get(item->obj);
ELM_CHECK_WIDTYPE(item->base.widget, widtype);
wd = elm_widget_data_get(item->base.widget);
if (!wd)
return;
if (item == wd->current)
return;
next = item;
_end(item->obj, item->obj, NULL, NULL);
_end(item->base.widget, item->base.widget, NULL, NULL);
if (wd->timer) ecore_timer_del(wd->timer);
if (wd->timeout > 0)
wd->timer = ecore_timer_add(wd->timeout, _timer_cb, item->obj);
wd->timer = ecore_timer_add(wd->timeout, _timer_cb, item->base.widget);
_item_realize(next);
edje_object_part_swallow(wd->slideshow, "elm.swallow.2", next->o);
evas_object_show(next->o);
edje_object_part_swallow(wd->slideshow, "elm.swallow.2", next->base.view);
evas_object_show(next->base.view);
snprintf(buf, sizeof(buf), "%s,next", wd->transition);
edje_object_signal_emit(wd->slideshow, buf, "slideshow");
wd->previous = wd->current;
@ -376,8 +372,8 @@ elm_slideshow_next(Evas_Object *obj)
_item_realize(next);
edje_object_part_swallow(wd->slideshow, "elm.swallow.2", next->o);
evas_object_show(next->o);
edje_object_part_swallow(wd->slideshow, "elm.swallow.2", next->base.view);
evas_object_show(next->base.view);
snprintf(buf, sizeof(buf), "%s,next", wd->transition);
edje_object_signal_emit(wd->slideshow, buf, "slideshow");
@ -416,8 +412,8 @@ elm_slideshow_previous(Evas_Object *obj)
_item_realize(prev);
edje_object_part_swallow(wd->slideshow, "elm.swallow.2", prev->o);
evas_object_show(prev->o);
edje_object_part_swallow(wd->slideshow, "elm.swallow.2", prev->base.view);
evas_object_show(prev->base.view);
snprintf(buf, 1024, "%s,previous", wd->transition);
edje_object_signal_emit(wd->slideshow, buf, "slideshow");
@ -623,15 +619,16 @@ elm_slideshow_clear(Evas_Object *obj)
wd->current = NULL;
EINA_LIST_FREE(wd->items_built, item)
{
if (item->itc->func.del)
item->itc->func.del((void*)item->data, item->o);
evas_object_del(item->o);
if (item->itc->func.del)
item->itc->func.del((void*)item->base.data, item->base.view);
evas_object_del(item->base.view);
item->base.view = NULL;
}
EINA_LIST_FREE(wd->items, item)
{
free(item);
}
{
elm_widget_item_del(item);
}
}
@ -646,7 +643,7 @@ EAPI void
elm_slideshow_item_del(Elm_Slideshow_Item *item)
{
if (!item) return;
Widget_Data *wd = elm_widget_data_get(item->obj);
Widget_Data *wd = elm_widget_data_get(item->base.widget);
if (!wd) return;
if (wd->previous == item) wd->previous = NULL;
if (wd->current == item)
@ -663,10 +660,10 @@ elm_slideshow_item_del(Elm_Slideshow_Item *item)
wd->items = eina_list_remove_list(wd->items, item->l);
wd->items_built = eina_list_remove_list(wd->items_built, item->l_built);
if (item->o && item->itc->func.del)
item->itc->func.del((void*)item->data, wd->previous->o);
if (item->o)
evas_object_del(item->o);
if (item->base.view && item->itc->func.del)
item->itc->func.del((void*)item->base.data, wd->previous->base.view);
if (item->base.view)
evas_object_del(item->base.view);
free(item);
}
@ -716,7 +713,7 @@ EAPI Evas_Object *
elm_slideshow_item_object_get(Elm_Slideshow_Item * item)
{
if (!item) return NULL;
return item->o;
return item->base.view;
}
/**
@ -730,6 +727,5 @@ elm_slideshow_item_object_get(Elm_Slideshow_Item * item)
EAPI void *
elm_slideshow_item_data_get(Elm_Slideshow_Item * item)
{
if (!item) return NULL;
return (void *)item->data;
return elm_widget_item_data_get(item);
}

View File

@ -23,13 +23,10 @@ struct _Widget_Data
struct _Elm_Toolbar_Item
{
Evas_Object *obj;
Evas_Object *base;
Elm_Widget_Item base;
const char *label;
Evas_Object *icon;
Evas_Smart_Cb func;
Evas_Smart_Cb del_cb;
const void *data;
Eina_Bool selected : 1;
Eina_Bool disabled : 1;
Eina_Bool separator : 1;
@ -53,12 +50,12 @@ static void _layout(Evas_Object *o, Evas_Object_Box_Data *priv, void *data);
static void
_item_show(Elm_Toolbar_Item *it)
{
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
Evas_Coord x, y, w, h, bx, by;
if (!wd) return;
evas_object_geometry_get(wd->bx, &bx, &by, NULL, NULL);
evas_object_geometry_get(it->base, &x, &y, &w, &h);
evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
elm_smart_scroller_child_region_show(wd->scr, x - bx, y - by, w, h);
}
@ -66,7 +63,7 @@ static void
_item_select(Elm_Toolbar_Item *it)
{
Elm_Toolbar_Item *it2;
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
Evas_Object *obj2;
const Eina_List *l;
@ -77,25 +74,26 @@ _item_select(Elm_Toolbar_Item *it)
if (it2->selected)
{
it2->selected = EINA_FALSE;
edje_object_signal_emit(it2->base, "elm,state,unselected", "elm");
edje_object_signal_emit
(it2->base.view, "elm,state,unselected", "elm");
break;
}
}
it->selected = EINA_TRUE;
edje_object_signal_emit(it->base, "elm,state,selected", "elm");
edje_object_signal_emit(it->base.view, "elm,state,selected", "elm");
_item_show(it);
obj2 = it->obj;
obj2 = it->base.widget;
if(it->menu)
{
evas_object_show(it->o_menu);
evas_object_event_callback_add(it->base, EVAS_CALLBACK_RESIZE,
evas_object_event_callback_add(it->base.view, EVAS_CALLBACK_RESIZE,
_menu_move_resize, it);
evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOVE,
evas_object_event_callback_add(it->base.view, EVAS_CALLBACK_MOVE,
_menu_move_resize, it);
_menu_move_resize(it, NULL, NULL, NULL);
}
if (it->func) it->func((void *)(it->data), it->obj, it);
if (it->func) it->func((void *)(it->base.data), it->base.widget, it);
evas_object_smart_callback_call(obj2, "clicked", it);
}
@ -103,7 +101,7 @@ static void
_menu_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Elm_Toolbar_Item *it = data;
elm_toolbar_item_unselect_all(it->obj);
elm_toolbar_item_unselect_all(it->base.widget);
}
static void
@ -119,25 +117,25 @@ _menu_move_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, v
{
Elm_Toolbar_Item *it = data;
Evas_Coord x,y,w,h;
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
if ((!wd) || (!wd->menu_parent)) return;
evas_object_geometry_get(it->base, &x, &y, &w, &h);
evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
elm_menu_move(it->o_menu, x, y+h);
}
static void
_item_disable(Elm_Toolbar_Item *it, Eina_Bool disabled)
{
Widget_Data *wd = elm_widget_data_get(it->obj);
Widget_Data *wd = elm_widget_data_get(it->base.widget);
if (!wd) return;
if (it->disabled == disabled) return;
it->disabled = disabled;
if (it->disabled)
edje_object_signal_emit(it->base, "elm,state,disabled", "elm");
edje_object_signal_emit(it->base.view, "elm,state,disabled", "elm");
else
edje_object_signal_emit(it->base, "elm,state,enabled", "elm");
edje_object_signal_emit(it->base.view, "elm,state,enabled", "elm");
}
static void
@ -149,12 +147,11 @@ _del_pre_hook(Evas_Object *obj)
if (!wd) return;
EINA_LIST_FREE(wd->items, it)
{
if (it->del_cb) it->del_cb((void *)it->data, it->obj, it);
elm_widget_item_pre_notify_del(it);
eina_stringshare_del(it->label);
if (it->icon) evas_object_del(it->icon);
if ((!wd->menu_parent) && (it->o_menu)) evas_object_del(it->o_menu);
evas_object_del(it->base);
free(it);
elm_widget_item_del(it);
}
}
@ -182,16 +179,17 @@ _theme_hook(Evas_Object *obj)
// edje_object_scale_set(wd->scr, scale);
EINA_LIST_FOREACH(wd->items, l, it)
{
Evas_Object *view = it->base.view;
Evas_Coord mw, mh;
edje_object_scale_set(it->base, scale);
edje_object_scale_set(view, scale);
if (!it->separator)
{
if (it->selected)
edje_object_signal_emit(it->base, "elm,state,selected", "elm");
edje_object_signal_emit(view, "elm,state,selected", "elm");
if (it->disabled)
edje_object_signal_emit(it->base, "elm,state,disabled", "elm");
_elm_theme_object_set(obj, it->base, "toolbar", "item", style);
edje_object_signal_emit(view, "elm,state,disabled", "elm");
_elm_theme_object_set(obj, view, "toolbar", "item", style);
if (it->icon)
{
int ms = 0;
@ -199,21 +197,21 @@ _theme_hook(Evas_Object *obj)
ms = ((double)wd->icon_size * _elm_config->scale);
evas_object_size_hint_min_set(it->icon, ms, ms);
evas_object_size_hint_max_set(it->icon, ms, ms);
edje_object_part_swallow(it->base, "elm.swallow.icon",
edje_object_part_swallow(view, "elm.swallow.icon",
it->icon);
}
edje_object_part_text_set(it->base, "elm.text", it->label);
edje_object_part_text_set(view, "elm.text", it->label);
}
else
_elm_theme_object_set(obj, it->base, "toolbar", "separator", style);
_elm_theme_object_set(obj, view, "toolbar", "separator", style);
mw = mh = -1;
if (!it->separator)
elm_coords_finger_size_adjust(1, &mw, 1, &mh);
edje_object_size_min_restricted_calc(it->base, &mw, &mh, mw, mh);
edje_object_size_min_restricted_calc(view, &mw, &mh, mw, mh);
if (!it->separator)
elm_coords_finger_size_adjust(1, &mw, 1, &mh);
evas_object_size_hint_min_set(it->base, mw, mh);
evas_object_size_hint_min_set(view, mw, mh);
}
_sizing_eval(obj);
}
@ -403,20 +401,20 @@ elm_toolbar_item_add(Evas_Object *obj, Evas_Object *icon, const char *label, Eva
Elm_Toolbar_Item *it;
if (!wd) return NULL;
it = ELM_NEW(Elm_Toolbar_Item);
it = elm_widget_item_new(obj, Elm_Toolbar_Item);
if (!it) return NULL;
wd->items = eina_list_append(wd->items, it);
it->obj = obj;
it->label = eina_stringshare_add(label);
it->icon = icon;
it->func = func;
it->data = data;
it->separator = EINA_FALSE;
it->base = edje_object_add(evas_object_evas_get(obj));
_elm_theme_object_set(obj, it->base, "toolbar", "item", elm_widget_style_get(obj));
edje_object_signal_callback_add(it->base, "elm,action,click", "elm",
it->base.data = data;
it->base.view = edje_object_add(evas_object_evas_get(obj));
_elm_theme_object_set
(obj, it->base.view, "toolbar", "item", elm_widget_style_get(obj));
edje_object_signal_callback_add(it->base.view, "elm,action,click", "elm",
_select, it);
elm_widget_sub_object_add(obj, it->base);
elm_widget_sub_object_add(obj, it->base.view);
if (it->icon)
{
int ms = 0;
@ -424,20 +422,20 @@ elm_toolbar_item_add(Evas_Object *obj, Evas_Object *icon, const char *label, Eva
ms = ((double)wd->icon_size * _elm_config->scale);
evas_object_size_hint_min_set(it->icon, ms, ms);
evas_object_size_hint_max_set(it->icon, ms, ms);
edje_object_part_swallow(it->base, "elm.swallow.icon", it->icon);
edje_object_part_swallow(it->base.view, "elm.swallow.icon", it->icon);
evas_object_show(it->icon);
elm_widget_sub_object_add(obj, it->icon);
}
edje_object_part_text_set(it->base, "elm.text", it->label);
edje_object_part_text_set(it->base.view, "elm.text", it->label);
mw = mh = -1;
elm_coords_finger_size_adjust(1, &mw, 1, &mh);
edje_object_size_min_restricted_calc(it->base, &mw, &mh, mw, mh);
edje_object_size_min_restricted_calc(it->base.view, &mw, &mh, mw, mh);
elm_coords_finger_size_adjust(1, &mw, 1, &mh);
evas_object_size_hint_weight_set(it->base, -1.0, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(it->base, 0.5, EVAS_HINT_FILL);
evas_object_size_hint_min_set(it->base, mw, mh);
evas_object_box_append(wd->bx, it->base);
evas_object_show(it->base);
evas_object_size_hint_weight_set(it->base.view, -1.0, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(it->base.view, 0.5, EVAS_HINT_FILL);
evas_object_size_hint_min_set(it->base.view, mw, mh);
evas_object_box_append(wd->bx, it->base.view);
evas_object_show(it->base.view);
_sizing_eval(obj);
return it;
}
@ -502,14 +500,14 @@ elm_toolbar_item_label_set(Elm_Toolbar_Item *item, const char *label)
if (!item) return;
eina_stringshare_replace(&item->label, label);
edje_object_part_text_set(item->base, "elm.text", item->label);
edje_object_part_text_set(item->base.view, "elm.text", item->label);
elm_coords_finger_size_adjust(1, &mw, 1, &mh);
edje_object_size_min_restricted_calc(item->base, &mw, &mh, mw, mh);
edje_object_size_min_restricted_calc(item->base.view, &mw, &mh, mw, mh);
elm_coords_finger_size_adjust(1, &mw, 1, &mh);
evas_object_size_hint_weight_set(item->base, -1.0, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(item->base, 0.5, EVAS_HINT_FILL);
evas_object_size_hint_min_set(item->base, mw, mh);
evas_object_size_hint_weight_set(item->base.view, -1.0, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(item->base.view, 0.5, EVAS_HINT_FILL);
evas_object_size_hint_min_set(item->base.view, mw, mh);
}
@ -523,16 +521,15 @@ elm_toolbar_item_label_set(Elm_Toolbar_Item *item, const char *label)
EAPI void
elm_toolbar_item_del(Elm_Toolbar_Item *it)
{
Widget_Data *wd = elm_widget_data_get(it->obj);
Evas_Object *obj2 = it->obj;
Widget_Data *wd = elm_widget_data_get(it->base.widget);
Evas_Object *obj2 = it->base.widget;
if ((!wd) || (!it)) return;
if (it->del_cb) it->del_cb((void *)it->data, it->obj, it);
elm_widget_item_pre_notify_del(it);
wd->items = eina_list_remove(wd->items, it);
eina_stringshare_del(it->label);
if (it->icon) evas_object_del(it->icon);
evas_object_del(it->base);
free(it);
elm_widget_item_del(it);
_theme_hook(obj2);
}
@ -547,7 +544,7 @@ elm_toolbar_item_del(Elm_Toolbar_Item *it)
EAPI void
elm_toolbar_item_del_cb_set(Elm_Toolbar_Item *it, Evas_Smart_Cb func)
{
it->del_cb = func;
elm_widget_item_del_cb_set(it, func);
}
/**
@ -608,7 +605,7 @@ elm_toolbar_item_separator_set(Elm_Toolbar_Item *item, Eina_Bool separator)
if (!item) return;
if (item->separator == separator) return;
item->separator = separator;
_theme_hook(item->obj);
_theme_hook(item->base.view);
}
/**
@ -765,7 +762,8 @@ elm_toolbar_item_unselect_all(Evas_Object *obj)
if (it->selected)
{
it->selected = EINA_FALSE;
edje_object_signal_emit(it->base, "elm,state,unselected", "elm");
edje_object_signal_emit
(it->base.view, "elm,state,unselected", "elm");
break;
}
}
@ -783,7 +781,7 @@ elm_toolbar_item_unselect(Elm_Toolbar_Item *item)
{
if ((!item) || (!item->selected)) return;
item->selected = EINA_FALSE;
edje_object_signal_emit(item->base, "elm,state,unselected", "elm");
edje_object_signal_emit(item->base.view, "elm,state,unselected", "elm");
}
/**
@ -835,14 +833,14 @@ elm_toolbar_align_get(const Evas_Object *obj)
EAPI void
elm_toolbar_item_menu_set(Elm_Toolbar_Item *item, Eina_Bool menu)
{
Widget_Data *wd = elm_widget_data_get(item->obj);
Widget_Data *wd = elm_widget_data_get(item->base.widget);
if ((!wd) || (!item)) return;
if (item->menu == menu) return;
item->menu = menu;
if (menu)
{
item->o_menu = elm_menu_add(item->base);
item->o_menu = elm_menu_add(item->base.view);
if (wd->menu_parent)
elm_menu_parent_set(item->o_menu, wd->menu_parent);
evas_object_event_callback_add(item->o_menu, EVAS_CALLBACK_HIDE,
@ -869,7 +867,7 @@ EAPI Evas_Object *
elm_toolbar_item_menu_get(Elm_Toolbar_Item *item)
{
if (!item) return NULL;
Widget_Data *wd = elm_widget_data_get(item->obj);
Widget_Data *wd = elm_widget_data_get(item->base.widget);
if (!wd) return NULL;
elm_toolbar_item_menu_set(item, 1);
return item->o_menu;