From: Subodh Kumar Date: Mon, 21 Dec 2015 14:27:43 +0000 (+0000) Subject: Edje entry: Fix cursor position on mouse up and down X-Git-Tag: upstream/1.20.0~7853 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7684cea2267f3fdd48977319ae05cbb4d12b82e9;p=platform%2Fupstream%2Fefl.git Edje entry: Fix cursor position on mouse up and down Summary: Fix cursor position on mouse up/down When mouse down/up over top and bottom part textblock is not able to set the char coordinate as it is not inside actual text, edje entry tries to manage it but textblock has that handling. As a result the cursor jump to first char for single line and at the last in the multiline last line. So this patch fixes this and manage to keep the the mouse coordinate inside the textblock. In mobile device this is not really acceptable when user taps over the entry at some position and cursor jumps to some arbitrary position. @fix Test Plan: 1. Elementary Test 2. Entry 3 (any entry) 3. Try to click little below or above the text in first entry single line.Observe cursor jumps to first position 4. Do as above for multiline entry (try to click at the last line little below) observe cursor jumps to last char. Reviewers: thiepha, herdsman, tasn Subscribers: jpeg, tasn, cedric Differential Revision: https://phab.enlightenment.org/D3257 --- diff --git a/src/lib/edje/edje_entry.c b/src/lib/edje/edje_entry.c index 9ed6ff7..9b9d194 100644 --- a/src/lib/edje/edje_entry.c +++ b/src/lib/edje/edje_entry.c @@ -2052,6 +2052,44 @@ _edje_key_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, v #endif } +static Evas_Textblock_Cursor * +_edje_cursor_char_coord_set(Edje_Real_Part *rp, Evas_Coord canvasx, Evas_Coord canvasy, Evas_Coord *cx, Evas_Coord *cy) +{ + Entry *en; + Evas_Coord x, y, lh = 0, cly = 0; + Evas_Textblock_Cursor *line_cur; + Evas_Textblock_Cursor *tc; + + en = rp->typedata.text->entry_data; + tc = evas_object_textblock_cursor_new(rp->object); + evas_textblock_cursor_copy(en->cursor, tc); + evas_object_geometry_get(rp->object, &x, &y, NULL, NULL); + *cx = canvasx - x; + *cy = canvasy - y; + + line_cur = evas_object_textblock_cursor_new(rp->object); + evas_textblock_cursor_paragraph_last(line_cur); + evas_textblock_cursor_line_geometry_get(line_cur, NULL, &cly, NULL, &lh); + /* Consider a threshold of half the line height */ + if (*cy > (cly + lh) && *cy < (cly + lh + lh / 2)) + { + *cy = cly + lh - 1; // Make it inside Textblock + } + evas_textblock_cursor_paragraph_first(line_cur); + evas_textblock_cursor_line_geometry_get(line_cur, NULL, &cly, NULL, NULL); + + if (*cy < cly && *cy > (cly - lh / 2)) + { + *cy = cly; + } + evas_textblock_cursor_free(line_cur); + /* No need to check return value if not able to set the char coord Textblock + * will take care */ + evas_textblock_cursor_char_coord_set(en->cursor, *cx, *cy); + + return tc; +} + static void _edje_part_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -2072,11 +2110,11 @@ _edje_part_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_ Edje_Real_Part *rp = data; Evas_Event_Mouse_Down *ev = event_info; Entry *en; - Evas_Coord x, y, w, h; // Eina_Bool multiline; Evas_Textblock_Cursor *tc = NULL; Eina_Bool dosel = EINA_FALSE; Eina_Bool shift; + if ((!rp) || (!ev)) return; if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; if ((rp->type != EDJE_RP_TYPE_TEXT) || @@ -2165,48 +2203,8 @@ _edje_part_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_ goto end; } } - tc = evas_object_textblock_cursor_new(rp->object); - evas_textblock_cursor_copy(en->cursor, tc); - // multiline = rp->part->multiline; - evas_object_geometry_get(rp->object, &x, &y, &w, &h); - cx = ev->canvas.x - x; - cy = ev->canvas.y - y; - if (!evas_textblock_cursor_char_coord_set(en->cursor, cx, cy)) - { - Evas_Coord lx, ly, lw, lh; - int line; + tc = _edje_cursor_char_coord_set(rp, ev->canvas.x, ev->canvas.y, &cx, &cy); - line = evas_textblock_cursor_line_coord_set(en->cursor, cy); - if (line == -1) - { - if (rp->part->multiline) - _curs_end(en->cursor, rp->object, en); - else - { - evas_textblock_cursor_paragraph_first(en->cursor); - evas_textblock_cursor_line_geometry_get(en->cursor, &lx, &ly, &lw, &lh); - if (!evas_textblock_cursor_char_coord_set(en->cursor, cx, ly + (lh / 2))) - _curs_end(en->cursor, rp->object, en); - } - } - else - { - int lnum; - - lnum = evas_textblock_cursor_line_geometry_get(en->cursor, &lx, &ly, &lw, &lh); - if (lnum < 0) - { - _curs_lin_start(en->cursor, rp->object, en); - } - else - { - if (cx <= lx) - _curs_lin_start(en->cursor, rp->object, en); - else - _curs_lin_end(en->cursor, rp->object, en); - } - } - } if (dosel) { if ((en->have_selection) && @@ -2294,8 +2292,8 @@ _edje_part_mouse_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UN Edje_Real_Part *rp = data; Evas_Event_Mouse_Up *ev = event_info; Entry *en; - Evas_Coord x, y, w, h; Evas_Textblock_Cursor *tc; + if ((!ev) || (ev->button != 1)) return; if (!rp) return; if (ev->flags & EVAS_BUTTON_TRIPLE_CLICK) return; @@ -2322,47 +2320,9 @@ _edje_part_mouse_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UN } #endif - tc = evas_object_textblock_cursor_new(rp->object); - evas_textblock_cursor_copy(en->cursor, tc); - evas_object_geometry_get(rp->object, &x, &y, &w, &h); - cx = ev->canvas.x - x; - cy = ev->canvas.y - y; - if (!evas_textblock_cursor_char_coord_set(en->cursor, cx, cy)) - { - Evas_Coord lx, ly, lw, lh; - int line; + /* cx cy are unused but needed in mouse down, please bear with it */ + tc = _edje_cursor_char_coord_set(rp, ev->canvas.x, ev->canvas.y, &cx, &cy); - line = evas_textblock_cursor_line_coord_set(en->cursor, cy); - if (line == -1) - { - if (rp->part->multiline) - _curs_end(en->cursor, rp->object, en); - else - { - evas_textblock_cursor_paragraph_first(en->cursor); - evas_textblock_cursor_line_geometry_get(en->cursor, &lx, &ly, &lw, &lh); - if (!evas_textblock_cursor_char_coord_set(en->cursor, cx, ly + (lh / 2))) - _curs_end(en->cursor, rp->object, en); - } - } - else - { - int lnum; - - lnum = evas_textblock_cursor_line_geometry_get(en->cursor, &lx, &ly, &lw, &lh); - if (lnum < 0) - { - _curs_lin_start(en->cursor, rp->object, en); - } - else - { - if (cx <= lx) - _curs_lin_start(en->cursor, rp->object, en); - else - _curs_lin_end(en->cursor, rp->object, en); - } - } - } if (en->select_allow) { if (rp->part->select_mode == EDJE_ENTRY_SELECTION_MODE_EXPLICIT)