#endif
#include <Elementary.h>
-static int tween_mode_val;
-
Evas_Object * _elm_min_set(Evas_Object *obj, Evas_Object *parent,
Evas_Coord w, Evas_Coord h);
elm_genlist_reorder_mode_set(data, elm_check_state_get(obj));
}
-static void
-_focus_highlight_ck_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- elm_win_focus_highlight_enabled_set(data, elm_check_state_get(obj));
-}
-
-static void
-_tween_mode_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
-{
- switch (tween_mode_val)
- {
- case 1:
- elm_genlist_reorder_mode_start(data, ECORE_POS_MAP_LINEAR);
- break;
- case 2:
- elm_genlist_reorder_mode_start(data, ECORE_POS_MAP_ACCELERATE);
- break;
- case 3:
- elm_genlist_reorder_mode_start(data, ECORE_POS_MAP_DECELERATE);
- break;
- case 4:
- elm_genlist_reorder_mode_start(data, ECORE_POS_MAP_SINUSOIDAL);
- break;
- case 5:
- elm_genlist_reorder_mode_start(data, ECORE_POS_MAP_DIVISOR_INTERP);
- break;
- case 6:
- elm_genlist_reorder_mode_start(data, ECORE_POS_MAP_BOUNCE);
- break;
- case 7:
- elm_genlist_reorder_mode_start(data, ECORE_POS_MAP_SPRING);
- break;
- default:
- elm_genlist_reorder_mode_start(data, ECORE_POS_MAP_LINEAR);
- break;
- }
-}
-
/**
* gl_moved is called after an item was reordered.
* This is only called when reorder mode is enabled.
void
test_genlist11(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- Evas_Object *win, *fr, *lb, *bx, *tg, *gl, *hbx, *ck, *grp, *rd;
+ Evas_Object *win, *fr, *lb, *bx, *tg, *gl;
int i;
api_data *api = calloc(1, sizeof(api_data));
win = elm_win_util_standard_add("genlist-reorder-mode", "Genlist Reorder Mode");
- elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
elm_win_autodel_set(win, EINA_TRUE);
evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
api->gl = gl;
evas_object_show(gl);
- hbx = elm_box_add(win);
- elm_box_horizontal_set(hbx, EINA_TRUE);
- evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, 0);
- elm_box_padding_set(hbx, 20, 0);
- elm_box_pack_end(bx, hbx);
- evas_object_show(hbx);
-
tg = elm_check_add(win);
elm_object_style_set(tg, "toggle");
elm_object_text_set(tg, "Reorder Mode:");
elm_check_state_set(tg, elm_config_mirrored_get());
evas_object_smart_callback_add(tg, "changed", _reorder_tg_changed_cb, gl);
- elm_box_pack_end(hbx, tg);
+ elm_box_pack_end(bx, tg);
evas_object_show(tg);
- ck = elm_check_add(win);
- elm_object_text_set(ck, "Focus Highlight");
- elm_check_state_set(ck, elm_win_focus_highlight_enabled_get(win));
- evas_object_smart_callback_add(ck, "changed", _focus_highlight_ck_changed_cb, win);
- elm_box_pack_end(hbx, ck);
- evas_object_show(ck);
-
- lb = elm_label_add(win);
- elm_object_text_set(lb, "Select reorder tween mode:");
- elm_box_pack_end(bx, lb);
- evas_object_show(lb);
-
- hbx = elm_box_add(win);
- elm_box_horizontal_set(hbx, EINA_TRUE);
- evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, 0);
- elm_box_pack_end(bx, hbx);
- evas_object_show(hbx);
-
- grp = rd = elm_radio_add(win);
- elm_object_text_set(rd, "Linear");
- elm_radio_state_value_set(rd, 1);
- elm_radio_value_pointer_set(rd, &tween_mode_val);
- evas_object_smart_callback_add(rd, "changed", _tween_mode_changed_cb, gl);
- elm_box_pack_end(hbx, rd);
- evas_object_show(rd);
-
- rd = elm_radio_add(win);
- elm_object_text_set(rd, "Accelerate");
- elm_radio_state_value_set(rd, 2);
- elm_radio_value_pointer_set(rd, &tween_mode_val);
- elm_radio_group_add(rd, grp);
- evas_object_smart_callback_add(rd, "changed", _tween_mode_changed_cb, gl);
- elm_box_pack_end(hbx, rd);
- evas_object_show(rd);
-
- rd = elm_radio_add(win);
- elm_object_text_set(rd, "Decelerate");
- elm_radio_state_value_set(rd, 3);
- elm_radio_value_pointer_set(rd, &tween_mode_val);
- elm_radio_group_add(rd, grp);
- evas_object_smart_callback_add(rd, "changed", _tween_mode_changed_cb, gl);
- elm_box_pack_end(hbx, rd);
- evas_object_show(rd);
-
- rd = elm_radio_add(win);
- elm_object_text_set(rd, "Sinusoidal");
- elm_radio_state_value_set(rd, 4);
- elm_radio_value_pointer_set(rd, &tween_mode_val);
- elm_radio_group_add(rd, grp);
- evas_object_smart_callback_add(rd, "changed", _tween_mode_changed_cb, gl);
- elm_box_pack_end(hbx, rd);
- evas_object_show(rd);
-
- hbx = elm_box_add(win);
- elm_box_horizontal_set(hbx, EINA_TRUE);
- evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, 0);
- elm_box_pack_end(bx, hbx);
- evas_object_show(hbx);
-
- rd = elm_radio_add(win);
- elm_object_text_set(rd, "Divisor Interpolation");
- elm_radio_state_value_set(rd, 5);
- elm_radio_value_pointer_set(rd, &tween_mode_val);
- elm_radio_group_add(rd, grp);
- evas_object_smart_callback_add(rd, "changed", _tween_mode_changed_cb, gl);
- elm_box_pack_end(hbx, rd);
- evas_object_show(rd);
-
- rd = elm_radio_add(win);
- elm_object_text_set(rd, "Bounce");
- elm_radio_state_value_set(rd, 6);
- elm_radio_value_pointer_set(rd, &tween_mode_val);
- elm_radio_group_add(rd, grp);
- evas_object_smart_callback_add(rd, "changed", _tween_mode_changed_cb, gl);
- elm_box_pack_end(hbx, rd);
- evas_object_show(rd);
-
- rd = elm_radio_add(win);
- elm_object_text_set(rd, "Spring");
- elm_radio_state_value_set(rd, 7);
- elm_radio_value_pointer_set(rd, &tween_mode_val);
- elm_radio_group_add(rd, grp);
- evas_object_smart_callback_add(rd, "changed", _tween_mode_changed_cb, gl);
- elm_box_pack_end(hbx, rd);
- evas_object_show(rd);
-
- elm_radio_value_set(grp, 1);
-
api->itc1 = elm_genlist_item_class_new();
api->itc1->item_style = "default";
api->itc1->func.text_get = gl_text_get;
api->itc1->func.content_get = gl_content_get;
api->itc1->func.state_get = gl_state_get;
api->itc1->func.del = NULL;
-
evas_object_smart_callback_add(gl, "moved", (Evas_Smart_Cb)gl_moved, gl);
evas_object_smart_callback_add(gl, "moved,after", (Evas_Smart_Cb)gl_moved_after, gl);
evas_object_smart_callback_add(gl, "moved,before", (Evas_Smart_Cb)gl_moved_before, gl);
cmd(SIG_ITEM_FOCUSED, "item,focused", "") \
cmd(SIG_ITEM_UNFOCUSED, "item,unfocused", "") \
cmd(SIG_PRESSED, "pressed", "") \
- cmd(SIG_RELEASED, "released", "") \
- cmd(SIG_ITEM_REORDER_START, "item,reorder,anim,start", "") \
- cmd(SIG_ITEM_REORDER_STOP, "item,reorder,anim,stop", "")
+ cmd(SIG_RELEASED, "released", "")
ELM_PRIV_GENLIST_SIGNALS(ELM_PRIV_STATIC_VARIABLE_DECLARE);
static Eina_Bool _key_action_move(Evas_Object *obj, const char *params);
static Eina_Bool _key_action_select(Evas_Object *obj, const char *params);
static Eina_Bool _key_action_escape(Evas_Object *obj, const char *params);
-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 _calc_job(void *data);
static Eina_Bool _item_block_recalc(Item_Block *itb, int in, Eina_Bool qadd);
static void _item_mouse_callbacks_add(Elm_Gen_Item *it, Evas_Object *view);
return EINA_FALSE;
}
-static void
-_anim_end(Elm_Genlist_Data *sd)
-{
- if (sd->reorder.dir == ELM_FOCUS_UP)
- _item_move_after(sd->reorder.it2, sd->reorder.it1);
- else if (sd->reorder.dir == ELM_FOCUS_DOWN)
- _item_move_after(sd->reorder.it1, sd->reorder.it2);
-
- ecore_job_del(sd->calc_job);
- sd->calc_job = ecore_job_add(_calc_job, sd->obj);
-}
-
-static Eina_Bool
-_item_swap_cb(void *data, double pos)
-{
- Elm_Genlist_Data *sd = data;
- double frame = pos;
- Evas_Coord xx1, yy1, xx2, yy2;
- double dx, dy;
-
- switch (sd->reorder.tween_mode)
- {
- case ECORE_POS_MAP_LINEAR:
- frame = ecore_animator_pos_map(frame, sd->reorder.tween_mode, 0, 0);
- break;
- case ECORE_POS_MAP_ACCELERATE:
- case ECORE_POS_MAP_DECELERATE:
- case ECORE_POS_MAP_SINUSOIDAL:
- frame = ecore_animator_pos_map(frame, sd->reorder.tween_mode, 1.0, 0);
- break;
- case ECORE_POS_MAP_DIVISOR_INTERP:
- case ECORE_POS_MAP_BOUNCE:
- case ECORE_POS_MAP_SPRING:
- frame = ecore_animator_pos_map(frame, sd->reorder.tween_mode, 1.0, 1.0);
- break;
- default:
- // use ECORE_POS_MAP_LINEAR as default tween mode
- frame = ecore_animator_pos_map(frame, sd->reorder.tween_mode, 0, 0);
- break;
- }
-
- dx = sd->reorder.x2 - sd->reorder.x1;
- dy = sd->reorder.y2 - sd->reorder.y1;
-
- xx1 = sd->reorder.x1 + (dx * frame);
- yy1 = sd->reorder.y1 + (dy * frame);
- xx2 = sd->reorder.x2 - (dx * frame);
- yy2 = sd->reorder.y2 - (dy * frame);
-
- evas_object_move(VIEW(sd->reorder.it2), xx2, yy2);
- evas_object_move(VIEW(sd->reorder.it1), xx1, yy1);
-
- if (pos == 1.0)
- {
- elm_genlist_item_bring_in((Elm_Object_Item *)sd->reorder.it2, ELM_GENLIST_ITEM_SCROLLTO_IN);
- _anim_end(sd);
- evas_object_smart_callback_call(sd->obj, SIG_ITEM_REORDER_STOP,
- EO_OBJ(sd->reorder.it1));
- evas_object_smart_callback_call(sd->obj, SIG_MOVED, EO_OBJ(sd->reorder.it1));
- sd->reorder.running = EINA_FALSE;
- }
-
- _elm_widget_focus_highlight_start(sd->obj);
-
- return EINA_TRUE;
-}
-
-
-static void
-_swap_items(Elm_Gen_Item *it1, Elm_Gen_Item *it2, Elm_Focus_Direction dir)
-{
- if (!it1 || !it2) return;
-
- ELM_GENLIST_DATA_GET_FROM_ITEM(it1, sd);
- Evas_Coord xx1, yy1, xx2, yy2;
-
- sd->reorder.running = EINA_TRUE;
- sd->reorder.dir = dir;
- sd->reorder.it1 = it1;
- sd->reorder.it2 = it2;
-
- evas_object_geometry_get(VIEW(it1), &xx1, &yy1, NULL, NULL);
- evas_object_geometry_get(VIEW(it2), &xx2, &yy2, NULL, NULL);
- sd->reorder.x1 = xx1;
- sd->reorder.y1 = yy1;
- sd->reorder.x2 = xx2;
- sd->reorder.y2 = yy2;
-
- evas_object_raise(VIEW(it1));
- evas_object_smart_callback_call(sd->obj, SIG_ITEM_REORDER_START,
- EO_OBJ(sd->reorder.it1));
- //TODO: Add elm config for time
- ecore_animator_timeline_add(0.3, _item_swap_cb, sd);
-}
-
static Eina_Bool
_key_action_move(Evas_Object *obj, const char *params)
{
}
else if (!strcmp(dir, "up"))
{
- if (sd->reorder.running) return EINA_TRUE;
- if (sd->reorder_mode)
- {
- Elm_Object_Item *up = elm_genlist_item_prev_get(sd->focused_item);
- ELM_GENLIST_ITEM_DATA_GET(sd->focused_item, focused_it);
- ELM_GENLIST_ITEM_DATA_GET(up, up2);
-
- _swap_items(focused_it, up2, ELM_FOCUS_UP);
-
- return EINA_TRUE;
- }
-
if (_key_action_move_dir(obj, ELM_FOCUS_UP, EINA_FALSE)) return EINA_TRUE;
else return EINA_FALSE;
}
}
else if (!strcmp(dir, "down"))
{
- if (sd->reorder.running) return EINA_TRUE;
- if (sd->reorder_mode)
- {
- Elm_Object_Item *down = elm_genlist_item_next_get(sd->focused_item);
- ELM_GENLIST_ITEM_DATA_GET(sd->focused_item, focused_it);
- ELM_GENLIST_ITEM_DATA_GET(down, down2);
-
- _swap_items(focused_it, down2, ELM_FOCUS_DOWN);
-
- return EINA_TRUE;
- }
-
if (_key_action_move_dir(obj, ELM_FOCUS_DOWN, EINA_FALSE)) return EINA_TRUE;
else return EINA_FALSE;
}
}
}
-EAPI void
-elm_genlist_reorder_mode_start(Evas_Object *obj, Ecore_Pos_Map tween_mode)
-{
- ELM_GENLIST_CHECK(obj);
- ELM_GENLIST_DATA_GET(obj, sd);
-
- sd->reorder.tween_mode = tween_mode;
- _elm_genlist_reorder_mode_set(obj, sd, EINA_TRUE);
-}
-
-EAPI void
-elm_genlist_reorder_mode_stop(Evas_Object *obj)
-{
- ELM_GENLIST_CHECK(obj);
- ELM_GENLIST_DATA_GET(obj, sd);
-
- _elm_genlist_reorder_mode_set(obj, sd, EINA_FALSE);
-}
-
EOLIAN static Eina_Bool
_elm_genlist_reorder_mode_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
{