From e960a0df12f512b4ff10d3d06198ada31bfb1fed Mon Sep 17 00:00:00 2001 From: Mykyta Biliavskyi Date: Tue, 9 Jun 2015 10:00:39 +0000 Subject: [PATCH] Edj viewer: support SPACER part highlighting. In edje library SPACER doesnt have Evas_Object, that represent part on canvas. Calculation position and size of the SPACER highlight should be corrected. For correcting geometry of highlight, uses current state of scroller(that contain layout object) and layout object. @fix T2464 --- src/lib/edj_viewer.c | 60 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/src/lib/edj_viewer.c b/src/lib/edj_viewer.c index def547e..b7b739e 100644 --- a/src/lib/edj_viewer.c +++ b/src/lib/edj_viewer.c @@ -101,13 +101,51 @@ part_obj_geom_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, } Evas_Coord x, y, w , h; - evas_object_geometry_get(obj, &x, &y, &w, &h); - evas_object_move(part_highlight, x, y); - evas_object_resize(part_highlight, w, h); + if (edje_edit_part_type_get(vd->layout, vd->part_name) == EDJE_PART_TYPE_SPACER) + { + Evas_Coord scroller_x, scroller_y; + Evas_Coord scroller_region_x, scroller_region_y; + Evas_Object *scroller_edje = elm_layout_edje_get(vd->scroller); + // Clipper need, to clip the highlight object for the part SPACER, + // because position of the highlight object is calculated here, + // not in edje. In case, when the SPACER is placed outside of + // scroller region view, the highlight should be hided. + Evas_Object *clipper = + (Evas_Object *)edje_object_part_object_get(scroller_edje, "clipper"); + + elm_scroller_region_get(vd->scroller, &scroller_region_x, + &scroller_region_y, NULL, NULL); + evas_object_geometry_get(vd->scroller, &scroller_x, &scroller_y, + NULL, NULL); + evas_object_smart_member_add(part_highlight, vd->scroller); + edje_object_part_geometry_get(vd->layout, vd->part_name, &x, &y, &w, &h); + + evas_object_move(part_highlight, x + scroller_x - scroller_region_x + 1, + y + scroller_y - scroller_region_y + 1); + evas_object_resize(part_highlight, w, h); + evas_object_clip_set(part_highlight, clipper); + } + else + { + evas_object_geometry_get(obj, &x, &y, &w, &h); + evas_object_move(part_highlight, x, y); + evas_object_resize(part_highlight, w, h); + } vd->part_highlight = part_highlight; } +static void +event_highlight_geom_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + view_data *vd = (view_data *) data; + if (!vd) return; + + if (edje_edit_part_type_get(vd->layout, vd->part_name) == EDJE_PART_TYPE_SPACER) + part_obj_geom_cb(vd, evas_object_evas_get(vd->layout), vd->part_obj, NULL); +} + static void part_obj_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, @@ -281,6 +319,8 @@ event_layer_set(view_data *vd) layout_del_cb, rect); evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_MOVE, rect_mouse_move_cb, vd); + evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_WHEEL, + event_highlight_geom_cb, vd); vd->event_rect = rect; } @@ -433,7 +473,6 @@ view_part_highlight_set(view_data *vd, const char *part_name) Evas_Object *part_obj = (Evas_Object *) edje_object_part_object_get(vd->layout, part_name); - if (!part_obj) return; //Delete the previous part callbacks if (vd->part_obj) @@ -452,6 +491,19 @@ view_part_highlight_set(view_data *vd, const char *part_name) evas_object_event_callback_add(part_obj, EVAS_CALLBACK_DEL, part_obj_del_cb, vd); + evas_object_event_callback_del(vd->layout, EVAS_CALLBACK_RESIZE, + event_highlight_geom_cb); + evas_object_event_callback_del(vd->layout, EVAS_CALLBACK_MOVE, + event_highlight_geom_cb); + + if (!part_obj) + { + evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_RESIZE, + event_highlight_geom_cb, vd); + evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_MOVE, + event_highlight_geom_cb, vd); + } + vd->part_obj = part_obj; eina_stringshare_replace(&vd->part_name, part_name); part_obj_geom_cb(vd, evas_object_evas_get(vd->layout), part_obj, NULL);