ryuan pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=5fd9c1e45232dd429dd1f2095e98269534caad77

commit 5fd9c1e45232dd429dd1f2095e98269534caad77
Author: Ryuan Choi <ryuan.c...@gmail.com>
Date:   Mon Oct 21 11:14:47 2013 +0900

    elc_fileselector: Update items of file_view to follow changes of selected 
path
    
    This patch implmented for fileselector to monitor and update changes of 
selected
    path. So, changes of selected path from other applications such as mkdir 
will be
    applied to the file_view without refresh.
    
    This feature is only available with EIO.
---
 ChangeLog                         |   4 ++
 NEWS                              |   1 +
 src/lib/elc_fileselector.c        | 138 ++++++++++++++++++++++++++++++++++++++
 src/lib/elm_widget_fileselector.h |   2 +
 4 files changed, 145 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 2358d2b..e85f251 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1711,3 +1711,7 @@
 2013-10-18  Ryuan Choi (ryuan)
 
         * fileselector : Add support visibility control of hidden 
files/directories.
+
+2013-10-21  Ryuan Choi (ryuan)
+
+        * fileselector : Monitor and update changes of selected path 
automatically while EIO is working.
diff --git a/NEWS b/NEWS
index 7489b41..67fd840 100644
--- a/NEWS
+++ b/NEWS
@@ -152,6 +152,7 @@ Improvements:
    This actually reduces the mapbuf calculation time muchly in case of complex
    layout.
    * Popup: Change the behavior of adding/removing buttons dynamically. User 
defined button's position is kept.
+   * Fileselector: Monitor and update changes of selected path automatically 
while EIO is working.
 
 Fixes:
    * Now elm_datetime_field_limit_set() can set year limits wihtout problems.
