#include <assert.h>
-
+#include <fnmatch.h>
#include <Elementary.h>
#include <Elementary_Cursor.h>
#include "elm_priv.h"
#include "els_scroller.h"
-#include "elm_gen.h"
+#include "elm_gen_common.h"
+
+// internally allocated
+#define CLASS_ALLOCATED 0x3a70f11f
-#define SWIPE_MOVES 12
#define MAX_ITEMS_PER_BLOCK 32
#define REORDER_EFFECT_TIME 0.5
+#define ELM_GEN_SETUP(wd) \
+ (wd)->calc_cb = (Ecore_Cb)_calc_job; \
+ (wd)->clear_cb = (Ecore_Cb)_clear_cb; \
+ (wd)->sizing_cb = (Ecore_Cb)_sizing_eval
+
+#define ELM_GEN_ITEM_SETUP(it) \
+ (it)->del_cb = (Ecore_Cb)_item_del; \
+ (it)->highlight_cb = (Ecore_Cb)_item_highlight; \
+ (it)->unsel_cb = (Ecore_Cb)_item_unselect; \
+ (it)->unhighlight_cb = (Ecore_Cb)_item_unhighlight; \
+ (it)->unrealize_cb = (Ecore_Cb)_item_unrealize_cb
+
+#define ELM_GENLIST_CHECK_ITC_VER(itc) \
+ do \
+ { \
+ if (!itc) \
+ { \
+ ERR("Genlist_Item_Class(itc) is NULL"); \
+ return; \
+ } \
+ if ((itc->version != ELM_GENLIST_ITEM_CLASS_VERSION) && \
+ (itc->version != CLASS_ALLOCATED)) \
+ { \
+ ERR("Genlist_Item_Class version mismatched! current = (%d), required = (%d) or (%d)", itc->version, ELM_GENLIST_ITEM_CLASS_VERSION, CLASS_ALLOCATED); \
+ return; \
+ } \
+ } \
+ while(0)
+
typedef struct _Item_Block Item_Block;
-typedef struct _Pan Pan;
typedef struct _Item_Cache Item_Cache;
struct Elm_Gen_Item_Type
Eina_List *items;
Evas_Coord w, h, minw, minh;
Elm_Gen_Item *group_item;
- Elm_Genlist_Item_Flags flags;
- Eina_List *mode_labels, *mode_icons, *mode_states, *mode_icon_objs;
+ Elm_Genlist_Item_Type type;
+ Eina_List *mode_texts, *mode_contents, *mode_states, *mode_content_objs;
+ Eina_List *edit_texts, *edit_contents, *edit_states, *edit_content_objs;
Ecore_Timer *swipe_timer;
Evas_Coord scrl_x, scrl_y, old_scrl_y;
Eina_Bool queued : 1;
Eina_Bool showme : 1;
Eina_Bool updateme : 1;
- Eina_Bool nocache : 1;
+ Eina_Bool nocache : 1; /* do not use cache for this item */
+ Eina_Bool nocache_once : 1; /* do not use cache for this item only once */
Eina_Bool stacking_even : 1;
Eina_Bool nostacking : 1;
Eina_Bool move_effect_enabled : 1;
-};
-
-struct _Widget_Data
-{
- Eina_Inlist_Sorted_State *state;
- Evas_Object *obj; /* the genlist object */
- Eina_List *selected;
- Eina_List *group_items; /* list of groups index items */
- Eina_Inlist *items; /* inlist of all items */
- Elm_Gen_Item *reorder_it; /* item currently being repositioned */
- Ecore_Job *calc_job;
- int walking;
- Eina_Bool reorder_mode : 1;
- Eina_Bool on_hold : 1;
- Eina_Bool multi : 1;
- Eina_Bool no_select : 1;
- Eina_Bool wasselected : 1;
- Eina_Bool always_select : 1;
- ////////////////////////////////////
- Evas_Object *scr; /* a smart scroller object which is used internally in genlist */
- Evas_Object *pan_smart; /* "elm_genlist_pan" evas smart object. this is an extern pan of smart scroller(scr). */
- Eina_Inlist *blocks; /* inlist of all blocks. a block consists of a certain number of items. maximum number of items in a block is 'max_items_per_block'. */
- Pan *pan; /* pan_smart object's smart data */
- Evas_Coord pan_x, pan_y, reorder_old_pan_y, w, h, minw, minh, realminw, prev_viewport_w;
- Ecore_Job *update_job;
- Ecore_Idle_Enterer *queue_idle_enterer;
- Ecore_Idler *must_recalc_idler;
- Eina_List *queue;
- Elm_Gen_Item *show_item, *anchor_item, *mode_item, *reorder_rel, *expanded_item;
- Elm_Gen_Item *last_selected_item; /* the last selected it. */
- Eina_Inlist *item_cache; /* an inlist of edje object it cache. */
- Evas_Coord anchor_y;
- Evas_Coord reorder_start_y; /* reorder it's initial y coordinate in the pan. */
- Elm_List_Mode mode;
- Ecore_Timer *multi_timer, *scr_hold_timer;
- Ecore_Animator *reorder_move_animator;
- const char *mode_type;
- const char *mode_item_style;
- unsigned int start_time;
- Evas_Coord prev_x, prev_y, prev_mx, prev_my;
- Evas_Coord cur_x, cur_y, cur_mx, cur_my;
- Eina_Bool mouse_down : 1;
- Eina_Bool multi_down : 1;
- Eina_Bool multi_timeout : 1;
- Eina_Bool multitouched : 1;
- Eina_Bool longpressed : 1;
- Eina_Bool bring_in : 1;
- Eina_Bool compress : 1;
- Eina_Bool height_for_width : 1;
- Eina_Bool homogeneous : 1;
- Eina_Bool clear_me : 1;
- Eina_Bool swipe : 1;
- Eina_Bool reorder_pan_move : 1;
- Eina_Bool auto_scroll_enabled : 1;
- Eina_Bool pan_resized : 1;
- struct
- {
- Evas_Coord x, y;
- } history[SWIPE_MOVES];
- int multi_device;
- int item_cache_count;
- int item_cache_max; /* maximum number of cached items */
- int movements;
- int item_width;
- int item_height;
- int group_item_width;
- int group_item_height;
- int max_items_per_block; /* maximum number of items per block */
- double longpress_timeout; /* longpress timeout. this value comes from _elm_config by default. this can be changed by elm_genlist_longpress_timeout_set() */
+ Eina_Bool edit_mode_item_realized : 1;
+ Eina_Bool tree_effect_finished : 1; /* tree effect */
};
struct _Item_Block
Widget_Data *wd;
Eina_List *items;
Evas_Coord x, y, w, h, minw, minh;
+ int position;
+ int item_position_stamp;
+
+ Eina_Bool position_update : 1;
Eina_Bool want_unrealize : 1;
Eina_Bool realized : 1;
Eina_Bool changed : 1;
Eina_Bool expanded : 1; // it->item->expanded
};
-#define ELM_GENLIST_ITEM_FROM_INLIST(it) \
- ((it) ? EINA_INLIST_CONTAINER_GET(it, Elm_Gen_Item) : NULL)
-
-struct _Pan
-{
- Evas_Object_Smart_Clipped_Data __clipped_data;
- Widget_Data *wd;
- Ecore_Job *resize_job;
-};
-
static const char *widtype = NULL;
static void _item_cache_zero(Widget_Data *wd);
static void _del_hook(Evas_Object *obj);
Evas_Object *obj);
static void _sizing_eval(Evas_Object *obj);
static void _item_realize(Elm_Gen_Item *it,
- int in,
- Eina_Bool calc);
+ int in,
+ Eina_Bool calc);
static void _item_unrealize_cb(Elm_Gen_Item *it);
static void _item_block_unrealize(Item_Block *itb);
static void _calc_job(void *data);
Evas_Callback_Type type,
void *event_info);
static void _signal_emit_hook(Evas_Object *obj,
- const char *emission,
- const char *source);
+ const char *emission,
+ const char *source);
static Eina_Bool _deselect_all_items(Widget_Data *wd);
static void _pan_calculate(Evas_Object *obj);
static void _pan_max_get(Evas_Object *obj,
Evas_Coord *x,
Evas_Coord *y);
static void _item_position(Elm_Gen_Item *it,
- Evas_Object *obj,
- Evas_Coord it_x,
- Evas_Coord it_y);
+ Evas_Object *obj,
+ Evas_Coord it_x,
+ Evas_Coord it_y);
static void _mode_item_realize(Elm_Gen_Item *it);
static void _mode_item_unrealize(Elm_Gen_Item *it);
static void _item_mode_set(Elm_Gen_Item *it);
static void _item_mode_unset(Widget_Data *wd);
+static void _edit_mode_item_position(Elm_Gen_Item *it, int itx, int ity);
+static void _edit_mode_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on);
+static void _edit_mode_item_unrealize(Elm_Gen_Item *it);
static void _group_items_recalc(void *data);
static void _item_move_after(Elm_Gen_Item *it,
Elm_Gen_Item *after);
static void _item_move_before(Elm_Gen_Item *it,
Elm_Gen_Item *before);
static void _item_auto_scroll(Widget_Data *wd);
+static void _elm_genlist_clear(Evas_Object *obj,
+ Eina_Bool standby);
+static void _pan_child_size_get(Evas_Object *obj,
+ Evas_Coord *w,
+ Evas_Coord *h);
+static Evas_Object* _create_tray_alpha_bg(const Evas_Object *obj);
+static void _item_contract_emit(Elm_Gen_Item *it);
+static int _item_tree_effect_before(Elm_Gen_Item *it);
+static void _item_tree_effect(Widget_Data *wd, int y);
+static void _item_tree_effect_finish(Widget_Data *wd);
+static Eina_Bool _item_moving_effect_timer_cb(void *data);
static Evas_Smart_Class _pan_sc = EVAS_SMART_CLASS_INIT_VERSION;
static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start";
static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop";
-static const char SIG_SCROLL_EDGE_TOP[] = "scroll,edge,top"; // TODO : remove this
-static const char SIG_SCROLL_EDGE_BOTTOM[] = "scroll,edge,bottom"; // TODO : remove this
-static const char SIG_SCROLL_EDGE_LEFT[] = "scroll,edge,left"; // TODO : remove this
-static const char SIG_SCROLL_EDGE_RIGHT[] = "scroll,edge,right"; // TODO : remove this
static const char SIG_EDGE_TOP[] = "edge,top";
static const char SIG_EDGE_BOTTOM[] = "edge,bottom";
static const char SIG_EDGE_LEFT[] = "edge,left";
static const char SIG_MULTI_PINCH_IN[] = "multi,pinch,in";
static const char SIG_SWIPE[] = "swipe";
static const char SIG_MOVED[] = "moved";
+static const char SIG_INDEX_UPDATE[] = "index,update";
+static const char SIG_TREE_EFFECT_FINISHED [] = "tree,effect,finished";
static const Evas_Smart_Cb_Description _signals[] = {
{SIG_CLICKED_DOUBLE, ""},
{SIG_SCROLL_ANIM_STOP, ""},
{SIG_SCROLL_DRAG_START, ""},
{SIG_SCROLL_DRAG_STOP, ""},
- {SIG_SCROLL_EDGE_TOP, ""},
- {SIG_SCROLL_EDGE_BOTTOM, ""},
- {SIG_SCROLL_EDGE_LEFT, ""},
- {SIG_SCROLL_EDGE_RIGHT, ""},
{SIG_EDGE_TOP, ""},
{SIG_EDGE_BOTTOM, ""},
{SIG_EDGE_LEFT, ""},
{SIG_MULTI_PINCH_IN, ""},
{SIG_SWIPE, ""},
{SIG_MOVED, ""},
+ {SIG_TREE_EFFECT_FINISHED, ""},
{NULL, NULL}
};
-static Eina_Compare_Cb _elm_genlist_item_compare_cb;
-static Eina_Compare_Cb _elm_genlist_item_compare_data_cb;
+/* TEMPORARY */
+#undef ELM_CHECK_WIDTYPE
+#define ELM_CHECK_WIDTYPE(obj, widtype) \
+ if ((!obj) || (!elm_genlist_type_check((obj), __func__))) return
+#undef ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN
+#define ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, ...) \
+ ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, __VA_ARGS__); \
+ ELM_CHECK_WIDTYPE(WIDGET((it)), widtype) __VA_ARGS__;
+
+static const char *_gengrid = NULL;
+static const char *_genlist = NULL;
+
+/* THIS FUNCTION IS HACKY AND TEMPORARY!!! */
+Eina_Bool
+elm_genlist_type_check(const Evas_Object *obj,
+ const char *func)
+{
+ const char *provided, *expected = "(unknown)";
+ static int abort_on_warn = -1;
+ provided = elm_widget_type_get(obj);
+ if (!_genlist) _genlist = eina_stringshare_add("genlist");
+ if (!_gengrid) _gengrid = eina_stringshare_add("gengrid");
+ if (EINA_LIKELY(provided == _genlist) || EINA_LIKELY(provided == _gengrid))
+ return EINA_TRUE;
+ if ((!provided) || (!provided[0]))
+ {
+ provided = evas_object_type_get(obj);
+ if ((!provided) || (!provided[0]))
+ provided = "(unknown)";
+ }
+ ERR("Passing Object: %p in function: %s, of type: '%s' when expecting type: '%s'", obj, func, provided, expected);
+ if (abort_on_warn == -1)
+ {
+ if (getenv("ELM_ERROR_ABORT")) abort_on_warn = 1;
+ else abort_on_warn = 0;
+ }
+ if (abort_on_warn == 1) abort();
+ return EINA_FALSE;
+}
static Eina_Bool
_event_hook(Evas_Object *obj,
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
if (elm_widget_disabled_get(obj)) return EINA_FALSE;
- Elm_Gen_Item *it = NULL;
+ Elm_Object_Item *it = NULL;
Evas_Coord x = 0;
Evas_Coord y = 0;
Evas_Coord step_x = 0;
else if ((!strcmp(ev->keyname, "Home")) || (!strcmp(ev->keyname, "KP_Home")))
{
it = elm_genlist_first_item_get(obj);
- elm_genlist_item_bring_in(it);
+ elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
+ elm_genlist_item_selected_set(it, EINA_TRUE);
ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
return EINA_TRUE;
}
else if ((!strcmp(ev->keyname, "End")) || (!strcmp(ev->keyname, "KP_End")))
{
it = elm_genlist_last_item_get(obj);
- elm_genlist_item_bring_in(it);
+ elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
+ elm_genlist_item_selected_set(it, EINA_TRUE);
ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
return EINA_TRUE;
}
return EINA_TRUE;
}
else if (((!strcmp(ev->keyname, "Return")) ||
- (!strcmp(ev->keyname, "KP_Enter")) ||
- (!strcmp(ev->keyname, "space")))
- && (!wd->multi) && (wd->selected))
+ (!strcmp(ev->keyname, "KP_Enter")) ||
+ (!strcmp(ev->keyname, "space")))
+ && (!wd->multi) && (wd->selected))
{
it = elm_genlist_selected_item_get(obj);
elm_genlist_item_expanded_set(it,
if (!wd->selected) return EINA_FALSE;
if (!wd->multi) return EINA_FALSE;
- Elm_Gen_Item *prev = elm_genlist_item_prev_get(wd->last_selected_item);
+ Elm_Object_Item *prev = elm_genlist_item_prev_get(wd->last_selected_item);
if (!prev) return EINA_TRUE;
if (elm_genlist_item_selected_get(prev))
{
elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
wd->last_selected_item = prev;
- elm_genlist_item_show(wd->last_selected_item);
+ elm_genlist_item_show(wd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
}
else
{
elm_genlist_item_selected_set(prev, EINA_TRUE);
- elm_genlist_item_show(prev);
+ elm_genlist_item_show(prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
}
return EINA_TRUE;
}
if (!wd->selected) return EINA_FALSE;
if (!wd->multi) return EINA_FALSE;
- Elm_Gen_Item *next = elm_genlist_item_next_get(wd->last_selected_item);
+ Elm_Object_Item *next;
+ next = elm_genlist_item_next_get(wd->last_selected_item);
if (!next) return EINA_TRUE;
if (elm_genlist_item_selected_get(next))
{
elm_genlist_item_selected_set(wd->last_selected_item, EINA_FALSE);
wd->last_selected_item = next;
- elm_genlist_item_show(wd->last_selected_item);
+ elm_genlist_item_show(wd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
}
else
{
elm_genlist_item_selected_set(next, EINA_TRUE);
- elm_genlist_item_show(next);
+ elm_genlist_item_show(next, ELM_GENLIST_ITEM_SCROLLTO_IN);
}
return EINA_TRUE;
}
Elm_Gen_Item *prev;
if (!wd->selected)
{
- prev = ELM_GENLIST_ITEM_FROM_INLIST(wd->items->last);
- while ((prev) && (prev->delete_me))
- prev = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
+ prev = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
+ while ((prev) && (prev->generation < wd->generation))
+ prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
}
- else prev = elm_genlist_item_prev_get(wd->last_selected_item);
+ else prev = (Elm_Gen_Item *) elm_genlist_item_prev_get(wd->last_selected_item);
if (!prev) return EINA_FALSE;
_deselect_all_items(wd);
- elm_genlist_item_selected_set(prev, EINA_TRUE);
- elm_genlist_item_show(prev);
+ elm_genlist_item_selected_set((Elm_Object_Item *) prev, EINA_TRUE);
+ elm_genlist_item_show((Elm_Object_Item *) prev, ELM_GENLIST_ITEM_SCROLLTO_IN);
return EINA_TRUE;
}
Elm_Gen_Item *next;
if (!wd->selected)
{
- next = ELM_GENLIST_ITEM_FROM_INLIST(wd->items);
- while ((next) && (next->delete_me))
- next = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
+ next = ELM_GEN_ITEM_FROM_INLIST(wd->items);
+ while ((next) && (next->generation < wd->generation))
+ next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
}
- else next = elm_genlist_item_next_get(wd->last_selected_item);
+ else next = (Elm_Gen_Item *) elm_genlist_item_next_get(wd->last_selected_item);
if (!next) return EINA_FALSE;
_deselect_all_items(wd);
- elm_genlist_item_selected_set(next, EINA_TRUE);
- elm_genlist_item_show(next);
+ elm_genlist_item_selected_set((Elm_Object_Item *) next, EINA_TRUE);
+ elm_genlist_item_show((Elm_Object_Item *) next, ELM_GENLIST_ITEM_SCROLLTO_IN);
return EINA_TRUE;
}
{
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
+ if (wd->edit_mode) elm_genlist_edit_mode_set(wd->obj, EINA_FALSE);
elm_genlist_clear(obj);
evas_object_del(wd->pan_smart);
wd->pan_smart = NULL;
}
if (wd->mode == ELM_LIST_LIMIT)
{
- Evas_Coord vmw, vmh, vw, vh;
+ Evas_Coord vmw, vmh;
minw = wd->realminw;
maxw = -1;
- elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh);
- if ((minw > 0) && (vw < minw)) vw = minw;
- else if ((maxw > 0) && (vw > maxw))
- vw = maxw;
+ elm_smart_scroller_child_viewport_size_get(wd->scr, &vmw, &vmh);
edje_object_size_min_calc
(elm_smart_scroller_edje_object_get(wd->scr), &vmw, &vmh);
minw = vmw + minw;
_item_highlight(Elm_Gen_Item *it)
{
const char *selectraise;
- if ((it->wd->no_select) || (it->delete_me) || (it->highlighted) ||
- (it->disabled) || (it->display_only) || (it->item->mode_view))
+ if ((it->wd->select_mode == ELM_OBJECT_NO_SELECT) ||
+ (it->wd->no_highlight) ||
+ (it->generation < it->wd->generation) ||
+ (it->highlighted) || elm_widget_item_disabled_get(it) ||
+ (it->display_only) || (it->item->mode_view))
return;
edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
+ if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,selected", "elm");
selectraise = edje_object_data_get(VIEW(it), "selectraise");
if ((selectraise) && (!strcmp(selectraise, "on")))
{
- evas_object_raise(VIEW(it));
+ if (it->edit_obj) evas_object_raise(it->edit_obj);
+ else evas_object_raise(VIEW(it));
if ((it->item->group_item) && (it->item->group_item->realized))
evas_object_raise(it->item->VIEW(group_item));
}
static void
_item_unhighlight(Elm_Gen_Item *it)
{
- const char *stacking, *selectraise;
- if ((it->delete_me) || (!it->highlighted)) return;
+ if ((it->generation < it->wd->generation) || (!it->highlighted)) return;
edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
- stacking = edje_object_data_get(VIEW(it), "stacking");
- selectraise = edje_object_data_get(VIEW(it), "selectraise");
+ if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,unselected", "elm");
if (!it->item->nostacking)
{
- if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even) evas_object_lower(VIEW(it));
- else evas_object_raise(VIEW(it));
+ if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
+ {
+ if (it->edit_obj) evas_object_lower(it->edit_obj);
+ else evas_object_lower(VIEW(it));
+ }
+ else
+ {
+ if (it->edit_obj) evas_object_raise(it->edit_obj);
+ else evas_object_raise(VIEW(it));
+ }
}
it->highlighted = EINA_FALSE;
}
static void
+_item_block_position_update(Eina_Inlist *list, int idx)
+{
+ Item_Block *tmp;
+
+ EINA_INLIST_FOREACH(list, tmp)
+ {
+ tmp->position = idx++;
+ tmp->position_update = EINA_TRUE;
+ }
+}
+
+static void
+_item_position_update(Eina_List *list, int idx)
+{
+ Elm_Gen_Item *it;
+ Eina_List *l;
+
+ EINA_LIST_FOREACH(list, l, it)
+ {
+ it->position = idx++;
+ it->position_update = EINA_TRUE;
+ }
+}
+
+static void
_item_block_del(Elm_Gen_Item *it)
{
Eina_Inlist *il;
if (it->parent)
it->parent->item->items = eina_list_remove(it->parent->item->items, it);
else
- it->wd->blocks = eina_inlist_remove(it->wd->blocks, il);
+ {
+ _item_block_position_update(il->next, itb->position);
+ it->wd->blocks = eina_inlist_remove(it->wd->blocks, il);
+ }
free(itb);
if (itbn) itbn->changed = EINA_TRUE;
}
itbp->count++;
itbp->changed = EINA_TRUE;
}
+ _item_block_position_update(EINA_INLIST_GET(itb)->next,
+ itb->position);
it->wd->blocks = eina_inlist_remove(it->wd->blocks,
EINA_INLIST_GET(itb));
free(itb);
itbn->count++;
itbn->changed = EINA_TRUE;
}
+ _item_block_position_update(EINA_INLIST_GET(itb)->next,
+ itb->position);
it->wd->blocks =
eina_inlist_remove(it->wd->blocks, EINA_INLIST_GET(itb));
free(itb);
}
static void
+_item_subitems_clear(Elm_Gen_Item *it)
+{
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Eina_List *tl = NULL, *l;
+ Elm_Object_Item *it2;
+
+ EINA_LIST_FOREACH(it->item->items, l, it2)
+ tl = eina_list_append(tl, it2);
+ EINA_LIST_FREE(tl, it2)
+ elm_object_item_del(it2);
+}
+
+static void
_item_del(Elm_Gen_Item *it)
{
Evas_Object *obj = WIDGET(it);
evas_event_freeze(evas_object_evas_get(obj));
- elm_genlist_item_subitems_clear(it);
+ elm_genlist_item_subitems_clear((Elm_Object_Item *)it);
if (it->wd->show_item == it) it->wd->show_item = NULL;
- if (it->realized) elm_gen_item_unrealize(it, EINA_FALSE, (Ecore_Cb)_item_unrealize_cb);
+ if (it->realized) _elm_genlist_item_unrealize(it, EINA_FALSE);
+ if (it->item->edit_mode_item_realized) _edit_mode_item_unrealize(it);
if (it->item->block) _item_block_del(it);
if (it->item->queued)
it->wd->queue = eina_list_remove(it->wd->queue, it);
if (it->wd->anchor_item == it)
{
- it->wd->anchor_item = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
+ it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
if (!it->wd->anchor_item)
- it->wd->anchor_item = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
+ it->wd->anchor_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
}
+ if (it->wd->expanded_item == it) it->wd->expanded_item = NULL;
if (it->parent)
it->parent->item->items = eina_list_remove(it->parent->item->items, it);
if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
- elm_gen_item_del_serious(it, (Ecore_Cb)_calc_job);
+ _elm_genlist_item_del_serious(it);
+ elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc);
evas_event_thaw(evas_object_evas_get(obj));
evas_event_thaw_eval(evas_object_evas_get(obj));
}
static void
-_item_select(Elm_Gen_Item *it)
+_clear_cb(Widget_Data *wd)
{
- Evas_Object *parent = WIDGET(it);
+ wd->anchor_item = NULL;
+ while (wd->blocks)
+ {
+ Item_Block *itb = (Item_Block *)(wd->blocks);
- if ((it->wd->no_select) || (it->delete_me) || (it->item->mode_view)) return;
- if (it->selected)
+ wd->blocks = eina_inlist_remove(wd->blocks, wd->blocks);
+ if (itb->items) eina_list_free(itb->items);
+ free(itb);
+ }
+ if (wd->queue_idle_enterer)
{
- if (it->wd->always_select) goto call;
- return;
+ ecore_idle_enterer_del(wd->queue_idle_enterer);
+ wd->queue_idle_enterer = NULL;
}
- it->selected = EINA_TRUE;
- it->wd->selected = eina_list_append(it->wd->selected, it);
-call:
- evas_object_ref(parent);
- it->walking++;
- it->wd->walking++;
- if (it->func.func) it->func.func((void *)it->func.data, parent, it);
- if (!it->delete_me)
- evas_object_smart_callback_call(parent, SIG_SELECTED, it);
- it->walking--;
- it->wd->walking--;
- if ((it->wd->clear_me) && (!it->wd->walking))
+ if (wd->must_recalc_idler)
{
- elm_genlist_clear(parent);
- goto end;
+ ecore_idler_del(wd->must_recalc_idler);
+ wd->must_recalc_idler = NULL;
}
- else
+ if (wd->queue) wd->queue = eina_list_free(wd->queue);
+ if (wd->reorder_move_animator)
{
- if ((!it->walking) && (it->delete_me))
- {
- if (!it->relcount) _item_del(it);
- goto end;
- }
+ ecore_animator_del(wd->reorder_move_animator);
+ wd->reorder_move_animator = NULL;
}
- it->wd->last_selected_item = it;
-
-end:
- evas_object_unref(parent);
+ wd->show_item = NULL;
+ wd->reorder_old_pan_y = 0;
}
static void
_item_unselect(Elm_Gen_Item *it)
{
- if ((it->delete_me) || (!it->selected)) return;
+ if ((it->generation < it->wd->generation) || (!it->selected)) return;
it->selected = EINA_FALSE;
it->wd->selected = eina_list_remove(it->wd->selected, it);
evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
if (!it->wd->on_hold)
{
it->wd->on_hold = EINA_TRUE;
- if (!it->wd->wasselected)
+ if ((!it->wd->wasselected) && (!it->flipped))
{
_item_unhighlight(it);
_item_unselect(it);
else
y_pos = it_scrl_y;
+ if (it->edit_obj)
+ _item_position(it, it->edit_obj, it->item->scrl_x, y_pos);
+ else
_item_position(it, VIEW(it), it->item->scrl_x, y_pos);
if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
Eina_List *list, *l;
it->long_timer = NULL;
- if ((it->disabled) || (it->dragging) || (it->display_only))
+ if (elm_widget_item_disabled_get(it) || (it->dragging) || (it->display_only))
return ECORE_CALLBACK_CANCEL;
it->wd->longpressed = EINA_TRUE;
evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
- if ((it->wd->reorder_mode) && (it->item->flags != ELM_GENLIST_ITEM_GROUP))
+ if ((it->wd->reorder_mode) && (!it->group))
{
it->wd->reorder_it = it;
it->wd->reorder_start_y = 0;
+ if (it->edit_obj)
+ evas_object_raise(it->edit_obj);
+ else
+ evas_object_raise(VIEW(it));
- evas_object_raise(VIEW(it));
elm_smart_scroller_hold_set(it->wd->scr, EINA_TRUE);
elm_smart_scroller_bounce_allow_set(it->wd->scr, EINA_FALSE, EINA_FALSE);
{
if (it != it_tmp) _item_unselect(it_tmp);
}
- if (elm_genlist_item_expanded_get(it))
+ if (elm_genlist_item_expanded_get((Elm_Object_Item *)it))
{
- elm_genlist_item_expanded_set(it, EINA_FALSE);
+ elm_genlist_item_expanded_set((Elm_Object_Item *)it, EINA_FALSE);
return ECORE_CALLBACK_RENEW;
}
- edje_object_signal_emit(VIEW(it), "elm,state,reorder,enabled", "elm");
+
+ if (!it->wd->edit_mode)
+ edje_object_signal_emit(VIEW(it), "elm,state,reorder,enabled", "elm");
}
return ECORE_CALLBACK_CANCEL;
}
int i, sum = 0;
if (!it) return;
- if ((it->display_only) || (it->disabled)) return;
+ if ((it->display_only) || elm_widget_item_disabled_get(it)) return;
it->wd->swipe = EINA_FALSE;
for (i = 0; i < it->wd->movements; i++)
{
it->wd->wasselected = it->selected;
_item_highlight(it);
if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
- if ((!it->disabled) && (!it->display_only))
+ if ((!elm_widget_item_disabled_get(it)) && (!it->display_only))
{
evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
edje_object_signal_emit(VIEW(it), "elm,state,reorder,disabled", "elm");
it->wd->reorder_it = it->wd->reorder_rel = NULL;
elm_smart_scroller_hold_set(it->wd->scr, EINA_FALSE);
- elm_smart_scroller_bounce_allow_set(it->wd->scr, EINA_FALSE, EINA_TRUE);
+ elm_smart_scroller_bounce_allow_set(it->wd->scr, it->wd->h_bounce, it->wd->v_bounce);
}
if (it->wd->longpressed)
{
it->wd->longpressed = EINA_FALSE;
- if (!it->wd->wasselected)
+ if ((!it->wd->wasselected) && (!it->flipped))
{
_item_unhighlight(it);
_item_unselect(it);
{
if (it->want_unrealize)
{
- elm_gen_item_unrealize(it, EINA_FALSE, (Ecore_Cb)_item_unrealize_cb);
+ _elm_genlist_item_unrealize(it, EINA_FALSE);
if (it->item->block->want_unrealize)
_item_block_unrealize(it->item->block);
}
}
- if ((it->disabled) || (dragged) || (it->display_only)) return;
+ if (elm_widget_item_disabled_get(it) || (dragged) || (it->display_only))
+ return;
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
if (it->wd->multi)
{
if (!it->selected)
{
_item_highlight(it);
- _item_select(it);
+ it->sel_cb(it);
}
else
{
Elm_Gen_Item *it2;
EINA_LIST_FOREACH_SAFE(it->wd->selected, l, l_next, it2)
- if (it2 != it)
+ if (it2 != it)
{
_item_unhighlight(it2);
_item_unselect(it2);
//_item_select(it);
}
_item_highlight(it);
- _item_select(it);
+ it->sel_cb(it);
}
}
if (!data) return;
if (!obj) return;
Elm_Gen_Item *it = data;
- if ((it->delete_me) || (!it->realized) || (!it->item->mode_view)) return;
+ if ((it->generation < it->wd->generation) || (!it->realized) || (!it->item->mode_view)) return;
char buf[1024];
Evas *te = evas_object_evas_get(obj);
evas_event_freeze(te);
- it->item->nocache = EINA_FALSE;
+ it->item->nocache_once = EINA_FALSE;
_mode_item_unrealize(it);
if (it->item->group_item)
evas_object_raise(it->item->VIEW(group_item));
wd->item_cache_count--;
if (itc->spacer) evas_object_del(itc->spacer);
if (itc->base_view) evas_object_del(itc->base_view);
- if (itc->item_style) eina_stringshare_del(itc->item_style);
+ eina_stringshare_del(itc->item_style);
free(itc);
}
evas_event_thaw(evas_object_evas_get(wd->obj));
it->wd->item_cache_count++;
itc = calloc(1, sizeof(Item_Cache));
+ if (!itc)
+ {
+ evas_event_thaw(evas_object_evas_get(it->wd->obj));
+ evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
+ return;
+ }
it->wd->item_cache = eina_inlist_prepend(it->wd->item_cache,
EINA_INLIST_GET(itc));
itc->spacer = it->spacer;
it->spacer = NULL;
itc->base_view = VIEW(it);
VIEW(it) = NULL;
+ edje_object_signal_emit(itc->base_view, "elm,state,unselected", "elm");
evas_object_hide(itc->base_view);
evas_object_move(itc->base_view, -9999, -9999);
itc->item_style = eina_stringshare_add(it->itc->item_style);
- if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS) itc->tree = 1;
+ if (it->item->type & ELM_GENLIST_ITEM_TREE) itc->tree = 1;
itc->compress = (it->wd->compress);
itc->selected = it->selected;
- itc->disabled = it->disabled;
+ itc->disabled = elm_widget_item_disabled_get(it);
itc->expanded = it->item->expanded;
if (it->long_timer)
{
Item_Cache *itc;
Eina_Bool tree = 0;
- if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS) tree = 1;
+ if (it->item->type & ELM_GENLIST_ITEM_TREE) tree = 1;
EINA_INLIST_FOREACH(it->wd->item_cache, itc)
{
if ((itc->selected) || (itc->disabled) || (itc->expanded))
continue;
if ((itc->tree == tree) &&
(itc->compress == it->wd->compress) &&
- (!strcmp(it->itc->item_style, itc->item_style)))
+ (((!it->itc->item_style) && (!itc->item_style)) ||
+ (it->itc->item_style && itc->item_style &&
+ (!strcmp(it->itc->item_style, itc->item_style)))))
{
it->wd->item_cache = eina_inlist_remove(it->wd->item_cache,
EINA_INLIST_GET(itc));
}
static void
+_elm_genlist_item_index_update(Elm_Gen_Item *it)
+{
+ if (it->position_update || it->item->block->position_update)
+ {
+ evas_object_smart_callback_call(WIDGET(it), SIG_INDEX_UPDATE, it);
+ it->position_update = EINA_FALSE;
+ }
+}
+
+static void
_elm_genlist_item_odd_even_update(Elm_Gen_Item *it)
{
if (!it->item->nostacking)
{
if ((it->item->order_num_in & 0x1) ^ it->item->stacking_even)
- evas_object_lower(VIEW(it));
+ {
+ if (it->edit_obj) evas_object_lower(it->edit_obj);
+ else evas_object_lower(VIEW(it));
+ }
else
- evas_object_raise(VIEW(it));
+ {
+ if (it->edit_obj) evas_object_raise(it->edit_obj);
+ else evas_object_raise(VIEW(it));
+ }
}
if (it->item->order_num_in & 0x1)
- edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
+ {
+ edje_object_signal_emit(VIEW(it), "elm,state,odd", "elm");
+ if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,odd", "elm");
+ }
else
- edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
+ {
+ edje_object_signal_emit(VIEW(it), "elm,state,even", "elm");
+ if (it->edit_obj) edje_object_signal_emit(it->edit_obj, "elm,state,even", "elm");
+ }
}
static void
if (it->selected)
edje_object_signal_emit(VIEW(it),
"elm,state,selected", "elm");
+
+ if (it->edit_obj)
+ edje_object_signal_emit(it->edit_obj,
+ "elm,state,selected", "elm");
}
- if (it->disabled != itc->disabled)
+ if (elm_widget_item_disabled_get(it) != itc->disabled)
{
- if (it->disabled)
+ if (elm_widget_item_disabled_get(it))
edje_object_signal_emit(VIEW(it),
"elm,state,disabled", "elm");
+ if (it->edit_obj)
+ edje_object_signal_emit(it->edit_obj,
+ "elm,state,disabled", "elm");
}
if (it->item->expanded != itc->expanded)
{
if (it->item->expanded)
edje_object_signal_emit(VIEW(it),
"elm,state,expanded", "elm");
+ if (it->edit_obj)
+ edje_object_signal_emit(it->edit_obj,
+ "elm,state,expanded", "elm");
}
}
else
{
if (it->selected)
- edje_object_signal_emit(VIEW(it),
- "elm,state,selected", "elm");
- if (it->disabled)
- edje_object_signal_emit(VIEW(it),
- "elm,state,disabled", "elm");
+ {
+ edje_object_signal_emit(VIEW(it),
+ "elm,state,selected", "elm");
+ if (it->edit_obj)
+ edje_object_signal_emit(it->edit_obj,
+ "elm,state,selected", "elm");
+ }
+
+ if (elm_widget_item_disabled_get(it))
+ {
+ edje_object_signal_emit(VIEW(it),
+ "elm,state,disabled", "elm");
+ if (it->edit_obj)
+ edje_object_signal_emit(it->edit_obj,
+ "elm,state,disabled", "elm");
+ }
if (it->item->expanded)
- edje_object_signal_emit(VIEW(it),
- "elm,state,expanded", "elm");
+ {
+ edje_object_signal_emit(VIEW(it),
+ "elm,state,expanded", "elm");
+ if (it->edit_obj)
+ edje_object_signal_emit(it->edit_obj,
+ "elm,state,expanded", "elm");
+ }
}
}
{
if (itc->spacer) evas_object_del(itc->spacer);
if (itc->base_view) evas_object_del(itc->base_view);
- if (itc->item_style) eina_stringshare_del(itc->item_style);
+ eina_stringshare_del(itc->item_style);
free(itc);
}
static void
-_item_del_hook(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
-{
- Elm_Gen_Item *it = event_info;
- if (!it) return;
- if (it->wd->last_selected_item == it)
- it->wd->last_selected_item = NULL;
-}
-
-static void
-_item_label_realize(Elm_Gen_Item *it,
+_item_text_realize(Elm_Gen_Item *it,
Evas_Object *target,
- Eina_List **source)
+ Eina_List **source,
+ const char *parts)
{
- if (it->itc->func.label_get)
+ if (it->itc->func.text_get)
{
const Eina_List *l;
const char *key;
- *source = elm_widget_stringlist_get(edje_object_data_get(target, "labels"));
+ *source = elm_widget_stringlist_get(edje_object_data_get(target, "texts"));
EINA_LIST_FOREACH(*source, l, key)
{
- char *s = it->itc->func.label_get
+ if (parts && fnmatch(parts, key, FNM_PERIOD))
+ continue;
+
+ char *s = it->itc->func.text_get
((void *)it->base.data, WIDGET(it), key);
if (s)
}
static Eina_List *
-_item_icon_realize(Elm_Gen_Item *it,
+_item_content_unrealize(Elm_Gen_Item *it,
+ Evas_Object *target,
+ Eina_List **source,
+ const char *parts)
+{
+ Eina_List *res = it->content_objs;
+
+ if (it->itc->func.content_get)
+ {
+ const Eina_List *l;
+ const char *key;
+ Evas_Object *ic = NULL;
+
+ EINA_LIST_FOREACH(*source, l, key)
+ {
+ if (parts && fnmatch(parts, key, FNM_PERIOD))
+ continue;
+
+ ic = edje_object_part_swallow_get(target, key);
+ if (ic)
+ {
+ res = eina_list_remove(res, ic);
+ edje_object_part_unswallow(target, ic);
+ evas_object_del(ic);
+ }
+ }
+ }
+
+ return res;
+}
+
+static Eina_List *
+_item_content_realize(Elm_Gen_Item *it,
Evas_Object *target,
- Eina_List **source)
+ Eina_List **source,
+ const char *parts)
{
Eina_List *res = NULL;
- if (it->itc->func.icon_get)
+ if (it->itc->func.content_get)
{
const Eina_List *l;
const char *key;
+ Evas_Object *ic = NULL;
+
+ *source = elm_widget_stringlist_get(edje_object_data_get(target, "contents"));
+
+ if (parts && (eina_list_count(*source) != eina_list_count(it->content_objs)))
+ res = it->content_objs;
- *source = elm_widget_stringlist_get(edje_object_data_get(target, "icons"));
EINA_LIST_FOREACH(*source, l, key)
{
- Evas_Object *ic = it->itc->func.icon_get
- ((void *)it->base.data, WIDGET(it), key);
+ if (parts && fnmatch(parts, key, FNM_PERIOD))
+ continue;
+ if (it->itc->func.content_get)
+ ic = it->itc->func.content_get
+ ((void *)it->base.data, WIDGET(it), key);
if (ic)
{
res = eina_list_append(res, ic);
edje_object_part_swallow(target, key, ic);
evas_object_show(ic);
elm_widget_sub_object_add(WIDGET(it), ic);
- if (it->disabled)
+ if (elm_widget_item_disabled_get(it))
elm_widget_disabled_set(ic, EINA_TRUE);
}
}
static void
_item_state_realize(Elm_Gen_Item *it,
Evas_Object *target,
- Eina_List **source)
+ Eina_List **source,
+ const char *parts)
{
if (it->itc->func.state_get)
{
*source = elm_widget_stringlist_get(edje_object_data_get(target, "states"));
EINA_LIST_FOREACH(*source, l, key)
{
+ if (parts && fnmatch(parts, key, FNM_PERIOD))
+ continue;
+
Eina_Bool on = it->itc->func.state_get
((void *)it->base.data, WIDGET(it), key);
}
}
+static Eina_List *
+_item_flips_realize(Elm_Gen_Item *it,
+ Evas_Object *target,
+ Eina_List **source)
+{
+ Eina_List *res = NULL;
+
+ if (it->itc->func.content_get)
+ {
+ const Eina_List *l;
+ const char *key;
+ Evas_Object *ic = NULL;
+
+ *source = elm_widget_stringlist_get(edje_object_data_get(target, "flips"));
+
+ EINA_LIST_FOREACH(*source, l, key)
+ {
+ if (it->itc->func.content_get)
+ ic = it->itc->func.content_get
+ ((void *)it->base.data, WIDGET(it), key);
+ if (ic)
+ {
+ res = eina_list_append(res, ic);
+ edje_object_part_swallow(target, key, ic);
+ evas_object_show(ic);
+ elm_widget_sub_object_add(WIDGET(it), ic);
+ if (elm_widget_item_disabled_get(it))
+ elm_widget_disabled_set(ic, EINA_TRUE);
+ }
+ }
+ }
+
+ return res;
+}
+
static void
_item_realize(Elm_Gen_Item *it,
int in,
Eina_Bool calc)
{
- Elm_Gen_Item *it2;
const char *treesize;
char buf[1024];
- int depth, tsize = 20;
+ int tsize = 20;
Item_Cache *itc = NULL;
- if (it->delete_me) return;
+ if (it->generation < it->wd->generation) return;
//evas_event_freeze(evas_object_evas_get(it->wd->obj));
if (it->realized)
{
it->item->order_num_in = in;
_elm_genlist_item_odd_even_update(it);
_elm_genlist_item_state_update(it, NULL);
+ _elm_genlist_item_index_update(it);
}
//evas_event_thaw(evas_object_evas_get(it->wd->obj));
//evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
}
it->item->order_num_in = in;
- if (it->item->nocache)
- it->item->nocache = EINA_FALSE;
- else
+ if (it->item->nocache_once)
+ it->item->nocache_once = EINA_FALSE;
+ else if (!it->item->nocache)
itc = _item_cache_find(it);
- if (itc)
+ if (itc && (!it->wd->tree_effect_enabled))
{
VIEW(it) = itc->base_view;
itc->base_view = NULL;
evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
elm_widget_sub_object_add(WIDGET(it), VIEW(it));
- if (it->item->flags & ELM_GENLIST_ITEM_SUBITEMS)
- strncpy(buf, "tree", sizeof(buf));
- else strncpy(buf, "item", sizeof(buf));
- if (it->wd->compress)
- strncat(buf, "_compress", sizeof(buf) - strlen(buf));
-
- strncat(buf, "/", sizeof(buf) - strlen(buf));
- strncat(buf, it->itc->item_style, sizeof(buf) - strlen(buf));
+ if (it->item->type & ELM_GENLIST_ITEM_TREE)
+ snprintf(buf, sizeof(buf), "tree%s/%s", it->wd->compress ? "_compress" : "", it->itc->item_style ?: "default");
+ else
+ snprintf(buf, sizeof(buf), "item%s/%s", it->wd->compress ? "_compress" : "", it->itc->item_style ?: "default");
_elm_theme_object_set(WIDGET(it), VIEW(it), "genlist", buf,
elm_widget_style_get(WIDGET(it)));
_elm_genlist_item_odd_even_update(it);
- for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
- {
- if (it2->parent->item->flags != ELM_GENLIST_ITEM_GROUP) depth += 1;
- }
- it->item->expanded_depth = depth;
treesize = edje_object_data_get(VIEW(it), "treesize");
if (treesize) tsize = atoi(treesize);
evas_object_size_hint_min_set(it->spacer,
- (depth * tsize) * _elm_config->scale, 1);
+ (it->item->expanded_depth * tsize) * _elm_config->scale, 1);
edje_object_part_swallow(VIEW(it), "elm.swallow.pad", it->spacer);
if (!calc)
{
evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MULTI_MOVE,
_multi_move, it);
+ if ((it->wd->edit_mode) && (!it->edit_obj) &&
+ (it->item->type != ELM_GENLIST_ITEM_GROUP) && (it->itc->edit_item_style))
+ _edit_mode_item_realize(it, EINA_FALSE);
+
_elm_genlist_item_state_update(it, itc);
+ _elm_genlist_item_index_update(it);
}
if ((calc) && (it->wd->homogeneous) &&
/* homogenous genlist shortcut */
if (!it->item->mincalcd)
{
- if (it->item->flags & ELM_GENLIST_ITEM_GROUP)
+ if (it->group)
{
it->item->w = it->item->minw = it->wd->group_item_width;
it->item->h = it->item->minh = it->wd->group_item_height;
{
/* FIXME: If you see that assert, please notify us and we
will clean our mess */
- assert(eina_list_count(it->icon_objs) == 0);
+ assert(eina_list_count(it->content_objs) == 0);
- _item_label_realize(it, VIEW(it), &it->labels);
- it->icon_objs = _item_icon_realize(it, VIEW(it), &it->icons);
- _item_state_realize(it, VIEW(it), &it->states);
+ _item_text_realize(it, VIEW(it), &it->texts, NULL);
+ it->content_objs = _item_content_realize(it, VIEW(it), &it->contents, NULL);
+ _item_state_realize(it, VIEW(it), &it->states, NULL);
+ if (it->flipped)
+ {
+ edje_object_signal_emit(VIEW(it), "elm,state,flip,enabled", "elm");
+ it->content_objs = _item_flips_realize(it, VIEW(it), &it->contents);
+ }
if (!it->item->mincalcd)
{
it->item->h = it->item->minh = mh;
it->item->mincalcd = EINA_TRUE;
- if ((!it->wd->group_item_width) && (it->item->flags == ELM_GENLIST_ITEM_GROUP))
+ if ((!it->wd->group_item_width) && (it->group))
{
it->wd->group_item_width = mw;
it->wd->group_item_height = mh;
}
- else if ((!it->wd->item_width) && (it->item->flags == ELM_GENLIST_ITEM_NONE))
+ else if ((!it->wd->item_width) && (it->item->type == ELM_GENLIST_ITEM_NONE))
{
it->wd->item_width = mw;
it->wd->item_height = mh;
it->tooltip.content_cb,
it->tooltip.data, NULL);
elm_widget_item_tooltip_style_set(it, it->tooltip.style);
- elm_widget_item_tooltip_size_restrict_disable(it, it->tooltip.free_size);
+ elm_widget_item_tooltip_window_mode_set(it, it->tooltip.free_size);
}
if (it->mouse_cursor)
//evas_event_thaw_eval(evas_object_evas_get(it->wd->obj));
if (!calc)
evas_object_smart_callback_call(WIDGET(it), SIG_REALIZED, it);
+
+ if ((!calc) && (it->wd->edit_mode) && (it->item->type != ELM_GENLIST_ITEM_GROUP))
+ {
+ if (it->itc->edit_item_style)
+ {
+ if (!it->edit_obj) _edit_mode_item_realize(it, EINA_FALSE);
+ edje_object_message_signal_process(it->edit_obj);
+ }
+ }
edje_object_message_signal_process(VIEW(it));
}
static void
_item_unrealize_cb(Elm_Gen_Item *it)
{
- if (it->item->nocache)
+ if (it->item->nocache_once || it->item->nocache)
{
evas_object_del(VIEW(it));
VIEW(it) = NULL;
it->states = NULL;
it->realized = EINA_FALSE;
it->want_unrealize = EINA_FALSE;
+ if (it->wd->edit_mode) _edit_mode_item_unrealize(it);
}
static Eina_Bool
itb->num = in;
EINA_LIST_FOREACH(itb->items, l, it)
{
- if (it->delete_me) continue;
+ if (it->generation < it->wd->generation) continue;
showme |= it->item->showme;
if (!itb->realized)
{
if (changed)
{
_item_realize(it, in, EINA_TRUE);
- elm_gen_item_unrealize(it, EINA_TRUE, (Ecore_Cb)_item_unrealize_cb);
+ _elm_genlist_item_unrealize(it, EINA_TRUE);
}
}
else
{
_item_realize(it, in, EINA_TRUE);
- elm_gen_item_unrealize(it, EINA_TRUE, (Ecore_Cb)_item_unrealize_cb);
+ _elm_genlist_item_unrealize(it, EINA_TRUE);
}
}
else
itb->minw = minw;
itb->minh = minh;
itb->changed = EINA_FALSE;
+ itb->position_update = EINA_FALSE;
//evas_event_thaw(evas_object_evas_get(itb->wd->obj));
//evas_event_thaw_eval(evas_object_evas_get(itb->wd->obj));
return showme;
evas_event_freeze(evas_object_evas_get(itb->wd->obj));
EINA_LIST_FOREACH(itb->items, l, it)
{
- if (it->item->flags != ELM_GENLIST_ITEM_GROUP)
+ if (itb->must_recalc || !it->group)
{
if (it->dragging)
{
it->want_unrealize = EINA_TRUE;
}
else
- elm_gen_item_unrealize(it, EINA_FALSE, (Ecore_Cb)_item_unrealize_cb);
+ _elm_genlist_item_unrealize(it, EINA_FALSE);
}
}
if (!dragging)
it->item->old_scrl_y -= y;
down = EINA_FALSE;
}
- _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
+
+ if (it->edit_obj)
+ _item_position(it, it->edit_obj, it->item->scrl_x, it->item->old_scrl_y);
+ else
+ _item_position(it, VIEW(it), it->item->scrl_x, it->item->old_scrl_y);
_group_items_recalc(it->wd);
if ((it->wd->reorder_pan_move) ||
Elm_Gen_Item *it;
Elm_Gen_Item *git;
Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
- int vis;
+ Eina_Bool vis = EINA_FALSE;
evas_event_freeze(evas_object_evas_get(itb->wd->obj));
evas_object_geometry_get(itb->wd->pan_smart, &ox, &oy, &ow, &oh);
&cvw, &cvh);
EINA_LIST_FOREACH(itb->items, l, it)
{
- if (it->delete_me) continue;
+ if (it->generation < it->wd->generation) continue;
else if (it->wd->reorder_it == it) continue;
it->x = 0;
it->y = y;
vis = (ELM_RECTS_INTERSECT(it->item->scrl_x, it->item->scrl_y, it->item->w, it->item->h,
cvx, cvy, cvw, cvh));
- if (it->item->flags != ELM_GENLIST_ITEM_GROUP)
+ if (!it->group)
{
if ((itb->realized) && (!it->realized))
{
}
if (it->realized)
{
- if (vis)
+ if (vis || it->dragging)
{
if (it->wd->reorder_mode)
y += _get_space_for_reorder_item(it);
}
if (!it->item->move_effect_enabled)
{
- if (it->item->mode_view)
- _item_position(it, it->item->mode_view, it->item->scrl_x,
- it->item->scrl_y);
+ if ((it->wd->edit_mode) && (it->itc->edit_item_style))
+ _edit_mode_item_position(it, it->item->scrl_x,
+ it->item->scrl_y);
else
- _item_position(it, VIEW(it), it->item->scrl_x,
- it->item->scrl_y);
+ {
+ if (it->item->mode_view)
+ _item_position(it, it->item->mode_view,
+ it->item->scrl_x,
+ it->item->scrl_y);
+ else
+ _item_position(it, VIEW(it), it->item->scrl_x,
+ it->item->scrl_y);
+ }
it->item->old_scrl_y = it->item->scrl_y;
}
}
else
{
- if (!it->dragging) elm_gen_item_unrealize(it, EINA_FALSE, (Ecore_Cb)_item_unrealize_cb);
+ if (!it->wd->item_moving_effect_timer)
+ _elm_genlist_item_unrealize(it, EINA_FALSE);
}
}
in++;
else if (!git->item->want_realize && git->realized)
{
if (!git->dragging)
- elm_gen_item_unrealize(git, EINA_FALSE, (Ecore_Cb)_item_unrealize_cb);
+ _elm_genlist_item_unrealize(git, EINA_FALSE);
}
}
evas_event_thaw(evas_object_evas_get(wd->obj));
}
static void
+_scroll_item(Widget_Data *wd)
+{
+ Elm_Gen_Item *it = NULL;
+ Evas_Coord gith = 0;
+ Evas_Coord ow, oh, dx = 0, dy = 0, dw = 0, dh = 0;
+
+ evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &oh);
+ it = wd->show_item;
+ dx = it->x + it->item->block->x;
+ dy = it->y + it->item->block->y;
+ dw = it->item->block->w;
+ dh = oh;
+ switch (wd->scrollto_type)
+ {
+ case ELM_GENLIST_ITEM_SCROLLTO_TOP:
+ if (it->item->group_item) gith = it->item->group_item->item->h;
+ dy -= gith;
+ break;
+ case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
+ dy += (it->item->h / 2 - oh / 2);
+ break;
+ case ELM_GENLIST_ITEM_SCROLLTO_IN:
+ default:
+ if ((wd->expanded_item) &&
+ ((wd->show_item->y + wd->show_item->item->block->y + wd->show_item->item->h)
+ - (wd->expanded_item->y + wd->expanded_item->item->block->y) > oh))
+ {
+ it = wd->expanded_item;
+ if (it->item->group_item) gith = it->item->group_item->item->h;
+ dx = it->x + it->item->block->x;
+ dy = it->y + it->item->block->y - gith;
+ dw = it->item->block->w;
+ }
+ else
+ {
+ if ((it->item->group_item) && (wd->pan_y > (it->y + it->item->block->y)))
+ gith = it->item->group_item->item->h;
+ dy -= gith;
+ dh = it->item->h;
+ }
+ break;
+ }
+ if (wd->bring_in)
+ elm_smart_scroller_region_bring_in(wd->scr, dx, dy, dw, dh);
+ else
+ elm_smart_scroller_child_region_show(wd->scr, dx, dy, dw, dh);
+
+ it->item->showme = EINA_FALSE;
+ wd->show_item = NULL;
+ wd->auto_scroll_enabled = EINA_FALSE;
+ wd->check_scroll = EINA_FALSE;
+}
+
+static void
_calc_job(void *data)
{
Widget_Data *wd = data;
Item_Block *itb, *chb = NULL;
- Evas_Coord minw = -1, minh = 0, y = 0, ow;
+ Evas_Coord minw = -1, minh = 0, y = 0, ow, dy = 0, vw;
+ Evas_Coord pan_w = 0, pan_h = 0;
int in = 0;
- double t0, t;
Eina_Bool minw_change = EINA_FALSE;
Eina_Bool did_must_recalc = EINA_FALSE;
if (!wd) return;
- t0 = ecore_time_get();
evas_object_geometry_get(wd->pan_smart, NULL, NULL, &ow, &wd->h);
+ elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, NULL);
+
if (wd->w != ow)
wd->w = ow;
if (it->item->mincalcd) it->item->mincalcd = EINA_FALSE;
itb->changed = EINA_TRUE;
if (itb->must_recalc) did_must_recalc = EINA_TRUE;
+ if (itb->realized) _item_block_unrealize(itb);
itb->must_recalc = EINA_FALSE;
}
- if (itb->realized) _item_block_unrealize(itb);
showme = _item_block_recalc(itb, in, EINA_FALSE);
chb = itb;
}
minw = itb->minw;
minw_change = EINA_TRUE;
}
+ if (minw > vw)
+ {
+ minw = vw;
+ minw_change = EINA_TRUE;
+ }
itb->w = minw;
itb->h = itb->minh;
y += itb->h;
in += itb->count;
if ((showme) && (wd->show_item) && (!wd->show_item->item->queued))
- {
- wd->show_item->item->showme = EINA_FALSE;
- if (wd->bring_in)
- elm_smart_scroller_region_bring_in(wd->scr,
- wd->show_item->x +
- wd->show_item->item->block->x,
- wd->show_item->y +
- wd->show_item->item->block->y,
- wd->show_item->item->block->w,
- wd->show_item->item->h);
- else
- elm_smart_scroller_child_region_show(wd->scr,
- wd->show_item->x +
- wd->show_item->item->block->x,
- wd->show_item->y +
- wd->show_item->item->block->y,
- wd->show_item->item->block->w,
- wd->show_item->item->h);
- wd->show_item = NULL;
- }
+ wd->check_scroll = EINA_TRUE;
}
if (minw_change)
{
wd->anchor_y = it_y;
}
}
- t = ecore_time_get();
if (did_must_recalc)
{
if (!wd->must_recalc_idler)
wd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, wd);
}
+ if (wd->check_scroll)
+ {
+ _pan_child_size_get(wd->pan_smart, &pan_w, &pan_h);
+ if (EINA_INLIST_GET(wd->show_item) == wd->items->last)
+ wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
+ switch (wd->scrollto_type)
+ {
+ case ELM_GENLIST_ITEM_SCROLLTO_TOP:
+ dy = wd->h;
+ break;
+ case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
+ dy = wd->h / 2;
+ break;
+ case ELM_GENLIST_ITEM_SCROLLTO_IN:
+ default:
+ dy = 0;
+ break;
+ }
+ if ((pan_w > (wd->show_item->x + wd->show_item->item->block->x)) &&
+ (pan_h > (wd->show_item->y + wd->show_item->item->block->y + dy)))
+ {
+ _scroll_item(wd);
+ }
+ }
wd->calc_job = NULL;
evas_object_smart_changed(wd->pan_smart);
evas_event_thaw(evas_object_evas_get(wd->obj));
it->item->updateme = EINA_FALSE;
if (it->realized)
{
- elm_gen_item_unrealize(it, EINA_FALSE, (Ecore_Cb)_item_unrealize_cb);
+ _elm_genlist_item_unrealize(it, EINA_FALSE);
_item_realize(it, num, EINA_FALSE);
position = EINA_TRUE;
}
else
{
_item_realize(it, num, EINA_TRUE);
- elm_gen_item_unrealize(it, EINA_TRUE, (Ecore_Cb)_item_unrealize_cb);
+ _elm_genlist_item_unrealize(it, EINA_TRUE);
}
if ((it->item->minw != itminw) || (it->item->minh != itminh))
recalc = EINA_TRUE;
if (sd->resize_job) ecore_job_del(sd->resize_job);
sd->resize_job = ecore_job_add(_pan_resize_job, sd);
}
- sd->wd->pan_resized = EINA_TRUE;
+ sd->wd->pan_changed = EINA_TRUE;
evas_object_smart_changed(obj);
if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
sd->wd->calc_job = NULL;
if (!sd) return;
evas_event_freeze(evas_object_evas_get(obj));
- if (sd->wd->pan_resized)
+ if (sd->wd->pan_changed)
{
_calc_job(sd->wd);
- sd->wd->pan_resized = EINA_FALSE;
+ sd->wd->pan_changed = EINA_FALSE;
}
evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
sd->wd->reorder_old_pan_y = sd->wd->pan_y;
sd->wd->start_time = ecore_loop_time_get();
}
- _item_auto_scroll(sd->wd);
+
+ if (sd->wd->tree_effect_enabled && (sd->wd->move_effect_mode != ELM_GENLIST_ITEM_MOVE_EFFECT_NONE))
+ {
+ if (!sd->wd->item_moving_effect_timer)
+ {
+ _item_tree_effect_before(sd->wd->expanded_item);
+ evas_object_raise(sd->wd->alpha_bg);
+ evas_object_show(sd->wd->alpha_bg);
+ sd->wd->start_time = ecore_time_get();
+ sd->wd->item_moving_effect_timer = ecore_animator_add(_item_moving_effect_timer_cb, sd->wd);
+ }
+ }
+ else
+ _item_auto_scroll(sd->wd);
+
evas_event_thaw(evas_object_evas_get(obj));
evas_event_thaw_eval(evas_object_evas_get(obj));
}
Pan *sd = evas_object_smart_data_get(obj);
if (!sd) return;
+
+ sd->wd->pan_changed = EINA_TRUE;
+ evas_object_smart_changed(obj);
if (sd->wd->calc_job) ecore_job_del(sd->wd->calc_job);
- sd->wd->calc_job = ecore_job_add(_calc_job, sd->wd);
+ sd->wd->calc_job = NULL;
}
static void
void *event_info __UNUSED__)
{
Evas_Object *obj = data;
- evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_LEFT, NULL);
evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
}
void *event_info __UNUSED__)
{
Evas_Object *obj = data;
- evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_RIGHT, NULL);
evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
}
void *event_info __UNUSED__)
{
Evas_Object *obj = data;
- evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_TOP, NULL);
evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
}
void *event_info __UNUSED__)
{
Evas_Object *obj = data;
- evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_BOTTOM, NULL);
evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
}
{
char buf[1024];
- if ((it->item->mode_view) || (it->delete_me)) return;
+ if ((it->item->mode_view) || (it->generation < it->wd->generation)) return;
evas_event_freeze(evas_object_evas_get(it->wd->obj));
it->item->mode_view = edje_object_add(evas_object_evas_get(WIDGET(it)));
if (it->item->order_num_in & 0x1) strncat(buf, "_odd", sizeof(buf) - strlen(buf));
strncat(buf, "/", sizeof(buf) - strlen(buf));
- strncat(buf, it->wd->mode_item_style, sizeof(buf) - strlen(buf));
+ strncat(buf, it->itc->mode_item_style, sizeof(buf) - strlen(buf));
_elm_theme_object_set(WIDGET(it), it->item->mode_view, "genlist", buf,
elm_widget_style_get(WIDGET(it)));
evas_object_event_callback_add(it->item->mode_view, EVAS_CALLBACK_MOUSE_MOVE,
_mouse_move, it);
- /* label_get, icon_get, state_get */
+ /* text_get, content_get, state_get */
/* FIXME: If you see that assert, please notify us and we
will clean our mess */
- assert(eina_list_count(it->item->mode_icon_objs) == 0);
+ assert(eina_list_count(it->item->mode_content_objs) == 0);
- _item_label_realize(it, it->item->mode_view, &it->item->mode_labels);
- it->item->mode_icon_objs = _item_icon_realize(it,
- it->item->mode_view,
- &it->item->mode_icons);
- _item_state_realize(it, it->item->mode_view, &it->item->mode_states);
+ _item_text_realize(it, it->item->mode_view, &it->item->mode_texts, NULL);
+ it->item->mode_content_objs =
+ _item_content_realize(it, it->item->mode_view,
+ &it->item->mode_contents, NULL);
+ _item_state_realize(it, it->item->mode_view, &it->item->mode_states, NULL);
edje_object_part_swallow(it->item->mode_view,
edje_object_data_get(it->item->mode_view, "mode_part"),
_mode_item_unrealize(Elm_Gen_Item *it)
{
Widget_Data *wd = it->wd;
- Evas_Object *icon;
+ Evas_Object *content;
if (!it->item->mode_view) return;
evas_event_freeze(evas_object_evas_get(it->wd->obj));
- elm_widget_stringlist_free(it->item->mode_labels);
- it->item->mode_labels = NULL;
- elm_widget_stringlist_free(it->item->mode_icons);
- it->item->mode_icons = NULL;
+ elm_widget_stringlist_free(it->item->mode_texts);
+ it->item->mode_texts = NULL;
+ elm_widget_stringlist_free(it->item->mode_contents);
+ it->item->mode_contents = NULL;
elm_widget_stringlist_free(it->item->mode_states);
- EINA_LIST_FREE(it->item->mode_icon_objs, icon)
- evas_object_del(icon);
+ EINA_LIST_FREE(it->item->mode_content_objs, content)
+ evas_object_del(content);
edje_object_part_unswallow(it->item->mode_view, VIEW(it));
evas_object_smart_member_add(VIEW(it), wd->pan_smart);
char buf[1024];
wd->mode_item = it;
- it->item->nocache = EINA_TRUE;
+ it->item->nocache_once = EINA_TRUE;
if (wd->scr_hold_timer)
{
Elm_Gen_Item *it;
it = wd->mode_item;
- it->item->nocache = EINA_TRUE;
+ it->item->nocache_once = EINA_TRUE;
snprintf(buf, sizeof(buf), "elm,state,%s,passive", wd->mode_type);
snprintf(buf2, sizeof(buf2), "elm,state,%s,passive,finished", wd->mode_type);
}
static void
-_item_auto_scroll(Widget_Data *wd)
+_edit_mode_item_position(Elm_Gen_Item *it, int itx, int ity)
{
- if (!wd) return;
- Elm_Gen_Item *it;
- Eina_List *l;
- Evas_Coord ox, oy, ow, oh;
-
- if ((wd->expanded_item) && (wd->auto_scroll_enabled))
- {
- evas_object_geometry_get(wd->obj, &ox, &oy, &ow, &oh);
- if (wd->expanded_item->item->scrl_y > (oh + oy) / 2)
- {
- EINA_LIST_FOREACH(wd->expanded_item->item->items, l, it)
- elm_genlist_item_bring_in(it);
- }
- wd->auto_scroll_enabled = EINA_FALSE;
- }
+ if ((!it) || (!it->wd->edit_mode)) return;
+ evas_object_resize(it->edit_obj, it->item->w, it->item->h);
+ evas_object_move(it->edit_obj, itx, ity);
}
-EAPI Evas_Object *
-elm_genlist_add(Evas_Object *parent)
+static void
+_edit_mode_item_realize(Elm_Gen_Item *it, Eina_Bool effect_on)
{
- Evas_Object *obj;
- Evas *e;
+ char buf[1024];
+ const char *stacking_even;
+ const char *stacking;
+
+ if ((!it) || (it->item->edit_mode_item_realized) ||
+ (it->generation < it->wd->generation))
+ return;
+
+ it->edit_obj = edje_object_add(evas_object_evas_get(WIDGET(it)));
+ edje_object_scale_set(it->edit_obj, elm_widget_scale_get(WIDGET(it)) *
+ _elm_config->scale);
+ evas_object_smart_member_add(it->edit_obj, it->wd->pan_smart);
+ elm_widget_sub_object_add(WIDGET(it), it->edit_obj);
+
+ if (it->item->type & ELM_GENLIST_ITEM_TREE)
+ strncpy(buf, "tree", sizeof(buf));
+ else strncpy(buf, "item", sizeof(buf));
+ if (it->wd->compress)
+ strncat(buf, "_compress", sizeof(buf) - strlen(buf));
+
+ strncat(buf, "/", sizeof(buf) - strlen(buf));
+ strncat(buf, it->itc->edit_item_style, sizeof(buf) - strlen(buf));
+
+ _elm_theme_object_set(WIDGET(it), it->edit_obj, "genlist", buf,
+ elm_widget_style_get(WIDGET(it)));
+
+ stacking_even = edje_object_data_get(VIEW(it), "stacking_even");
+ if (!stacking_even) stacking_even = "above";
+ it->item->stacking_even = !!strcmp("above", stacking_even);
+
+ stacking = edje_object_data_get(VIEW(it), "stacking");
+ if (!stacking) stacking = "yes";
+ it->item->nostacking = !!strcmp("yes", stacking);
+
+ edje_object_mirrored_set(it->edit_obj,
+ elm_widget_mirrored_get(WIDGET(it)));
+
+ _elm_genlist_item_odd_even_update(it);
+ _elm_genlist_item_state_update(it, NULL);
+
+ if (effect_on) edje_object_signal_emit(it->edit_obj, "elm,state,edit,enabled,effect", "elm");
+ else edje_object_signal_emit(it->edit_obj, "elm,state,edit,enabled", "elm");
+
+ evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_DOWN,
+ _mouse_down, it);
+ evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_UP,
+ _mouse_up, it);
+ evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_MOVE,
+ _mouse_move, it);
+ evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_DOWN,
+ _multi_down, it);
+ evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_UP,
+ _multi_up, it);
+ evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MULTI_MOVE,
+ _multi_move, it);
+
+ _item_text_realize(it, it->edit_obj, &it->item->edit_texts, NULL);
+ if (it->flipped) edje_object_signal_emit(it->edit_obj, "elm,state,flip,enabled", "elm");
+ it->item->edit_content_objs =
+ _item_content_realize(it, it->edit_obj, &it->item->edit_contents, NULL);
+ _item_state_realize(it, it->edit_obj, &it->item->edit_states, NULL);
+ edje_object_part_swallow(it->edit_obj, "elm.swallow.edit.content", VIEW(it));
+
+ _edit_mode_item_position(it, it->item->scrl_x, it->item->scrl_y);
+ evas_object_show(it->edit_obj);
+
+ it->item->edit_mode_item_realized = EINA_TRUE;
+ it->want_unrealize = EINA_FALSE;
+}
+
+static void
+_edit_mode_item_unrealize(Elm_Gen_Item *it)
+{
+ Evas_Object *icon;
+ if ((!it) || (!it->item->edit_mode_item_realized)) return;
+
+ edje_object_part_unswallow(it->edit_obj, VIEW(it));
+ evas_object_smart_member_add(VIEW(it), it->wd->pan_smart);
+ elm_widget_sub_object_add(WIDGET(it), VIEW(it));
+ _elm_genlist_item_odd_even_update(it);
+ _elm_genlist_item_state_update(it, NULL);
+
+ evas_object_del(it->edit_obj);
+ it->edit_obj = NULL;
+ elm_widget_stringlist_free(it->item->edit_texts);
+ it->item->edit_texts = NULL;
+ elm_widget_stringlist_free(it->item->edit_contents);
+ it->item->edit_contents = NULL;
+ elm_widget_stringlist_free(it->item->edit_states);
+ it->item->edit_states = NULL;
+ EINA_LIST_FREE(it->item->edit_content_objs, icon)
+ evas_object_del(icon);
+ edje_object_message_signal_process(it->edit_obj);
+
+ evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_DOWN,
+ _mouse_down, it);
+ evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_UP,
+ _mouse_up, it);
+ evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MOUSE_MOVE,
+ _mouse_move, it);
+ evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_DOWN,
+ _multi_down, it);
+ evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_UP,
+ _multi_up, it);
+ evas_object_event_callback_del_full(it->edit_obj, EVAS_CALLBACK_MULTI_MOVE,
+ _multi_move, it);
+ it->item->edit_mode_item_realized = EINA_FALSE;
+}
+
+static void
+_item_auto_scroll(Widget_Data *wd)
+{
+ if (!wd) return;
+ Elm_Gen_Item *tmp_item = NULL;
+
+ if ((wd->expanded_item) && (wd->auto_scroll_enabled))
+ {
+ tmp_item = eina_list_data_get(eina_list_last(wd->expanded_item->item->items));
+ if (!tmp_item) return;
+ wd->show_item = tmp_item;
+ wd->bring_in = EINA_TRUE;
+ wd->scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
+ if ((wd->show_item->item->queued) || (!wd->show_item->item->mincalcd))
+ {
+ wd->show_item->item->showme = EINA_TRUE;
+ wd->auto_scroll_enabled = EINA_FALSE;
+ }
+ else
+ _scroll_item(wd);
+ }
+}
+
+EAPI Evas_Object *
+elm_genlist_add(Evas_Object *parent)
+{
+ Evas_Object *obj;
+ Evas *e;
Widget_Data *wd;
Evas_Coord minw, minh;
static Evas_Smart *smart = NULL;
ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
ELM_SET_WIDTYPE(widtype, "genlist");
+ ELM_GEN_SETUP(wd);
elm_widget_type_set(obj, "genlist");
elm_widget_sub_object_add(parent, obj);
elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
elm_widget_on_show_region_hook_set(obj, _show_region_hook, obj);
elm_widget_translate_hook_set(obj, _translate_hook);
+ wd->generation = 1;
wd->scr = elm_smart_scroller_add(e);
elm_smart_scroller_widget_set(wd->scr, obj);
elm_smart_scroller_object_theme_set(obj, wd->scr, "genlist", "base",
return obj;
}
+void
+_item_select(Elm_Gen_Item *it)
+{
+ if ((it->generation < it->wd->generation) || (it->mode_set) ||
+ (it->wd->select_mode == ELM_OBJECT_NO_SELECT))
+ return;
+ if (!it->selected)
+ {
+ it->selected = EINA_TRUE;
+ it->wd->selected = eina_list_append(it->wd->selected, it);
+ }
+ else if (it->wd->select_mode == ELM_OBJECT_ALWAYS_SELECT) return;
+
+ evas_object_ref(WIDGET(it));
+ it->walking++;
+ it->wd->walking++;
+ if (it->func.func) it->func.func((void *)it->func.data, WIDGET(it), it);
+ if (it->generation == it->wd->generation)
+ evas_object_smart_callback_call(WIDGET(it), SIG_SELECTED, it);
+ it->walking--;
+ it->wd->walking--;
+ evas_object_unref(WIDGET(it));
+ if ((it->wd->clear_me) && (!it->wd->walking))
+ _elm_genlist_clear(WIDGET(it), EINA_TRUE);
+ else
+ {
+ if ((!it->walking) && (it->generation < it->wd->generation))
+ {
+ if (!it->relcount)
+ {
+ it->del_cb(it);
+ elm_widget_item_free(it);
+ }
+ }
+ else
+ it->wd->last_selected_item = (Elm_Object_Item *)it;
+ }
+}
+
+static Evas_Object *
+_item_content_get_hook(Elm_Gen_Item *it, const char *part)
+{
+ return edje_object_part_swallow_get(VIEW(it), part);
+}
+
+static void
+_item_content_set_hook(Elm_Gen_Item *it, const char *part, Evas_Object *content)
+{
+ if (content && part)
+ {
+ it->content_objs = eina_list_append(it->content_objs, content);
+ edje_object_part_swallow(VIEW(it), part, content);
+ }
+}
+
+static Evas_Object *
+_item_content_unset_hook(Elm_Gen_Item *it, const char *part)
+{
+ Evas_Object *obj;
+ obj = edje_object_part_swallow_get(VIEW(it), part);
+ if (!obj) return NULL;
+ it->content_objs = eina_list_remove(it->content_objs, obj);
+ edje_object_part_unswallow(VIEW(it), obj);
+ return obj;
+}
+
+static const char *
+_item_text_hook(Elm_Gen_Item *it, const char *part)
+{
+ if (!it->itc->func.text_get) return NULL;
+ return edje_object_part_text_get(VIEW(it), part);
+}
+
+static void
+_item_disable_hook(Elm_Object_Item *it)
+{
+ Eina_List *l;
+ Evas_Object *obj;
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+
+ if (_it->generation < _it->wd->generation) return;
+
+ if (_it->selected)
+ elm_genlist_item_selected_set(it, EINA_FALSE);
+
+ if (_it->realized)
+ {
+ if (elm_widget_item_disabled_get(it))
+ {
+ edje_object_signal_emit(VIEW(_it), "elm,state,disabled", "elm");
+ if (_it->edit_obj)
+ edje_object_signal_emit(_it->edit_obj, "elm,state,disabled", "elm");
+ }
+ else
+ {
+ edje_object_signal_emit(VIEW(_it), "elm,state,enabled", "elm");
+ if (_it->edit_obj)
+ edje_object_signal_emit(_it->edit_obj, "elm,state,enabled", "elm");
+ }
+ EINA_LIST_FOREACH(_it->content_objs, l, obj)
+ elm_widget_disabled_set(obj, elm_widget_item_disabled_get(_it));
+ }
+}
+
+static Eina_Bool
+_item_del_pre_hook(Elm_Object_Item *it)
+{
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+
+ if ((_it->relcount > 0) || (_it->walking > 0))
+ {
+ elm_genlist_item_subitems_clear(it);
+ if (_it->wd->show_item == _it) _it->wd->show_item = NULL;
+ _elm_genlist_item_del_notserious(_it);
+ if (_it->item->block)
+ {
+ if (_it->realized) _elm_genlist_item_unrealize(_it, EINA_FALSE);
+ _it->item->block->changed = EINA_TRUE;
+ 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->parent)
+ {
+ _it->parent->item->items =
+ eina_list_remove(_it->parent->item->items, it);
+ _it->parent = NULL;
+ }
+ return EINA_FALSE;
+ }
+ _item_del(_it);
+ return EINA_TRUE;
+}
+
+Elm_Gen_Item *
+_elm_genlist_item_new(Widget_Data *wd,
+ const Elm_Gen_Item_Class *itc,
+ const void *data,
+ Elm_Gen_Item *parent,
+ Evas_Smart_Cb func,
+ const void *func_data)
+{
+ Elm_Gen_Item *it;
+
+ it = elm_widget_item_new(wd->obj, Elm_Gen_Item);
+ if (!it) return NULL;
+ it->wd = wd;
+ it->generation = wd->generation;
+ it->itc = itc;
+ elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc);
+ it->base.data = data;
+ it->parent = parent;
+ it->func.func = func;
+ it->func.data = func_data;
+ elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
+ elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
+ elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
+ elm_widget_item_text_get_hook_set(it, _item_text_hook);
+ elm_widget_item_disable_hook_set(it, _item_disable_hook);
+ elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
+ /* TEMPORARY */
+ it->sel_cb = (Ecore_Cb)_item_select;
+
+ return it;
+}
+
static Elm_Gen_Item *
_item_new(Widget_Data *wd,
const Elm_Genlist_Item_Class *itc,
const void *data,
Elm_Gen_Item *parent,
- Elm_Genlist_Item_Flags flags,
+ Elm_Genlist_Item_Type type,
Evas_Smart_Cb func,
const void *func_data)
{
- Elm_Gen_Item *it;
+ Elm_Gen_Item *it, *it2;
+ int depth = 0;
- it = elm_gen_item_new(wd, itc, data, parent, func, func_data);
+ it = _elm_genlist_item_new(wd, itc, data, parent, func, func_data);
if (!it) return NULL;
it->item = ELM_NEW(Elm_Gen_Item_Type);
- it->item->flags = flags;
- if (flags & ELM_GENLIST_ITEM_GROUP) it->group++;
+ it->item->type = type;
+ if (type & ELM_GENLIST_ITEM_GROUP) it->group++;
it->item->expanded_depth = 0;
- elm_widget_item_del_cb_set(it, _item_del_hook);
+ ELM_GEN_ITEM_SETUP(it);
if (it->parent)
{
if (it->parent->group)
else if (it->parent->item->group_item)
it->item->group_item = it->parent->item->group_item;
}
+ for (it2 = it, depth = 0; it2->parent; it2 = it2->parent)
+ {
+ if (!it2->parent->group) depth += 1;
+ }
+ it->item->expanded_depth = depth;
+ wd->item_count++;
return it;
}
-static void
-_item_block_add(Widget_Data *wd,
+static Item_Block *
+_item_block_new(Widget_Data *wd, Eina_Bool prepend)
+{
+ Item_Block *itb;
+
+ itb = calloc(1, sizeof(Item_Block));
+ if (!itb) return NULL;
+ itb->wd = wd;
+ if (prepend)
+ {
+ wd->blocks = eina_inlist_prepend(wd->blocks, EINA_INLIST_GET(itb));
+ _item_block_position_update(wd->blocks, 0);
+ }
+ else
+ {
+ wd->blocks = eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
+ itb->position_update = EINA_TRUE;
+ if (wd->blocks != EINA_INLIST_GET(itb))
+ {
+ itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
+ }
+ else
+ {
+ itb->position = 0;
+ }
+ }
+ return itb;
+}
+
+static Eina_Bool
+_item_block_add(Widget_Data *wd,
Elm_Gen_Item *it)
{
Item_Block *itb = NULL;
if (it->item->rel)
{
itb = calloc(1, sizeof(Item_Block));
- if (!itb) return;
+ if (!itb) return EINA_FALSE;
itb->wd = wd;
if (!it->item->rel->item->block)
{
wd->blocks =
eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
itb->items = eina_list_append(itb->items, it);
+ itb->position_update = EINA_TRUE;
+ it->position = eina_list_count(itb->items);
+ it->position_update = EINA_TRUE;
+
+ if (wd->blocks != EINA_INLIST_GET(itb))
+ {
+ itb->position = ((Item_Block *) (EINA_INLIST_GET(itb)->prev))->position + 1;
+ }
+ else
+ {
+ itb->position = 0;
+ }
}
else
{
+ Eina_List *tmp;
+
+ tmp = eina_list_data_find_list(itb->items, it->item->rel);
if (it->item->before)
{
wd->blocks = eina_inlist_prepend_relative
(wd->blocks, EINA_INLIST_GET(itb),
EINA_INLIST_GET(it->item->rel->item->block));
itb->items =
- eina_list_prepend_relative(itb->items, it, it->item->rel);
+ eina_list_prepend_relative_list(itb->items, it, tmp);
+
+ /* Update index from where we prepended */
+ _item_position_update(eina_list_prev(tmp), it->item->rel->position);
+ _item_block_position_update(EINA_INLIST_GET(itb),
+ it->item->rel->item->block->position);
}
else
{
(wd->blocks, EINA_INLIST_GET(itb),
EINA_INLIST_GET(it->item->rel->item->block));
itb->items =
- eina_list_append_relative(itb->items, it, it->item->rel);
+ eina_list_append_relative_list(itb->items, it, tmp);
+
+ /* Update block index from where we appended */
+ _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
+ _item_block_position_update(EINA_INLIST_GET(itb),
+ it->item->rel->item->block->position + 1);
}
}
}
itb = (Item_Block *)(wd->blocks);
if (itb->count >= wd->max_items_per_block)
{
- itb = calloc(1, sizeof(Item_Block));
- if (!itb) return;
- itb->wd = wd;
- wd->blocks =
- eina_inlist_prepend(wd->blocks,
- EINA_INLIST_GET(itb));
+ itb = _item_block_new(wd, EINA_TRUE);
+ if (!itb) return EINA_FALSE;
}
}
else
{
- itb = calloc(1, sizeof(Item_Block));
- if (!itb) return;
- itb->wd = wd;
- wd->blocks =
- eina_inlist_prepend(wd->blocks, EINA_INLIST_GET(itb));
+ itb = _item_block_new(wd, EINA_TRUE);
+ if (!itb) return EINA_FALSE;
}
itb->items = eina_list_prepend(itb->items, it);
+
+ _item_position_update(itb->items, 0);
}
else
{
itb = (Item_Block *)(wd->blocks->last);
if (itb->count >= wd->max_items_per_block)
{
- itb = calloc(1, sizeof(Item_Block));
- if (!itb) return;
- itb->wd = wd;
- wd->blocks =
- eina_inlist_append(wd->blocks,
- EINA_INLIST_GET(itb));
+ itb = _item_block_new(wd, EINA_FALSE);
+ if (!itb) return EINA_FALSE;
}
}
else
{
- itb = calloc(1, sizeof(Item_Block));
- if (!itb) return;
- itb->wd = wd;
- wd->blocks =
- eina_inlist_append(wd->blocks, EINA_INLIST_GET(itb));
+ itb = _item_block_new(wd, EINA_FALSE);
+ if (!itb) return EINA_FALSE;
}
itb->items = eina_list_append(itb->items, it);
+ it->position = eina_list_count(itb->items);
}
}
}
else
{
+ Eina_List *tmp;
+
+ if (it->item->rel->item->queued)
+ {
+ /* NOTE: for a strange reason eina_list and eina_inlist don't have the same property
+ on sorted insertion order, so the queue is not always ordered like the item list.
+ This lead to issue where we depend on an item that is not yet created. As a quick
+ work around, we reschedule the calc of the item and stop reordering the list to
+ prevent any nasty issue to show up here.
+ */
+ wd->queue = eina_list_append(wd->queue, it);
+ wd->requeued = EINA_TRUE;
+ it->item->queued = EINA_TRUE;
+ return EINA_FALSE;
+ }
itb = it->item->rel->item->block;
if (!itb) goto newblock;
+ tmp = eina_list_data_find_list(itb->items, it->item->rel);
if (it->item->before)
- itb->items = eina_list_prepend_relative(itb->items, it, it->item->rel);
+ {
+ itb->items = eina_list_prepend_relative_list(itb->items, it, tmp);
+ _item_position_update(eina_list_prev(tmp), it->item->rel->position);
+ }
else
- itb->items = eina_list_append_relative(itb->items, it, it->item->rel);
+ {
+ itb->items = eina_list_append_relative_list(itb->items, it, tmp);
+ _item_position_update(eina_list_next(tmp), it->item->rel->position + 1);
+ }
}
itb->count++;
itb->changed = EINA_TRUE;
if (it->item->rel)
{
it->item->rel->relcount--;
- if ((it->item->rel->delete_me) && (!it->item->rel->relcount))
- _item_del(it->item->rel);
+ if ((it->item->rel->generation < it->wd->generation) && (!it->item->rel->relcount))
+ {
+ _item_del(it->item->rel);
+ elm_widget_item_free(it->item->rel);
+ }
it->item->rel = NULL;
}
if (itb->count > itb->wd->max_items_per_block)
{
- int newc;
Item_Block *itb2;
Elm_Gen_Item *it2;
+ int newc;
+ Eina_Bool done = EINA_FALSE;
newc = itb->count / 2;
- itb2 = calloc(1, sizeof(Item_Block));
- if (!itb2) return;
- itb2->wd = wd;
- wd->blocks =
- eina_inlist_append_relative(wd->blocks, EINA_INLIST_GET(itb2),
- EINA_INLIST_GET(itb));
- itb2->changed = EINA_TRUE;
- while ((itb->count > newc) && (itb->items))
+
+ if (EINA_INLIST_GET(itb)->prev)
{
- Eina_List *l;
+ Item_Block *itbp = (Item_Block *)(EINA_INLIST_GET(itb)->prev);
+
+ if (itbp->count + newc < wd->max_items_per_block / 2)
+ {
+ /* moving items to previous block */
+ while ((itb->count > newc) && (itb->items))
+ {
+ it2 = eina_list_data_get(itb->items);
+ itb->items = eina_list_remove_list(itb->items, itb->items);
+ itb->count--;
+
+ itbp->items = eina_list_append(itbp->items, it2);
+ it2->item->block = itbp;
+ itbp->count++;
+ }
+
+ done = EINA_TRUE;
+ }
+ }
+
+ if (!done && EINA_INLIST_GET(itb)->next)
+ {
+ Item_Block *itbn = (Item_Block *)(EINA_INLIST_GET(itb)->next);
+
+ if (itbn->count + newc < wd->max_items_per_block / 2)
+ {
+ /* moving items to next block */
+ while ((itb->count > newc) && (itb->items))
+ {
+ Eina_List *l;
+
+ l = eina_list_last(itb->items);
+ it2 = eina_list_data_get(l);
+ itb->items = eina_list_remove_list(itb->items, l);
+ itb->count--;
+
+ itbn->items = eina_list_prepend(itbn->items, it2);
+ it2->item->block = itbn;
+ itbn->count++;
+ }
+
+ done = EINA_TRUE;
+ }
+ }
- l = eina_list_last(itb->items);
- it2 = l->data;
- itb->items = eina_list_remove_list(itb->items, l);
- itb->count--;
+ if (!done)
+ {
+ /* moving items to new block */
+ itb2 = calloc(1, sizeof(Item_Block));
+ if (!itb2) return EINA_FALSE;
+ itb2->wd = wd;
+ wd->blocks =
+ eina_inlist_append_relative(wd->blocks, EINA_INLIST_GET(itb2),
+ EINA_INLIST_GET(itb));
+ itb2->changed = EINA_TRUE;
+ while ((itb->count > newc) && (itb->items))
+ {
+ Eina_List *l;
+
+ l = eina_list_last(itb->items);
+ it2 = l->data;
+ itb->items = eina_list_remove_list(itb->items, l);
+ itb->count--;
- itb2->items = eina_list_prepend(itb2->items, it2);
- it2->item->block = itb2;
- itb2->count++;
+ itb2->items = eina_list_prepend(itb2->items, it2);
+ it2->item->block = itb2;
+ itb2->count++;
+ }
}
}
+
+ return EINA_TRUE;
}
static int
Eina_Bool showme = EINA_FALSE;
double t0, t;
- t0 = ecore_time_get();
+ t0 = ecore_loop_time_get();
//evas_event_freeze(evas_object_evas_get(wd->obj));
for (n = 0; (wd->queue) && (n < 128); n++)
{
Elm_Gen_Item *it;
- it = wd->queue->data;
+ it = eina_list_data_get(wd->queue);
wd->queue = eina_list_remove_list(wd->queue, wd->queue);
it->item->queued = EINA_FALSE;
- _item_block_add(wd, it);
+ if (!_item_block_add(wd, it)) continue;
+ if (!wd->blocks)
+ _item_block_realize(it->item->block);
t = ecore_time_get();
if (it->item->block->changed)
{
showme = _item_block_recalc(it->item->block, it->item->block->num, EINA_TRUE);
it->item->block->changed = 0;
+ if (wd->pan_changed)
+ {
+ if (wd->calc_job) ecore_job_del(wd->calc_job);
+ wd->calc_job = NULL;
+ _calc_job(wd);
+ wd->pan_changed = EINA_FALSE;
+ }
}
if (showme) it->item->block->showme = EINA_TRUE;
- if (eina_inlist_count(wd->blocks) > 1)
+ /* same as eina_inlist_count > 1 */
+ if (wd->blocks && wd->blocks->next)
{
if ((t - t0) > (ecore_animator_frametime_get())) break;
}
}
static void
-_item_queue(Widget_Data *wd,
- Elm_Gen_Item *it)
+_item_queue(Widget_Data *wd,
+ Elm_Gen_Item *it,
+ Eina_Compare_Cb cb)
{
if (it->item->queued) return;
it->item->queued = EINA_TRUE;
- wd->queue = eina_list_append(wd->queue, it);
+ if (cb && !wd->requeued)
+ wd->queue = eina_list_sorted_insert(wd->queue, cb, it);
+ else
+ wd->queue = eina_list_append(wd->queue, it);
// FIXME: why does a freeze then thaw here cause some genlist
// elm_genlist_item_append() to be much much slower?
// evas_event_freeze(evas_object_evas_get(wd->obj));
}
static int
-_elm_genlist_item_compare_data(const void *data, const void *data1)
-{
- const Elm_Gen_Item *it = data;
- const Elm_Gen_Item *item1 = data1;
-
- return _elm_genlist_item_compare_data_cb(it->base.data, item1->base.data);
-}
-
-static int
_elm_genlist_item_compare(const void *data, const void *data1)
{
const Elm_Gen_Item *it, *item1;
- it = ELM_GENLIST_ITEM_FROM_INLIST(data);
- item1 = ELM_GENLIST_ITEM_FROM_INLIST(data1);
- return _elm_genlist_item_compare_cb(it, item1);
+ it = ELM_GEN_ITEM_FROM_INLIST(data);
+ item1 = ELM_GEN_ITEM_FROM_INLIST(data1);
+ return it->wd->item_compare_cb(it, item1);
}
static int
{
const Elm_Gen_Item *it = data;
const Elm_Gen_Item *item1 = data1;
- return _elm_genlist_item_compare_cb(it, item1);
+ return it->wd->item_compare_cb(it, item1);
}
static void
it->item->rel->relcount++;
it->item->before = EINA_FALSE;
if (after->item->group_item) it->item->group_item = after->item->group_item;
- _item_queue(it->wd, it);
+ _item_queue(it->wd, it, NULL);
evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
}
it->item->rel->relcount++;
it->item->before = EINA_TRUE;
if (before->item->group_item) it->item->group_item = before->item->group_item;
- _item_queue(it->wd, it);
+ _item_queue(it->wd, it, NULL);
evas_object_smart_callback_call(WIDGET(it), SIG_MOVED, it);
}
-EAPI Elm_Gen_Item *
+EAPI unsigned int
+elm_genlist_items_count(const Evas_Object *obj)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) 0;
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return 0;
+ return wd->item_count;
+}
+
+EAPI Elm_Object_Item *
elm_genlist_item_append(Evas_Object *obj,
const Elm_Genlist_Item_Class *itc,
const void *data,
- Elm_Gen_Item *parent,
- Elm_Genlist_Item_Flags flags,
+ Elm_Object_Item *parent,
+ Elm_Genlist_Item_Type type,
Evas_Smart_Cb func,
const void *func_data)
{
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return NULL;
- Elm_Gen_Item *it = _item_new(wd, itc, data, parent, flags, func,
- func_data);
+ Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
+ func, func_data);
if (!it) return NULL;
if (!it->parent)
{
- if (flags & ELM_GENLIST_ITEM_GROUP)
+ if (it->group)
wd->group_items = eina_list_append(wd->group_items, it);
wd->items = eina_inlist_append(wd->items, EINA_INLIST_GET(it));
it->item->rel = NULL;
it->item->rel->relcount++;
}
it->item->before = EINA_FALSE;
- _item_queue(wd, it);
- return it;
+ _item_queue(wd, it, NULL);
+ return (Elm_Object_Item *)it;
}
-EAPI Elm_Gen_Item *
+EAPI Elm_Object_Item *
elm_genlist_item_prepend(Evas_Object *obj,
const Elm_Genlist_Item_Class *itc,
const void *data,
- Elm_Gen_Item *parent,
- Elm_Genlist_Item_Flags flags,
+ Elm_Object_Item *parent,
+ Elm_Genlist_Item_Type type,
Evas_Smart_Cb func,
const void *func_data)
{
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return NULL;
- Elm_Gen_Item *it = _item_new(wd, itc, data, parent, flags, func,
- func_data);
+ Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
+ func, func_data);
if (!it) return NULL;
if (!it->parent)
{
- if (flags & ELM_GENLIST_ITEM_GROUP)
+ if (it->group)
wd->group_items = eina_list_prepend(wd->group_items, it);
wd->items = eina_inlist_prepend(wd->items, EINA_INLIST_GET(it));
it->item->rel = NULL;
it->item->rel->relcount++;
}
it->item->before = EINA_TRUE;
- _item_queue(wd, it);
- return it;
+ _item_queue(wd, it, NULL);
+ return (Elm_Object_Item *)it;
}
-EAPI Elm_Gen_Item *
+EAPI Elm_Object_Item *
elm_genlist_item_insert_after(Evas_Object *obj,
const Elm_Genlist_Item_Class *itc,
const void *data,
- Elm_Gen_Item *parent,
- Elm_Gen_Item *after,
- Elm_Genlist_Item_Flags flags,
+ Elm_Object_Item *parent,
+ Elm_Object_Item *after,
+ Elm_Genlist_Item_Type type,
Evas_Smart_Cb func,
const void *func_data)
{
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
- EINA_SAFETY_ON_NULL_RETURN_VAL(after, NULL);
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
Widget_Data *wd = elm_widget_data_get(obj);
+ Elm_Gen_Item *_after = (Elm_Gen_Item *) after;
if (!wd) return NULL;
- Elm_Gen_Item *it = _item_new(wd, itc, data, parent, flags, func,
- func_data);
- if (!it) return NULL;
/* It makes no sense to insert after in an empty list with after != NULL, something really bad is happening in your app. */
EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
+ Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
+ func, func_data);
+ if (!it) return NULL;
if (!it->parent)
{
- if ((flags & ELM_GENLIST_ITEM_GROUP) &&
- (after->item->flags & ELM_GENLIST_ITEM_GROUP))
+ if ((it->group) && (_after->group))
wd->group_items = eina_list_append_relative(wd->group_items, it,
- after);
+ _after);
}
else
{
- it->parent->item->items = eina_list_append_relative(it->parent->item->items, it,
- after);
+ it->parent->item->items =
+ eina_list_append_relative(it->parent->item->items, it, _after);
}
wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
- EINA_INLIST_GET(after));
- it->item->rel = after;
+ EINA_INLIST_GET(_after));
+ it->item->rel = _after;
it->item->rel->relcount++;
it->item->before = EINA_FALSE;
- _item_queue(wd, it);
- return it;
+ _item_queue(wd, it, NULL);
+ return (Elm_Object_Item *)it;
}
-EAPI Elm_Gen_Item *
+EAPI Elm_Object_Item *
elm_genlist_item_insert_before(Evas_Object *obj,
const Elm_Genlist_Item_Class *itc,
const void *data,
- Elm_Gen_Item *parent,
- Elm_Gen_Item *before,
- Elm_Genlist_Item_Flags flags,
+ Elm_Object_Item *parent,
+ Elm_Object_Item *before,
+ Elm_Genlist_Item_Type type,
Evas_Smart_Cb func,
const void *func_data)
{
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
- EINA_SAFETY_ON_NULL_RETURN_VAL(before, NULL);
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
Widget_Data *wd = elm_widget_data_get(obj);
+ Elm_Gen_Item *_before = (Elm_Gen_Item *) before;
if (!wd) return NULL;
- Elm_Gen_Item *it = _item_new(wd, itc, data, parent, flags, func,
- func_data);
- if (!it) return NULL;
/* It makes no sense to insert before in an empty list with before != NULL, something really bad is happening in your app. */
EINA_SAFETY_ON_NULL_RETURN_VAL(wd->items, NULL);
+ Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
+ func, func_data);
+ if (!it) return NULL;
if (!it->parent)
{
- if ((flags & ELM_GENLIST_ITEM_GROUP) &&
- (before->item->flags & ELM_GENLIST_ITEM_GROUP))
+ if (it->group && _before->group)
wd->group_items = eina_list_prepend_relative(wd->group_items, it,
- before);
+ _before);
}
else
{
- it->parent->item->items = eina_list_prepend_relative(it->parent->item->items, it,
- before);
+ it->parent->item->items =
+ eina_list_prepend_relative(it->parent->item->items, it, _before);
}
wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
- EINA_INLIST_GET(before));
- it->item->rel = before;
+ EINA_INLIST_GET(_before));
+ it->item->rel = _before;
it->item->rel->relcount++;
it->item->before = EINA_TRUE;
- _item_queue(wd, it);
- return it;
+ _item_queue(wd, it, NULL);
+ return (Elm_Object_Item *)it;
}
-EAPI Elm_Gen_Item *
-elm_genlist_item_direct_sorted_insert(Evas_Object *obj,
- const Elm_Genlist_Item_Class *itc,
- const void *data,
- Elm_Gen_Item *parent,
- Elm_Genlist_Item_Flags flags,
- Eina_Compare_Cb comp,
- Evas_Smart_Cb func,
- const void *func_data)
+EAPI Elm_Object_Item *
+elm_genlist_item_sorted_insert(Evas_Object *obj,
+ const Elm_Genlist_Item_Class *itc,
+ const void *data,
+ Elm_Object_Item *parent,
+ Elm_Genlist_Item_Type type,
+ Eina_Compare_Cb comp,
+ Evas_Smart_Cb func,
+ const void *func_data)
{
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return NULL;
Elm_Gen_Item *rel = NULL;
- Elm_Gen_Item *it = _item_new(wd, itc, data, parent, flags, func,
- func_data);
+ Elm_Gen_Item *it = _item_new(wd, itc, data, (Elm_Gen_Item *) parent, type,
+ func, func_data);
if (!it) return NULL;
- _elm_genlist_item_compare_cb = comp;
+ wd->item_compare_cb = comp;
if (it->parent)
{
int cmp_result;
l = eina_list_search_sorted_near_list(it->parent->item->items,
- _elm_genlist_item_list_compare, it,
+ _elm_genlist_item_list_compare,
+ it,
&cmp_result);
if (l)
rel = eina_list_data_get(l);
if (!wd->state)
{
wd->state = eina_inlist_sorted_state_new();
+ eina_inlist_sorted_state_init(wd->state, wd->items);
+ wd->requeued = EINA_FALSE;
}
- if (flags & ELM_GENLIST_ITEM_GROUP)
+ if (it->group)
wd->group_items = eina_list_append(wd->group_items, it);
wd->items = eina_inlist_sorted_state_insert(wd->items, EINA_INLIST_GET(it),
if (EINA_INLIST_GET(it)->next)
{
- rel = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
+ rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
it->item->before = EINA_TRUE;
}
else if (EINA_INLIST_GET(it)->prev)
{
- rel = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
+ rel = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
it->item->before = EINA_FALSE;
}
}
it->item->rel->relcount++;
}
- _item_queue(wd, it);
+ _item_queue(wd, it, _elm_genlist_item_list_compare);
- return it;
+ return (Elm_Object_Item *)it;
}
-EAPI Elm_Gen_Item *
-elm_genlist_item_sorted_insert(Evas_Object *obj,
- const Elm_Genlist_Item_Class *itc,
- const void *data,
- Elm_Gen_Item *parent,
- Elm_Genlist_Item_Flags flags,
- Eina_Compare_Cb comp,
- Evas_Smart_Cb func,
- const void *func_data)
+static void
+_elm_genlist_clear(Evas_Object *obj, Eina_Bool standby)
{
- _elm_genlist_item_compare_data_cb = comp;
+ Eina_Inlist *next, *l;
- return elm_genlist_item_direct_sorted_insert(obj, itc, data, parent, flags,
- _elm_genlist_item_compare_data, func, func_data);
-}
-
-EAPI void
-elm_genlist_clear(Evas_Object *obj)
-{
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
+
+ if (!standby) wd->generation++;
+
if (wd->state)
{
eina_inlist_sorted_state_free(wd->state);
wd->state = NULL;
}
+
if (wd->walking > 0)
{
- Elm_Gen_Item *it;
-
wd->clear_me = EINA_TRUE;
- EINA_INLIST_FOREACH(wd->items, it)
- {
- it->delete_me = EINA_TRUE;
- }
return;
}
evas_event_freeze(evas_object_evas_get(wd->obj));
- while (wd->items)
+ for (l = wd->items, next = l ? l->next : NULL;
+ l;
+ l = next, next = next ? next->next : NULL)
{
- Elm_Gen_Item *it = ELM_GENLIST_ITEM_FROM_INLIST(wd->items);
+ Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(l);
- if (wd->anchor_item == it)
+ if (it->generation < wd->generation)
{
- wd->anchor_item = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
- if (!wd->anchor_item)
- wd->anchor_item =
- ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
+ Elm_Gen_Item *itn = NULL;
+
+ if (next) itn = ELM_GEN_ITEM_FROM_INLIST(next);
+ if (itn) itn->walking++; /* prevent early death of subitem */
+ it->del_cb(it);
+ elm_widget_item_free(it);
+ if (itn) itn->walking--;
}
- wd->items = eina_inlist_remove(wd->items, wd->items);
- if (it->item->flags & ELM_GENLIST_ITEM_GROUP)
- it->wd->group_items = eina_list_remove(it->wd->group_items, it);
- elm_widget_item_pre_notify_del(it);
- if (it->realized) elm_gen_item_unrealize(it, EINA_FALSE, (Ecore_Cb)_item_unrealize_cb);
- if (((wd->clear_me) || (!it->delete_me)) && (it->itc->func.del))
- it->itc->func.del((void *)it->base.data, WIDGET(it));
- if (it->long_timer) ecore_timer_del(it->long_timer);
- if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer);
- free(it->item);
- elm_widget_item_del(it);
}
wd->clear_me = EINA_FALSE;
- wd->anchor_item = NULL;
- while (wd->blocks)
- {
- Item_Block *itb = (Item_Block *)(wd->blocks);
-
- wd->blocks = eina_inlist_remove(wd->blocks, wd->blocks);
- if (itb->items) eina_list_free(itb->items);
- free(itb);
- }
+ wd->pan_changed = EINA_TRUE;
if (wd->calc_job)
{
ecore_job_del(wd->calc_job);
wd->calc_job = NULL;
}
- if (wd->queue_idle_enterer)
- {
- ecore_idle_enterer_del(wd->queue_idle_enterer);
- wd->queue_idle_enterer = NULL;
- }
- if (wd->must_recalc_idler)
- {
- ecore_idler_del(wd->must_recalc_idler);
- wd->must_recalc_idler = NULL;
- }
- if (wd->queue)
- {
- eina_list_free(wd->queue);
- wd->queue = NULL;
- }
- if (wd->selected)
- {
- eina_list_free(wd->selected);
- wd->selected = NULL;
- }
- if (wd->reorder_move_animator)
- {
- ecore_animator_del(wd->reorder_move_animator);
- wd->reorder_move_animator = NULL;
- }
- wd->show_item = NULL;
+ if (wd->selected) wd->selected = eina_list_free(wd->selected);
+ if (wd->clear_cb) wd->clear_cb(wd);
wd->pan_x = 0;
wd->pan_y = 0;
- wd->reorder_old_pan_y = 0;
wd->minw = 0;
wd->minh = 0;
+
+ if (wd->alpha_bg) evas_object_del(wd->alpha_bg);
+ wd->alpha_bg = NULL;
+
if (wd->pan_smart)
{
evas_object_size_hint_min_set(wd->pan_smart, wd->minw, wd->minh);
evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
}
- _sizing_eval(obj);
+ if (wd->sizing_cb) wd->sizing_cb(wd->obj);
elm_smart_scroller_child_region_show(wd->scr, 0, 0, 0, 0);
evas_event_thaw(evas_object_evas_get(wd->obj));
evas_event_thaw_eval(evas_object_evas_get(wd->obj));
}
EAPI void
+elm_genlist_clear(Evas_Object *obj)
+{
+ _elm_genlist_clear(obj, EINA_FALSE);
+}
+
+EAPI void
elm_genlist_multi_select_set(Evas_Object *obj,
Eina_Bool multi)
{
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
- wd->multi = multi;
+ wd->multi = !!multi;
}
EAPI Eina_Bool
return wd->multi;
}
-EAPI Elm_Gen_Item *
+EAPI Elm_Object_Item *
elm_genlist_selected_item_get(const Evas_Object *obj)
{
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
Eina_List *l;
Elm_Gen_Item *it;
- done = 1;
+ done = EINA_TRUE;
EINA_LIST_FOREACH(itb->items, l, it)
{
if (it->realized) list = eina_list_append(list, it);
return list;
}
-EAPI Elm_Gen_Item *
+EAPI Elm_Object_Item *
elm_genlist_at_xy_item_get(const Evas_Object *obj,
Evas_Coord x,
Evas_Coord y,
*posret = 1;
else *posret = 0;
}
- return it;
+ return (Elm_Object_Item *)it;
}
lasty = ity + it->item->h;
}
return NULL;
}
-EAPI Elm_Gen_Item *
+EAPI Elm_Object_Item *
elm_genlist_first_item_get(const Evas_Object *obj)
{
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return NULL;
if (!wd->items) return NULL;
- Elm_Gen_Item *it = ELM_GENLIST_ITEM_FROM_INLIST(wd->items);
- while ((it) && (it->delete_me))
- it = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
- return it;
+ Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items);
+ while ((it) && (it->generation < wd->generation))
+ it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
+ return (Elm_Object_Item *)it;
}
-EAPI Elm_Gen_Item *
+EAPI Elm_Object_Item *
elm_genlist_last_item_get(const Evas_Object *obj)
{
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return NULL;
if (!wd->items) return NULL;
- Elm_Gen_Item *it = ELM_GENLIST_ITEM_FROM_INLIST(wd->items->last);
- while ((it) && (it->delete_me))
- it = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
- return it;
+ Elm_Gen_Item *it = ELM_GEN_ITEM_FROM_INLIST(wd->items->last);
+ while ((it) && (it->generation < wd->generation))
+ it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
+ return (Elm_Object_Item *)it;
}
-EAPI Elm_Gen_Item *
-elm_genlist_item_next_get(const Elm_Gen_Item *it)
+EAPI Elm_Object_Item *
+elm_genlist_item_next_get(const Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);
- while (it)
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+ while (_it)
{
- it = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
- if ((it) && (!it->delete_me)) break;
+ _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->next);
+ if ((_it) && (_it->generation == _it->wd->generation)) break;
}
- return (Elm_Gen_Item *)it;
+ return (Elm_Object_Item *) _it;
}
-EAPI Elm_Gen_Item *
-elm_genlist_item_prev_get(const Elm_Gen_Item *it)
+EAPI Elm_Object_Item *
+elm_genlist_item_prev_get(const Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);
- while (it)
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+ while (_it)
{
- it = ELM_GENLIST_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
- if ((it) && (!it->delete_me)) break;
+ _it = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(_it)->prev);
+ if ((_it) && (_it->generation == _it->wd->generation)) break;
}
- return (Elm_Gen_Item *)it;
-}
-
-EAPI Evas_Object *
-elm_genlist_item_genlist_get(const Elm_Gen_Item *it)
-{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);
- return WIDGET(it);
+ return (Elm_Object_Item *) _it;
}
-EAPI Elm_Gen_Item *
-elm_genlist_item_parent_get(const Elm_Gen_Item *it)
+EAPI Elm_Object_Item *
+elm_genlist_item_parent_get(const Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);
- return it->parent;
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
+ return (Elm_Object_Item *) ((Elm_Gen_Item *)it)->parent;
}
EAPI void
-elm_genlist_item_subitems_clear(Elm_Gen_Item *it)
+elm_genlist_item_subitems_clear(Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- Eina_List *tl = NULL, *l;
- Elm_Gen_Item *it2;
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Widget_Data *wd = elm_widget_data_get(WIDGET(it));
+ if (!wd) return;
+ Elm_Gen_Item *_it = (Elm_Gen_Item *) it;
- EINA_LIST_FOREACH(it->item->items, l, it2)
- tl = eina_list_append(tl, it2);
- EINA_LIST_FREE(tl, it2)
- elm_genlist_item_del(it2);
+ if (!wd->tree_effect_enabled || !wd->move_effect_mode)
+ _item_subitems_clear(_it);
+ else
+ {
+ if (!wd->item_moving_effect_timer)
+ {
+ wd->expanded_item = _it;
+ _item_tree_effect_before(_it);
+ evas_object_raise(wd->alpha_bg);
+ evas_object_show(wd->alpha_bg);
+ wd->start_time = ecore_time_get();
+ wd->item_moving_effect_timer = ecore_animator_add(_item_moving_effect_timer_cb, wd);
+ }
+ else
+ _item_subitems_clear(_it);
+ }
}
EAPI void
-elm_genlist_item_selected_set(Elm_Gen_Item *it,
- Eina_Bool selected)
+elm_genlist_item_selected_set(Elm_Object_Item *it,
+ Eina_Bool selected)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- Widget_Data *wd = it->wd;
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+ Widget_Data *wd = _it->wd;
if (!wd) return;
- if ((it->delete_me) || (it->disabled)) return;
+ if ((_it->generation < wd->generation) || elm_widget_item_disabled_get(_it))
+ return;
selected = !!selected;
- if (it->selected == selected) return;
+ if (_it->selected == selected) return;
if (selected)
{
{
while (wd->selected)
{
- _item_unhighlight(wd->selected->data);
- _item_unselect(wd->selected->data);
+ if (_it->unhighlight_cb) _it->unhighlight_cb(wd->selected->data);
+ _it->unsel_cb(wd->selected->data);
}
}
- _item_highlight(it);
- _item_select(it);
- }
- else
- {
- _item_unhighlight(it);
- _item_unselect(it);
+ _it->highlight_cb(_it);
+ _item_select(_it);
+ return;
}
+ if (_it->unhighlight_cb) _it->unhighlight_cb(_it);
+ _it->unsel_cb(_it);
}
EAPI Eina_Bool
-elm_genlist_item_selected_get(const Elm_Gen_Item *it)
+elm_genlist_item_selected_get(const Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, EINA_FALSE);
- return it->selected;
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
+ return ((Elm_Gen_Item *)it)->selected;
}
-EAPI void
-elm_genlist_item_expanded_set(Elm_Gen_Item *it,
- Eina_Bool expanded)
+Elm_Gen_Item *
+_elm_genlist_expanded_next_item_get(Elm_Gen_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- if (it->item->expanded == expanded) return;
- it->item->expanded = expanded;
- it->wd->expanded_item = it;
+ Elm_Gen_Item *it2;
if (it->item->expanded)
{
- if (it->realized)
- edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm");
- evas_object_smart_callback_call(WIDGET(it), SIG_EXPANDED, it);
- it->wd->auto_scroll_enabled = EINA_TRUE;
+ it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
}
else
{
- if (it->realized)
- edje_object_signal_emit(VIEW(it), "elm,state,contracted", "elm");
- evas_object_smart_callback_call(WIDGET(it), SIG_CONTRACTED, it);
- it->wd->auto_scroll_enabled = EINA_FALSE;
+ it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
+ while (it2)
+ {
+ if (it->item->expanded_depth >= it2->item->expanded_depth) break;
+ it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
+ }
}
+ return it2;
}
-EAPI Eina_Bool
-elm_genlist_item_expanded_get(const Elm_Gen_Item *it)
+static void
+_elm_genlist_move_items_set(Elm_Gen_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, EINA_FALSE);
- return it->item->expanded;
-}
+ Eina_List *l;
+ Elm_Gen_Item *it2 = NULL;
+ Evas_Coord ox, oy, ow, oh, dh = 0;
-EAPI int
-elm_genlist_item_expanded_depth_get(const Elm_Gen_Item *it)
-{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, 0);
- return it->item->expanded_depth;
+ it->wd->expanded_next_item = _elm_genlist_expanded_next_item_get(it);
+
+ if (it->item->expanded)
+ {
+ it->wd->move_items = elm_genlist_realized_items_get(it->wd->obj);
+ EINA_LIST_FOREACH(it->wd->move_items, l, it2)
+ {
+ if (it2 == it->wd->expanded_next_item) break;
+ it->wd->move_items = eina_list_remove(it->wd->move_items, it2);
+ }
+ }
+ else
+ {
+ evas_object_geometry_get(it->wd->pan_smart, &ox, &oy, &ow, &oh);
+ it2 = it->wd->expanded_next_item;
+ while (it2 && (dh < oy + oh))
+ {
+ dh += it2->item->h;
+ it->wd->move_items = eina_list_append(it->wd->move_items, it2);
+ it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
+ }
+ }
}
EAPI void
-elm_genlist_item_disabled_set(Elm_Gen_Item *it,
- Eina_Bool disabled)
+elm_genlist_item_expanded_set(Elm_Object_Item *it,
+ Eina_Bool expanded)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- Eina_List *l;
- Evas_Object *obj;
- if (it->disabled == disabled) return;
- if (it->delete_me) return;
- it->disabled = !!disabled;
- if (it->selected)
- elm_genlist_item_selected_set(it, EINA_FALSE);
- if (it->realized)
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+ expanded = !!expanded;
+ if (_it->item->expanded == expanded) return;
+ _it->item->expanded = expanded;
+ _it->wd->expanded_item = _it;
+ _elm_genlist_move_items_set(_it);
+
+ if (_it->wd->tree_effect_enabled && !_it->wd->alpha_bg)
+ _it->wd->alpha_bg = _create_tray_alpha_bg(WIDGET(_it));
+
+ if (_it->item->expanded)
{
- if (it->disabled)
- edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
- else
- edje_object_signal_emit(VIEW(it), "elm,state,enabled", "elm");
- EINA_LIST_FOREACH(it->icon_objs, l, obj)
- elm_widget_disabled_set(obj, disabled);
+ _it->wd->move_effect_mode = ELM_GENLIST_ITEM_MOVE_EFFECT_EXPAND;
+ if (_it->realized)
+ edje_object_signal_emit(VIEW(_it), "elm,state,expanded", "elm");
+ evas_object_smart_callback_call(WIDGET(_it), SIG_EXPANDED, _it);
+ _it->wd->auto_scroll_enabled = EINA_TRUE;
+ }
+ else
+ {
+ _it->wd->move_effect_mode = ELM_GENLIST_ITEM_MOVE_EFFECT_CONTRACT;
+ if (_it->realized)
+ edje_object_signal_emit(VIEW(_it), "elm,state,contracted", "elm");
+ evas_object_smart_callback_call(WIDGET(_it), SIG_CONTRACTED, _it);
+ _it->wd->auto_scroll_enabled = EINA_FALSE;
}
}
EAPI Eina_Bool
-elm_genlist_item_disabled_get(const Elm_Gen_Item *it)
+elm_genlist_item_expanded_get(const Elm_Object_Item *it)
+{
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
+ return ((Elm_Gen_Item *)it)->item->expanded;
+}
+
+EAPI int
+elm_genlist_item_expanded_depth_get(const Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, EINA_FALSE);
- if (it->delete_me) return EINA_FALSE;
- return it->disabled;
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it, 0);
+ return ((Elm_Gen_Item *)it)->item->expanded_depth;
}
EAPI void
-elm_genlist_item_display_only_set(Elm_Gen_Item *it,
+elm_genlist_item_display_only_set(Elm_Object_Item *it,
Eina_Bool display_only)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- if (it->display_only == display_only) return;
- if (it->delete_me) return;
- it->display_only = display_only;
- it->item->mincalcd = EINA_FALSE;
- it->item->updateme = EINA_TRUE;
- if (it->item->block) it->item->block->updateme = EINA_TRUE;
- if (it->wd->update_job) ecore_job_del(it->wd->update_job);
- it->wd->update_job = ecore_job_add(_update_job, it->wd);
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+ display_only = !!display_only;
+ if (_it->display_only == display_only) return;
+ if (_it->generation < _it->wd->generation) return;
+ _it->display_only = display_only;
+ _it->item->mincalcd = EINA_FALSE;
+ _it->item->updateme = EINA_TRUE;
+ if (_it->item->block) _it->item->block->updateme = EINA_TRUE;
+ if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
+ _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
}
EAPI Eina_Bool
-elm_genlist_item_display_only_get(const Elm_Gen_Item *it)
+elm_genlist_item_display_only_get(const Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, EINA_FALSE);
- if (it->delete_me) return EINA_FALSE;
- return it->display_only;
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+ if (_it->generation < _it->wd->generation) return EINA_FALSE;
+ return _it->display_only;
}
-EAPI void
-elm_genlist_item_show(Elm_Gen_Item *it)
+static Eina_Bool _elm_genlist_item_compute_coordinates(
+ Elm_Object_Item *it,
+ Elm_Genlist_Item_Scrollto_Type type,
+ Evas_Coord *x,
+ Evas_Coord *y,
+ Evas_Coord *w,
+ Evas_Coord *h)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
Evas_Coord gith = 0;
- if (it->delete_me) return;
- if ((it->item->queued) || (!it->item->mincalcd))
+ if (_it->generation < _it->wd->generation) return EINA_FALSE;
+ if ((_it->item->queued) || (!_it->item->mincalcd))
{
- it->wd->show_item = it;
- it->wd->bring_in = EINA_TRUE;
- it->item->showme = EINA_TRUE;
- return;
+ _it->wd->show_item = _it;
+ _it->wd->bring_in = EINA_FALSE;
+ _it->wd->scrollto_type = type;
+ _it->item->showme = EINA_TRUE;
+ return EINA_FALSE;
}
- if (it->wd->show_item)
+ if (_it->wd->show_item)
{
- it->wd->show_item->item->showme = EINA_FALSE;
- it->wd->show_item = NULL;
+ _it->wd->show_item->item->showme = EINA_FALSE;
+ _it->wd->show_item = NULL;
}
- if ((it->item->group_item) && (it->wd->pan_y > (it->y + it->item->block->y)))
- gith = it->item->group_item->item->h;
- elm_smart_scroller_child_region_show(it->wd->scr,
- it->x + it->item->block->x,
- it->y + it->item->block->y - gith,
- it->item->block->w, it->item->h);
-}
-EAPI void
-elm_genlist_item_bring_in(Elm_Gen_Item *it)
-{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- Evas_Coord gith = 0;
- if (it->delete_me) return;
- if ((it->item->queued) || (!it->item->mincalcd))
+ evas_object_geometry_get(_it->wd->pan_smart, NULL, NULL, w, h);
+ if (type==ELM_GENLIST_ITEM_SCROLLTO_IN)
{
- it->wd->show_item = it;
- it->wd->bring_in = EINA_TRUE;
- it->item->showme = EINA_TRUE;
- return;
+ if ((_it->item->group_item) &&
+ (_it->wd->pan_y > (_it->y + _it->item->block->y)))
+ gith = _it->item->group_item->item->h;
+
+ *h = _it->item->h;
+ *y = _it->y + _it->item->block->y - gith;
+ }
+ else if (type==ELM_GENLIST_ITEM_SCROLLTO_TOP)
+ {
+ if (_it->item->group_item) gith = _it->item->group_item->item->h;
+ *y = _it->y + _it->item->block->y - gith;
}
- if (it->wd->show_item)
+ else if (type==ELM_GENLIST_ITEM_SCROLLTO_MIDDLE)
{
- it->wd->show_item->item->showme = EINA_FALSE;
- it->wd->show_item = NULL;
+ *y = _it->y + _it->item->block->y - *h / 2 + _it->item->h / 2;
}
- if ((it->item->group_item) && (it->wd->pan_y > (it->y + it->item->block->y)))
- gith = it->item->group_item->item->h;
- elm_smart_scroller_region_bring_in(it->wd->scr,
- it->x + it->item->block->x,
- it->y + it->item->block->y - gith,
- it->item->block->w, it->item->h);
+ else
+ return EINA_FALSE;
+
+ *x = _it->x + _it->item->block->x;
+ *w = _it->item->block->w;
+ return EINA_TRUE;
}
EAPI void
-elm_genlist_item_top_show(Elm_Gen_Item *it)
+elm_genlist_item_promote(Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- Evas_Coord ow, oh;
- Evas_Coord gith = 0;
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+ if (_it->generation < _it->wd->generation) return;
+ _item_move_before(_it,
+ (Elm_Gen_Item *) elm_genlist_first_item_get(WIDGET(_it)));
+}
- if (it->delete_me) return;
- if ((it->item->queued) || (!it->item->mincalcd))
- {
- it->wd->show_item = it;
- it->wd->bring_in = EINA_TRUE;
- it->item->showme = EINA_TRUE;
- return;
- }
- if (it->wd->show_item)
- {
- it->wd->show_item->item->showme = EINA_FALSE;
- it->wd->show_item = NULL;
- }
- evas_object_geometry_get(it->wd->pan_smart, NULL, NULL, &ow, &oh);
- if (it->item->group_item) gith = it->item->group_item->item->h;
- elm_smart_scroller_child_region_show(it->wd->scr,
- it->x + it->item->block->x,
- it->y + it->item->block->y - gith,
- it->item->block->w, oh);
+EAPI void
+elm_genlist_item_demote(Elm_Object_Item *it)
+{
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+ if (_it->generation < _it->wd->generation) return;
+ _item_move_after(_it,
+ (Elm_Gen_Item *) elm_genlist_last_item_get(WIDGET(_it)));
}
EAPI void
-elm_genlist_item_top_bring_in(Elm_Gen_Item *it)
+elm_genlist_item_show(Elm_Object_Item *it, Elm_Genlist_Item_Scrollto_Type type)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- Evas_Coord ow, oh;
- Evas_Coord gith = 0;
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Evas_Coord x, y, w, h;
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
- if (it->delete_me) return;
- if ((it->item->queued) || (!it->item->mincalcd))
- {
- it->wd->show_item = it;
- it->wd->bring_in = EINA_TRUE;
- it->item->showme = EINA_TRUE;
- return;
- }
- if (it->wd->show_item)
- {
- it->wd->show_item->item->showme = EINA_FALSE;
- it->wd->show_item = NULL;
- }
- evas_object_geometry_get(it->wd->pan_smart, NULL, NULL, &ow, &oh);
- if (it->item->group_item) gith = it->item->group_item->item->h;
- elm_smart_scroller_region_bring_in(it->wd->scr,
- it->x + it->item->block->x,
- it->y + it->item->block->y - gith,
- it->item->block->w, oh);
+ if (_elm_genlist_item_compute_coordinates(it, type, &x, &y, &w, &h))
+ elm_smart_scroller_child_region_show(_it->wd->scr, x, y, w, h);
}
EAPI void
-elm_genlist_item_middle_show(Elm_Gen_Item *it)
+elm_genlist_item_bring_in(Elm_Object_Item *it, Elm_Genlist_Item_Scrollto_Type type)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- Evas_Coord ow, oh;
- if (it->delete_me) return;
- if ((it->item->queued) || (!it->item->mincalcd))
- {
- it->wd->show_item = it;
- it->wd->bring_in = EINA_TRUE;
- it->item->showme = EINA_TRUE;
- return;
- }
- if (it->wd->show_item)
- {
- it->wd->show_item->item->showme = EINA_FALSE;
- it->wd->show_item = NULL;
- }
- evas_object_geometry_get(it->wd->pan_smart, NULL, NULL, &ow, &oh);
- elm_smart_scroller_child_region_show(it->wd->scr,
- it->x + it->item->block->x,
- it->y + it->item->block->y - oh / 2 +
- it->item->h / 2, it->item->block->w, oh);
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Evas_Coord x, y, w, h;
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+
+ if (_elm_genlist_item_compute_coordinates(it, type, &x, &y, &w, &h))
+ elm_smart_scroller_region_bring_in(_it->wd->scr,x, y, w, h);
}
-EAPI void
-elm_genlist_item_middle_bring_in(Elm_Gen_Item *it)
+EINA_DEPRECATED EAPI void
+elm_genlist_item_top_show(Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- Evas_Coord ow, oh;
+ elm_genlist_item_show(it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
+}
- if (it->delete_me) return;
- if ((it->item->queued) || (!it->item->mincalcd))
- {
- it->wd->show_item = it;
- it->wd->bring_in = EINA_TRUE;
- it->item->showme = EINA_TRUE;
- return;
- }
- if (it->wd->show_item)
- {
- it->wd->show_item->item->showme = EINA_FALSE;
- it->wd->show_item = NULL;
- }
- evas_object_geometry_get(it->wd->pan_smart, NULL, NULL, &ow, &oh);
- elm_smart_scroller_region_bring_in(it->wd->scr,
- it->x + it->item->block->x,
- it->y + it->item->block->y - oh / 2 + it->item->h / 2,
- it->item->block->w, oh);
+EINA_DEPRECATED EAPI void
+elm_genlist_item_top_bring_in(Elm_Object_Item *it)
+{
+ elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
}
-EAPI void
-elm_genlist_item_del(Elm_Gen_Item *it)
+EINA_DEPRECATED EAPI void
+elm_genlist_item_middle_show(Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- if ((it->relcount > 0) || (it->walking > 0))
- {
- elm_genlist_item_subitems_clear(it);
- if (it->wd->show_item == it) it->wd->show_item = NULL;
- elm_gen_item_del_notserious(it);
- if (it->item->block)
- {
- if (it->realized) elm_gen_item_unrealize(it, EINA_FALSE, (Ecore_Cb)_item_unrealize_cb);
- it->item->block->changed = EINA_TRUE;
- if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
- it->wd->calc_job = ecore_job_add(_calc_job, it->wd);
- }
- return;
- }
- _item_del(it);
+ elm_genlist_item_show(it, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
}
-EAPI void
-elm_genlist_item_data_set(Elm_Gen_Item *it,
- const void *data)
+EINA_DEPRECATED EAPI void
+elm_genlist_item_middle_bring_in(Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- elm_widget_item_data_set(it, data);
+ elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
}
-EAPI void *
-elm_genlist_item_data_get(const Elm_Gen_Item *it)
+EINA_DEPRECATED EAPI void
+elm_genlist_item_contents_orphan(Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);
- return elm_widget_item_data_get(it);
+ elm_genlist_item_all_contents_unset(it, NULL);
}
EAPI void
-elm_genlist_item_icons_orphan(Elm_Gen_Item *it)
+elm_genlist_item_all_contents_unset(Elm_Object_Item *it, Eina_List **l)
{
- Evas_Object *icon;
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- EINA_LIST_FREE(it->icon_objs, icon)
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+
+ Evas_Object *content;
+ EINA_LIST_FREE(((Elm_Gen_Item *)it)->content_objs, content)
{
- elm_widget_sub_object_del(WIDGET(it), icon);
- evas_object_smart_member_del(icon);
- evas_object_hide(icon);
+ elm_widget_sub_object_del(WIDGET(it), content);
+ evas_object_smart_member_del(content);
+ evas_object_hide(content);
+ if (l)
+ *l = eina_list_append(*l, content);
}
}
-EAPI const Evas_Object *
-elm_genlist_item_object_get(const Elm_Gen_Item *it)
+EINA_DEPRECATED EAPI const Evas_Object *
+elm_genlist_item_object_get(const Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
return VIEW(it);
}
EAPI void
-elm_genlist_item_update(Elm_Gen_Item *it)
+elm_genlist_item_update(Elm_Object_Item *it)
+{
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+
+ if (!_it->item->block) return;
+ if (_it->generation < _it->wd->generation) return;
+ _it->item->mincalcd = EINA_FALSE;
+ _it->item->updateme = EINA_TRUE;
+ _it->item->block->updateme = EINA_TRUE;
+ if (_it->wd->update_job) ecore_job_del(_it->wd->update_job);
+ _it->wd->update_job = ecore_job_add(_update_job, _it->wd);
+}
+
+EAPI void
+elm_genlist_item_fields_update(Elm_Object_Item *it,
+ const char *parts,
+ Elm_Genlist_Item_Field_Type itf)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- if (!it->item->block) return;
- if (it->delete_me) return;
- it->item->mincalcd = EINA_FALSE;
- it->item->updateme = EINA_TRUE;
- it->item->block->updateme = EINA_TRUE;
- if (it->wd->update_job) ecore_job_del(it->wd->update_job);
- it->wd->update_job = ecore_job_add(_update_job, it->wd);
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+
+ if (!_it->item->block) return;
+ if (_it->generation < _it->wd->generation) return;
+
+ if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_TEXT))
+ _item_text_realize(_it, VIEW(_it), &_it->texts, parts);
+ if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_CONTENT))
+ {
+ _it->content_objs = _item_content_unrealize(_it, VIEW(_it),
+ &_it->contents, parts);
+ _it->content_objs = _item_content_realize(_it, VIEW(_it),
+ &_it->contents, parts);
+ }
+ if ((!itf) || (itf & ELM_GENLIST_ITEM_FIELD_STATE))
+ _item_state_realize(_it, VIEW(_it), &_it->states, parts);
}
EAPI void
-elm_genlist_item_item_class_update(Elm_Gen_Item *it,
+elm_genlist_item_item_class_update(Elm_Object_Item *it,
const Elm_Genlist_Item_Class *itc)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- if (!it->item->block) return;
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+
+ if (!_it->item->block) return;
EINA_SAFETY_ON_NULL_RETURN(itc);
- if (it->delete_me) return;
- it->itc = itc;
- it->item->nocache = EINA_TRUE;
+ if (_it->generation < _it->wd->generation) return;
+ _it->itc = itc;
+ _it->item->nocache_once = EINA_TRUE;
elm_genlist_item_update(it);
}
EAPI const Elm_Genlist_Item_Class *
-elm_genlist_item_item_class_get(const Elm_Gen_Item *it)
+elm_genlist_item_item_class_get(const Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);
- if (it->delete_me) return NULL;
- return it->itc;
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+ if (_it->generation < _it->wd->generation) return NULL;
+ return _it->itc;
}
static Evas_Object *
}
EAPI void
-elm_genlist_item_tooltip_text_set(Elm_Gen_Item *it,
- const char *text)
+elm_genlist_item_tooltip_text_set(Elm_Object_Item *it,
+ const char *text)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
text = eina_stringshare_add(text);
elm_genlist_item_tooltip_content_cb_set(it, _elm_genlist_item_label_create,
text,
}
EAPI void
-elm_genlist_item_tooltip_content_cb_set(Elm_Gen_Item *it,
+elm_genlist_item_tooltip_content_cb_set(Elm_Object_Item *it,
Elm_Tooltip_Item_Content_Cb func,
const void *data,
Evas_Smart_Cb del_cb)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_GOTO(it, error);
+ ELM_OBJ_ITEM_CHECK_OR_GOTO(it, error);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
- if ((it->tooltip.content_cb == func) && (it->tooltip.data == data))
+ if ((_it->tooltip.content_cb == func) && (_it->tooltip.data == data))
return;
- if (it->tooltip.del_cb)
- it->tooltip.del_cb((void *)it->tooltip.data,
- WIDGET(it), it);
+ if (_it->tooltip.del_cb)
+ _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(it), it);
- it->tooltip.content_cb = func;
- it->tooltip.data = data;
- it->tooltip.del_cb = del_cb;
+ _it->tooltip.content_cb = func;
+ _it->tooltip.data = data;
+ _it->tooltip.del_cb = del_cb;
- if (VIEW(it))
+ if (VIEW(_it))
{
- elm_widget_item_tooltip_content_cb_set(it,
- it->tooltip.content_cb,
- it->tooltip.data, NULL);
- elm_widget_item_tooltip_style_set(it, it->tooltip.style);
- elm_widget_item_tooltip_size_restrict_disable(it, it->tooltip.free_size);
+ elm_widget_item_tooltip_content_cb_set(_it,
+ _it->tooltip.content_cb,
+ _it->tooltip.data, NULL);
+ elm_widget_item_tooltip_style_set(_it, _it->tooltip.style);
+ elm_widget_item_tooltip_window_mode_set(_it, _it->tooltip.free_size);
}
return;
}
EAPI void
-elm_genlist_item_tooltip_unset(Elm_Gen_Item *it)
+elm_genlist_item_tooltip_unset(Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- if ((VIEW(it)) && (it->tooltip.content_cb))
- elm_widget_item_tooltip_unset(it);
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
- if (it->tooltip.del_cb)
- it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
- it->tooltip.del_cb = NULL;
- it->tooltip.content_cb = NULL;
- it->tooltip.data = NULL;
- it->tooltip.free_size = EINA_FALSE;
- if (it->tooltip.style)
+ if ((VIEW(_it)) && (_it->tooltip.content_cb))
+ elm_widget_item_tooltip_unset(_it);
+
+ if (_it->tooltip.del_cb)
+ _it->tooltip.del_cb((void *) _it->tooltip.data, WIDGET(_it), _it);
+ _it->tooltip.del_cb = NULL;
+ _it->tooltip.content_cb = NULL;
+ _it->tooltip.data = NULL;
+ _it->tooltip.free_size = EINA_FALSE;
+ if (_it->tooltip.style)
elm_genlist_item_tooltip_style_set(it, NULL);
}
EAPI void
-elm_genlist_item_tooltip_style_set(Elm_Gen_Item *it,
+elm_genlist_item_tooltip_style_set(Elm_Object_Item *it,
const char *style)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- eina_stringshare_replace(&it->tooltip.style, style);
- if (VIEW(it)) elm_widget_item_tooltip_style_set(it, style);
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+
+ eina_stringshare_replace(&_it->tooltip.style, style);
+ if (VIEW(_it)) elm_widget_item_tooltip_style_set(_it, style);
}
EAPI const char *
-elm_genlist_item_tooltip_style_get(const Elm_Gen_Item *it)
+elm_genlist_item_tooltip_style_get(const Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);
- return it->tooltip.style;
+ return elm_object_item_tooltip_style_get(it);
}
EAPI Eina_Bool
-elm_genlist_item_tooltip_size_restrict_disable(Elm_Gen_Item *it, Eina_Bool disable)
+elm_genlist_item_tooltip_window_mode_set(Elm_Object_Item *it,
+ Eina_Bool disable)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, EINA_FALSE);
- it->tooltip.free_size = disable;
- if (VIEW(it)) return elm_widget_item_tooltip_size_restrict_disable(it, disable);
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+
+ _it->tooltip.free_size = disable;
+ if (VIEW(_it)) return elm_widget_item_tooltip_window_mode_set(_it, disable);
return EINA_TRUE;
}
EAPI Eina_Bool
-elm_genlist_item_tooltip_size_restrict_disabled_get(const Elm_Gen_Item *it)
+elm_genlist_item_tooltip_window_mode_get(const Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, EINA_FALSE);
- return it->tooltip.free_size;
+ return elm_object_tooltip_window_mode_get(VIEW(it));
}
EAPI void
-elm_genlist_item_cursor_set(Elm_Gen_Item *it,
+elm_genlist_item_cursor_set(Elm_Object_Item *it,
const char *cursor)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- eina_stringshare_replace(&it->mouse_cursor, cursor);
- if (VIEW(it)) elm_widget_item_cursor_set(it, cursor);
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+ eina_stringshare_replace(&_it->mouse_cursor, cursor);
+ if (VIEW(_it)) elm_widget_item_cursor_set(_it, cursor);
}
EAPI const char *
-elm_genlist_item_cursor_get(const Elm_Gen_Item *it)
+elm_genlist_item_cursor_get(const Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);
return elm_widget_item_cursor_get(it);
}
EAPI void
-elm_genlist_item_cursor_unset(Elm_Gen_Item *it)
+elm_genlist_item_cursor_unset(Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- if (!it->mouse_cursor)
- return;
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
- if (VIEW(it))
- elm_widget_item_cursor_unset(it);
+ if (!_it->mouse_cursor) return;
- eina_stringshare_del(it->mouse_cursor);
- it->mouse_cursor = NULL;
+ if (VIEW(_it)) elm_widget_item_cursor_unset(_it);
+
+ eina_stringshare_del(_it->mouse_cursor);
+ _it->mouse_cursor = NULL;
}
EAPI void
-elm_genlist_item_cursor_style_set(Elm_Gen_Item *it,
+elm_genlist_item_cursor_style_set(Elm_Object_Item *it,
const char *style)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
elm_widget_item_cursor_style_set(it, style);
}
EAPI const char *
-elm_genlist_item_cursor_style_get(const Elm_Gen_Item *it)
+elm_genlist_item_cursor_style_get(const Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);
return elm_widget_item_cursor_style_get(it);
}
EAPI void
-elm_genlist_item_cursor_engine_only_set(Elm_Gen_Item *it,
- Eina_Bool engine_only)
+elm_genlist_item_cursor_engine_only_set(Elm_Object_Item *it,
+ Eina_Bool engine_only)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
elm_widget_item_cursor_engine_only_set(it, engine_only);
}
EAPI Eina_Bool
-elm_genlist_item_cursor_engine_only_get(const Elm_Gen_Item *it)
+elm_genlist_item_cursor_engine_only_get(const Elm_Object_Item *it)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, EINA_FALSE);
return elm_widget_item_cursor_engine_only_get(it);
}
+EAPI int
+elm_genlist_item_index_get(const Elm_Object_Item *it)
+{
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it, -1);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+
+ if (_it->item->block)
+ return _it->position + _it->item->block->position;
+ return -1;
+}
+
EAPI void
-elm_genlist_horizontal_set(Evas_Object *obj,
- Elm_List_Mode mode)
+elm_genlist_mode_set(Evas_Object *obj,
+ Elm_List_Mode mode)
{
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
_sizing_eval(obj);
}
-EAPI void
-elm_genlist_horizontal_mode_set(Evas_Object *obj,
- Elm_List_Mode mode)
-{
- elm_genlist_horizontal_set(obj, mode);
-}
EAPI Elm_List_Mode
-elm_genlist_horizontal_get(const Evas_Object *obj)
+elm_genlist_mode_get(const Evas_Object *obj)
{
ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST;
Widget_Data *wd = elm_widget_data_get(obj);
return wd->mode;
}
-EAPI Elm_List_Mode
-elm_genlist_horizontal_mode_get(const Evas_Object *obj)
-{
- return elm_genlist_horizontal_get(obj);
-}
-
-EAPI void
+EINA_DEPRECATED EAPI void
elm_genlist_always_select_mode_set(Evas_Object *obj,
Eina_Bool always_select)
{
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
- wd->always_select = always_select;
+ if (always_select)
+ elm_genlist_select_mode_set(obj, ELM_OBJECT_ALWAYS_SELECT);
+ else
+ {
+ Elm_Object_Select_Mode_Type oldmode = elm_genlist_select_mode_get(obj);
+ if (oldmode == ELM_OBJECT_ALWAYS_SELECT)
+ elm_genlist_select_mode_set(obj, ELM_OBJECT_NORMAL_SELECT);
+ }
}
-EAPI Eina_Bool
+EINA_DEPRECATED EAPI Eina_Bool
elm_genlist_always_select_mode_get(const Evas_Object *obj)
{
ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return EINA_FALSE;
- return wd->always_select;
+ Elm_Object_Select_Mode_Type oldmode = elm_genlist_select_mode_get(obj);
+ if (oldmode == ELM_OBJECT_ALWAYS_SELECT)
+ return EINA_TRUE;
+ return EINA_FALSE;
}
-EAPI void
+EINA_DEPRECATED EAPI void
elm_genlist_no_select_mode_set(Evas_Object *obj,
Eina_Bool no_select)
{
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
- wd->no_select = no_select;
+ if (no_select)
+ elm_genlist_select_mode_set(obj, ELM_OBJECT_NO_SELECT);
+ else
+ {
+ Elm_Object_Select_Mode_Type oldmode = elm_genlist_select_mode_get(obj);
+ if (oldmode == ELM_OBJECT_NO_SELECT)
+ elm_genlist_select_mode_set(obj, ELM_OBJECT_NORMAL_SELECT);
+ }
}
-EAPI Eina_Bool
+EINA_DEPRECATED EAPI Eina_Bool
elm_genlist_no_select_mode_get(const Evas_Object *obj)
{
ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return EINA_FALSE;
- return wd->no_select;
+ Elm_Object_Select_Mode_Type oldmode = elm_genlist_select_mode_get(obj);
+ if (oldmode == ELM_OBJECT_NO_SELECT)
+ return EINA_TRUE;
+ return EINA_FALSE;
}
EAPI void
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
- wd->compress = compress;
+ wd->compress = !!compress;
if (!compress) elm_genlist_homogeneous_set(obj, EINA_FALSE);
}
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
- elm_smart_scroller_bounce_allow_set(wd->scr, h_bounce, v_bounce);
+ wd->h_bounce = !!h_bounce;
+ wd->v_bounce = !!v_bounce;
+ elm_smart_scroller_bounce_allow_set(wd->scr, wd->h_bounce, wd->v_bounce);
}
EAPI void
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
- elm_smart_scroller_bounce_allow_get(wd->scr, h_bounce, v_bounce);
+ if (h_bounce) *h_bounce = wd->h_bounce;
+ if (v_bounce) *v_bounce = wd->v_bounce;
}
EAPI void
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
if (homogeneous) elm_genlist_compress_mode_set(obj, EINA_TRUE);
- wd->homogeneous = homogeneous;
+ wd->homogeneous = !!homogeneous;
}
EAPI Eina_Bool
EAPI void
elm_genlist_block_count_set(Evas_Object *obj,
- int n)
+ int count)
{
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
- wd->max_items_per_block = n;
+ wd->max_items_per_block = count;
wd->item_cache_max = wd->max_items_per_block * 2;
_item_cache_clean(wd);
}
ELM_CHECK_WIDTYPE(obj, widtype);
Eina_List *list, *l;
- Elm_Gen_Item *it;
+ Elm_Object_Item *it;
list = elm_genlist_realized_items_get(obj);
EINA_LIST_FOREACH(list, l, it)
}
EAPI void
-elm_genlist_item_mode_set(Elm_Gen_Item *it,
+elm_genlist_item_mode_set(Elm_Object_Item *it,
const char *mode_type,
Eina_Bool mode_set)
{
- ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
- Widget_Data *wd = it->wd;
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+
+ Widget_Data *wd = _it->wd;
Eina_List *l;
- Elm_Gen_Item *it2;
+ Elm_Object_Item *it2;
if (!wd) return;
if (!mode_type) return;
- if ((it->delete_me) || (it->disabled)) return;
+ if ((_it->generation < _it->wd->generation) ||
+ elm_widget_item_disabled_get(_it)) return;
+ if (wd->edit_mode) return;
- if ((wd->mode_item == it) &&
+ if ((wd->mode_item == _it) &&
(!strcmp(mode_type, wd->mode_type)) &&
(mode_set))
return;
- if (!wd->mode_item_style) return;
+ if (!_it->itc->mode_item_style) return;
+ _it->mode_set = mode_set;
if (wd->multi)
{
EINA_LIST_FOREACH(wd->selected, l, it2)
- if (it2->realized)
+ if (((Elm_Gen_Item *)it2)->realized)
elm_genlist_item_selected_set(it2, EINA_FALSE);
}
else
{
it2 = elm_genlist_selected_item_get(wd->obj);
- if ((it2) && (it2->realized))
+ if ((it2) && (((Elm_Gen_Item *)it2)->realized))
elm_genlist_item_selected_set(it2, EINA_FALSE);
}
if (((wd->mode_type) && (strcmp(mode_type, wd->mode_type))) ||
(mode_set) ||
- ((it == wd->mode_item) && (!mode_set)))
+ ((_it == wd->mode_item) && (!mode_set)))
_item_mode_unset(wd);
eina_stringshare_replace(&wd->mode_type, mode_type);
- if (mode_set) _item_mode_set(it);
+ if (mode_set) _item_mode_set(_it);
}
-
EAPI const char *
-elm_genlist_mode_item_style_get(const Evas_Object *obj)
+elm_genlist_mode_type_get(const Evas_Object *obj)
{
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return NULL;
- return wd->mode_item_style;
-}
-
-EAPI void
-elm_genlist_mode_item_style_set(Evas_Object *obj, const char *style)
-{
- ELM_CHECK_WIDTYPE(obj, widtype);
- Widget_Data *wd = elm_widget_data_get(obj);
- if (!wd) return;
- if ((style == wd->mode_item_style) || (style && wd->mode_item_style &&
- (!strcmp(style, wd->mode_item_style))))
- return;
- eina_stringshare_replace(&wd->mode_item_style, style);
- elm_genlist_realized_items_update(obj);
+ return wd->mode_type;
}
-EAPI const char *
-elm_genlist_mode_get(const Evas_Object *obj)
+EAPI const Elm_Object_Item *
+elm_genlist_mode_item_get(const Evas_Object *obj)
{
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return NULL;
- return wd->mode_type;
+ return (Elm_Object_Item *) wd->mode_item;
}
-EAPI const Elm_Gen_Item *
-elm_genlist_mode_item_get(const Evas_Object *obj)
+EAPI Eina_Bool
+elm_genlist_edit_mode_get(const Evas_Object *obj)
{
- ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+ ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
Widget_Data *wd = elm_widget_data_get(obj);
- if (!wd) return NULL;
- return wd->mode_item;
+ if (!wd) return EINA_FALSE;
+
+ return wd->edit_mode;
}
EAPI void
-elm_genlist_reorder_mode_set(Evas_Object *obj,
- Eina_Bool reorder_mode)
+elm_genlist_edit_mode_set(Evas_Object *obj, Eina_Bool edit_mode)
{
ELM_CHECK_WIDTYPE(obj, widtype);
+ Eina_List *list, *l;
+ Elm_Gen_Item *it;
+
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
- wd->reorder_mode = reorder_mode;
-}
+ edit_mode = !!edit_mode;
+ if (wd->edit_mode == edit_mode) return;
+ wd->edit_mode = edit_mode;
-EAPI Eina_Bool
-elm_genlist_reorder_mode_get(const Evas_Object *obj)
-{
+ list = elm_genlist_realized_items_get(obj);
+ if (!wd->edit_mode)
+ {
+ EINA_LIST_FOREACH(list, l, it)
+ {
+ if (it->item->type != ELM_GENLIST_ITEM_GROUP)
+ _edit_mode_item_unrealize(it);
+ }
+ _item_cache_zero(wd);
+ }
+ else
+ {
+ EINA_LIST_FOREACH(list, l, it)
+ {
+ if (it->item->type != ELM_GENLIST_ITEM_GROUP)
+ {
+ if (it->selected) _item_unselect(it);
+ if (it->itc->edit_item_style)
+ _edit_mode_item_realize(it, EINA_TRUE);
+ }
+ }
+ }
+ if (wd->calc_job) ecore_job_del(wd->calc_job);
+ wd->calc_job = ecore_job_add(_calc_job, wd);
+}
+
+EAPI void
+elm_genlist_reorder_mode_set(Evas_Object *obj,
+ Eina_Bool reorder_mode)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype);
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+ wd->reorder_mode = !!reorder_mode;
+}
+
+EAPI Eina_Bool
+elm_genlist_reorder_mode_get(const Evas_Object *obj)
+{
ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return EINA_FALSE;
return wd->reorder_mode;
}
+
+EAPI Elm_Genlist_Item_Type
+elm_genlist_item_type_get(const Elm_Object_Item *it)
+{
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it, ELM_GENLIST_ITEM_MAX);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+ return _it->item->type;
+}
+
+EINA_DEPRECATED EAPI Elm_Genlist_Item_Type
+elm_genlist_item_flags_get(const Elm_Object_Item *it)
+{
+ return elm_genlist_item_type_get(it);
+}
+
+EAPI Elm_Genlist_Item_Class *
+elm_genlist_item_class_new(void)
+{
+ Elm_Genlist_Item_Class *itc;
+
+ itc = calloc(1, sizeof(Elm_Genlist_Item_Class));
+ if (!itc)
+ return NULL;
+ itc->version = CLASS_ALLOCATED;
+ itc->refcount = 1;
+ itc->delete_me = EINA_FALSE;
+
+ return itc;
+}
+
+EAPI void
+elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc)
+{
+ if (itc && (itc->version == CLASS_ALLOCATED))
+ {
+ if (!itc->delete_me) itc->delete_me = EINA_TRUE;
+ if (itc->refcount > 0) elm_genlist_item_class_unref(itc);
+ else
+ {
+ itc->version = 0;
+ free(itc);
+ }
+ }
+}
+
+EAPI void
+elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc)
+{
+ if (itc && (itc->version == CLASS_ALLOCATED))
+ {
+ itc->refcount++;
+ if (itc->refcount == 0) itc->refcount--;
+ }
+}
+
+EAPI void
+elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc)
+{
+ if (itc && (itc->version == CLASS_ALLOCATED))
+ {
+ if (itc->refcount > 0) itc->refcount--;
+ if (itc->delete_me && (!itc->refcount))
+ elm_genlist_item_class_free(itc);
+ }
+}
+
+void _flip_job(void *data)
+{
+ Elm_Gen_Item *it = (Elm_Gen_Item *) data;
+ _elm_genlist_item_unrealize(it, EINA_FALSE);
+ if (it->selected) _item_unselect(it);
+ it->flipped = EINA_TRUE;
+ it->item->nocache = EINA_TRUE;
+}
+
+EAPI void
+elm_genlist_item_flip_set(Elm_Object_Item *it,
+ Eina_Bool flip)
+{
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+
+ flip = !!flip;
+ if (_it->flipped == flip) return;
+
+ if (flip)
+ {
+ ecore_job_add(_flip_job, _it);
+ if (_it->wd->calc_job) ecore_job_del(_it->wd->calc_job);
+ _it->wd->calc_job = ecore_job_add(_calc_job, _it->wd);
+ }
+ else
+ {
+ _it->flipped = flip;
+ _item_cache_zero(_it->wd);
+ elm_genlist_item_update(it);
+ _it->item->nocache = EINA_FALSE;
+ }
+}
+
+EAPI Eina_Bool
+elm_genlist_item_flip_get(const Elm_Object_Item *it)
+{
+ ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
+ Elm_Gen_Item *_it = (Elm_Gen_Item *)it;
+ return _it->flipped;
+}
+
+EAPI void
+elm_genlist_select_mode_set(Evas_Object *obj, Elm_Object_Select_Mode_Type mode)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype);
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+ if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
+ return;
+ if (wd->select_mode != mode)
+ wd->select_mode = mode;
+}
+
+EAPI Elm_Object_Select_Mode_Type
+elm_genlist_select_mode_get(const Evas_Object *obj)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) ELM_OBJECT_SELECT_MODE_MAX;
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return ELM_OBJECT_SELECT_MODE_MAX;
+ return wd->select_mode;
+}
+
+EAPI void
+elm_genlist_hilight_mode_set(Evas_Object *obj,
+ Eina_Bool hilight)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype);
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+ hilight = !!hilight;
+ wd->no_highlight = !hilight;
+}
+
+EAPI Eina_Bool
+elm_genlist_hilight_mode_get(const Evas_Object *obj)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return EINA_FALSE;
+ return !wd->no_highlight;
+}
+
+/* for gengrid as of now */
+void
+_elm_genlist_page_relative_set(Evas_Object *obj,
+ double h_pagerel,
+ double v_pagerel)
+{
+ Evas_Coord pagesize_h;
+ Evas_Coord pagesize_v;
+
+ ELM_CHECK_WIDTYPE(obj, widtype);
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+
+ elm_smart_scroller_paging_get(wd->scr, NULL, NULL, &pagesize_h, &pagesize_v);
+ elm_smart_scroller_paging_set(wd->scr, h_pagerel, v_pagerel, pagesize_h,
+ pagesize_v);
+}
+
+/* for gengrid as of now */
+void
+_elm_genlist_page_relative_get(const Evas_Object *obj,
+ double *h_pagerel,
+ double *v_pagerel)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype);
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+
+ elm_smart_scroller_paging_get(wd->scr, h_pagerel, v_pagerel, NULL, NULL);
+}
+
+/* for gengrid as of now */
+void
+_elm_genlist_page_size_set(Evas_Object *obj,
+ Evas_Coord h_pagesize,
+ Evas_Coord v_pagesize)
+{
+ double pagerel_h;
+ double pagerel_v;
+
+ ELM_CHECK_WIDTYPE(obj, widtype);
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+ elm_smart_scroller_paging_get(wd->scr, &pagerel_h, &pagerel_v, NULL, NULL);
+ elm_smart_scroller_paging_set(wd->scr, pagerel_h, pagerel_v, h_pagesize,
+ v_pagesize);
+}
+
+/* for gengrid as of now */
+void
+_elm_genlist_current_page_get(const Evas_Object *obj,
+ int *h_pagenumber,
+ int *v_pagenumber)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype);
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+ elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber);
+}
+
+/* for gengrid as of now */
+void
+_elm_genlist_last_page_get(const Evas_Object *obj,
+ int *h_pagenumber,
+ int *v_pagenumber)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype);
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+ elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber);
+}
+
+/* for gengrid as of now */
+void
+_elm_genlist_page_show(const Evas_Object *obj,
+ int h_pagenumber,
+ int v_pagenumber)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype);
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+ elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber);
+}
+
+/* for gengrid as of now */
+void
+_elm_genlist_page_bring_in(const Evas_Object *obj,
+ int h_pagenumber,
+ int v_pagenumber)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype);
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+ elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber);
+}
+
+void
+_elm_genlist_item_unrealize(Elm_Gen_Item *it,
+ Eina_Bool calc)
+{
+ Evas_Object *content;
+
+ if (!it->realized) return;
+ if (it->wd->reorder_it == it) return;
+
+ evas_event_freeze(evas_object_evas_get(WIDGET(it)));
+ if (!calc)
+ evas_object_smart_callback_call(WIDGET(it), SIG_UNREALIZED, it);
+ if (it->long_timer)
+ {
+ ecore_timer_del(it->long_timer);
+ it->long_timer = NULL;
+ }
+
+ elm_widget_stringlist_free(it->texts);
+ it->texts = NULL;
+ elm_widget_stringlist_free(it->contents);
+ it->contents = NULL;
+ elm_widget_stringlist_free(it->states);
+ it->states = NULL;
+
+ EINA_LIST_FREE(it->content_objs, content)
+ evas_object_del(content);
+
+ it->unrealize_cb(it);
+
+ it->realized = EINA_FALSE;
+ it->want_unrealize = EINA_FALSE;
+ evas_event_thaw(evas_object_evas_get(WIDGET(it)));
+ evas_event_thaw_eval(evas_object_evas_get(WIDGET(it)));
+}
+
+void
+_elm_genlist_item_del_notserious(Elm_Gen_Item *it)
+{
+ elm_widget_item_pre_notify_del(it);
+ it->generation = it->wd->generation - 1; /* This means that the item is deleted */
+ if (it->selected) it->wd->selected = eina_list_remove(it->wd->selected, it);
+
+ if (it->itc->func.del)
+ it->itc->func.del((void *)it->base.data, WIDGET(it));
+}
+
+void
+_elm_genlist_item_del_serious(Elm_Gen_Item *it)
+{
+ _elm_genlist_item_del_notserious(it);
+ it->wd->items = eina_inlist_remove(it->wd->items, EINA_INLIST_GET(it));
+ if (it->tooltip.del_cb)
+ it->tooltip.del_cb((void *)it->tooltip.data, WIDGET(it), it);
+ it->wd->walking -= it->walking;
+ if (it->long_timer) ecore_timer_del(it->long_timer);
+ if (it->group)
+ it->wd->group_items = eina_list_remove(it->wd->group_items, it);
+
+ if (it->wd->state)
+ {
+ eina_inlist_sorted_state_free(it->wd->state);
+ it->wd->state = NULL;
+ }
+ if (it->wd->calc_job) ecore_job_del(it->wd->calc_job);
+ it->wd->calc_job = ecore_job_add(it->wd->calc_cb, it->wd);
+ free(it->item);
+
+ it->item = NULL;
+ if (it->wd->last_selected_item == (Elm_Object_Item *)it)
+ it->wd->last_selected_item = NULL;
+ it->wd->item_count--;
+}
+
+EAPI void
+elm_genlist_tree_effect_enabled_set(Evas_Object *obj, Eina_Bool enabled)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype);
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+ wd->tree_effect_enabled = !!enabled;
+}
+
+EAPI Eina_Bool
+elm_genlist_tree_effect_enabled_get(const Evas_Object *obj)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return EINA_FALSE;
+ return wd->tree_effect_enabled;
+}
+
+static Evas_Object*
+_create_tray_alpha_bg(const Evas_Object *obj)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return NULL;
+
+ Evas_Object *bg = NULL;
+ Evas_Coord ox, oy, ow, oh;
+
+ evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
+ bg = evas_object_rectangle_add(evas_object_evas_get(wd->obj));
+ evas_object_color_set(bg,0,0,0,0);
+ evas_object_resize(bg , ow, oh);
+ evas_object_move(bg , ox, oy);
+ return bg ;
+}
+
+static void
+_item_contract_emit(Elm_Gen_Item *it)
+{
+ Elm_Gen_Item *it2;
+ Eina_List *l;
+
+ edje_object_signal_emit(VIEW(it), "elm,state,contract_flip", "");
+ it->item->tree_effect_finished = EINA_FALSE;
+
+ EINA_LIST_FOREACH(it->item->items, l, it2)
+ if (it2) _item_contract_emit(it2);
+}
+
+static int
+_item_tree_effect_before(Elm_Gen_Item *it)
+{
+ Elm_Gen_Item *it2;
+ Eina_List *l;
+
+ EINA_LIST_FOREACH(it->item->items, l, it2)
+ {
+ if (it2->parent && (it == it2->parent))
+ {
+ if (it->wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_EXPAND)
+ edje_object_signal_emit(VIEW(it2), "elm,state,hide", "");
+ else if (it->wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_CONTRACT)
+ _item_contract_emit(it2);
+ }
+ }
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_item_tree_effect(Widget_Data *wd, int y)
+{
+ Elm_Gen_Item *it = NULL, *expanded_next_it;
+
+ expanded_next_it = wd->expanded_next_item;
+
+ if (wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_EXPAND)
+ {
+ it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) expanded_next_it);
+ while (it)
+ {
+ if (it->item->expanded_depth <= expanded_next_it->item->expanded_depth) break;
+ if (it->item->scrl_y && (it->item->scrl_y < expanded_next_it->item->old_scrl_y + y) &&
+ (it->item->expanded_depth > expanded_next_it->item->expanded_depth))
+ {
+ if (!it->item->tree_effect_finished)
+ {
+ edje_object_signal_emit(VIEW(it), "flip_item", "");
+ evas_object_show(VIEW(it));
+ it->item->tree_effect_finished = EINA_TRUE;
+ }
+ }
+ it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it);
+ }
+ }
+ else if (wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_CONTRACT)
+ {
+ it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) expanded_next_it);
+ while (it)
+ {
+ if ((it->item->scrl_y > expanded_next_it->item->old_scrl_y + y) &&
+ (it->item->expanded_depth > expanded_next_it->item->expanded_depth))
+ {
+ if (!it->item->tree_effect_finished)
+ {
+ edje_object_signal_emit(VIEW(it), "elm,state,hide", "");
+ it->item->tree_effect_finished = EINA_TRUE;
+ }
+ }
+ else
+ break;
+ it = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it);
+ }
+ }
+}
+
+static void
+_item_tree_effect_finish(Widget_Data *wd)
+{
+ Item_Block *itb;
+ Elm_Gen_Item *it = NULL;
+ const Eina_List *l;
+
+ if (wd->item_moving_effect_timer)
+ {
+ if (wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_CONTRACT)
+ _item_subitems_clear(wd->expanded_item);
+ EINA_INLIST_FOREACH(wd->blocks, itb)
+ {
+ EINA_LIST_FOREACH(itb->items, l, it)
+ {
+ it->item->tree_effect_finished = EINA_TRUE;
+ it->item->old_scrl_y = it->item->scrl_y;
+ }
+ }
+ }
+ _item_auto_scroll(wd);
+ evas_object_lower(wd->alpha_bg);
+ evas_object_hide(wd->alpha_bg);
+ wd->move_effect_mode = ELM_GENLIST_ITEM_MOVE_EFFECT_NONE;
+ if (wd->move_items) wd->move_items = eina_list_free(wd->move_items);
+
+ evas_object_smart_callback_call(wd->pan_smart, "changed", NULL);
+ evas_object_smart_callback_call(wd->obj, SIG_TREE_EFFECT_FINISHED, NULL);
+ evas_object_smart_changed(wd->pan_smart);
+
+ wd->item_moving_effect_timer = NULL;
+}
+
+static Eina_Bool
+_item_moving_effect_timer_cb(void *data)
+{
+ Widget_Data *wd = data;
+ if (!wd) return EINA_FALSE;
+ Evas_Coord ox, oy, ow, oh, cvx, cvy, cvw, cvh;
+ Elm_Gen_Item *it = NULL, *it2, *expanded_next_it;
+ const Eina_List *l;
+ double effect_duration = 0.5, t;
+ int y = 0, dy = 0, dh = 0;
+ Eina_Bool end = EINA_FALSE, vis = EINA_TRUE;
+ int in = 0;
+
+ t = ((0.0 > (t = ecore_time_get() - wd->start_time)) ? 0.0 : t);
+ evas_object_geometry_get(wd->pan_smart, &ox, &oy, &ow, &oh);
+ evas_output_viewport_get(evas_object_evas_get(wd->pan_smart), &cvx, &cvy, &cvw, &cvh);
+ if (t > effect_duration) end = EINA_TRUE;
+
+ // Below while statement is needed, when the genlist is resized.
+ it2 = wd->expanded_item;
+ while (it2 && vis)
+ {
+ evas_object_move(VIEW(it2), it2->item->scrl_x, it2->item->scrl_y);
+ vis = (ELM_RECTS_INTERSECT(it2->item->scrl_x, it2->item->scrl_y, it2->item->w, it2->item->h,
+ cvx, cvy, cvw, cvh));
+ it2 = (Elm_Gen_Item *) elm_genlist_item_prev_get((Elm_Object_Item *) it2);
+ }
+
+ if (wd->expanded_next_item)
+ {
+ expanded_next_it = wd->expanded_next_item;
+
+ /* move items */
+ EINA_LIST_FOREACH(wd->move_items, l, it)
+ {
+ if (wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_EXPAND)
+ {
+ expanded_next_it->item->old_scrl_y = wd->expanded_item->item->old_scrl_y + wd->expanded_item->item->h;
+ if (expanded_next_it->item->scrl_y < expanded_next_it->item->old_scrl_y) //did not calculate next item position
+ expanded_next_it->item->scrl_y = cvy + cvh;
+
+ dy = ((expanded_next_it->item->scrl_y >= (cvy + cvh)) ?
+ cvy + cvh : expanded_next_it->item->scrl_y) -
+ expanded_next_it->item->old_scrl_y;
+ }
+ else if (wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_CONTRACT)
+ {
+ if (expanded_next_it->item->scrl_y > expanded_next_it->item->old_scrl_y) //did not calculate next item position
+ expanded_next_it->item->old_scrl_y = cvy + cvh;
+
+ if (expanded_next_it->item->old_scrl_y > (cvy + cvh))
+ {
+ dy = (wd->expanded_item->item->scrl_y + wd->expanded_item->item->h) -
+ cvy + cvh;
+ expanded_next_it->item->old_scrl_y = cvy + cvh;
+ }
+ else
+ {
+ dy = (wd->expanded_item->item->scrl_y + wd->expanded_item->item->h) -
+ expanded_next_it->item->old_scrl_y;
+ }
+ }
+
+ if (t <= effect_duration)
+ {
+ y = ((1 - (1 - (t / effect_duration)) * (1 - (t /effect_duration))) * dy);
+ }
+ else
+ {
+ end = EINA_TRUE;
+ y = dy;
+ }
+
+ if (!it->realized)
+ {
+ _item_realize(it, in, 0);
+ }
+ in++;
+
+ if (it != expanded_next_it)
+ {
+ it->item->old_scrl_y = expanded_next_it->item->old_scrl_y + expanded_next_it->item->h + dh;
+ dh += it->item->h;
+ }
+
+ if ((it->item->old_scrl_y + y) < (cvy + cvh))
+ _item_position(it, VIEW(it),it->item->scrl_x, it->item->old_scrl_y + y);
+ }
+ /* tree effect */
+ _item_tree_effect(wd, y);
+ }
+ else
+ {
+ int expanded_item_num = 0;
+ int num = 0;
+
+ if (wd->expanded_item)
+ it = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) wd->expanded_item);
+
+ it2 = it;
+ while (it2)
+ {
+ expanded_item_num++;
+ it2 = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it2);
+ }
+
+ while (it)
+ {
+ num++;
+ if (wd->expanded_item->item->expanded_depth >= it->item->expanded_depth) break;
+ if (wd->move_effect_mode == ELM_GENLIST_ITEM_MOVE_EFFECT_EXPAND)
+ {
+ if (!it->item->tree_effect_finished)
+ {
+ if (t >= (((num - 1) * effect_duration) / expanded_item_num))
+ {
+ edje_object_signal_emit(VIEW(it), "flip_item", "");
+ evas_object_show(VIEW(it));
+ it->item->tree_effect_finished = EINA_TRUE;
+ }
+ }
+ }
+ it = (Elm_Gen_Item *) elm_genlist_item_next_get((Elm_Object_Item *) it);
+ }
+ }
+
+ if (end)
+ {
+ _item_tree_effect_finish(wd);
+ return ECORE_CALLBACK_CANCEL;
+ }
+ return ECORE_CALLBACK_RENEW;
+}