On Mon, 30 Dec 2013 01:05:19 +0900 Daniel Juyung Seo <seojuyu...@gmail.com>
said:

> On Sun, Dec 29, 2013 at 1:22 PM, Ryuan Choi <ryuan.c...@gmail.com> wrote:
> 
> > raster pushed a commit to branch master.
> >
> >
> > http://git.enlightenment.org/core/elementary.git/commit/?id=4693736bb028077977abed7911a7faf21e21440a
> >
> > commit 4693736bb028077977abed7911a7faf21e21440a
> > Author: Ryuan Choi <ryuan.c...@gmail.com>
> > Date:   Sun Dec 29 13:23:17 2013 +0900
> >
> >     fileselector : Add elm_fileselector_custom_filter_append to support
> > custom filter
> >
> >     Summary:
> >     Now, application developers can decide whether files and directories
> > to show in
> >     fileselector view.
> >
> >     Reviewers: seoz, raster
> >
> >     Reviewed By: raster
> >
> >     Differential Revision: https://phab.enlightenment.org/D416
> > ---
> >  src/bin/test_fileselector.c       |   9 +++
> >  src/lib/elc_fileselector.c        | 157
> > +++++++++++++++++++++++++++++++-------
> >  src/lib/elc_fileselector_common.h |   2 +
> >  src/lib/elc_fileselector_eo.h     |  15 ++++
> >  src/lib/elc_fileselector_legacy.h |  16 ++++
> >  src/lib/elm_widget_fileselector.h |  24 +++++-
> >  6 files changed, 194 insertions(+), 29 deletions(-)
> >
> > diff --git a/src/bin/test_fileselector.c b/src/bin/test_fileselector.c
> > index d72343a..b5fedc5 100644
> > --- a/src/bin/test_fileselector.c
> > +++ b/src/bin/test_fileselector.c
> > @@ -474,6 +474,14 @@ _thumbnail_size_option_create(Evas_Object *parent,
> > Evas_Object *fs)
> >     return frame;
> >  }
> >
> > +static Eina_Bool
> > +_all_filter(const char *path  EINA_UNUSED,
> > +            Eina_Bool dir     EINA_UNUSED,
> > +            void *data        EINA_UNUSED)
> > +{
> > +   return EINA_TRUE;
> > +}
> > +
> >  void
> >  test_fileselector(void *data       EINA_UNUSED,
> >                    Evas_Object *obj EINA_UNUSED,
> > @@ -507,6 +515,7 @@ test_fileselector(void *data       EINA_UNUSED,
> >     elm_fileselector_path_set(fs, getenv("HOME"));
> >     elm_fileselector_mime_types_filter_append(fs, "text/*", "Text Files");
> >     elm_fileselector_mime_types_filter_append(fs, "image/*", "Image
> > Files");
> > +   elm_fileselector_custom_filter_append(fs, _all_filter, NULL, "All
> > Files");
> >
> >     /* allow fs to expand in x & y */
> >     evas_object_size_hint_weight_set(fs, EVAS_HINT_EXPAND,
> > EVAS_HINT_EXPAND);
> > diff --git a/src/lib/elc_fileselector.c b/src/lib/elc_fileselector.c
> > index f15d20e..846b9cf 100644
> > --- a/src/lib/elc_fileselector.c
> > +++ b/src/lib/elc_fileselector.c
> > @@ -4,7 +4,6 @@
> >   *  - user defined icon/label cb
> >   *  - show/hide/add buttons ???
> >   *  - Pattern Filter support
> > - *  - Custom Filter support
> >   */
> >  #ifdef HAVE_CONFIG_H
> >  # include "elementary_config.h"
> > @@ -304,20 +303,19 @@ _mime_type_matched(const char *mime_filter, const
> > char *mime_type)
> >  }
> >
> >  static Eina_Bool
> > -_check_filters(const Elm_Fileselector_Filter *filter, const char
> > *file_name)
> > +_check_mime_type_filter(const Elm_Fileselector_Filter *filter,
> > +                        const char *file_name)
> >  {
> >     const char *mime_type = NULL;
> >     int i;
> >
> > -   if (!filter) return EINA_TRUE;
> > -
> >     mime_type = efreet_mime_type_get(file_name);
> >
> >     if (!mime_type) return EINA_FALSE;
> >
> > -   for (i = 0; filter->mime_types[i]; ++i)
> > +   for (i = 0; filter->filter.mime_types[i]; ++i)
> >       {
> > -        if (_mime_type_matched(filter->mime_types[i], mime_type))
> > +        if (_mime_type_matched(filter->filter.mime_types[i], mime_type))
> >            return EINA_TRUE;
> >       }
> >     return EINA_FALSE;
> > @@ -329,17 +327,34 @@ _ls_filter_cb(void *data,
> >                const Eina_File_Direct_Info *info)
> >  {
> >     Listing_Request *lreq = data;
> > +   Elm_Fileselector_Filter *cf;
> > +   Eina_Bool dir = EINA_FALSE;
> >
> >     if (!lreq->sd->hidden_visible && info->path[info->name_start] == '.')
> >       return EINA_FALSE;
> >
> > -   if (lreq->sd->only_folder && info->type != EINA_FILE_DIR)
> > -     return EINA_FALSE;
> > +   if (info->type == EINA_FILE_DIR)
> > +     dir = EINA_TRUE;
> >
> > -   if (info->type != EINA_FILE_DIR &&
> > !_check_filters(lreq->sd->current_filter, info->path))
> > +   if (lreq->sd->only_folder && dir)
> >       return EINA_FALSE;
> >
> > -   return EINA_TRUE;
> > +   cf = lreq->sd->current_filter;
> > +   if (!cf)
> > +     return EINA_TRUE;
> > +
> > +   switch (cf->filter_type)
> > +     {
> > +      case ELM_FILESELECTOR_MIME_FILTER:
> > +         return dir || _check_mime_type_filter(cf, info->path);
> > +      case ELM_FILESELECTOR_CUSTOM_FILTER:
> > +         return cf->filter.custom->func(info->path, dir,
> > +                                        cf->filter.custom->data);
> > +      default:
> > +         return EINA_FALSE;
> > +     }
> > +
> > +   return EINA_FALSE;
> >  }
> >
> >  static const char *
> > @@ -1164,16 +1179,35 @@ _resource_created(void *data, int type, void *ev)
> >     Evas_Object *obj = data;
> >     Eio_Monitor_Event *event = ev;
> >     int itcn = ELM_FILE_UNKNOW;
> > +   Eina_Bool dir = EINA_FALSE;
> >
> >     ELM_FILESELECTOR_DATA_GET(obj, sd);
> >
> >     if (type == EIO_MONITOR_DIRECTORY_CREATED)
> > +     dir = EINA_TRUE;
> > +
> > +   Elm_Fileselector_Filter *cf = sd->current_filter;
> > +   if (cf)
> > +     {
> > +        switch (cf->filter_type)
> > +          {
> > +           case ELM_FILESELECTOR_MIME_FILTER:
> > +              if (!dir && !_check_mime_type_filter(cf, event->filename))
> > +                return ECORE_CALLBACK_PASS_ON;
> > +              break;
> > +           case ELM_FILESELECTOR_CUSTOM_FILTER:
> > +              if (!cf->filter.custom->func(event->filename, dir,
> > cf->filter.custom->data))
> > +                return ECORE_CALLBACK_PASS_ON;
> > +              break;
> > +           default:
> > +              break;
> > +          }
> > +     }
> > +
> > +   if (dir)
> >       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;
> >       }
> > @@ -1410,8 +1444,13 @@ _elm_fileselector_smart_del(Eo *obj EINA_UNUSED,
> > void *_pd, va_list *list EINA_U
> >       {
> >          eina_stringshare_del(filter->filter_name);
> >
> > -        free(filter->mime_types[0]);
> > -        free(filter->mime_types);
> > +        if (filter->filter_type == ELM_FILESELECTOR_MIME_FILTER)
> > +          {
> > +             free(filter->filter.mime_types[0]);
> > +             free(filter->filter.mime_types);
> > +          }
> > +        else
> > +          free(filter->filter.custom);
> >
> >          free(filter);
> >       }
> > @@ -1892,6 +1931,18 @@ _selected_paths_get(Eo *obj __UNUSED__, void *_pd,
> > va_list *list)
> >       *ret = NULL;
> >  }
> >
> > +static Elm_Fileselector_Filter *
> > +_filter_add(Elm_Fileselector_Smart_Data *sd, const char *filter_name)
> > +{
> > +   Elm_Fileselector_Filter *ff;
> > +   ff = malloc(sizeof(Elm_Fileselector_Filter));
> > +
> > +   ff->filter_name = eina_stringshare_add(filter_name);
> > +   ff->sd = sd;
> > +
> > +   return ff;
> > +}
> > +
> >  EAPI Eina_Bool
> >  elm_fileselector_mime_types_filter_append(Evas_Object *obj, const char
> > *mime_type, const char *filter_name)
> >  {
> > @@ -1917,17 +1968,65 @@ _mime_types_filter_append(Eo *obj, void *_pd,
> > va_list *list)
> >
> >     sd = _pd;
> >
> > -   ff = malloc(sizeof(Elm_Fileselector_Filter));
> > -   if (!ff) goto end;
> > +   ff = _filter_add(sd, filter_name ? filter_name : mime_types);
> > +   ff->filter_type = ELM_FILESELECTOR_MIME_FILTER;
> >
> > -   if (filter_name)
> > -     ff->filter_name = eina_stringshare_add(filter_name);
> > -   else
> > -     ff->filter_name = eina_stringshare_add(mime_types);
> > +   ff->filter.mime_types = eina_str_split(mime_types, ",", 0);
> >
> > -   ff->sd = sd;
> > +   if (!sd->filter_list)
> > +     {
> > +        sd->current_filter = ff;
> > +        sd->filter_hoversel = elm_hoversel_add(obj);
> > +        elm_object_text_set(sd->filter_hoversel, ff->filter_name);
> > +        need_theme = EINA_TRUE;
> > +     }
> > +   elm_hoversel_item_add(sd->filter_hoversel, ff->filter_name, NULL,
> > ELM_ICON_NONE, _current_filter_changed, ff);
> >
> > -   ff->mime_types = eina_str_split(mime_types, ",", 0);
> > +   sd->filter_list = eina_list_append(sd->filter_list, ff);
> > +
> > +   _populate(obj, sd->path, NULL, NULL);
> > +
> > +   if (need_theme)
> > +     eo_do(obj, elm_wdg_theme(NULL));
> > +
> > +   int_ret = EINA_TRUE;
> > +
> > +end:
> > +   if (ret) *ret = int_ret;
> > +}
> > +
> > +EAPI Eina_Bool
> > +elm_fileselector_custom_filter_append(Evas_Object *obj,
> > Elm_Fileselector_Filter_Func func, void *data, const char *filter_name)
> > +{
> > +   ELM_FILESELECTOR_CHECK(obj) EINA_FALSE;
> > +   Eina_Bool ret = EINA_FALSE;
> > +   eo_do(obj, elm_obj_fileselector_custom_filter_append(func, data,
> > filter_name, &ret));
> > +   return ret;
> > +}
> > +
> > +static void
> > +_custom_filter_append(Eo *obj, void *_pd, va_list *list)
> > +{
> > +   Elm_Fileselector_Filter_Func func = va_arg(*list,
> > Elm_Fileselector_Filter_Func);
> > +   void *data = va_arg(*list, void *);
> > +   const char *filter_name = va_arg(*list, const char *);
> > +   Eina_Bool *ret = va_arg(*list, Eina_Bool *);
> > +
> > +   Elm_Fileselector_Smart_Data *sd;
> > +   Elm_Fileselector_Filter *ff;
> > +   Eina_Bool int_ret = EINA_FALSE;
> > +   Eina_Bool need_theme = EINA_FALSE;
> > +
> > +   if (!func) goto end;
> > +
> > +   sd = _pd;
> > +
> > +   ff = _filter_add(sd, filter_name ? filter_name : "custom");
> > +   ff->filter_type = ELM_FILESELECTOR_CUSTOM_FILTER;
> > +
> > +   ff->filter.custom = malloc(sizeof(Elm_Fileselector_Filter_Func));
> > +   ff->filter.custom->func = func;
> > +   ff->filter.custom->data = data;
> >
> >     if (!sd->filter_list)
> >       {
> > @@ -1946,7 +2045,6 @@ _mime_types_filter_append(Eo *obj, void *_pd,
> > va_list *list)
> >       eo_do(obj, elm_wdg_theme(NULL));
> >
> >     int_ret = EINA_TRUE;
> > -
> >  end:
> >     if (ret) *ret = int_ret;
> >  }
> > @@ -1968,8 +2066,13 @@ _filters_clear(Eo *obj, void *_pd, va_list *list
> > EINA_UNUSED)
> >       {
> >          eina_stringshare_del(filter->filter_name);
> >
> > -        free(filter->mime_types[0]);
> > -        free(filter->mime_types);
> > +        if (filter->filter_type == ELM_FILESELECTOR_MIME_FILTER)
> > +          {
> > +             free(filter->filter.mime_types[0]);
> > +             free(filter->filter.mime_types);
> > +          }
> > +        else
> > +          free(filter->filter.custom);
> >
> >          free(filter);
> >       }
> > @@ -2216,6 +2319,7 @@ _class_constructor(Eo_Class *klass)
> >
> >  EO_OP_FUNC(ELM_OBJ_FILESELECTOR_ID
> > (ELM_OBJ_FILESELECTOR_SUB_ID_SELECTED_SET), _selected_set),
> >
> >  EO_OP_FUNC(ELM_OBJ_FILESELECTOR_ID
> > (ELM_OBJ_FILESELECTOR_SUB_ID_SELECTED_PATHS_GET), _selected_paths_get),
> >
> >  EO_OP_FUNC(ELM_OBJ_FILESELECTOR_ID
> > (ELM_OBJ_FILESELECTOR_SUB_ID_MIME_TYPES_FILTER_APPEND),
> > _mime_types_filter_append), +
> >  EO_OP_FUNC(ELM_OBJ_FILESELECTOR_ID
> > (ELM_OBJ_FILESELECTOR_SUB_ID_CUSTOM_FILTER_APPEND), _custom_filter_append),
> >
> >  EO_OP_FUNC(ELM_OBJ_FILESELECTOR_ID
> > (ELM_OBJ_FILESELECTOR_SUB_ID_FILTERS_CLEAR), _filters_clear),
> >
> >  EO_OP_FUNC(ELM_OBJ_FILESELECTOR_ID
> > (ELM_OBJ_FILESELECTOR_SUB_ID_HIDDEN_VISIBLE_SET), _hidden_visible_set),
> >
> >  EO_OP_FUNC(ELM_OBJ_FILESELECTOR_ID
> > (ELM_OBJ_FILESELECTOR_SUB_ID_HIDDEN_VISIBLE_GET), _hidden_visible_get),
> > @@ -2282,6 +2386,7 @@ static const Eo_Op_Description op_desc[] = {
> >       EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_SUB_ID_SELECTED_SET, "Set,
> > programmatically, the currently selected file/directory in the given file
> > selector widget."),
> >       EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_SUB_ID_SELECTED_PATHS_GET,
> > "Get the currently selected item's (full) path, in the given file selector
> > widget."),
> >
> > EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_SUB_ID_MIME_TYPES_FILTER_APPEND,
> > "Append mime type filter"),
> > +     EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_SUB_ID_CUSTOM_FILTER_APPEND,
> > "Append custom filter"),
> >       EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_SUB_ID_FILTERS_CLEAR, "Clear
> > filters"),
> >       EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_SUB_ID_HIDDEN_VISIBLE_SET,
> > "Enable or disable visibility of hidden files/directories in the file
> > selector widget."),
> >       EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_SUB_ID_HIDDEN_VISIBLE_GET,
> > "Get if visibility of hidden files/directories in the file selector widget
> > is enabled or disabled."),
> > diff --git a/src/lib/elc_fileselector_common.h
> > b/src/lib/elc_fileselector_common.h
> > index 73fd30d..8b12c92 100644
> > --- a/src/lib/elc_fileselector_common.h
> > +++ b/src/lib/elc_fileselector_common.h
> > @@ -21,3 +21,5 @@ typedef enum
> >     ELM_FILESELECTOR_SORT_BY_MODIFIED_DESC,
> >     ELM_FILESELECTOR_SORT_LAST /**< sentinel (helper) value, not used */
> >  } Elm_Fileselector_Sort;
> > +
> >
> 
> Thanks for the nice patch :)
> 
> 
> > +typedef Eina_Bool (*Elm_Fileselector_Filter_Func)(const char *path,
> > Eina_Bool dir, void *data);
> >
> 
> 
> But how about Elm_Fileselector_Custom_Filter_Func?
> This is only valid for custom filter not mime filter.
> Thanks in advance.

mime filters dont use funcs... just mimetype strings. already there in the api
so changing this would break it... this just adds a fully custom filter func in
addition to run on filtering file contents in the fsel list. so there isn't a
clash with mime filters here that i see.

> Daniel Juyung Seo (SeoZ)
> 
> 
> > diff --git a/src/lib/elc_fileselector_eo.h b/src/lib/elc_fileselector_eo.h
> > index b0696f8..b8a38f9 100644
> > --- a/src/lib/elc_fileselector_eo.h
> > +++ b/src/lib/elc_fileselector_eo.h
> > @@ -29,6 +29,7 @@ enum
> >     ELM_OBJ_FILESELECTOR_SUB_ID_SELECTED_SET,
> >     ELM_OBJ_FILESELECTOR_SUB_ID_SELECTED_PATHS_GET,
> >     ELM_OBJ_FILESELECTOR_SUB_ID_MIME_TYPES_FILTER_APPEND,
> > +   ELM_OBJ_FILESELECTOR_SUB_ID_CUSTOM_FILTER_APPEND,
> >     ELM_OBJ_FILESELECTOR_SUB_ID_FILTERS_CLEAR,
> >     ELM_OBJ_FILESELECTOR_SUB_ID_HIDDEN_VISIBLE_SET,
> >     ELM_OBJ_FILESELECTOR_SUB_ID_HIDDEN_VISIBLE_GET,
> > @@ -269,6 +270,20 @@ enum
> >  #define elm_obj_fileselector_mime_types_filter_append(mime_types,
> > filter_name, ret)
> > ELM_OBJ_FILESELECTOR_ID
> > (ELM_OBJ_FILESELECTOR_SUB_ID_MIME_TYPES_FILTER_APPEND), EO_TYPECHECK(const
> > char *, mime_types), EO_TYPECHECK(const char *, filter_name), EO_TYPECHECK
> > (Eina_Bool *, ret)
> >
> >  /**
> > + * @def elm_obj_fileselector_custom_filter_append
> > + * @since 1.9
> > + *
> > + * Append custom filter into filter list
> > + *
> > + * @param[in] mime_types
> > + * @param[in] filter_name
> > + * @param[out] ret
> > + *
> > + * @see elm_fileselector_custom_filter_append
> > + */
> > +#define elm_obj_fileselector_custom_filter_append(func, data,
> > filter_name, ret)
> > ELM_OBJ_FILESELECTOR_ID(ELM_OBJ_FILESELECTOR_SUB_ID_CUSTOM_FILTER_APPEND),
> > EO_TYPECHECK(Elm_Fileselector_Filter_Func, func), EO_TYPECHECK(void *,
> > data), EO_TYPECHECK(const char *, filter_name), EO_TYPECHECK(Eina_Bool *,
> > ret)
> > +
> > +/**
> >   * @def elm_obj_fileselector_filters_clear
> >   * @since 1.8
> >   *
> > diff --git a/src/lib/elc_fileselector_legacy.h
> > b/src/lib/elc_fileselector_legacy.h
> > index a59936e..aff3456 100644
> > --- a/src/lib/elc_fileselector_legacy.h
> > +++ b/src/lib/elc_fileselector_legacy.h
> > @@ -320,6 +320,22 @@ EAPI const Eina_List
> >  *elm_fileselector_selected_paths_get(const Evas_Object
> >  EAPI Eina_Bool
> > elm_fileselector_mime_types_filter_append(Evas_Object *obj, const char
> > *mime_types, const char *filter_name);
> >
> >  /**
> > + * Append custom filter into filter list
> > + *
> > + * @param obj The file selector object
> > + * @param func The function to call when manipulating files and
> > directories.
> > + * @param data The data to be passed to this @p func call.
> > + * @param filter_name The name to be displayed, "custom" will be
> > displayed if NULL
> > + * @return @c EINA_TRUE on success, @c EINA_FALSE on failure.
> > + *
> > + * @note first added filter will be the default filter at the moment.
> > + *
> > + * @since 1.9
> > + * @ingroup Fileselector
> > + */
> > +EAPI Eina_Bool
> > elm_fileselector_custom_filter_append(Evas_Object *obj,
> > Elm_Fileselector_Filter_Func func, void *data, const char *filter_name);
> > +
> > +/**
> >   * Clear all filters registered
> >   *
> >   * @param obj The file selector object
> > diff --git a/src/lib/elm_widget_fileselector.h
> > b/src/lib/elm_widget_fileselector.h
> > index c52948d..2991485 100644
> > --- a/src/lib/elm_widget_fileselector.h
> > +++ b/src/lib/elm_widget_fileselector.h
> > @@ -98,12 +98,30 @@ typedef enum {
> >     ELM_FILE_LAST
> >  } Elm_Fileselector_Type;
> >
> > +typedef enum {
> > +   ELM_FILESELECTOR_MIME_FILTER = 0,
> > +   ELM_FILESELECTOR_CUSTOM_FILTER,
> > +   ELM_FILESELECTOR_FILTER_LAST
> > +} Elm_Fileselector_Filter_Type;
> > +
> > +typedef struct _Elm_Fileselector_Custom_Filter
> > Elm_Fileselector_Custom_Filter;
> > +struct _Elm_Fileselector_Custom_Filter
> > +{
> > +   Elm_Fileselector_Filter_Func  func;
> > +   void                         *data;
> > +};
> > +
> >  struct _Elm_Fileselector_Filter
> >  {
> > -   const char                   *filter_name;
> > -   Elm_Fileselector_Smart_Data  *sd;
> > +   const char                         *filter_name;
> > +   Elm_Fileselector_Smart_Data        *sd;
> > +
> > +   union {
> > +      char                           **mime_types;
> > +      Elm_Fileselector_Custom_Filter  *custom;
> > +   } filter;
> >
> > -   char                        **mime_types;
> > +   Elm_Fileselector_Filter_Type        filter_type;
> >  };
> >
> >  /**
> >
> > --
> >
> >
> >
> ------------------------------------------------------------------------------
> Rapidly troubleshoot problems before they affect your business. Most IT 
> organizations don't have a clear picture of how application performance 
> affects their revenue. With AppDynamics, you get 100% visibility into your 
> Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
> http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
> 


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    ras...@rasterman.com


------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to