summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Hacohen <tom@stosb.com>2016-06-09 13:00:36 +0100
committerTom Hacohen <tom@stosb.com>2016-06-09 13:00:47 +0100
commit677e09d66fe2b895ddc5cb215cf4de4078bdd9f7 (patch)
tree21a22899c2e2406bd71fc908006b612d309e5f5f
parent8ed4a5d50aa09f01f5efaca7f74d249b4c0c2bdc (diff)
downloadefl-677e09d66fe2b895ddc5cb215cf4de4078bdd9f7.tar.gz
Text interactive: Simplify and unify selection handling in key input.
-rw-r--r--src/lib/elementary/efl_ui_internal_text_interactive.c227
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