woohyun pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=ed18471ba955be316abb2117ebdde3f3df418751

commit ed18471ba955be316abb2117ebdde3f3df418751
Author: Ali Alzyod <[email protected]>
Date:   Wed Aug 5 13:09:00 2020 +0900

    evas_textblock: enhance cursor event submitting during markup_set/text_set
    
    Summary:
    Enhance text cursor events submitting:
    1- Submit events only for changed cursors.
    2- Reduce code complexity for cursor change.
    3- Add test case for cursor event change
    
    Reviewers: woohyun, zmike, bu5hm4n
    
    Reviewed By: woohyun
    
    Subscribers: cedric, #reviewers, #committers
    
    Tags: #efl
    
    Differential Revision: https://phab.enlightenment.org/D11775
---
 src/lib/evas/canvas/evas_object_textblock.c | 65 +++++++++++++----------------
 src/tests/evas/evas_test_textblock.c        | 21 ++++++++++
 2 files changed, 49 insertions(+), 37 deletions(-)

diff --git a/src/lib/evas/canvas/evas_object_textblock.c 
b/src/lib/evas/canvas/evas_object_textblock.c
index 6ed1593e15..e9b89dec98 100644
--- a/src/lib/evas/canvas/evas_object_textblock.c
+++ b/src/lib/evas/canvas/evas_object_textblock.c
@@ -578,8 +578,6 @@ static void evas_object_textblock_coords_recalc(Evas_Object 
*eo_obj,
                                                 void *type_private_data);
 static void _canvas_text_format_changed(Eo *eo_obj, Efl_Canvas_Textblock_Data 
*o);
 
-static void _evas_textblock_cursor_paragraph_first(Efl_Text_Cursor_Handle *cur,
-                                                   Eina_Bool emit_change);
 static const Evas_Object_Func object_func =
 {
    /* methods (compulsory) */
@@ -8754,16 +8752,36 @@ _evas_object_textblock_text_markup_set(Eo *eo_obj, 
Efl_Canvas_Textblock_Data *o,
      }
    _nodes_clear(eo_obj);
 
-   Efl_Text_Cursor_Handle *co = o->cursor;
-   co->node = _evas_textblock_node_text_new();
+   if (o->cursor->pos != 0)
+   {
+      o->cursor->changed = EINA_TRUE;
+      o->cursor->pos = 0;
+   }
+
    o->text_nodes = _NODE_TEXT(eina_inlist_append(
             EINA_INLIST_GET(o->text_nodes),
-            EINA_INLIST_GET(co->node)));
-
-   evas_textblock_cursor_paragraph_first(o->cursor);
+            EINA_INLIST_GET(_evas_textblock_node_text_new())));
+   o->cursor->node = o->text_nodes;
 
    evas_object_textblock_text_markup_prepend(o->cursor, text);
 
+   Eina_List *l;
+   Efl_Text_Cursor_Handle *cur;
+   EINA_LIST_FOREACH(o->cursors, l, cur)
+     {
+        cur->node = o->text_nodes;
+        if (cur->pos != 0)
+          {
+             cur->pos = 0;
+             cur->changed = EINA_TRUE;
+          }
+     }
+   _cursor_emit_if_changed(o->cursor);
+   EINA_LIST_FOREACH(o->cursors, l, cur)
+     {
+        _cursor_emit_if_changed(cur);
+     }
+
    /*If there was no text markup_prepend will not call change function
      So we will call it inside markup_set*/
    if (!text || !*text)
@@ -8772,26 +8790,6 @@ _evas_object_textblock_text_markup_set(Eo *eo_obj, 
Efl_Canvas_Textblock_Data *o,
         _evas_textblock_changed(o, eo_obj);
      }
 
