diff --git a/src/bin/grid.c b/src/bin/grid.c index 776b8a5..090b2cd 100644 --- a/src/bin/grid.c +++ b/src/bin/grid.c @@ -39,8 +39,10 @@ struct _Grid } cursor; Evas_Object *o_event; + Ecore_Animator *anim; const char *name; + int scroll; Eina_Bool noreqsize : 1; @@ -476,8 +478,10 @@ _smart_apply(Evas_Object *obj) ch1, y, ch2 - ch1 + 1, 1); } - /* TODO: test scrolling */ - evas_object_show(sd->cursor.obj); + if (sd->scroll != 0) + evas_object_hide(sd->cursor.obj); + else + evas_object_show(sd->cursor.obj); evas_object_move(sd->cursor.obj, ox + (sd->cursor.x * sd->font.chw), @@ -539,23 +543,6 @@ _smart_cb_delayed_size(void *data) return EINA_FALSE; } -/* static Eina_Bool */ -/* _smart_cb_change(void *data) */ -/* { */ -/* Evas_Object *obj; */ -/* Grid *sd; */ - -/* obj = data; */ - -/* if (!(sd = evas_object_smart_data_get(obj))) return EINA_FALSE; */ - -/* _smart_apply(obj); */ - -/* evas_object_smart_callback_call(obj, "changed", NULL); */ - -/* return EINA_FALSE; */ -/* } */ - static void _smart_cb_cursor_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) { @@ -575,7 +562,6 @@ _smart_cb_focus_in(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNU if (!(sd = evas_object_smart_data_get(data))) return; edje_object_signal_emit(sd->cursor.obj, "focus,in", "express"); - evas_object_show(sd->cursor.obj); /* TODO: finish */ } @@ -592,6 +578,89 @@ _smart_cb_focus_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UN /* TODO: finish */ } +static void +_smart_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event) +{ + Grid *sd; + Evas_Event_Mouse_Down *ev; + + ev = event; + if (!(sd = evas_object_smart_data_get(data))) return; + + if (ev->button == 3) + { + elm_object_focus_set(data, EINA_TRUE); + evas_object_smart_callback_call(data, "options", NULL); + } +} + +static Eina_Bool +_smart_cb_change(void *data) +{ + Evas_Object *obj; + Grid *sd; + + if (!(obj = data)) return EINA_FALSE; + if (!(sd = evas_object_smart_data_get(obj))) return EINA_FALSE; + + sd->anim = NULL; + _smart_apply(obj); + evas_object_smart_callback_call(obj, "changed", NULL); + return EINA_FALSE; +} + +static void +_smart_update_queue(Evas_Object *obj, Grid *sd) +{ + if (sd->anim) return; + sd->anim = ecore_animator_add(_smart_cb_change, obj); +} + +static void +_smart_cb_mouse_wheel(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event) +{ + Grid *sd; + Evas_Event_Mouse_Wheel *ev; + + ev = event; + if (!(sd = evas_object_smart_data_get(data))) return; + + sd->scroll -= (ev->z * 4); + if (sd->scroll < 0) sd->scroll = 0; + _smart_update_queue(data, sd); +} + +static void +_smart_cb_key_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event) +{ + Grid *sd; + Evas_Event_Key_Down *ev; + + ev = event; + if (!(sd = evas_object_smart_data_get(data))) return; + + if ((!evas_key_modifier_is_set(ev->modifiers, "Alt")) && + (evas_key_modifier_is_set(ev->modifiers, "Control")) && + (!evas_key_modifier_is_set(ev->modifiers, "Shift"))) + { + if ((!strcmp(ev->key, "Prior")) || (!strcmp(ev->key, "Right"))) + { + evas_object_smart_callback_call(data, "prev", NULL); + goto end; + } + else if ((!strcmp(ev->key, "Next")) || (!strcmp(ev->key, "Left"))) + { + evas_object_smart_callback_call(data, "next", NULL); + goto end; + } + } + + /* TODO: finish */ + +end: + edje_object_signal_emit(sd->cursor.obj, "key,down", "express"); +} + static void _smart_calculate(Evas_Object *obj) { @@ -656,16 +725,23 @@ _smart_add(Evas_Object *obj) sd->sel.theme = edje_object_add(sd->evas); evas_object_smart_member_add(sd->sel.theme, obj); - /* TODO: callbacks */ + /* TODO: selection callbacks */ /* create event object */ sd->o_event = evas_object_rectangle_add(sd->evas); evas_object_repeat_events_set(sd->o_event, EINA_TRUE); - evas_object_color_set(sd->o_event, 255, 0, 0,32); + evas_object_color_set(sd->o_event, 0, 0, 0, 0); evas_object_smart_member_add(sd->o_event, obj); evas_object_show(sd->o_event); + evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN, + _smart_cb_mouse_down, obj); + evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_WHEEL, + _smart_cb_mouse_wheel, obj); + /* TODO: Finish callbacks & imf */ + evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN, + _smart_cb_key_down, obj); evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_IN, _smart_cb_focus_in, obj); evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_OUT, @@ -689,6 +765,8 @@ _smart_del(Evas_Object *obj) if (sd->sel.theme) evas_object_del(sd->sel.theme); if (sd->grid.obj) evas_object_del(sd->grid.obj); if (sd->font.name) eina_stringshare_del(sd->font.name); + if (sd->anim) ecore_animator_del(sd->anim); + /* TODO: finish */ _parent_sc.del(obj);