netstar pushed a commit to branch master. http://git.enlightenment.org/apps/ecrire.git/commit/?id=92555c7041269a765d7fa1e2f3b22900e3396d8b
commit 92555c7041269a765d7fa1e2f3b22900e3396d8b Author: Alastair Poole <nets...@gmail.com> Date: Thu Apr 8 10:25:27 2021 +0100 search: WIP does wrap and resets. --- src/bin/ui/search_dialog.c | 183 ++++++++++++++++++++++++++------------------- 1 file changed, 107 insertions(+), 76 deletions(-) diff --git a/src/bin/ui/search_dialog.c b/src/bin/ui/search_dialog.c index 3f44166..9328d30 100644 --- a/src/bin/ui/search_dialog.c +++ b/src/bin/ui/search_dialog.c @@ -3,44 +3,57 @@ #include "../Ecrire.h" -static Evas_Object *search_win, *sent, *rent; -static Eina_Bool forward = EINA_TRUE; -static Evas_Textblock_Cursor *cur_find; +typedef struct +{ + Evas_Object *entry_find; + Evas_Object *entry_replace; + Ecrire_Editor *inst; + + int initial_pos; + Eina_Bool forwards; + Eina_Bool wrap; + Evas_Textblock_Cursor *cur_find; +} Entry_Search; static Eina_Bool -_find_in_entry(Evas_Object *entry, const char *text, Eina_Bool jump_next) +_search_replace(Entry_Search *search, const char *text, Eina_Bool jump_next) { + Evas_Textblock_Cursor *end, *start, *mcur; Eina_Bool try_next = EINA_FALSE; const char *found; char *utf8; - const Evas_Object *tb = elm_entry_textblock_get(entry); - Evas_Textblock_Cursor *end, *start, *mcur; size_t initial_pos; + Evas_Object *entry; + const Evas_Object *tb; + + + entry = search->inst->entry; + tb = elm_entry_textblock_get(entry); if (!text || !*text) return EINA_FALSE; mcur = (Evas_Textblock_Cursor *) evas_object_textblock_cursor_get(tb); - if (!cur_find) + if (!search->cur_find) { - cur_find = evas_object_textblock_cursor_new(tb); + search->cur_find = evas_object_textblock_cursor_new(tb); } - else if (!evas_textblock_cursor_compare(cur_find, mcur)) + else if (!evas_textblock_cursor_compare(search->cur_find, mcur)) { try_next = EINA_TRUE; } - if (forward) + if (search->forwards) { - evas_textblock_cursor_paragraph_last(cur_find); + evas_textblock_cursor_paragraph_last(search->cur_find); start = mcur; - end = cur_find; + end = search->cur_find; } else { /* Not correct, more adjustments needed. */ - evas_textblock_cursor_paragraph_first(cur_find); - start = cur_find; + evas_textblock_cursor_paragraph_first(search->cur_find); + start = search->cur_find; end = mcur; } @@ -58,6 +71,11 @@ _find_in_entry(Evas_Object *entry, const char *text, Eina_Bool jump_next) if (!found) { found = utf8; + if (search->wrap) + { + elm_entry_cursor_pos_set(entry, 0); + return 0; + } } } else @@ -84,7 +102,7 @@ _find_in_entry(Evas_Object *entry, const char *text, Eina_Bool jump_next) elm_entry_cursor_selection_begin(entry); elm_entry_cursor_pos_set(entry, pos + initial_pos); elm_entry_cursor_selection_end(entry); - evas_textblock_cursor_copy(mcur, cur_find); + evas_textblock_cursor_copy(mcur, search->cur_find); } free(utf8); @@ -93,57 +111,80 @@ _find_in_entry(Evas_Object *entry, const char *text, Eina_Bool jump_next) } static void -_find_clicked(void *data, - Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_cb_find_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - _find_in_entry(data, elm_object_text_get(sent), EINA_TRUE); + Entry_Search *search = data; + + _search_replace(search, elm_object_text_get(search->entry_find), EINA_TRUE); } static void -_replace_clicked(void *data, - Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_cb_replace_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - if (_find_in_entry(data, elm_object_text_get(sent), EINA_FALSE)) + Entry_Search *search = data; + + if (_search_replace(search, elm_object_text_get(search->entry_find), EINA_FALSE)) { - elm_entry_entry_insert(data, elm_object_text_get(rent)); - if (cur_find) + elm_entry_entry_insert(search->inst->entry, elm_object_text_get(search->entry_replace)); + if (search->cur_find) { - evas_textblock_cursor_free(cur_find); - cur_find = NULL; + evas_textblock_cursor_free(search->cur_find); + search->cur_find = NULL; } } } static void -my_win_del(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) +_cb_wrap_changed(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) { - (void) obj; - (void) event_info; - /* Reset the stuff that need reseting */ - if (cur_find) - { - evas_textblock_cursor_free(cur_find); - cur_find = NULL; - } - search_win = NULL; + Entry_Search *search = data; + + search->wrap = elm_check_state_get(obj); +} + +static void +_cb_entry_changed(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Entry_Search *search = data; + + elm_entry_cursor_pos_set(search->inst->entry, search->initial_pos); +} + +static void +_cb_win_del(void *data EINA_UNUSED, Evas *e, Evas_Object *obj, void *event_info) +{ + Entry_Search *search = data; + + if (search->cur_find) + evas_textblock_cursor_free(search->cur_find); + + free(search); } Evas_Object * ui_find_dialog_open(Evas_Object *parent, Ecrire_Editor *inst) { - Evas_Object *entry = inst->entry; - Evas_Object *win, *bg, *tbl, *bx, *exp, *pad, *lbl, *hbx, *btn; + Evas_Object *win, *bg, *tbl, *bx, *pad, *hbx, *chk, *btn; + Evas_Object *sent, *rent; + const Evas_Object *tb; + Evas_Textblock_Cursor *cursor; - if (search_win) - { - evas_object_show(search_win); - return search_win; - } + Entry_Search *search = calloc(1, sizeof(Entry_Search)); + EINA_SAFETY_ON_NULL_RETURN_VAL(search, NULL); + + search->inst = inst; + search->forwards = 1; + + tb = elm_entry_textblock_get(inst->entry); + cursor = (Evas_Textblock_Cursor *) evas_object_textblock_cursor_get(tb); + search->initial_pos = evas_textblock_cursor_pos_get(cursor); - search_win = win = elm_win_add(parent, "search", ELM_WIN_TOOLBAR); + win = elm_win_add(parent, "search", ELM_WIN_TOOLBAR); elm_win_autodel_set(win, EINA_TRUE); elm_win_title_set(win, _("Search")); - evas_object_smart_callback_add(win, "delete,request", my_win_del, entry); + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cb_win_del, search); bg = elm_bg_add(win); elm_win_resize_object_add(win, bg); @@ -162,52 +203,34 @@ ui_find_dialog_open(Evas_Object *parent, Ecrire_Editor *inst) evas_object_show(tbl); elm_box_pack_end(bx, tbl); - lbl = elm_label_add(win); - elm_object_text_set(lbl, _("Search:")); - evas_object_size_hint_align_set(lbl, EVAS_HINT_FILL, 0.5); - evas_object_size_hint_weight_set(lbl, 0.0, 0.0); - elm_table_pack(tbl, lbl, 0, 0, 1, 1); - evas_object_show(lbl); - - sent = elm_entry_add(win); + search->entry_find = sent = elm_entry_add(win); + elm_object_part_text_set(sent, "guide", "Search"); elm_entry_scrollable_set(sent, EINA_TRUE); elm_entry_single_line_set(sent, EINA_TRUE); evas_object_size_hint_align_set(sent, EVAS_HINT_FILL, 0.0); evas_object_size_hint_weight_set(sent, EVAS_HINT_EXPAND, 0.0); - elm_table_pack(tbl, sent, 1, 0, 1, 1); + elm_table_pack(tbl, sent, 0, 0, 1, 1); evas_object_show(sent); + evas_object_smart_callback_add(sent, "changed", _cb_entry_changed, search); - lbl = elm_label_add(win); - elm_object_text_set(lbl, _("Replace:")); - evas_object_size_hint_align_set(lbl, EVAS_HINT_FILL, 1.0); - evas_object_size_hint_weight_set(lbl, 0.0, 0.0); - elm_table_pack(tbl, lbl, 0, 1, 1, 1); - evas_object_show(lbl); - - rent = elm_entry_add(win); + search->entry_replace = rent = elm_entry_add(win); + elm_object_part_text_set(rent, "guide", "Replace"); elm_entry_scrollable_set(rent, EINA_TRUE); elm_entry_single_line_set(rent, EINA_TRUE); evas_object_size_hint_align_set(rent, EVAS_HINT_FILL, 0.0); evas_object_size_hint_weight_set(rent, EVAS_HINT_EXPAND, 0.0); - elm_table_pack(tbl, rent, 1, 1, 1, 1); + elm_table_pack(tbl, rent, 0, 1, 1, 1); evas_object_show(rent); + evas_object_smart_callback_add(rent, "changed", _cb_entry_changed, search); hbx = elm_box_add(win); elm_box_homogeneous_set(hbx, EINA_FALSE); elm_box_horizontal_set(hbx, EINA_TRUE); - evas_object_size_hint_align_set(hbx, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_align_set(hbx, 0.5, EVAS_HINT_FILL); evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, 0.0); evas_object_show(hbx); elm_box_pack_end(bx, hbx); - exp = elm_box_add(win); - evas_object_size_hint_align_set(exp, 1.0, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(exp, EVAS_HINT_EXPAND, 0.0); - elm_box_horizontal_set(exp, EINA_TRUE); - elm_box_homogeneous_set(exp, EINA_TRUE); - evas_object_show(exp); - elm_box_pack_end(hbx, exp); - pad = elm_frame_add(win); elm_object_style_set(pad, "pad_small"); evas_object_size_hint_align_set(pad, EVAS_HINT_FILL, EVAS_HINT_FILL); @@ -220,8 +243,8 @@ ui_find_dialog_open(Evas_Object *parent, Ecrire_Editor *inst) evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0); evas_object_show(btn); elm_object_content_set(pad, btn); - elm_box_pack_end(exp, pad); - evas_object_smart_callback_add(btn, "clicked", _find_clicked, entry); + elm_box_pack_end(hbx, pad); + evas_object_smart_callback_add(btn, "clicked", _cb_find_clicked, search); pad = elm_frame_add(win); elm_object_style_set(pad, "pad_small"); @@ -235,13 +258,21 @@ ui_find_dialog_open(Evas_Object *parent, Ecrire_Editor *inst) evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0); evas_object_show(btn); elm_object_content_set(pad, btn); - elm_box_pack_end(exp, pad); - evas_object_smart_callback_add(btn, "clicked", _replace_clicked, entry); + elm_box_pack_end(hbx, pad); + evas_object_smart_callback_add(btn, "clicked", _cb_replace_clicked, search); + + chk = elm_check_add(bx); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(chk, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(chk, _("Wrap?")); + elm_check_state_set(chk, search->wrap); + elm_box_pack_end(hbx, chk); + evas_object_show(chk); + evas_object_smart_callback_add(chk, "changed", _cb_wrap_changed, search); /* Forcing it to be the min height. */ evas_object_resize(win, 250, 1); evas_object_show(win); - cur_find = NULL; return win; } --