-   efl_event_freeze(eo_obj);
-   /* Point all the cursors to the starrt */
-     {
-        Eina_List *l;
-        Efl_Text_Cursor_Handle *cur;
-
-        /*update all cursors positions first, without emitting change*/
-        EINA_LIST_FOREACH(o->cursors, l, cur)
-          {
-             _evas_textblock_cursor_paragraph_first(cur, EINA_FALSE);
-          }
-        /*emitting change event for all cursors, after all of them are ready*/
-        EINA_LIST_FOREACH(o->cursors, l, cur)
-          {
-             _evas_textblock_cursor_object_changed(cur);
-          }
-
-     }
-   efl_event_thaw(eo_obj);
-
     o->markup_text = text;
 }
 
@@ -10039,8 +10037,8 @@ found:
    _evas_textblock_changed(o, eo_obj);
 }
 
-static void
-_evas_textblock_cursor_paragraph_first(Efl_Text_Cursor_Handle *cur, Eina_Bool 
emit_change)
+EAPI void
+evas_textblock_cursor_paragraph_first(Efl_Text_Cursor_Handle *cur)
 {
    if (!cur) return;
    Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, 
EFL_CANVAS_OBJECT_CLASS);
@@ -10048,14 +10046,7 @@ 
_evas_textblock_cursor_paragraph_first(Efl_Text_Cursor_Handle *cur, Eina_Bool em
    Efl_Canvas_Textblock_Data *o = efl_data_scope_get(cur->obj, MY_CLASS);
    cur->node = o->text_nodes;
    cur->pos = 0;
-   if (emit_change)
-     _evas_textblock_cursor_object_changed(cur);
-}
-
-EAPI void
-evas_textblock_cursor_paragraph_first(Efl_Text_Cursor_Handle *cur)
-{
-   _evas_textblock_cursor_paragraph_first(cur, EINA_TRUE);
+   _evas_textblock_cursor_object_changed(cur);
 }
 
 EAPI void
diff --git a/src/tests/evas/evas_test_textblock.c 
b/src/tests/evas/evas_test_textblock.c
index 707c72f22c..6bdf25a19d 100644
--- a/src/tests/evas/evas_test_textblock.c
+++ b/src/tests/evas/evas_test_textblock.c
@@ -4847,6 +4847,26 @@ EFL_START_TEST(efl_canvas_textblock_cursor)
 }
 EFL_END_TEST
 
+EFL_START_TEST(efl_canvas_textblock_cursor_change)
+{
+   START_EFL_CANVAS_TEXTBLOCK_TEST();
+   (void) cur_obj;
+   int changed_emit1 = 0;
+   int changed_emit2 = 0;
+   Efl_Object *cur1, *cur2;
+   cur1 = efl_canvas_textblock_cursor_create(txt);
+   cur2 = efl_canvas_textblock_cursor_create(txt);
+   efl_text_set(txt, "Hello World");
+   efl_text_cursor_object_position_set(cur1, 0);
+   efl_text_cursor_object_position_set(cur2, 1);
+   efl_event_callback_add(cur1, EFL_TEXT_CURSOR_OBJECT_EVENT_CHANGED, 
_increment_int_changed, &changed_emit1);
+   efl_event_callback_add(cur2, EFL_TEXT_CURSOR_OBJECT_EVENT_CHANGED, 
_increment_int_changed, &changed_emit2);
+   efl_text_set(txt, "");
+   ck_assert_int_eq(changed_emit1, 0);
+   ck_assert_int_eq(changed_emit2, 1);
+}
+EFL_END_TEST
+
 
 EFL_START_TEST(efl_canvas_textblock_markup)
 {
@@ -5143,6 +5163,7 @@ void evas_test_textblock(TCase *tc)
    tcase_add_test(tc, efl_canvas_textblock_simple);
    tcase_add_test(tc, efl_text);
    tcase_add_test(tc, efl_canvas_textblock_cursor);
+   tcase_add_test(tc, efl_canvas_textblock_cursor_change);
    tcase_add_test(tc, efl_canvas_textblock_markup);
    tcase_add_test(tc, efl_canvas_textblock_markup_invalid_escape);
    tcase_add_test(tc, efl_text_font);

-- 


Reply via email to