ajwillia-ms pushed a commit to branch master.

http://git.enlightenment.org/tools/edi.git/commit/?id=681aad0ef8d7525e7f35d21d432b75a2f1c695b9

commit 681aad0ef8d7525e7f35d21d432b75a2f1c695b9
Author: Andy Williams <a...@andywilliams.me>
Date:   Thu Feb 11 14:13:12 2016 +0000

    [ui] Add feature to filter file list
    
    Now you can easily find files in a big project
---
 ChangeLog               |   4 ++
 NEWS                    |   1 +
 src/bin/edi_filepanel.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++--
 src/bin/edi_filepanel.h |   2 +
 src/bin/edi_main.c      |   8 ++++
 5 files changed, 127 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index aca626c..cb264d9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2016-02-11 ajwillia.ms (Andy Williams)
+
+       * Add a filename filter to the filepanel
+
 2015-11-19 ajwillia.ms (Andy Williams)
 
        * Update for the efo 1.16 release
diff --git a/NEWS b/NEWS
index e6c975d..e5ca46e 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,7 @@ Features:
 
   * Option to inserts spaces instead of tabs
   * Update to EFFL 1.17 release for better toolbar handling
+  * Add file filtering for hunting down files in the list
 
 Bug fixes:
 
diff --git a/src/bin/edi_filepanel.c b/src/bin/edi_filepanel.c
index e37b43d..987e5e7 100644
--- a/src/bin/edi_filepanel.c
+++ b/src/bin/edi_filepanel.c
@@ -19,7 +19,7 @@ static Elm_Genlist_Item_Class itc, itc2;
 static Evas_Object *list;
 static edi_filepanel_item_clicked_cb _open_cb;
 
-static Evas_Object *menu, *_main_win;
+static Evas_Object *menu, *_main_win, *_filepanel_box, *_filter_box, *_filter;
 static const char *_menu_cb_path;
 
 static void
@@ -408,12 +408,120 @@ _edi_filepanel_reload()
    free(dir);
 }
 
