viking

webkit based web browser for Enlightenment
Log | Files | Refs | LICENSE

commit 80ff66050884b6d75d436330efac1918f2c21f93
parent 08b6674c8d8563f84ce7088737e8aac83933a750
Author: Kyle Milz <kmilz@ucalgary.ca>
Date:   Mon,  5 Nov 2012 13:09:58 -0700

buffer: add file selection dialog compliments of MiniBrowser

Diffstat:
Msrc/buffer.c | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 77 insertions(+), 0 deletions(-)

diff --git a/src/buffer.c b/src/buffer.c @@ -196,6 +196,82 @@ on_tooltip_text_unset(void *user_data, Evas_Object *obj, void *event_info) elm_object_tooltip_unset(wd->cur_buf->view); } +typedef struct { + Evas_Object *parent; + Evas_Object *window; + Ewk_File_Chooser_Request *request; +} FileSelectorData; + +static void on_filepicker_parent_deletion(void *user_data, Evas *evas, Evas_Object *window, void *event); + +static void close_file_picker(FileSelectorData* fs_data) +{ + evas_object_event_callback_del(fs_data->parent, EVAS_CALLBACK_DEL, on_filepicker_parent_deletion); + evas_object_del(fs_data->window); + ewk_file_chooser_request_unref(fs_data->request); + free(fs_data); +} + + static void +on_filepicker_parent_deletion(void *user_data, Evas *evas, Evas_Object *window, void *event) +{ + close_file_picker((FileSelectorData *)user_data); +} + + static void +on_filepicker_deletion(void *user_data, Evas_Object *window, void *event_info) +{ + close_file_picker((FileSelectorData *)user_data); +} + + static void +on_fileselector_done(void *user_data, Evas_Object *file_selector, void *event_info) +{ + FileSelectorData *fs_data = (FileSelectorData *)user_data; + + const char *selected = (const char *)event_info; + if (selected && *selected) + ewk_file_chooser_request_file_choose(fs_data->request, selected); + + close_file_picker(fs_data); +} + + static void +on_file_chooser_request(void *user_data, Evas_Object *webview, void *event_info) +{ + // Browser_Window *app_data = (Browser_Window *)user_data; + Window_Data *wd = user_data; + Ewk_File_Chooser_Request *request = (Ewk_File_Chooser_Request *)event_info; + + // Show basic file picker which does not currently support multiple files + // or MIME type filtering. + Evas_Object *window = elm_win_add(wd->win, "file-picker-window", ELM_WIN_DIALOG_BASIC); + elm_win_title_set(window, "File picker"); + elm_win_modal_set(window, EINA_TRUE); + + FileSelectorData* fs_data = (FileSelectorData*)malloc(sizeof(FileSelectorData)); + fs_data->parent = wd->win; + fs_data->window = window; + fs_data->request = ewk_file_chooser_request_ref(request); + evas_object_smart_callback_add(window, "delete,request", on_filepicker_deletion, fs_data); + evas_object_event_callback_add(wd->win, EVAS_CALLBACK_DEL, on_filepicker_parent_deletion, fs_data); + + Evas_Object *file_selector = elm_fileselector_add(window); + const char *home_path = getenv("HOME"); + elm_fileselector_path_set(file_selector, home_path ? home_path : "/home"); + evas_object_size_hint_weight_set(file_selector, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(window, file_selector); + evas_object_show(file_selector); + + evas_object_smart_callback_add(file_selector, "done", on_fileselector_done, fs_data); + + evas_object_resize(window, 400, 400); + elm_win_center(window, EINA_TRUE, EINA_TRUE); + evas_object_show(window); +} + + + /* static void webview_create_window_cb(void *data, Evas_Object *obj, Eina_Bool js, const Elm_Web_Window_Features *wf) @@ -859,6 +935,7 @@ buffer_add(const unsigned char flags, Window_Data *wd, const char *url, Session_ evas_object_smart_callback_add(v, "authentication,request", on_authentication_request, wd); evas_object_smart_callback_add(v, "tooltip,text,set", on_tooltip_text_set, wd); evas_object_smart_callback_add(v, "tooltip,text,unset", on_tooltip_text_unset, wd); + evas_object_smart_callback_add(v, "file,chooser,request", on_file_chooser_request, wd); /* downloads */ evas_object_smart_callback_add(v, "download,request", download_request_cb, wd);