diff --git a/legacy/edje/data/src/e_logo.edc b/legacy/edje/data/src/e_logo.edc index 5bfb97f14a..6c5bae1423 100644 --- a/legacy/edje/data/src/e_logo.edc +++ b/legacy/edje/data/src/e_logo.edc @@ -201,7 +201,11 @@ collections { parts { part { name: "background"; - mouse_events: 0; + mouse_events: 1; + dragable { + events: "dragable"; + } + description { state: "default" 0.0; color_class: "bg"; diff --git a/legacy/edje/src/bin/edje_cc_handlers.c b/legacy/edje/src/bin/edje_cc_handlers.c index 7c12131dd7..50deba9af9 100644 --- a/legacy/edje/src/bin/edje_cc_handlers.c +++ b/legacy/edje/src/bin/edje_cc_handlers.c @@ -30,6 +30,7 @@ static void st_collections_group_parts_part_clip_to_id(void); static void st_collections_group_parts_part_dragable_x(void); static void st_collections_group_parts_part_dragable_y(void); static void st_collections_group_parts_part_dragable_confine(void); +static void st_collections_group_parts_part_dragable_events(void); static void ob_collections_group_parts_part_description(void); static void st_collections_group_parts_part_description_inherit(void); @@ -118,6 +119,7 @@ New_Statement_Handler statement_handlers[] = {"collections.group.parts.part.dragable.x", st_collections_group_parts_part_dragable_x}, {"collections.group.parts.part.dragable.y", st_collections_group_parts_part_dragable_y}, {"collections.group.parts.part.dragable.confine", st_collections_group_parts_part_dragable_confine}, + {"collections.group.parts.part.dragable.events", st_collections_group_parts_part_dragable_events}, {"collections.group.parts.part.image", st_images_image}, /* dup */ {"collections.group.parts.part.images.image", st_images_image}, /* dup */ {"collections.group.parts.part.font", st_fonts_font}, /* dup */ @@ -573,6 +575,7 @@ ob_collections_group_parts_part(void) ep->repeat_events = 0; ep->clip_to_id = -1; ep->dragable.confine_id = -1; + ep->dragable.events_id = -1; } static void @@ -718,6 +721,25 @@ st_collections_group_parts_part_dragable_confine(void) } } +static void +st_collections_group_parts_part_dragable_events(void) +{ + Edje_Part_Collection *pc; + Edje_Part *ep; + + check_arg_count(1); + + pc = evas_list_data(evas_list_last(edje_collections)); + ep = evas_list_data(evas_list_last(pc->parts)); + { + char *name; + + name = parse_str(0); + data_queue_part_lookup(pc, name, &(ep->dragable.events_id)); + free(name); + } +} + static void ob_collections_group_parts_part_description(void) { diff --git a/legacy/edje/src/lib/edje_callbacks.c b/legacy/edje/src/lib/edje_callbacks.c index 4dc9e6ba0f..0b362c8a8c 100644 --- a/legacy/edje/src/lib/edje_callbacks.c +++ b/legacy/edje/src/lib/edje_callbacks.c @@ -1,3 +1,8 @@ +/* + * vim: ts=8 + */ + + #include "Edje.h" #include "edje_private.h" @@ -54,14 +59,75 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) _edje_ref(ed); _edje_freeze(ed); _edje_emit(ed, buf, rp->part->name); + + if (rp->events_to) + { + int x, y; + Edje_Real_Part* events; + events = rp->events_to; + + //fprintf(stderr,"rp = %s, events = %s\n", rp->part->name, events->part->name); + + evas_object_geometry_get(rp->object, &x, &y, NULL, NULL); + /* + fprintf(stderr,"x = %d, y = %d\n", x, y); + fprintf(stderr,"ev->canvas.x = %d\n", ev->canvas.x); + * + x = ed->x; + y = ed->y; + */ + if ((events->part->dragable.x) || (events->part->dragable.y)) + { + if (events->part->dragable.x) + { + events->drag.tmp.x = ev->canvas.x - x - (events->x + events->w/2); + events->drag.down.x = ev->canvas.x - x; + events->x = ev->canvas.x - x - events->w/2; + } + if (events->part->dragable.y) + { + events->drag.tmp.y = ev->canvas.y - y - (events->y + events->h/2); + events->drag.down.y = ev->canvas.y - y; + events->y = ev->canvas.y - y - events->h/2; + } + + snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button); + _edje_emit(ed, buf, events->part->name); + ed->dirty = 1; + } + _edje_recalc(ed); + _edje_thaw(ed); + _edje_unref(ed); + _edje_ref(ed); + _edje_freeze(ed); + + rp = events; + { + double dx, dy; + int dir; + + dir = _edje_part_dragable_calc(ed, rp, &dx, &dy); +// fprintf(stderr,"dx = %f, dy = %f\n", dx, dy); + if ((dx != rp->drag.val.x) || (dy != rp->drag.val.y)) + { + rp->drag.val.x = dx; + rp->drag.val.y = dy; + _edje_emit(ed, "drag", rp->part->name); + ed->dirty = 1; + rp->drag.need_reset = 1; + _edje_recalc(ed); + } + } + } + if ((rp->part->dragable.x) || (rp->part->dragable.y)) { if (rp->drag.down.count == 0) { if (rp->part->dragable.x) - rp->drag.down.x = ev->canvas.x; + rp->drag.down.x = ev->canvas.x; if (rp->part->dragable.y) - rp->drag.down.y = ev->canvas.y; + rp->drag.down.y = ev->canvas.y; _edje_emit(ed, "drag,start", rp->part->name); } rp->drag.down.count++; @@ -90,9 +156,18 @@ _edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) ed = data; rp = evas_object_data_get(obj, "real_part"); if (!rp) return; + snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button); _edje_ref(ed); _edje_emit(ed, buf, rp->part->name); + + if(rp->events_to) + { + rp = rp->events_to; + snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button); + _edje_emit(ed, buf, rp->part->name); + } + if ((rp->part->dragable.x) || (rp->part->dragable.y)) { if (rp->drag.down.count > 0) @@ -132,6 +207,9 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) ed = data; rp = evas_object_data_get(obj, "real_part"); if (!rp) return; + if (rp->events_to) + rp = rp->events_to; + if (rp->still_in) { Evas_Coord x, y, w, h; diff --git a/legacy/edje/src/lib/edje_data.c b/legacy/edje/src/lib/edje_data.c index 73c248a09c..0ea859ecbc 100644 --- a/legacy/edje/src/lib/edje_data.c +++ b/legacy/edje/src/lib/edje_data.c @@ -238,6 +238,7 @@ _edje_edd_setup(void) EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "dragable.step_y", dragable.step_y, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "dragable.count_y", dragable.count_y, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "dragable.counfine_id", dragable.confine_id, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "dragable.events_id", dragable.events_id, EET_T_INT); _edje_edd_edje_part_collection = NEWD("Edje_Part_Collection", diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index 42afe86fd7..32f7f84cd8 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/src/lib/edje_load.c @@ -85,6 +85,7 @@ edje_object_file_set(Evas_Object *obj, const char *file, const char *part) desc = hist->data; if (desc->color_class) _edje_color_class_member_add(ed, desc->color_class); } + hist = NULL; hist = evas_list_append(hist, ep); while (ep->dragable.confine_id >= 0) { @@ -101,6 +102,32 @@ edje_object_file_set(Evas_Object *obj, const char *file, const char *part) evas_list_free(hist); hist = NULL; hist = evas_list_append(hist, ep); + while (ep->dragable.events_id >= 0) + { + Edje_Part* prev; + + prev = ep; + + ep = evas_list_nth(ed->collection->parts, + ep->dragable.events_id); + + if (!ep->dragable.x && !ep->dragable.y) + { + prev->dragable.events_id = -1; + break; + } + + if (evas_list_find(hist, ep)) + { + printf("EDJE ERROR: events_to loops. invalidating loop.\n"); + ep->dragable.events_id = -1; + break; + } + hist = evas_list_append(hist, ep); + } + evas_list_free(hist); + hist = NULL; + hist = evas_list_append(hist, ep); while (ep->clip_to_id >= 0) { ep = evas_list_nth(ed->collection->parts, @@ -232,6 +259,18 @@ edje_object_file_set(Evas_Object *obj, const char *file, const char *part) if (rp->part->dragable.confine_id >= 0) rp->confine_to = evas_list_nth(ed->parts, rp->part->dragable.confine_id); + /* replay events for dragable */ + if (rp->part->dragable.events_id >= 0) + { + rp->events_to = + evas_list_nth(ed->parts, + rp->part->dragable.events_id); + /* events_to may be used only with dragable */ + if (!rp->events_to->part->dragable.x && + !rp->events_to->part->dragable.y) + rp->events_to = NULL; + } + rp->swallow_params.min.w = 0; rp->swallow_params.min.w = 0; rp->swallow_params.max.w = -1; diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index c31ec76e6a..e35a61a8d0 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -182,7 +182,7 @@ struct _Edje_Font_Directory_Entry char *entry; /* the name of the font */ }; - + /*----------*/ struct _Edje_Image_Directory @@ -305,6 +305,9 @@ struct _Edje_Part int count_y; /* drag area divided by n (0 = no limit) */ int confine_id; /* dragging within this bit, -1 = no */ + + /* davinchi */ + int events_id; /* If it is used as scrollbar */ } dragable; }; @@ -542,6 +545,7 @@ struct _Edje_Real_Part Edje_Real_Part *clip_to; Edje_Running_Program *program; + Edje_Real_Part *events_to; }; struct _Edje_Running_Program