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:
M | src/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);