Enlightenment CVS committal Author : jethomas Project : e17 Module : libs/ewl
Dir : e17/libs/ewl/src/lib Modified Files: ewl_filedialog.c ewl_filedialog.h ewl_filelist.c ewl_filelist.h ewl_filelist_model.c ewl_filelist_model.h ewl_filepicker.c ewl_filepicker.h Log Message: Implement filtering in the file choosing widgets =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filedialog.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -3 -r1.40 -r1.41 --- ewl_filedialog.c 14 Nov 2007 20:07:58 -0000 1.40 +++ ewl_filedialog.c 9 Dec 2007 04:33:39 -0000 1.41 @@ -405,7 +405,8 @@ */ void ewl_filedialog_filter_add(Ewl_Filedialog *fd, const char *name, - const char *filter) + const char *filter, + Ecore_List *mime_types) { DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR(fd); @@ -413,7 +414,7 @@ DCHECK_PARAM_PTR(filter); DCHECK_TYPE(fd, EWL_FILEDIALOG_TYPE); - ewl_filepicker_filter_add(EWL_FILEPICKER(fd->fp), name, filter); + ewl_filepicker_filter_add(EWL_FILEPICKER(fd->fp), name, filter, mime_types); DLEAVE_FUNCTION(DLEVEL_STABLE); } =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filedialog.h,v retrieving revision 1.23 retrieving revision 1.24 diff -u -3 -r1.23 -r1.24 --- ewl_filedialog.h 14 Nov 2007 20:07:58 -0000 1.23 +++ ewl_filedialog.h 9 Dec 2007 04:33:39 -0000 1.24 @@ -89,7 +89,8 @@ void ewl_filedialog_filter_add(Ewl_Filedialog *fd, const char *name, - const char *filter); + const char *filter, + Ecore_List *mime_types); /* * Internally used callbacks, override at your own risk. =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filelist.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -3 -r1.44 -r1.45 --- ewl_filelist.c 9 Dec 2007 01:00:40 -0000 1.44 +++ ewl_filelist.c 9 Dec 2007 04:33:39 -0000 1.45 @@ -77,8 +77,8 @@ fl->multiselect = FALSE; fl->skip_hidden = TRUE; - ewl_filelist_filter_set(fl, NULL); - ewl_filelist_directory_set(fl, NULL); + fl->directory = NULL; + fl->filter = NULL; ewl_filelist_setup(fl); DRETURN_INT(TRUE, DLEVEL_STABLE); @@ -279,7 +279,7 @@ if (data) ewl_filelist_model_data_unref(data); data = ewl_filelist_model_directory_new(fl->directory, - fl->skip_hidden, TRUE); + fl->skip_hidden, TRUE, fl->filter); ewl_mvc_data_set(EWL_MVC(fl->controller), data); ewl_mvc_dirty_set(EWL_MVC(fl->controller), TRUE); @@ -313,17 +313,25 @@ * @brief Sets the given filter into the filelist */ void -ewl_filelist_filter_set(Ewl_Filelist *fl, const char *filter) +ewl_filelist_filter_set(Ewl_Filelist *fl, Ewl_Filelist_Filter *filter) { + Ewl_Filelist_Directory *dir; + int ret = 0; + DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR(fl); + DCHECK_PARAM_PTR(filter); DCHECK_TYPE(fl, EWL_FILELIST_TYPE); - IF_FREE(fl->filter); - fl->filter = (filter ? strdup(filter) : NULL); + fl->filter = NULL; + fl->filter = filter; + dir = ewl_mvc_data_get(EWL_MVC(fl->controller)); - /* Model does not do filtering yet */ - DWARNING("Filtering not yet implemented"); + /* Set the filelist and test if there is any change in data */ + if (dir) + ret = ewl_filelist_model_filter_set(dir, filter); + if (ret) + ewl_mvc_dirty_set(EWL_MVC(fl->controller), TRUE); DLEAVE_FUNCTION(DLEVEL_STABLE); } @@ -333,7 +341,7 @@ * @return Returns the current filter * @brief Retrieves the current filter set on the filelist */ -const char * +Ewl_Filelist_Filter * ewl_filelist_filter_get(Ewl_Filelist *fl) { DENTER_FUNCTION(DLEVEL_STABLE); @@ -406,7 +414,8 @@ void ewl_filelist_show_dot_files_set(Ewl_Filelist *fl, unsigned int dot) { - Ewl_Filelist_Directory *data; + Ewl_Filelist_Directory *dir; + int ret = 0; DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR(fl); @@ -416,13 +425,13 @@ DRETURN(DLEVEL_STABLE); fl->skip_hidden = !!dot; - data = ewl_mvc_data_get(EWL_MVC(fl->controller)); - if (data) ewl_filelist_model_data_unref(data); - - data = ewl_filelist_model_directory_new(fl->directory, - fl->skip_hidden, TRUE); - ewl_mvc_data_set(EWL_MVC(fl->controller), data); - ewl_mvc_dirty_set(EWL_MVC(fl->controller), TRUE); + dir = ewl_mvc_data_get(EWL_MVC(fl->controller)); + + /* check if data and then call the model function */ + if (dir) + ret = ewl_filelist_model_show_dot_files_set(dir, dot); + if (ret) + ewl_mvc_dirty_set(EWL_MVC(fl->controller), TRUE); DLEAVE_FUNCTION(DLEVEL_STABLE); } @@ -1150,12 +1159,12 @@ DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR(w); DCHECK_TYPE(w, EWL_FILELIST_TYPE); - + fl = EWL_FILELIST(w); IF_FREE(fl->directory); - IF_FREE(fl->filter); IF_FREE(fl->view); IF_FREE(fl->model); + fl->filter = NULL; DLEAVE_FUNCTION(DLEVEL_STABLE); } =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filelist.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -3 -r1.21 -r1.22 --- ewl_filelist.h 14 Nov 2007 20:07:58 -0000 1.21 +++ ewl_filelist.h 9 Dec 2007 04:33:39 -0000 1.22 @@ -20,6 +20,30 @@ * * @{ */ + + /** + * * @def EWL_FILELIST_FILTER_TYPE + * * The type name + * **/ +#define EWL_FILELIST_FILTER_TYPE "filelist_filter" + +typedef struct Ewl_Filelist_Filter Ewl_Filelist_Filter; + +/** + * * @def EWL_FILELIST_FILTER(ff) + * * Typecasts a pointer to an Ewl_Filelist_Filter + * **/ +#define EWL_FILELIST_FILTER(ff), ((Ewl_Filelist_Filter *)ff) + +/** + * * @brief The data structure for Ewl_Filelist_Filter + * **/ +struct Ewl_Filelist_Filter +{ + char *name; + char *extension; + Ecore_List *mime_list; +}; /** * @def EWL_FILELIST_TYPE @@ -56,7 +80,7 @@ Ewl_Model *model; /**< The model for the mvc */ char *directory; /**< The directory to display */ - char *filter; /**< The file filter to employ */ + Ewl_Filelist_Filter *filter; /**< The file filter to employ */ unsigned char multiselect:1; /**< Allow multiple file selctions */ unsigned char skip_hidden:1; /**< Show . files */ @@ -69,6 +93,65 @@ } scroll_flags; /**< Flags to modify a containing scrollpane */ }; +/** + * @def EWL_FILELIST_FILE_TYPE + * The type name + */ +#define EWL_FILELIST_FILE_TYPE "filelist_file" + +typedef struct Ewl_Filelist_File Ewl_Filelist_File; + +/** + * @def EWL_FILELIST_FILE(fl) + * Typecasts a pointer to an Ewl_Filelist_File pointer + */ +#define EWL_FILELIST_FILE(fl) ((Ewl_Filelist_File *)fl) + +/** + * @brief The data structure for Ewl_Filelist_File + */ +struct Ewl_Filelist_File +{ + const char *name; + off_t size; + mode_t mode; + uid_t username; + gid_t groupname; + time_t modtime; + unsigned char readable:1; + unsigned char writeable:1; + unsigned char is_dir:1; +}; + +/** + * * @def EWL_FILELIST_DIRECTORY_TYPE + * * The type name + * */ +#define EWL_FILELIST_DIRECTORY_TYPE "filelist_directory" + +typedef struct Ewl_Filelist_Directory Ewl_Filelist_Directory; + +/** + * * @def EWL_FILELIST_DIRECTORY(fl) + * * Typecasts a pointer to an Ewl_Filelist_Directory pointer + * */ +#define EWL_FILELIST_DIRECTORY(fl) ((Ewl_Filelist_Directory *)fl) + +/** + * * @brief The data structure for Ewl_Filelist_Directory + * */ +struct Ewl_Filelist_Directory +{ + const char *name; + Ecore_List *rfiles; + Ecore_List *rdirs; + Ecore_List *files; + Ecore_List *dirs; + Ewl_Filelist_Filter *filter; + unsigned char skip_hidden:1; + unsigned int num_dirs; + unsigned int num_files; +}; Ewl_Widget *ewl_filelist_new(void); @@ -79,8 +162,8 @@ const char *ewl_filelist_directory_get(Ewl_Filelist *fl); void ewl_filelist_filter_set(Ewl_Filelist *fl, - const char *filter); -const char *ewl_filelist_filter_get(Ewl_Filelist *fl); + Ewl_Filelist_Filter *filter); +Ewl_Filelist_Filter *ewl_filelist_filter_get(Ewl_Filelist *fl); void ewl_filelist_view_set(Ewl_Filelist *fl, Ewl_Filelist_View view); @@ -126,21 +209,6 @@ const char *ewl_filelist_stock_icon_get(const char *path); char *ewl_filelist_expand_path(Ewl_Filelist *fl, const char *dir); -void ewl_filelist_directory_read(Ewl_Filelist *fl, - const char *dir, - unsigned int skip_dot_dot, - void (*func)(Ewl_Filelist *fl, - const char *dir, - char *file, void *data), - void *data); -void ewl_filelist_handle_click(Ewl_Filelist *fl, Ewl_Widget *w, - Ewl_Event_Mouse_Up *ev, - const char *select_state, - const char *unselect_state); -void ewl_filelist_container_shift_handle(Ewl_Filelist *fl, - Ewl_Container *c, Ewl_Widget *clicked, - const char *select_signal, - const char *unselect_signal); /* * Internally used functions, override at your own risk =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filelist_model.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- ewl_filelist_model.c 14 Nov 2007 20:07:59 -0000 1.5 +++ ewl_filelist_model.c 9 Dec 2007 04:33:39 -0000 1.6 @@ -5,6 +5,7 @@ #include "ewl_debug.h" #include "ewl_model.h" #include "ewl_filelist.h" +#include "ewl_io_manager.h" #include <dirent.h> static int ewl_filelist_model_data_name_sort(Ewl_Filelist_File *file1, @@ -12,21 +13,28 @@ static int ewl_filelist_model_data_size_sort(Ewl_Filelist_File *file1, Ewl_Filelist_File *file2); static void free_file(Ewl_Filelist_File *file); +void ewl_filelist_model_filter(Ewl_Filelist_Directory *dir); +static unsigned int ewl_filelist_model_filter_main + (Ewl_Filelist_Directory *dir, + Ewl_Filelist_File *file); /** * @param path: The path to the directory to read - * @param skip_hidden: TRUE skips hidden files, FALSE does not + * @param skip_hidden: TRUE shows hidden files, FALSE does not * @param show_dot_dot: TRUE shows .. for navigating upwards, FALSE does not + * @param filter: The Ewl_Filelist_Filter to use * @return Returns an Ewl_Filelist_Directory structure * @brief Retrieves all files in a directory */ Ewl_Filelist_Directory * -ewl_filelist_model_directory_new(const char *path, +ewl_filelist_model_directory_new(const char *path, unsigned char skip_hidden, - unsigned int show_dot_dot) + unsigned int show_dot_dot, + Ewl_Filelist_Filter *filter) { Ewl_Filelist_Directory *dir; Ewl_Filelist_File *file; + struct stat st; char filename[PATH_MAX], *file_temp; int nf = 0, nd = 0; @@ -48,13 +56,6 @@ while ((file_temp = ecore_list_first_remove(all_files))) { - /* Handle hidden files */ - if ((skip_hidden) && (file_temp[0] == '.')) - { - FREE(file_temp); - continue; - } - /* allocate the memory for the file structure */ file = NEW(Ewl_Filelist_File, 1); @@ -100,12 +101,18 @@ /* create the new directory structure */ dir = NEW(Ewl_Filelist_Directory, 1); - dir->files = files; - dir->dirs = dirs; + dir->rfiles = files; + dir->rdirs = dirs; + dir->files = ecore_list_new(); + dir->dirs = ecore_list_new(); dir->name = ecore_string_instance(path); dir->skip_hidden = !!skip_hidden; + dir->filter = filter; dir->num_dirs = nd; dir->num_files = nf; + + /* Filter the directory */ + ewl_filelist_model_filter(dir); IF_FREE_LIST(all_files); DRETURN_PTR(dir, DLEVEL_STABLE); @@ -339,8 +346,8 @@ file = ecore_list_index_goto(fld->dirs, parent); snprintf(path, PATH_MAX, "%s/%s", fld->name, file->name); subdir = ewl_filelist_model_directory_new - (path, fld->skip_hidden, - FALSE); + (path, fld->skip_hidden, + FALSE, fld->filter); DRETURN_PTR(subdir, DLEVEL_STABLE); } @@ -360,6 +367,8 @@ ecore_string_release(dir->name); ecore_list_destroy(dir->files); ecore_list_destroy(dir->dirs); + ecore_list_destroy(dir->rfiles); + ecore_list_destroy(dir->rdirs); FREE(dir); DRETURN_INT(TRUE, DLEVEL_STABLE); @@ -377,5 +386,201 @@ FREE(file); DLEAVE_FUNCTION(DLEVEL_STABLE); +} + +/** + * @param data: The model to work with + * @param hidden: TRUE shows hidden files, FALSE does not + * @return Returns TRUE if a change in data, FALSE if not + * @brief This function sets whether the filelist should contain hidden files + */ +unsigned int +ewl_filelist_model_show_dot_files_set(Ewl_Filelist_Directory *dir, + unsigned int skip_hidden) +{ + DENTER_FUNCTION(DLEVEL_STABLE); + DCHECK_PARAM_PTR_RET(dir, FALSE); + + /* If nothing has changed, leave */ + if (skip_hidden == !!dir->skip_hidden) + DRETURN_INT(FALSE, DLEVEL_STABLE); + + /* Else set value in */ + dir->skip_hidden = !!skip_hidden; + + /* Refilter the files */ + ewl_filelist_model_filter(dir); + + DRETURN_INT(TRUE, DLEVEL_STABLE); +} + +/** + * @param data: The model to work with + * @return Returns if the model shows dot files + * @brief Returns if the model shows dot files + */ +unsigned int +ewl_filelist_model_show_dot_files_get(Ewl_Filelist_Directory *dir) +{ + DENTER_FUNCTION(DLEVEL_STABLE); + DCHECK_PARAM_PTR_RET(dir, FALSE); + DRETURN_INT((unsigned int)dir->skip_hidden, DLEVEL_STABLE); +} + +/** + * @param dir: The directory to filter + * @return Does not return a value + * @brief Filters a directory + */ +void +ewl_filelist_model_filter(Ewl_Filelist_Directory *dir) +{ + Ewl_Filelist_File *file; + int ret = 0; + + DENTER_FUNCTION(DLEVEL_STABLE); + DCHECK_PARAM_PTR(dir); + + /* Set up temporary filelist */ + ecore_list_clear(dir->files); + ecore_list_clear(dir->dirs); + + + /* Hidden files first */ + if (dir->skip_hidden) + { + + /* Run through files and filter hidden first, then others */ + ecore_list_first_goto(dir->rfiles); + while ((file = ecore_list_next(dir->rfiles))) + { + ret = ewl_filelist_model_filter_main(dir, file); + if ((file->name[0] != '.') && (ret)) + ecore_list_append(dir->files, file); + + } + + /* Now directories */ + ecore_list_first_goto(dir->rdirs); + while ((file = ecore_list_next(dir->rdirs))) + { + if ((file->name[0] != '.') || + (!strcmp(file->name, ".."))) + ecore_list_append(dir->dirs, file); + } + } + + /* If showing hidden */ + else + { + /* Still loop through to check if pass filter */ + ecore_list_first_goto(dir->rfiles); + while ((file = ecore_list_next(dir->rfiles))) + { + ret = ewl_filelist_model_filter_main(dir, file); + if (ret) + ecore_list_append(dir->files, file); + } + + ecore_list_first_goto(dir->rdirs); + while ((file = ecore_list_next(dir->rdirs))) + ecore_list_append(dir->dirs, file); + } + + + /* Set numbers into directory data */ + dir->num_dirs = ecore_list_count(dir->dirs); + dir->num_files = ecore_list_count(dir->files); + + DLEAVE_FUNCTION(DLEVEL_STABLE); +} + +/** + * @param dir: The directory to set a filter upon + * @param filter: The Ewl_Filelist_Filter to use + * @returns: Returns TRUE on data change, FALSE if not + * @brief Sets a filter onto a directory + */ +unsigned int +ewl_filelist_model_filter_set(Ewl_Filelist_Directory *dir, + Ewl_Filelist_Filter *filter) +{ + DENTER_FUNCTION(DLEVEL_STABLE); + DCHECK_PARAM_PTR_RET(dir, FALSE); + DCHECK_PARAM_PTR_RET(filter, FALSE); + + /* If nothing has changed, leave */ + if ((dir->filter) && (!memcmp(dir->filter, filter, + sizeof(dir->filter)))) + DRETURN_INT(FALSE, DLEVEL_STABLE); + + /* Set the filter and call the function */ + dir->filter = filter; + ewl_filelist_model_filter(dir); + + DRETURN_INT(TRUE, DLEVEL_STABLE); +} + +/** + * @param dir: The directory to get the filter for + * @returns: Returns the Ewl_Filelist_Filter used + * @brief Gets the filter used on a directory + */ +Ewl_Filelist_Filter * +ewl_filelist_model_filter_get(Ewl_Filelist_Directory *dir) +{ + DENTER_FUNCTION(DLEVEL_STABLE); + DCHECK_PARAM_PTR_RET(dir, NULL); + DRETURN_PTR(dir->filter, DLEVEL_STABLE); +} + +/** + * @internal + * @param dir: The directory to get the filter from + * @param file: The file to test + * @returns: Returns TRUE if passes the filter, FALSE otherwise + * @brief Tests a file against a filter + */ +static unsigned int +ewl_filelist_model_filter_main(Ewl_Filelist_Directory *dir, + Ewl_Filelist_File *file) +{ + Ewl_Filelist_Filter *filter = dir->filter; + const char *mime_check; + char *mime_given; + + DENTER_FUNCTION(DLEVEL_STABLE); + DCHECK_PARAM_PTR_RET(dir, FALSE); + DCHECK_PARAM_PTR_RET(file, FALSE); + + if (!filter) + DRETURN_INT(FALSE, DLEVEL_STABLE); + + /* First check mime types */ + if (filter->mime_list) + { + mime_check = ewl_io_manager_uri_mime_type_get(file->name); + ecore_list_first_goto(filter->mime_list); + while ((mime_given = ecore_list_next(filter->mime_list))) + { + if (!strcmp(mime_given, mime_check)) + DRETURN_INT(TRUE, DLEVEL_STABLE); + } + } + + /* Next check extension */ + else if (filter->extension) + { + if (!fnmatch(filter->extension, file->name, 0)) + DRETURN_INT(TRUE, DLEVEL_STABLE); + } + + /* If no filter at all is in effect */ + else if ((!filter->extension) && (!filter->mime_list)) + { + DRETURN_INT(TRUE, DLEVEL_STABLE); + } + + DRETURN_INT(FALSE, DLEVEL_STABLE); } =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filelist_model.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- ewl_filelist_model.h 3 Dec 2007 04:16:06 -0000 1.6 +++ ewl_filelist_model.h 9 Dec 2007 04:33:39 -0000 1.7 @@ -1,5 +1,6 @@ #ifndef EWL_FILELIST_MODEL_H #define EWL_FILELIST_MODEL_H +#include "ewl_filelist.h" /** * @addtogroup Ewl_Filelist_Model Ewl_Filelist_Model: The model for the filelist @@ -8,66 +9,10 @@ * @{ */ -/** - * @def EWL_FILELIST_FILE_TYPE - * The type name - */ -#define EWL_FILELIST_FILE_TYPE "filelist_file" - -typedef struct Ewl_Filelist_File Ewl_Filelist_File; - -/** - * @def EWL_FILELIST_FILE(fl) - * Typecasts a pointer to an Ewl_Filelist_File pointer - */ -#define EWL_FILELIST_FILE(fl) ((Ewl_Filelist_File *)fl) - -/** - * @brief The data structure for Ewl_Filelist_File - */ -struct Ewl_Filelist_File -{ - const char *name; - off_t size; - mode_t mode; - uid_t username; - gid_t groupname; - time_t modtime; - unsigned char readable:1; - unsigned char writeable:1; - unsigned char is_dir:1; -}; - -/** - * * @def EWL_FILELIST_DIRECTORY_TYPE - * * The type name - * */ -#define EWL_FILELIST_DIRECTORY_TYPE "filelist_directory" - -typedef struct Ewl_Filelist_Directory Ewl_Filelist_Directory; - -/** - * * @def EWL_FILELIST_DIRECTORY(fl) - * * Typecasts a pointer to an Ewl_Filelist_Directory pointer - * */ -#define EWL_FILELIST_DIRECTORY(fl) ((Ewl_Filelist_Directory *)fl) - -/** - * * @brief The data structure for Ewl_Filelist_Directory - * */ -struct Ewl_Filelist_Directory -{ - const char *name; - Ecore_List *files; - Ecore_List *dirs; - unsigned char skip_hidden:1; - unsigned int num_dirs; - unsigned int num_files; -}; - Ewl_Filelist_Directory *ewl_filelist_model_directory_new(const char *path, - unsigned char skip_hidden, - unsigned int show_dot_dot); + unsigned char skip_hidden, + unsigned int show_dot_dot, + Ewl_Filelist_Filter *filter); unsigned int ewl_filelist_model_data_count(void *data); void *ewl_filelist_model_data_fetch(void *data, unsigned int row, unsigned int column); @@ -80,6 +25,15 @@ unsigned int ewl_filelist_model_data_unref(void *data); int ewl_filelist_model_column_sortable(void *data, unsigned int column); + +unsigned int ewl_filelist_model_show_dot_files_set(Ewl_Filelist_Directory *dir, + unsigned int skip_hidden); +unsigned int ewl_filelist_model_show_dot_files_get(Ewl_Filelist_Directory *dir); + +unsigned int ewl_filelist_model_filter_set(Ewl_Filelist_Directory *dir, + Ewl_Filelist_Filter *filter); +Ewl_Filelist_Filter *ewl_filelist_model_filter_get + (Ewl_Filelist_Directory *dir); /** * @} =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filepicker.c,v retrieving revision 1.39 retrieving revision 1.40 diff -u -3 -r1.39 -r1.40 --- ewl_filepicker.c 17 Nov 2007 16:57:56 -0000 1.39 +++ ewl_filepicker.c 9 Dec 2007 04:33:39 -0000 1.40 @@ -12,20 +12,6 @@ #include "ewl_private.h" #include "ewl_debug.h" -/** - * Ewl_Filepicker_Filter - */ -typedef struct Ewl_Filepicker_Filter Ewl_Filepicker_Filter; - -/** - * @brief Contains information on a filepicker filter - */ -struct Ewl_Filepicker_Filter -{ - char *name; - char *filter; -}; - static void ewl_filepicker_favorites_populate(Ewl_Filepicker *fp); static void ewl_filepicker_cb_list_value_changed(Ewl_Widget *w, void *ev, void *data); @@ -46,7 +32,7 @@ static unsigned int ewl_filepicker_cb_type_count(void *data); static Ewl_Widget *ewl_filepicker_cb_type_header(void *data, unsigned int col); -static void ewl_filepicker_filter_free_cb(Ewl_Filepicker_Filter *filter); +static void ewl_filepicker_filter_free_cb(Ewl_Filelist_Filter *filter); /** * @return Returns a new Ewl_Filepicker widget or NULL on failure @@ -133,6 +119,15 @@ fp->file_list_box = ewl_scrollpane_new(); ewl_container_child_append(EWL_CONTAINER(o), fp->file_list_box); ewl_widget_show(fp->file_list_box); + + fp->file_list = ewl_filelist_new(); + ewl_container_child_append(EWL_CONTAINER(fp->file_list_box), + fp->file_list); + ewl_callback_append(EWL_WIDGET(fp->file_list), + EWL_CALLBACK_VALUE_CHANGED, + ewl_filepicker_cb_list_value_changed, + fp); + ewl_widget_show(fp->file_list); o = ewl_hbox_new(); ewl_container_child_append(EWL_CONTAINER(fp), o); @@ -152,7 +147,6 @@ fp->filters = ecore_list_new(); ecore_list_free_cb_set(fp->filters, ECORE_FREE_CB(ewl_filepicker_filter_free_cb)); - ewl_filepicker_filter_add(fp, "All files", NULL); fp->mvc_filters.model = ewl_model_new(); ewl_model_data_fetch_set(fp->mvc_filters.model, @@ -170,8 +164,6 @@ ewl_mvc_view_set(EWL_MVC(fp->mvc_filters.combo), fp->mvc_filters.view); ewl_mvc_data_set(EWL_MVC(fp->mvc_filters.combo), fp); - ewl_mvc_selected_set(EWL_MVC(fp->mvc_filters.combo), - NULL, fp, 0, 0); ewl_combo_editable_set(EWL_COMBO(fp->mvc_filters.combo), TRUE); ewl_callback_append(fp->mvc_filters.combo, EWL_CALLBACK_VALUE_CHANGED, @@ -203,17 +195,12 @@ ewl_filepicker_cb_button_clicked, fp); ewl_object_fill_policy_set(EWL_OBJECT(o), EWL_FLAG_FILL_SHRINK); ewl_widget_show(o); - - /* do this last so all the other widgets are set correctly */ - fp->file_list = ewl_filelist_new(); - ewl_container_child_append(EWL_CONTAINER(fp->file_list_box), - fp->file_list); - ewl_callback_append(EWL_WIDGET(fp->file_list), - EWL_CALLBACK_VALUE_CHANGED, - ewl_filepicker_cb_list_value_changed, - fp); - ewl_widget_show(fp->file_list); + + /* Set up filelist */ + ewl_filepicker_filter_add(fp, "All files", NULL, NULL); ewl_filepicker_directory_set(fp, NULL); + ewl_mvc_selected_set(EWL_MVC(fp->mvc_filters.combo), + NULL, fp, 0, 0); DRETURN_INT(TRUE, DLEVEL_STABLE); } @@ -361,7 +348,7 @@ * @brief Set the given filter into the file picker */ void -ewl_filepicker_filter_set(Ewl_Filepicker *fp, const char *filter) +ewl_filepicker_filter_set(Ewl_Filepicker *fp, Ewl_Filelist_Filter *filter) { DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR(fp); @@ -377,7 +364,7 @@ * @return Returns the current filter used in the filepicker * @brief Retrieves the current filter used in the filepicker */ -const char * +Ewl_Filelist_Filter * ewl_filepicker_filter_get(Ewl_Filepicker *fp) { DENTER_FUNCTION(DLEVEL_STABLE); @@ -542,18 +529,22 @@ */ void ewl_filepicker_filter_add(Ewl_Filepicker *fp, const char *name, - const char *filter) + const char *extension, + Ecore_List *mime_types) { - Ewl_Filepicker_Filter *f; + Ewl_Filelist_Filter *f; DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR(fp); DCHECK_PARAM_PTR(name); DCHECK_TYPE(fp, EWL_FILEPICKER_TYPE); - f= NEW(Ewl_Filepicker_Filter, 1); + f= NEW(Ewl_Filelist_Filter, 1); f->name = strdup(name); - f->filter = (filter ? strdup(filter) : NULL); + if (extension) f->extension = strdup(extension); + else f->extension = NULL; + if (mime_types) f->mime_list = mime_types; + else f->mime_list = NULL; ecore_list_prepend(fp->filters, f); @@ -652,7 +643,7 @@ unsigned int col __UNUSED__) { Ewl_Filepicker *fp; - Ewl_Filepicker_Filter *filter; + Ewl_Filelist_Filter *filter; DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR_RET(data, NULL); @@ -681,7 +672,7 @@ ewl_filepicker_cb_type_header(void *data, unsigned int col) { Ewl_Filepicker *fp; - Ewl_Filepicker_Filter *filter; + Ewl_Filelist_Filter *filter; Ewl_Widget *w; DENTER_FUNCTION(DLEVEL_STABLE); @@ -761,6 +752,7 @@ ewl_filepicker_cb_filter_change(Ewl_Widget *w, void *ev __UNUSED__, void *data) { Ewl_Filepicker *fp; + const char *name; DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR(w); @@ -768,7 +760,13 @@ DCHECK_TYPE(w, EWL_WIDGET_TYPE); fp = data; - ewl_filepicker_filter_set(fp, ewl_text_text_get(EWL_TEXT(w))); + name = ewl_text_text_get(EWL_TEXT(w)); + + if (!name) + DRETURN(DLEVEL_STABLE); + + ewl_filepicker_filter_add(fp, name, name, NULL); + ewl_filepicker_cb_type_change(fp->mvc_filters.combo, NULL, fp); DLEAVE_FUNCTION(DLEVEL_STABLE); } @@ -778,7 +776,7 @@ void *data) { Ewl_Filepicker *fp; - Ewl_Filepicker_Filter *filter; + Ewl_Filelist_Filter *filter; Ewl_Selection_Idx *idx; DENTER_FUNCTION(DLEVEL_STABLE); @@ -792,8 +790,10 @@ { ecore_list_index_goto(fp->filters, idx->row); filter = ecore_list_current(fp->filters); - ewl_filepicker_filter_set(fp, filter->filter); + ewl_filepicker_filter_set(fp, filter); } + + FREE(idx); DLEAVE_FUNCTION(DLEVEL_STABLE); } @@ -821,14 +821,15 @@ } static void -ewl_filepicker_filter_free_cb(Ewl_Filepicker_Filter *filter) +ewl_filepicker_filter_free_cb(Ewl_Filelist_Filter *filter) { DENTER_FUNCTION(DLEVEL_STABLE); if (!filter) DRETURN(DLEVEL_STABLE); IF_FREE(filter->name); - IF_FREE(filter->filter); + IF_FREE(filter->extension); + IF_FREE_LIST(filter->mime_list); FREE(filter); =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filepicker.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- ewl_filepicker.h 17 Nov 2007 00:01:55 -0000 1.13 +++ ewl_filepicker.h 9 Dec 2007 04:33:39 -0000 1.14 @@ -5,6 +5,7 @@ #include "ewl_box.h" #include "ewl_view.h" #include "ewl_model.h" +#include "ewl_filelist.h" /** * @addtogroup Ewl_Filepicker Ewl_Filepicker: Allows selecting files from a list @@ -77,8 +78,8 @@ const char *ewl_filepicker_directory_get(Ewl_Filepicker *fp); void ewl_filepicker_filter_set(Ewl_Filepicker *fp, - const char *filter); -const char *ewl_filepicker_filter_get(Ewl_Filepicker *fp); + Ewl_Filelist_Filter *filter); +Ewl_Filelist_Filter *ewl_filepicker_filter_get(Ewl_Filepicker *fp); void ewl_filepicker_multiselect_set(Ewl_Filepicker *fp, unsigned int ms); @@ -106,7 +107,8 @@ void ewl_filepicker_filter_add(Ewl_Filepicker *fp, const char *name, - const char *filter); + const char *extension, + Ecore_List *mime_types); /** * @} */ ------------------------------------------------------------------------- SF.Net email is sponsored by: Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://sourceforge.net/services/buy/index.php _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs