forked from enlightenment/efl
efl.text.cursor: change to abstract class
Summary: 1- Change cursor to abstract class 2- Remove copy method from cursor 3- remove cursor_Add method from efl.canvas.textblock and efl.ui.textbox Reviewers: woohyun, segfaultxavi, bu5hm4n Reviewed By: bu5hm4n Subscribers: lauromoura, YOhoho, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T8299, T8454 Differential Revision: https://phab.enlightenment.org/D11034
This commit is contained in:
parent
7b0a44dd33
commit
1a02745a88
|
@ -76,6 +76,12 @@ _text_filter_markup_prepend(Efl_Canvas_Textblock *obj, Efl_Ui_Internal_Text_Inte
|
|||
const char *fmtpre, const char *fmtpost,
|
||||
Eina_Bool clearsel, Eina_Bool changeinfo);
|
||||
|
||||
static void
|
||||
_cur_pos_copy(Efl_Text_Cursor *src, Efl_Text_Cursor *dest)
|
||||
{
|
||||
efl_text_cursor_position_set(dest, efl_text_cursor_position_get(src));
|
||||
}
|
||||
|
||||
#ifdef HAVE_ECORE_IMF
|
||||
static void
|
||||
_preedit_clear(Efl_Ui_Internal_Text_Interactive_Data *en)
|
||||
|
@ -523,12 +529,12 @@ _entry_imf_event_preedit_changed_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUS
|
|||
/* set preedit start cursor */
|
||||
if (!en->preedit_start)
|
||||
en->preedit_start = efl_canvas_textblock_cursor_create(obj);
|
||||
efl_text_cursor_copy(cur, en->preedit_start);
|
||||
_cur_pos_copy(cur, en->preedit_start);
|
||||
|
||||
/* set preedit end cursor */
|
||||
if (!en->preedit_end)
|
||||
en->preedit_end = efl_canvas_textblock_cursor_create(obj);
|
||||
efl_text_cursor_copy(cur, en->preedit_end);
|
||||
_cur_pos_copy(cur, en->preedit_end);
|
||||
|
||||
preedit_end_pos = efl_text_cursor_position_get(cur);
|
||||
|
||||
|
@ -752,8 +758,8 @@ _sel_init(Efl_Text_Cursor *c, Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_I
|
|||
if (en->have_selection)
|
||||
return;
|
||||
|
||||
efl_text_cursor_copy(c, en->sel_start);
|
||||
efl_text_cursor_copy(c, en->sel_end);
|
||||
_cur_pos_copy(c, en->sel_start);
|
||||
_cur_pos_copy(c, en->sel_end);
|
||||
|
||||
en->have_selection = EINA_FALSE;
|
||||
if (en->selection)
|
||||
|
@ -804,7 +810,7 @@ _sel_extend(Efl_Text_Cursor *c, Evas_Object *o, Efl_Ui_Internal_Text_Interactive
|
|||
_sel_enable(c, o, en);
|
||||
if (efl_text_cursor_equal(c, en->sel_end)) return;
|
||||
|
||||
efl_text_cursor_copy(c, en->sel_end);
|
||||
_cur_pos_copy(c, en->sel_end);
|
||||
|
||||
_entry_imf_cursor_info_set(en);
|
||||
|
||||
|
@ -830,7 +836,7 @@ _sel_clear(Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *en
|
|||
{
|
||||
en->have_selection = EINA_FALSE;
|
||||
Eina_Bool b_value = en->have_selection;
|
||||
efl_text_cursor_copy(en->sel_start, en->sel_end);
|
||||
_cur_pos_copy(en->sel_start, en->sel_end);
|
||||
efl_event_callback_call(o, EFL_TEXT_INTERACTIVE_EVENT_HAVE_SELECTION_CHANGED, &b_value);
|
||||
}
|
||||
}
|
||||
|
@ -1024,9 +1030,9 @@ _key_down_sel_pre(Efl_Ui_Internal_Text_Interactive *obj, Efl_Text_Cursor *cur, E
|
|||
{
|
||||
Eina_Bool sel_forward = efl_text_cursor_compare(en->sel_start, en->sel_end);
|
||||
if ((sel_forward && movement_forward) || (!sel_forward && !movement_forward))
|
||||
efl_text_cursor_copy(en->sel_end, cur);
|
||||
_cur_pos_copy(en->sel_end, cur);
|
||||
else
|
||||
efl_text_cursor_copy(en->sel_start, cur);
|
||||
_cur_pos_copy(en->sel_start, cur);
|
||||
_sel_clear(obj, en);
|
||||
}
|
||||
}
|
||||
|
@ -1207,7 +1213,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void
|
|||
// del to start of previous word
|
||||
Efl_Text_Cursor *tc = efl_canvas_textblock_cursor_create(obj);
|
||||
|
||||
efl_text_cursor_copy(tc, cur);
|
||||
_cur_pos_copy(tc, cur);
|
||||
efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_PREV);
|
||||
efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START);
|
||||
|
||||
|
@ -1242,7 +1248,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void
|
|||
// del to end of next word
|
||||
Efl_Text_Cursor *tc = efl_canvas_textblock_cursor_create(obj);
|
||||
|
||||
efl_text_cursor_copy(tc, cur);
|
||||
_cur_pos_copy(tc, cur);
|
||||
efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_END);
|
||||
efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_NEXT);
|
||||
|
||||
|
@ -1484,7 +1490,7 @@ _cursor_char_coord_set(Efl_Canvas_Textblock *obj, Efl_Text_Cursor *cur, Evas_Coo
|
|||
Efl_Text_Cursor *tc;
|
||||
|
||||
tc = efl_canvas_textblock_cursor_create(obj);
|
||||
efl_text_cursor_copy(cur, tc);
|
||||
_cur_pos_copy(cur, tc);
|
||||
evas_object_geometry_get(obj, &x, &y, NULL, NULL);
|
||||
cx = canvasx - x;
|
||||
cy = canvasy - y;
|
||||
|
@ -1549,7 +1555,7 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN
|
|||
if (shift)
|
||||
{
|
||||
tc = efl_canvas_textblock_cursor_create(obj);
|
||||
efl_text_cursor_copy(cur, tc);
|
||||
_cur_pos_copy(cur, tc);
|
||||
if (efl_text_cursor_compare(cur, en->sel_start) < 0)
|
||||
efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_LINE_START);
|
||||
else
|
||||
|
@ -1562,7 +1568,7 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN
|
|||
en->selecting = EINA_FALSE;
|
||||
_sel_clear(obj, en);
|
||||
tc = efl_canvas_textblock_cursor_create(obj);
|
||||
efl_text_cursor_copy(cur, tc);
|
||||
_cur_pos_copy(cur, tc);
|
||||
efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_LINE_START);
|
||||
_sel_init(cur, obj, en);
|
||||
efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_LINE_END);
|
||||
|
@ -1575,7 +1581,7 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN
|
|||
if (shift)
|
||||
{
|
||||
tc = efl_canvas_textblock_cursor_create(obj);
|
||||
efl_text_cursor_copy(cur, tc);
|
||||
_cur_pos_copy(cur, tc);
|
||||
if (efl_text_cursor_compare(cur, en->sel_start) < 0)
|
||||
efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START);
|
||||
else
|
||||
|
@ -1591,7 +1597,7 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN
|
|||
en->selecting = EINA_FALSE;
|
||||
_sel_clear(obj, en);
|
||||
tc = efl_canvas_textblock_cursor_create(obj);
|
||||
efl_text_cursor_copy(cur, tc);
|
||||
_cur_pos_copy(cur, tc);
|
||||
efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START);
|
||||
_sel_init(cur, obj, en);
|
||||
efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_END);
|
||||
|
@ -1650,7 +1656,7 @@ _mouse_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void
|
|||
|
||||
if (en->select_allow)
|
||||
{
|
||||
efl_text_cursor_copy(en->sel_end, cur);
|
||||
_cur_pos_copy(en->sel_end, cur);
|
||||
}
|
||||
if (en->selecting)
|
||||
{
|
||||
|
@ -1690,7 +1696,7 @@ _mouse_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, vo
|
|||
if (en->selecting)
|
||||
{
|
||||
tc = efl_canvas_textblock_cursor_create(obj);
|
||||
efl_text_cursor_copy(cur, tc);
|
||||
_cur_pos_copy(cur, tc);
|
||||
evas_object_geometry_get(obj, &x, &y, &w, &h);
|
||||
cx = ev->cur.canvas.x - x;
|
||||
cy = ev->cur.canvas.y - y;
|
||||
|
|
|
@ -2108,16 +2108,10 @@ _efl_ui_textbox_entry_insert(Eo *obj, Efl_Ui_Textbox_Data *sd, const char *entry
|
|||
efl_canvas_group_change(obj);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_textbox_cursor_add(Eo *obj, Efl_Ui_Textbox_Data *pd, Efl_Text_Cursor *cursor)
|
||||
{
|
||||
efl_text_cursor_text_object_set(cursor, pd->text_obj, obj);
|
||||
}
|
||||
|
||||
EOLIAN static Efl_Text_Cursor *
|
||||
_efl_ui_textbox_cursor_create(Eo *obj, Efl_Ui_Textbox_Data *pd)
|
||||
{
|
||||
Eo* cursor = efl_add(EFL_TEXT_CURSOR_CLASS, pd->text_obj);
|
||||
Eo* cursor = efl_text_cursor_create(pd->text_obj);;
|
||||
efl_text_cursor_text_object_set(cursor, pd->text_obj, obj);
|
||||
return cursor;
|
||||
}
|
||||
|
|
|
@ -64,13 +64,6 @@ class @beta Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Click
|
|||
item_factory: Efl.Canvas.Textblock_Factory; [[Factory to create items]]
|
||||
}
|
||||
}
|
||||
cursor_add {
|
||||
[[Add cursor that will manipulate and iterate content of the text object.
|
||||
It is typically more convenient to obtain a cursor directly from the text object using @.cursor_create.]]
|
||||
params {
|
||||
cursor: Efl.Text.Cursor; [[Text cursor.]]
|
||||
}
|
||||
}
|
||||
cursor_create {
|
||||
[[Creates and returns a new cursor for the text.]]
|
||||
return: Efl.Text.Cursor @move; [[Text cursor.]]
|
||||
|
|
|
@ -23,15 +23,6 @@ class @beta Efl.Canvas.Textblock extends Efl.Canvas.Object implements Efl.Text,
|
|||
is_empty: bool; [[$true if empty.]]
|
||||
}
|
||||
}
|
||||
cursor_add {
|
||||
[[Adds an existing cursor to the text object.
|
||||
If the cursor already belonged to another text object it will be reassigned to the new one.
|
||||
It is typically more convenient to obtain a cursor directly from the text object using @.cursor_create.
|
||||
]]
|
||||
params {
|
||||
cursor: Efl.Text.Cursor; [[The text cursor to use.]]
|
||||
}
|
||||
}
|
||||
cursor_create {
|
||||
[[Creates a new cursor and adds it to the text object.
|
||||
This cursor can be used to manipulate and iterate the content of the text object.
|
||||
|
|
|
@ -293,6 +293,14 @@ _evas_textblock_relayout_if_needed(Evas_Object *o);
|
|||
EAPI void efl_text_cursor_text_object_set(Eo *cursor, Eo *canvas_text_obj, Eo *text_obj);
|
||||
|
||||
|
||||
/**
|
||||
* Internally create instance of cursor object.
|
||||
*
|
||||
* @param parent the parent of the cursor object.
|
||||
*/
|
||||
EAPI Eo* efl_text_cursor_create(Eo *parent);
|
||||
|
||||
|
||||
/**
|
||||
* Internally sets cursor handle(legacy textblock cursor) into cursor object.
|
||||
*
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include "evas_common_private.h"
|
||||
#include "evas_private.h"
|
||||
#include "efl_canvas_textblock_internal.h"
|
||||
#include "eo_internal.h"
|
||||
|
||||
#define MY_CLASS EFL_TEXT_CURSOR_CLASS
|
||||
#define MY_CLASS_NAME "Efl.Text.Cursor"
|
||||
|
@ -20,6 +21,8 @@ struct _Evas_Textblock_Selection_Iterator
|
|||
|
||||
typedef struct _Evas_Textblock_Selection_Iterator Evas_Textblock_Selection_Iterator;
|
||||
|
||||
EFL_CLASS_SIMPLE_CLASS(efl_text_cursor, "efl_text_cursor", EFL_TEXT_CURSOR_CLASS)
|
||||
|
||||
EOLIAN static void
|
||||
_efl_text_cursor_position_set(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, int position)
|
||||
{
|
||||
|
@ -102,11 +105,15 @@ _efl_text_cursor_compare(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, co
|
|||
return evas_textblock_cursor_compare(pd->handle, efl_text_cursor_handle_get(dst));
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_text_cursor_copy(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Efl_Text_Cursor *dst)
|
||||
static void
|
||||
_efl_text_cursor_copy(const Efl_Text_Cursor *obj, Efl_Text_Cursor *dst)
|
||||
{
|
||||
Efl_Text_Cursor_Data *pd = efl_data_scope_safe_get(obj, MY_CLASS);
|
||||
EINA_SAFETY_ON_NULL_RETURN(pd);
|
||||
|
||||
Efl_Text_Cursor_Data *pd_dest = efl_data_scope_safe_get(dst, MY_CLASS);
|
||||
EINA_SAFETY_ON_NULL_RETURN(pd_dest);
|
||||
|
||||
if (!pd->handle) return;
|
||||
|
||||
Efl_Text_Cursor_Handle *handle = evas_object_textblock_cursor_new(pd->handle->obj);
|
||||
|
@ -119,9 +126,9 @@ _efl_text_cursor_copy(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Efl_T
|
|||
EOLIAN static Efl_Text_Cursor *
|
||||
_efl_text_cursor_efl_duplicate_duplicate(const Eo *obj, Efl_Text_Cursor_Data *pd EINA_UNUSED)
|
||||
{
|
||||
Efl_Text_Cursor *dup = efl_new(MY_CLASS);
|
||||
Efl_Text_Cursor *dup = efl_text_cursor_create(efl_parent_get(obj));
|
||||
|
||||
efl_text_cursor_copy(obj, dup);
|
||||
_efl_text_cursor_copy(obj, dup);
|
||||
|
||||
return dup;
|
||||
}
|
||||
|
@ -436,6 +443,11 @@ efl_text_cursor_handle_get(const Eo *obj)
|
|||
return pd->handle;
|
||||
}
|
||||
|
||||
Eo* efl_text_cursor_create(Eo *parent)
|
||||
{
|
||||
return efl_add(efl_text_cursor_realized_class_get(), parent);
|
||||
}
|
||||
|
||||
void efl_text_cursor_text_object_set(Eo *cursor, Eo *canvas_text_obj, Eo *text_obj)
|
||||
{
|
||||
Efl_Text_Cursor_Data *pd = efl_data_scope_safe_get(cursor, MY_CLASS);
|
||||
|
|
|
@ -26,7 +26,7 @@ enum @beta Efl.Text.Cursor_Move_Type
|
|||
paragraph_prev [[Advances to the end of the previous paragraph.]]
|
||||
}
|
||||
|
||||
class @beta Efl.Text.Cursor extends Efl.Object implements Efl.Duplicate{
|
||||
abstract @beta Efl.Text.Cursor extends Efl.Object implements Efl.Duplicate{
|
||||
[[Cursor API.]]
|
||||
c_prefix: efl_text_cursor;
|
||||
methods {
|
||||
|
@ -112,13 +112,6 @@ class @beta Efl.Text.Cursor extends Efl.Object implements Efl.Duplicate{
|
|||
return: int; [[Difference between cursors.]]
|
||||
}
|
||||
|
||||
copy @const {
|
||||
[[Copy existing cursor to destination cursor, like position and cursor text object.]]
|
||||
params {
|
||||
dst: Efl.Text.Cursor; [[Destination Cursor.]]
|
||||
}
|
||||
}
|
||||
|
||||
move {
|
||||
[[Move the cursor.]]
|
||||
params {
|
||||
|
|
|
@ -8077,16 +8077,10 @@ _efl_canvas_textblock_all_styles_get(const Eo *eo_obj EINA_UNUSED, Efl_Canvas_Te
|
|||
return o->default_format.default_style_str;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_canvas_textblock_cursor_add(Eo *obj, Efl_Canvas_Textblock_Data *pd EINA_UNUSED, Efl_Text_Cursor *cursor)
|
||||
{
|
||||
efl_text_cursor_text_object_set(cursor, obj, obj);
|
||||
}
|
||||
|
||||
EOLIAN static Efl_Text_Cursor *
|
||||
_efl_canvas_textblock_cursor_create(Eo *obj, Efl_Canvas_Textblock_Data *pd EINA_UNUSED)
|
||||
{
|
||||
Eo* cursor = efl_add(EFL_TEXT_CURSOR_CLASS, obj);
|
||||
Eo* cursor = efl_text_cursor_create(obj);
|
||||
efl_text_cursor_text_object_set(cursor, obj, obj);
|
||||
return cursor;
|
||||
}
|
||||
|
|
|
@ -4515,14 +4515,12 @@ EFL_START_TEST(efl_canvas_textblock_cursor)
|
|||
efl_text_cursor_line_number_set(cur_obj, 0);
|
||||
ck_assert_int_eq(efl_text_cursor_position_get(cur_obj), 0);
|
||||
|
||||
Eo * cursor1 = efl_add(EFL_TEXT_CURSOR_CLASS, txt);
|
||||
pos = efl_text_cursor_position_get(cursor1);
|
||||
ck_assert_int_eq(pos, -1);
|
||||
efl_text_cursor_position_set(cursor1, 10);
|
||||
pos = efl_text_cursor_position_get(cursor1);
|
||||
ck_assert_int_eq(pos, -1);
|
||||
Eo * cursor_temp = efl_duplicate(cur_obj);
|
||||
ck_assert_ptr_ne(cursor_temp, NULL);
|
||||
efl_del(cursor_temp);
|
||||
cursor_temp = NULL;
|
||||
|
||||
efl_canvas_textblock_cursor_add(txt, cursor1);
|
||||
Eo * cursor1 = efl_canvas_textblock_cursor_create(txt);
|
||||
efl_text_cursor_position_set(cursor1, 1);
|
||||
pos = efl_text_cursor_position_get(cursor1);
|
||||
ck_assert_int_eq(pos, 1);
|
||||
|
@ -4633,13 +4631,12 @@ EFL_START_TEST(efl_canvas_textblock_cursor)
|
|||
ck_assert_int_eq(efl_text_cursor_position_get(cur_obj), 0);
|
||||
#endif
|
||||
|
||||
Eo *nCur = efl_add(EFL_TEXT_CURSOR_CLASS, txt), *nCur2 = efl_add(EFL_TEXT_CURSOR_CLASS, txt), *nCur3 = efl_add(EFL_TEXT_CURSOR_CLASS, txt);
|
||||
Eo *nCur = efl_canvas_textblock_cursor_create(txt);
|
||||
Eo *nCur2 = efl_canvas_textblock_cursor_create(txt);
|
||||
Eo *nCur3 = efl_canvas_textblock_cursor_create(txt);
|
||||
efl_text_markup_set(txt, "Hello World<ps/>This is EFL<br/>Enlightenment");
|
||||
efl_text_cursor_position_set(cur_obj, 0);
|
||||
efl_text_cursor_copy(cur_obj, nCur);
|
||||
ck_assert_ptr_ne(nCur, NULL);
|
||||
efl_text_cursor_copy(cur_obj, nCur2);
|
||||
efl_text_cursor_copy(cur_obj, nCur3);
|
||||
ck_assert_ptr_ne(nCur2, NULL);
|
||||
ck_assert_ptr_ne(nCur3, NULL);
|
||||
|
||||
|
@ -4655,7 +4652,7 @@ EFL_START_TEST(efl_canvas_textblock_cursor)
|
|||
ck_assert(efl_text_cursor_move(nCur, EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_NEXT));
|
||||
ck_assert_int_lt(efl_text_cursor_compare(cur_obj, nCur), 0);
|
||||
ck_assert_int_gt(efl_text_cursor_compare(nCur, cur_obj), 0);
|
||||
efl_text_cursor_copy(nCur, nCur2);
|
||||
efl_text_cursor_position_set(nCur2, efl_text_cursor_position_get(nCur));
|
||||
ck_assert_int_lt(efl_text_cursor_compare(cur_obj, nCur2), 0);
|
||||
ck_assert_int_gt(efl_text_cursor_compare(nCur2, cur_obj), 0);
|
||||
ck_assert(!efl_text_cursor_equal(nCur2, nCur3));
|
||||
|
|
Loading…
Reference in New Issue