+/* Panel filtering */
+
+static Eina_Bool
+_filter_get(void *data, Evas_Object *obj EINA_UNUSED, void *key)
+{
+   if (!strlen((char *)key)) return EINA_TRUE;
+
+   if (strstr(basename((char *)data), (char *)key))
+     return EINA_TRUE;
+
+   return EINA_FALSE;
+}
+
+static void
+_filter_clear(Evas_Object *filter)
+{
+   elm_object_text_set(filter, NULL);
+}
+
+static void
+_filter_clear_bt_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
+{
+   _filter_clear((Evas_Object *)data);
+}
+
+static void
+_filter_cancel_bt_cb(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
+{
+   _filter_clear((Evas_Object *)data);
+
+   evas_object_hide(_filter_box);
+   elm_box_unpack(_filepanel_box, _filter_box);
+}
+
+static void
+_filter_key_down_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Evas_Object *tree;
+   const char *match;
+
+   tree = (Evas_Object *)data;
+   match = elm_object_text_get(obj);
+
+   if (!match || strlen(match) == 0)
+     elm_genlist_filter_set(tree, NULL);
+   else
+     elm_genlist_filter_set(tree, (void *)strdup(match));
+}
+
+void
+edi_filepanel_search()
+{
+   elm_box_pack_start(_filepanel_box, _filter_box);
+   evas_object_show(_filter_box);
+   elm_object_focus_set(_filter, EINA_TRUE);
+}
+
+/* Panel setup */
+
 void
 edi_filepanel_add(Evas_Object *parent, Evas_Object *win,
                   const char *path, edi_filepanel_item_clicked_cb cb)
 {
+   Evas_Object *box, *hbox, *filter, *clear, *cancel, *icon;
    const char *sharedpath;
 
+   box = elm_box_add(parent);
+   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_homogeneous_set(box, EINA_FALSE);
+   evas_object_show(box);
+   elm_box_pack_end(parent, box);
+   _filepanel_box = box;
+
+   hbox = elm_box_add(box);
+   evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_horizontal_set(hbox, EINA_TRUE);
+   elm_box_homogeneous_set(hbox, EINA_FALSE);
+   _filter_box = hbox;
+
+   filter = elm_entry_add(hbox);
+   elm_entry_scrollable_set(filter, EINA_TRUE);
+   elm_entry_single_line_set(filter, EINA_TRUE);
+   elm_object_part_text_set(filter, "guide", "Find file");
+   evas_object_size_hint_weight_set(filter, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(filter, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_entry_editable_set(filter, EINA_TRUE);
+   evas_object_show(filter);
+   elm_box_pack_end(hbox, filter);
+   _filter = filter;
+
+   clear = elm_button_add(hbox);
+   evas_object_smart_callback_add(clear, "clicked", _filter_clear_bt_cb, 
filter);
+   evas_object_show(clear);
+   elm_box_pack_end(hbox, clear);
+
+   icon = elm_icon_add(clear);
+   elm_icon_order_lookup_set(icon, ELM_ICON_LOOKUP_FDO_THEME);
+   evas_object_size_hint_min_set(icon, 14 * elm_config_scale_get(), 14 * 
elm_config_scale_get());
+   elm_icon_standard_set(icon, "edit-clear");
+   elm_object_part_content_set(clear, "icon", icon);
+
+   cancel = elm_button_add(hbox);
+   evas_object_smart_callback_add(cancel, "clicked", _filter_cancel_bt_cb, 
filter);
+   evas_object_show(cancel);
+   elm_box_pack_end(hbox, cancel);
+
+   icon = elm_icon_add(cancel);
+   elm_icon_order_lookup_set(icon, ELM_ICON_LOOKUP_FDO_THEME);
+   evas_object_size_hint_min_set(icon, 14 * elm_config_scale_get(), 14 * 
elm_config_scale_get());
+   elm_icon_standard_set(icon, "window-close");
+   elm_object_part_content_set(cancel, "icon", icon);
+
    list = elm_genlist_add(parent);
    elm_genlist_homogeneous_set(list, EINA_TRUE);
    elm_genlist_select_mode_set(list, ELM_OBJECT_SELECT_MODE_ALWAYS);
@@ -421,6 +529,7 @@ edi_filepanel_add(Evas_Object *parent, Evas_Object *win,
    evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_show(list);
+   elm_box_pack_end(box, list);
 
    sharedpath = eina_stringshare_add(path);
    evas_object_event_callback_add(list, EVAS_CALLBACK_MOUSE_DOWN,
@@ -438,6 +547,7 @@ edi_filepanel_add(Evas_Object *parent, Evas_Object *win,
    itc.item_style = "default";
    itc.func.text_get = _text_get;
    itc.func.content_get = _content_get;
+   itc.func.filter_get = _filter_get;
    itc.func.del = _item_del;
 
    itc2.item_style = "default";
@@ -449,8 +559,7 @@ edi_filepanel_add(Evas_Object *parent, Evas_Object *win,
    _open_cb = cb;
    _main_win = win;
    _populate(list, path, NULL, NULL);
-
-   elm_box_pack_end(parent, list);
+   evas_object_smart_callback_add(filter, "changed", _filter_key_down_cb, 
list);
 }
 
 const char *
diff --git a/src/bin/edi_filepanel.h b/src/bin/edi_filepanel.h
index 05d5969..9ea1ae9 100644
--- a/src/bin/edi_filepanel.h
+++ b/src/bin/edi_filepanel.h
@@ -41,6 +41,8 @@ void edi_filepanel_add(Evas_Object *parent, Evas_Object *win,
 
 const char *edi_filepanel_selected_path_get(Evas_Object *obj);
 
+void edi_filepanel_search();
+
 /**
  * @}
  */
diff --git a/src/bin/edi_main.c b/src/bin/edi_main.c
index 1f1ea80..d95f0ab 100644
--- a/src/bin/edi_main.c
+++ b/src/bin/edi_main.c
@@ -747,6 +747,13 @@ _edi_menu_find_cb(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED,
 }
 
 static void
+_edi_menu_findfile_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                      void *event_info EINA_UNUSED)
+{
+   edi_filepanel_search();
+}
+
+static void
 _edi_menu_goto_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
                   void *event_info EINA_UNUSED)
 {
@@ -819,6 +826,7 @@ _edi_menu_setup(Evas_Object *win)
    elm_menu_item_add(menu, menu_it, "edit-paste", "Paste", _edi_menu_paste_cb, 
NULL);
    elm_menu_item_separator_add(menu, menu_it);
    elm_menu_item_add(menu, menu_it, "edit-find-replace", "Find & Replace", 
_edi_menu_find_cb, NULL);
+   elm_menu_item_add(menu, menu_it, "edit-find", "Find file", 
_edi_menu_findfile_cb, NULL);
    elm_menu_item_add(menu, menu_it, "go-jump", "Goto Line ...", 
_edi_menu_goto_cb, NULL);
 
    menu_it = elm_menu_item_add(menu, NULL, NULL, "Build", NULL, NULL);

-- 


Reply via email to