From 5f1d624c5cf8b44133a7f7ce9cfe2bc24bed3b4d Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Sun, 4 May 2014 04:03:42 +1000 Subject: Add a file selector. --- src/extantz/build.lua | 4 +- src/extantz/extantz.c | 10 ++ src/extantz/extantz.h | 1 + src/extantz/files.c | 274 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 287 insertions(+), 2 deletions(-) create mode 100644 src/extantz/files.c (limited to 'src/extantz') diff --git a/src/extantz/build.lua b/src/extantz/build.lua index 75b210f..8a02b55 100755 --- a/src/extantz/build.lua +++ b/src/extantz/build.lua @@ -17,10 +17,10 @@ CFLAGS = CFLAGS .. ' -I../../libraries/irrlicht-1.8.1/include -I/usr/X11R6/inc LDFLAGS = LDFLAGS .. ' -L../../libraries/irrlicht-1.8.1/lib/Linux' libs = libs .. ' -lIrrlicht -lGL -lbz2' -removeFiles(dir, {'../../extantz', 'crappisspuke.o', 'CDemo.o', 'extantzCamera.o', 'gears.o', 'ephysics_demo.o', 'camera.o', 'Evas_3D_demo.o', 'fangWin.o', 'chat.o', 'woMan.o', '../../media/extantz.edj'}) +removeFiles(dir, {'../../extantz', 'crappisspuke.o', 'CDemo.o', 'extantzCamera.o', 'gears.o', 'ephysics_demo.o', 'camera.o', 'Evas_3D_demo.o', 'fangWin.o', 'chat.o', 'files.o', 'woMan.o', '../../media/extantz.edj'}) runCommand('edje_cc', dir, 'edje_cc ' .. EDJE_FLAGS .. ' extantz.edc ../../media/extantz.edj') runCommand('Irrlicht files', dir, 'g++ ' .. CFLAGS .. ' -ffast-math -c crappisspuke.cpp -o crappisspuke.o ' .. LDFLAGS) runCommand(nil, dir, 'g++ ' .. CFLAGS .. ' -ffast-math -c CDemo.cpp -o CDemo.o ' .. LDFLAGS) runCommand(nil, dir, 'g++ ' .. CFLAGS .. ' -ffast-math -c extantzCamera.cpp -o extantzCamera.o ' .. LDFLAGS) -compileFiles('../../extantz', dir, {'gears', 'ephysics_demo', 'camera', 'Evas_3D_demo', 'fangWin', 'chat', 'woMan', 'extantz'}, 'crappisspuke.o CDemo.o extantzCamera.o') +compileFiles('../../extantz', dir, {'gears', 'ephysics_demo', 'camera', 'Evas_3D_demo', 'fangWin', 'chat', 'files', 'woMan', 'extantz'}, 'crappisspuke.o CDemo.o extantzCamera.o') diff --git a/src/extantz/extantz.c b/src/extantz/extantz.c index 4ad752e..1d37ade 100644 --- a/src/extantz/extantz.c +++ b/src/extantz/extantz.c @@ -330,6 +330,15 @@ EAPI_MAIN int elm_main(int argc, char **argv) char buf[PATH_MAX]; // Eina_Bool gotWebKit = elm_need_web(); // Initialise ewebkit if it exists, or return EINA_FALSE if it don't. + /* Set the locale according to the system pref. + * If you don't do so the file selector will order the files list in + * a case sensitive manner + */ + setlocale(LC_ALL, ""); + + elm_need_ethumb(); + elm_need_efreet(); + HamrTime(elm_main, "extantz"); fprintf(stdout, "prefix was set to: %s\n", elm_app_prefix_dir_get()); fprintf(stdout, "data directory is: %s\n", elm_app_data_dir_get()); @@ -403,6 +412,7 @@ EAPI_MAIN int elm_main(int argc, char **argv) // overlay_add(&ourGlobals); woMan_add(&ourGlobals); chat_add(&ourGlobals); + files_add(&ourGlobals); // Gotta do this after adding the windows, otherwise the menu renders under the window. // This sucks, gotta redefine this menu each time we create a new window? diff --git a/src/extantz/extantz.h b/src/extantz/extantz.h index 3c671bb..1cc76cd 100644 --- a/src/extantz/extantz.h +++ b/src/extantz/extantz.h @@ -251,6 +251,7 @@ void fang_win_complete(globals *ourGlobals, Evas_Object *win, int x, int y, int void overlay_add(globals *ourGlobals); void chat_add(globals *ourGlobals); +void files_add(globals *ourGlobals); void woMan_add(globals *ourGlobals); diff --git a/src/extantz/files.c b/src/extantz/files.c new file mode 100644 index 0000000..7cfc5c0 --- /dev/null +++ b/src/extantz/files.c @@ -0,0 +1,274 @@ +#include "extantz.h" + + +static void my_fileselector_done(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + /* event_info conatin the full path of the selected file + * or NULL if none is selected or cancel is pressed */ + const char *selected = event_info; + + if (selected) + printf("Selected file: %s\n", selected); + else + evas_object_del(data); /* delete the test window */ +} + +static void my_fileselector_selected(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + /* event_info conatin the full path of the selected file */ + const char *selected = event_info; + printf("Selected file: %s\n", selected); + + /* or you can query the selection */ + if (elm_fileselector_multi_select_get(obj)) + { + const Eina_List *li; + const Eina_List *paths = elm_fileselector_selected_paths_get(obj); + char *path; + printf("All selected files are:\n"); + EINA_LIST_FOREACH(paths, li, path) + printf(" %s\n", path); + } + else + printf("or: %s\n", elm_fileselector_selected_get(obj)); +} + +static void _popup_close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +static void my_fileselector_invalid(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Object *popup; + Evas_Object *btn; + char error_msg[256]; + + snprintf(error_msg, 256, "No such file or directory: %s", (char *)event_info); + + popup = elm_popup_add(data); + elm_popup_content_text_wrap_type_set(popup, ELM_WRAP_CHAR); + elm_object_part_text_set(popup, "title,text", "Error"); + elm_object_text_set(popup, error_msg); + + btn = elm_button_add(popup); + elm_object_text_set(btn, "OK"); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup); + + evas_object_show(popup); +} + +static void my_fileselector_activated(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("Activated file: %s\n", (char *)event_info); +} + +static void _expandable_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + + if (elm_fileselector_expandable_get(fs)) + elm_fileselector_expandable_set(fs, EINA_FALSE); + else + elm_fileselector_expandable_set(fs, EINA_TRUE); +} + +static void _hidden_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + if (elm_fileselector_hidden_visible_get(fs)) + elm_fileselector_hidden_visible_set(fs, EINA_FALSE); + else + elm_fileselector_hidden_visible_set(fs, EINA_TRUE); +} + +static void _mode_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + Elm_Fileselector_Mode mode; + + mode = (elm_fileselector_mode_get(fs) + 1) % ELM_FILESELECTOR_LAST; + elm_radio_value_set(obj, mode); + elm_fileselector_mode_set(data, mode); +} + +static void _sort_selected_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *fs = evas_object_data_get(obj, "fileselector"); + const char *selected = elm_object_item_text_get(event_info); + + elm_object_text_set(obj, selected); + elm_fileselector_sort_method_set(fs, (Elm_Fileselector_Sort)data); +} + +static void _tiny_icon_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + Evas_Coord w, h; + + elm_fileselector_thumbnail_size_get(fs, &w, &h); + elm_fileselector_thumbnail_size_set(fs, 16, 16); +} + +static void _small_icon_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + Evas_Coord w, h; + + elm_fileselector_thumbnail_size_get(fs, &w, &h); + elm_fileselector_thumbnail_size_set(fs, 32, 32); +} + +static void _middle_icon_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + Evas_Coord w, h; + + elm_fileselector_thumbnail_size_get(fs, &w, &h); + elm_fileselector_thumbnail_size_set(fs, 64, 64); +} + +static void _big_icon_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + Evas_Coord w, h; + + elm_fileselector_thumbnail_size_get(fs, &w, &h); + elm_fileselector_thumbnail_size_set(fs, 128, 128); +} + +static Eina_Bool _all_filter(const char *path EINA_UNUSED, Eina_Bool dir EINA_UNUSED, void *data EINA_UNUSED) +{ + return EINA_TRUE; +} + +static Eina_Bool _edje_filter(const char *path, Eina_Bool dir, void *data EINA_UNUSED) +{ + if (dir) return EINA_TRUE; + + if (eina_str_has_extension(path, ".edc") || + eina_str_has_extension(path, ".edj")) + return EINA_TRUE; + return EINA_FALSE; +} + +void files_add(globals *ourGlobals) +{ + Evas_Object *win, *bx, *vbox, *fs, *bt, *rd = NULL, *rdg = NULL, *hoversel; + + win = fang_win_add(ourGlobals); + + bx = eo_add(ELM_OBJ_BOX_CLASS, win); + eo_do(bx, + elm_obj_box_homogeneous_set(EINA_FALSE), + evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND), + evas_obj_size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL) + ); + elm_win_resize_object_add(win, bx); + + fs = eo_add(ELM_OBJ_FILESELECTOR_CLASS, bx); + eo_do(fs, + evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND), + evas_obj_size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL), + evas_obj_visibility_set(EINA_TRUE) + ); + elm_box_pack_end(bx, fs); + + /* disnable the fs file name entry */ + elm_fileselector_is_save_set(fs, EINA_FALSE); + /* make the file list a tree with dir expandable in place */ + elm_fileselector_expandable_set(fs, EINA_FALSE); + /* start the fileselector in the home dir */ + elm_fileselector_path_set(fs, getenv("HOME")); + elm_fileselector_folder_only_set(fs, EINA_FALSE); + elm_fileselector_buttons_ok_cancel_set(fs, EINA_TRUE); + elm_fileselector_multi_select_set(fs, EINA_TRUE); + + /* add filesters */ + elm_fileselector_custom_filter_append(fs, _all_filter, NULL, "all files"); + elm_fileselector_custom_filter_append(fs, _edje_filter, NULL, "edje files"); + elm_fileselector_mime_types_filter_append(fs, "image/*", "image files"); + elm_fileselector_mime_types_filter_append(fs, "text/*", "text files"); + + evas_object_smart_callback_add(fs, "done", my_fileselector_done, win); + evas_object_smart_callback_add(fs, "selected", my_fileselector_selected, win); + evas_object_smart_callback_add(fs, "selected,invalid", my_fileselector_invalid, win); + evas_object_smart_callback_add(fs, "activated", my_fileselector_activated, win); + + eo_unref(fs); + + vbox = eo_add(ELM_OBJ_BOX_CLASS, win); + eo_do(vbox, + elm_obj_box_homogeneous_set(EINA_FALSE), + elm_obj_box_horizontal_set(EINA_TRUE), + evas_obj_size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL) + ); + + bt = elm_check_add(vbox); + elm_object_text_set(bt, "tree"); + elm_check_state_set(bt, elm_fileselector_expandable_get(fs)); + evas_object_smart_callback_add(bt, "changed", _expandable_clicked, fs); + elm_box_pack_end(vbox, bt); + evas_object_show(bt); + + bt = elm_check_add(vbox); + elm_object_text_set(bt, "hidden"); + elm_check_state_set(bt, elm_fileselector_hidden_visible_get(fs)); + evas_object_smart_callback_add(bt, "changed", _hidden_clicked, fs); + elm_box_pack_end(vbox, bt); + evas_object_show(bt); + + rdg = rd = elm_radio_add(vbox); + elm_radio_state_value_set(rd, ELM_FILESELECTOR_LIST); + elm_object_text_set(rd, "list"); + elm_box_pack_end(vbox, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _mode_changed_cb, fs); + + rd = elm_radio_add(vbox); + elm_radio_group_add(rd, rdg); + elm_radio_state_value_set(rd, ELM_FILESELECTOR_GRID); + elm_object_text_set(rd, "grid"); + elm_box_pack_end(vbox, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _mode_changed_cb, fs); + + + hoversel = elm_hoversel_add(vbox); + elm_hoversel_hover_parent_set(hoversel, win); + evas_object_data_set(hoversel, "fileselector", fs); + elm_object_text_set(hoversel, "sorting"); + + elm_hoversel_item_add(hoversel, "name(asc)", NULL, ELM_ICON_NONE, _sort_selected_cb, (const void *) ELM_FILESELECTOR_SORT_BY_FILENAME_ASC); + elm_hoversel_item_add(hoversel, "name(desc)", NULL, ELM_ICON_NONE, _sort_selected_cb, (const void *) ELM_FILESELECTOR_SORT_BY_FILENAME_DESC); + elm_hoversel_item_add(hoversel, "type(asc)", NULL, ELM_ICON_NONE, _sort_selected_cb, (const void *) ELM_FILESELECTOR_SORT_BY_TYPE_ASC); + elm_hoversel_item_add(hoversel, "type(desc)", NULL, ELM_ICON_NONE, _sort_selected_cb, (const void *) ELM_FILESELECTOR_SORT_BY_TYPE_DESC); + elm_hoversel_item_add(hoversel, "size(asc)", NULL, ELM_ICON_NONE, _sort_selected_cb, (const void *) ELM_FILESELECTOR_SORT_BY_SIZE_ASC); + elm_hoversel_item_add(hoversel, "size(desc)", NULL, ELM_ICON_NONE, _sort_selected_cb, (const void *) ELM_FILESELECTOR_SORT_BY_SIZE_DESC); + elm_hoversel_item_add(hoversel, "time(asc)", NULL, ELM_ICON_NONE, _sort_selected_cb, (const void *) ELM_FILESELECTOR_SORT_BY_MODIFIED_ASC); + elm_hoversel_item_add(hoversel, "time(desc)", NULL, ELM_ICON_NONE, _sort_selected_cb, (const void *) ELM_FILESELECTOR_SORT_BY_MODIFIED_DESC); + + elm_box_pack_end(vbox, hoversel); + evas_object_show(hoversel); + + hoversel = elm_hoversel_add(vbox); + elm_hoversel_hover_parent_set(hoversel, win); + evas_object_data_set(hoversel, "fileselector", fs); + elm_object_text_set(hoversel, "size"); + + elm_hoversel_item_add(hoversel, "tiny", NULL, ELM_ICON_NONE, _tiny_icon_clicked, fs); + elm_hoversel_item_add(hoversel, "small", NULL, ELM_ICON_NONE, _small_icon_clicked, fs); + elm_hoversel_item_add(hoversel, "medium", NULL, ELM_ICON_NONE, _middle_icon_clicked, fs); + elm_hoversel_item_add(hoversel, "big", NULL, ELM_ICON_NONE, _big_icon_clicked, fs); + + elm_box_pack_end(vbox, hoversel); + evas_object_show(hoversel); + + elm_box_pack_end(bx, vbox); + evas_object_show(vbox); + evas_object_show(bx); + eo_unref(bx); + + fang_win_complete(ourGlobals, win, ourGlobals->win_w - 380, ourGlobals->win_w - 530, 350, 500); +} -- cgit v1.1