diff options
author | Tom Hacohen <tom@stosb.com> | 2016-06-09 13:00:36 +0100 |
---|---|---|
committer | Tom Hacohen <tom@stosb.com> | 2016-06-09 13:00:47 +0100 |
commit | 677e09d66fe2b895ddc5cb215cf4de4078bdd9f7 (patch) | |
tree | 21a22899c2e2406bd71fc908006b612d309e5f5f | |
parent | 8ed4a5d50aa09f01f5efaca7f74d249b4c0c2bdc (diff) | |
download | efl-677e09d66fe2b895ddc5cb215cf4de4078bdd9f7.tar.gz |
Text interactive: Simplify and unify selection handling in key input.
-rw-r--r-- | src/lib/elementary/efl_ui_internal_text_interactive.c | 227 |
1 files changed, 77 insertions, 150 deletions
diff --git a/src/lib/elementary/efl_ui_internal_text_interactive.c b/src/lib/elementary/efl_ui_internal_text_interactive.c index 08a5636d9b..d789f59726 100644 --- a/src/lib/elementary/efl_ui_internal_text_interactive.c +++ b/src/lib/elementary/efl_ui_internal_text_interactive.c @@ -709,6 +709,41 @@ _compose_seq_reset(Efl_Ui_Internal_Text_Interactive_Data *en) en->composing = EINA_FALSE; } +/* + * shift: if shift is pressed. + * movement_forward: if the movement we are going to do is forward (towards the end of the textblock) + */ +static void +_key_down_sel_pre(Efl_Ui_Internal_Text_Interactive *obj, Efl_Canvas_Text_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en, Eina_Bool shift, Eina_Bool movement_forward) +{ + if (en->select_allow) + { + if (shift) + { + _sel_start(cur, obj, en); + } + else if (en->have_selection) + { + Eina_Bool sel_forward = evas_textblock_cursor_compare(en->sel_start, en->sel_end); + if ((sel_forward && movement_forward) || (!sel_forward && !movement_forward)) + evas_textblock_cursor_copy(en->sel_end, cur); + else + evas_textblock_cursor_copy(en->sel_start, cur); + _sel_clear(cur, obj, en); + } + } +} + +static void +_key_down_sel_post(Efl_Ui_Internal_Text_Interactive *obj, Efl_Canvas_Text_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en, Eina_Bool shift) +{ + if (en->select_allow) + { + if (shift) _sel_extend(cur, obj, en); + else _sel_clear(cur, obj, en); + } +} + static void _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) { @@ -769,32 +804,12 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void _compose_seq_reset(en); if (multiline) { - if (en->have_selection && - !efl_canvas_text_cursor_equal(en->sel_start, en->sel_end)) - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - if (en->select_allow) - { - if (shift) - { - _sel_start(cur, obj, en); - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - } - else if (en->have_selection) - { - if (evas_textblock_cursor_compare(en->sel_start, en->sel_end) < 0) - evas_textblock_cursor_copy(en->sel_start, cur); - else - evas_textblock_cursor_copy(en->sel_end, cur); - _sel_clear(cur, obj, en); - } - } + _key_down_sel_pre(obj, cur, en, shift, EINA_FALSE); + efl_canvas_text_cursor_line_jump_by(cur, -1); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - if (en->select_allow) - { - if (shift) _sel_extend(cur, obj, en); - else _sel_clear(cur, obj, en); - } + + _key_down_sel_post(obj, cur, en, shift); } } else if (!strcmp(ev->key, "Down") || @@ -803,105 +818,39 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void _compose_seq_reset(en); if (multiline) { - if (en->have_selection && - !efl_canvas_text_cursor_equal(en->sel_start, en->sel_end)) - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - if (en->select_allow) - { - if (shift) - { - _sel_start(cur, obj, en); - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - } - else if (en->have_selection) - { - if (evas_textblock_cursor_compare(en->sel_start, en->sel_end) < 0) - evas_textblock_cursor_copy(en->sel_end, cur); - else - evas_textblock_cursor_copy(en->sel_start, cur); - _sel_clear(cur, obj, en); - } - } + _key_down_sel_pre(obj, cur, en, shift, EINA_TRUE); + efl_canvas_text_cursor_line_jump_by(cur, 1); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - if (en->select_allow) - { - if (shift) _sel_extend(cur, obj, en); - else _sel_clear(cur, obj, en); - } + + _key_down_sel_post(obj, cur, en, shift); } } else if (!strcmp(ev->key, "Left") || (!strcmp(ev->key, "KP_Left") && !ev->string)) { _compose_seq_reset(en); - if (en->have_selection && - !efl_canvas_text_cursor_equal(en->sel_start, en->sel_end)) - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - if (en->select_allow) - { - if (shift) - { - _sel_start(cur, obj, en); - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - } - else - { - if (en->have_selection) - { - if (evas_textblock_cursor_compare(en->sel_start, en->sel_end) < 0) - evas_textblock_cursor_copy(en->sel_start, cur); - else - evas_textblock_cursor_copy(en->sel_end, cur); - _sel_clear(cur, obj, en); - } - } - } - if (evas_textblock_cursor_char_prev(cur)) - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + _key_down_sel_pre(obj, cur, en, shift, EINA_FALSE); + + efl_canvas_text_cursor_char_prev(cur); /* If control is pressed, go to the start of the word */ - if (control) evas_textblock_cursor_word_start(cur); - if (en->select_allow) - { - if (shift) _sel_extend(cur, obj, en); - else _sel_clear(cur, obj, en); - } + if (control) efl_canvas_text_cursor_word_start(cur); + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + + _key_down_sel_post(obj, cur, en, shift); } else if (!strcmp(ev->key, "Right") || (!strcmp(ev->key, "KP_Right") && !ev->string)) { _compose_seq_reset(en); - if (en->have_selection && - !efl_canvas_text_cursor_equal(en->sel_start, en->sel_end)) - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - if (en->select_allow) - { - if (shift) - { - _sel_start(cur, obj, en); - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - } - else - { - if (en->have_selection) - { - if (evas_textblock_cursor_compare(en->sel_start, en->sel_end) < 0) - evas_textblock_cursor_copy(en->sel_end, cur); - else - evas_textblock_cursor_copy(en->sel_start, cur); - _sel_clear(cur, obj, en); - } - } - } + _key_down_sel_pre(obj, cur, en, shift, EINA_TRUE); + /* If control is pressed, go to the end of the word */ - if (control) evas_textblock_cursor_word_end(cur); - if (evas_textblock_cursor_char_next(cur)) - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - if (en->select_allow) - { - if (shift) _sel_extend(cur, obj, en); - else _sel_clear(cur, obj, en); - } + if (control) efl_canvas_text_cursor_word_end(cur); + efl_canvas_text_cursor_char_prev(cur); + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + + _key_down_sel_post(obj, cur, en, shift); } else if (!strcmp(ev->key, "BackSpace")) { @@ -980,19 +929,14 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void ((!strcmp(ev->key, "KP_Home")) && !ev->string))) { _compose_seq_reset(en); - if (en->select_allow) - { - if (shift) _sel_start(cur, obj, en); - else _sel_clear(cur, obj, en); - } + _key_down_sel_pre(obj, cur, en, shift, EINA_FALSE); + if ((control) && (multiline)) - evas_textblock_cursor_paragraph_first(cur); + efl_canvas_text_cursor_paragraph_first(cur); else - evas_textblock_cursor_line_char_first(cur); - if (en->select_allow) - { - if (shift) _sel_extend(cur, obj, en); - } + efl_canvas_text_cursor_line_char_first(cur); + + _key_down_sel_post(obj, cur, en, shift); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; } else if ((!alt) && @@ -1000,19 +944,14 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void ((!strcmp(ev->key, "KP_End")) && !ev->string))) { _compose_seq_reset(en); - if (en->select_allow) - { - if (shift) _sel_start(cur, obj, en); - else _sel_clear(cur, obj, en); - } + _key_down_sel_pre(obj, cur, en, shift, EINA_TRUE); + if ((control) && (multiline)) - evas_textblock_cursor_paragraph_last(cur); + efl_canvas_text_cursor_paragraph_last(cur); else - evas_textblock_cursor_line_char_last(cur); - if (en->select_allow) - { - if (shift) _sel_extend(cur, obj, en); - } + efl_canvas_text_cursor_line_char_last(cur); + + _key_down_sel_post(obj, cur, en, shift); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; } else if (shift && !strcmp(ev->key, "Tab")) @@ -1033,34 +972,22 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void (!strcmp(ev->key, "KP_Prior") && !ev->string)) { _compose_seq_reset(en); - if (en->select_allow) - { - if (shift) _sel_start(cur, obj, en); - else _sel_clear(cur, obj, en); - } + _key_down_sel_pre(obj, cur, en, shift, EINA_FALSE); + efl_canvas_text_cursor_line_jump_by(cur, -10); - if (en->select_allow) - { - if (shift) _sel_extend(cur, obj, en); - else _sel_clear(cur, obj, en); - } + + _key_down_sel_post(obj, cur, en, shift); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; } else if (!strcmp(ev->key, "Next") || (!strcmp(ev->key, "KP_Next") && !ev->string)) { _compose_seq_reset(en); - if (en->select_allow) - { - if (shift) _sel_start(cur, obj, en); - else _sel_clear(cur, obj, en); - } + _key_down_sel_pre(obj, cur, en, shift, EINA_TRUE); + efl_canvas_text_cursor_line_jump_by(cur, 10); - if (en->select_allow) - { - if (shift) _sel_extend(cur, obj, en); - else _sel_clear(cur, obj, en); - } + + _key_down_sel_post(obj, cur, en, shift); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; } else |