diff --git a/src/lib/elc_fileselector.c b/src/lib/elc_fileselector.c
index a490f66..5d8dc37 100644
--- a/src/lib/elc_fileselector.c
+++ b/src/lib/elc_fileselector.c
@@ -597,6 +597,7 @@ _populate(Evas_Object *obj,
 #else /* asynchronous listing path */
    if (sd->expand && sd->current) return;
 
+   if (sd->monitor) eio_monitor_del(sd->monitor);
    if (sd->current) eio_file_cancel(sd->current);
 
    lreq = malloc(sizeof (Listing_Request));
@@ -615,6 +616,8 @@ _populate(Evas_Object *obj,
    else
      lreq->selected = NULL;
 
+   /* TODO: sub directory should be monitored for expand mode */
+   sd->monitor = eio_monitor_add(path);
    sd->current = eio_file_stat_ls(path, _ls_filter_cb, _ls_main_cb,
                                   _ls_done_cb, _ls_error_cb, lreq);
    elm_progressbar_pulse(sd->spinner, EINA_TRUE);
@@ -1168,6 +1171,120 @@ _files_grid_add(Evas_Object *obj)
    return grid;
 }
 
+#ifdef HAVE_EIO
+static Eina_Bool
+_resource_created(void *data, int type, void *ev)
+{
+   Evas_Object *obj = data;
+   Eio_Monitor_Event *event = ev;
+   int itcn = ELM_FILE_UNKNOW;
+
+   ELM_FILESELECTOR_DATA_GET(obj, sd);
+
+   if (type == EIO_MONITOR_DIRECTORY_CREATED)
+     itcn = ELM_DIRECTORY;
+   else
+     {
+        if (!_check_filters(sd->current_filter, event->filename))
+          return ECORE_CALLBACK_PASS_ON;
+
+        if (evas_object_image_extension_can_load_get(event->filename))
+          itcn = ELM_FILE_IMAGE;
+     }
+
+   if (sd->mode == ELM_FILESELECTOR_LIST)
+     elm_genlist_item_sorted_insert(sd->files_view, list_itc[itcn],
+                                    eina_stringshare_add(event->filename),
+                                    NULL,
+                                    (sd->expand && itcn == ELM_DIRECTORY)
+                                    ? ELM_GENLIST_ITEM_TREE : 
ELM_GENLIST_ITEM_NONE,
+                                    _file_list_cmp, NULL, NULL);
+   else
+     elm_gengrid_item_sorted_insert(sd->files_view, grid_itc[itcn],
+                                    eina_stringshare_add(event->filename),
+                                    _file_grid_cmp, NULL, NULL);
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_resource_deleted(void *data, int type EINA_UNUSED, void *ev)
+{
+   Evas_Object *obj = data;
+   Eio_Monitor_Event *event = ev;
+   Elm_Object_Item *it = NULL;
+   Eina_Bool selected = EINA_FALSE;
+
+   ELM_FILESELECTOR_DATA_GET(obj, sd);
+
+   if (sd->mode == ELM_FILESELECTOR_LIST)
+     {
+        it = elm_genlist_first_item_get(sd->files_view);
+        while(it)
+          {
+             if (!strcmp(elm_object_item_data_get(it), event->filename))
+               {
+                  selected = elm_genlist_item_selected_get(it);
+                  break;
+               }
+             it = elm_genlist_item_next_get(it);
+          }
+     }
+   else
+     {
+        it = elm_gengrid_first_item_get(sd->files_view);
+        while(it)
+          {
+             if (!strcmp(elm_object_item_data_get(it), event->filename))
+               {
+                  selected = elm_genlist_item_selected_get(it);
+                  break;
+               }
+             it = elm_gengrid_item_next_get(it);
+          }
+     }
+
+   if (it) elm_object_item_del(it);
+
+   if (selected)
+     {
+        if (sd->multi)
+          {
+             Eina_List *li, *l;
+             char *path;
+             Eina_Strbuf *buf;
+             Eina_Bool first = EINA_TRUE;
+
+             buf = eina_strbuf_new();
+             EINA_LIST_FOREACH_SAFE(sd->paths, li, l, path)
+               {
+                  if (!strcmp(path, event->filename))
+                    {
+                       sd->paths = eina_list_remove_list(sd->paths, li);
+                       free(path);
+                    }
+                  else
+                    {
+                       if (!first)
+                         eina_strbuf_append_length(buf, ", ", 2);
+                       else
+                         first = EINA_FALSE;
+
+                       eina_strbuf_append(buf, ecore_file_file_get(path));
+                    }
+               }
+
+             elm_object_text_set(sd->name_entry, eina_strbuf_string_get(buf));
+             eina_strbuf_free(buf);
+          }
+        else
+          elm_object_text_set(sd->name_entry, "");
+     }
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+#endif
+
 static void
 _elm_fileselector_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
 {
@@ -1258,6 +1375,19 @@ _elm_fileselector_smart_add(Eo *obj, void *_pd, va_list 
*list EINA_UNUSED)
    elm_fileselector_buttons_ok_cancel_set(obj, EINA_TRUE);
    elm_fileselector_is_save_set(obj, EINA_FALSE);
 
+#ifdef HAVE_EIO
+#define HANDLER_ADD(e, fn) \
+   priv->handlers = eina_list_append(priv->handlers, \
+                                     ecore_event_handler_add(e, fn, obj));
+
+   HANDLER_ADD(EIO_MONITOR_FILE_CREATED, _resource_created);
+   HANDLER_ADD(EIO_MONITOR_DIRECTORY_CREATED, _resource_created);
+
+   HANDLER_ADD(EIO_MONITOR_FILE_DELETED, _resource_deleted);
+   HANDLER_ADD(EIO_MONITOR_DIRECTORY_DELETED, _resource_deleted);
+#undef HANDLER_ADD
+#endif
+
    eo_do(obj, elm_wdg_theme(NULL));
 }
 
@@ -1269,7 +1399,15 @@ _elm_fileselector_smart_del(Eo *obj EINA_UNUSED, void 
*_pd, va_list *list EINA_U
    char *path;
 
 #ifdef HAVE_EIO
+   Ecore_Event_Handler *h;
+
+   if (sd->monitor) eio_monitor_del(sd->monitor);
    if (sd->current) eio_file_cancel(sd->current);
+
+   EINA_LIST_FREE(sd->handlers, h)
+     {
+        ecore_event_handler_del(h);
+     }
 #endif
 
    EINA_LIST_FREE(sd->filter_list, filter)
diff --git a/src/lib/elm_widget_fileselector.h 
b/src/lib/elm_widget_fileselector.h
index e697934..ee6adaf 100644
--- a/src/lib/elm_widget_fileselector.h
+++ b/src/lib/elm_widget_fileselector.h
@@ -49,6 +49,8 @@ struct _Elm_Fileselector_Smart_Data
 
 #ifdef HAVE_EIO
    Eio_File                *current;
+   Eio_Monitor             *monitor;
+   Eina_List               *handlers;
 #endif
 
    Elm_Fileselector_Mode mode;

-- 


Reply via email to