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;
 }

-- 


Reply via email to