fix entry shift selection extend with mouse.

SVN revision: 74338
This commit is contained in:
Carsten Haitzler 2012-07-24 03:52:14 +00:00
parent 5410726016
commit 29452cf797
2 changed files with 106 additions and 58 deletions

View File

@ -531,3 +531,9 @@
2012-07-14 Cedric Bail 2012-07-14 Cedric Bail
* Fix Edje_Multisense shutdown. * Fix Edje_Multisense shutdown.
2012-07-24 Carsten Haitzler (The Rasterman)
* Fix edje entry to extend selection to char pos/word or line
when holding shift + mouse click.

View File

@ -1651,8 +1651,9 @@ _edje_part_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS
Entry *en; Entry *en;
Evas_Coord x, y, w, h; Evas_Coord x, y, w, h;
// Eina_Bool multiline; // Eina_Bool multiline;
Evas_Textblock_Cursor *tc; Evas_Textblock_Cursor *tc = NULL;
Eina_Bool dosel = EINA_FALSE; Eina_Bool dosel = EINA_FALSE;
Eina_Bool shift;
if (!rp) return; if (!rp) return;
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
en = rp->entry_data; en = rp->entry_data;
@ -1673,6 +1674,7 @@ _edje_part_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS
} }
#endif #endif
shift = evas_key_modifier_is_set(ev->modifiers, "Shift");
en->select_mod_start = EINA_FALSE; en->select_mod_start = EINA_FALSE;
en->select_mod_end = EINA_FALSE; en->select_mod_end = EINA_FALSE;
if (rp->part->select_mode == EDJE_ENTRY_SELECTION_MODE_DEFAULT) if (rp->part->select_mode == EDJE_ENTRY_SELECTION_MODE_DEFAULT)
@ -1684,33 +1686,63 @@ _edje_part_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS
if (ev->button == 2) dosel = EINA_FALSE; if (ev->button == 2) dosel = EINA_FALSE;
if (dosel) if (dosel)
{ {
evas_object_geometry_get(rp->object, &x, &y, &w, &h);
cx = ev->canvas.x - x;
cy = ev->canvas.y - y;
if (ev->flags & EVAS_BUTTON_TRIPLE_CLICK) if (ev->flags & EVAS_BUTTON_TRIPLE_CLICK)
{ {
en->have_selection = EINA_FALSE; if (shift)
en->selecting = EINA_FALSE; {
_sel_clear(en->cursor, rp->object, en); tc = evas_object_textblock_cursor_new(rp->object);
tc = evas_object_textblock_cursor_new(rp->object); evas_textblock_cursor_copy(en->cursor, tc);
evas_textblock_cursor_copy(en->cursor, tc); if (evas_textblock_cursor_compare(en->cursor, en->sel_start) < 0)
evas_textblock_cursor_line_char_first(en->cursor); evas_textblock_cursor_line_char_first(en->cursor);
_sel_start(en->cursor, rp->object, en); else
evas_textblock_cursor_line_char_last(en->cursor); evas_textblock_cursor_line_char_last(en->cursor);
_sel_extend(en->cursor, rp->object, en); _sel_extend(en->cursor, rp->object, en);
}
else
{
en->have_selection = EINA_FALSE;
en->selecting = EINA_FALSE;
_sel_clear(en->cursor, rp->object, en);
tc = evas_object_textblock_cursor_new(rp->object);
evas_textblock_cursor_copy(en->cursor, tc);
evas_textblock_cursor_line_char_first(en->cursor);
_sel_start(en->cursor, rp->object, en);
evas_textblock_cursor_line_char_last(en->cursor);
_sel_extend(en->cursor, rp->object, en);
}
goto end; goto end;
} }
else if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) else if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
{ {
en->have_selection = EINA_FALSE; if (shift)
en->selecting = EINA_FALSE; {
_sel_clear(en->cursor, rp->object, en); tc = evas_object_textblock_cursor_new(rp->object);
tc = evas_object_textblock_cursor_new(rp->object); evas_textblock_cursor_copy(en->cursor, tc);
evas_textblock_cursor_copy(en->cursor, tc); if (evas_textblock_cursor_compare(en->cursor, en->sel_start) < 0)
evas_textblock_cursor_word_start(en->cursor); evas_textblock_cursor_word_start(en->cursor);
_sel_start(en->cursor, rp->object, en); else
evas_textblock_cursor_word_end(en->cursor); {
evas_textblock_cursor_char_next(en->cursor); evas_textblock_cursor_word_end(en->cursor);
_sel_extend(en->cursor, rp->object, en); evas_textblock_cursor_char_next(en->cursor);
}
_sel_extend(en->cursor, rp->object, en);
}
else
{
en->have_selection = EINA_FALSE;
en->selecting = EINA_FALSE;
_sel_clear(en->cursor, rp->object, en);
tc = evas_object_textblock_cursor_new(rp->object);
evas_textblock_cursor_copy(en->cursor, tc);
evas_textblock_cursor_word_start(en->cursor);
_sel_start(en->cursor, rp->object, en);
evas_textblock_cursor_word_end(en->cursor);
evas_textblock_cursor_char_next(en->cursor);
_sel_extend(en->cursor, rp->object, en);
}
goto end; goto end;
} }
} }
@ -1761,55 +1793,65 @@ _edje_part_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS
if ((en->have_selection) && if ((en->have_selection) &&
(rp->part->select_mode == EDJE_ENTRY_SELECTION_MODE_EXPLICIT)) (rp->part->select_mode == EDJE_ENTRY_SELECTION_MODE_EXPLICIT))
{ {
Eina_List *first, *last; if (shift)
FLOAT_T sc; _sel_extend(en->cursor, rp->object, en);
else
first = en->sel;
last = eina_list_last(en->sel);
if (first && last)
{ {
Evas_Textblock_Rectangle *r1, *r2; Eina_List *first, *last;
Evas_Coord d, d1, d2; FLOAT_T sc;
r1 = first->data; first = en->sel;
r2 = last->data; last = eina_list_last(en->sel);
d = r1->x - cx; if (first && last)
d1 = d * d;
d = (r1->y + (r1->h / 2)) - cy;
d1 += d * d;
d = r2->x + r2->w - 1 - cx;
d2 = d * d;
d = (r2->y + (r2->h / 2)) - cy;
d2 += d * d;
sc = rp->edje->scale;
if (sc == ZERO) sc = _edje_scale;
d = (Evas_Coord)MUL(FROM_INT(20), sc); // FIXME: maxing number!
d = d * d;
if (d1 < d2)
{ {
if (d1 <= d) Evas_Textblock_Rectangle *r1, *r2;
Evas_Coord d, d1, d2;
r1 = first->data;
r2 = last->data;
d = r1->x - cx;
d1 = d * d;
d = (r1->y + (r1->h / 2)) - cy;
d1 += d * d;
d = r2->x + r2->w - 1 - cx;
d2 = d * d;
d = (r2->y + (r2->h / 2)) - cy;
d2 += d * d;
sc = rp->edje->scale;
if (sc == ZERO) sc = _edje_scale;
d = (Evas_Coord)MUL(FROM_INT(20), sc); // FIXME: maxing number!
d = d * d;
if (d1 < d2)
{ {
en->select_mod_start = EINA_TRUE; if (d1 <= d)
en->selecting = EINA_TRUE; {
en->select_mod_start = EINA_TRUE;
en->selecting = EINA_TRUE;
}
} }
} else
else
{
if (d2 <= d)
{ {
en->select_mod_end = EINA_TRUE; if (d2 <= d)
en->selecting = EINA_TRUE; {
en->select_mod_end = EINA_TRUE;
en->selecting = EINA_TRUE;
}
} }
} }
} }
} }
else else
{ {
en->selecting = EINA_TRUE; if ((en->have_selection) && (shift))
_sel_clear(en->cursor, rp->object, en); _sel_extend(en->cursor, rp->object, en);
if (en->select_allow) else
{ {
_sel_start(en->cursor, rp->object, en); en->selecting = EINA_TRUE;
_sel_clear(en->cursor, rp->object, en);
if (en->select_allow)
{
_sel_start(en->cursor, rp->object, en);
}
} }
} }
} }