From 14c920bdc1782662bcfb7e76072aeffcd55dfc25 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sun, 23 Jul 2006 11:22:13 +0000 Subject: [PATCH] 1. add template files for favorites dir for file selector 2. lots of code on efm tomake it work well for file selection 3. a file selector widget with all the bits and pieces 4. first move - make wallpaper bg import tool use the new file selector - it's a start. 5. pants on! SVN revision: 24139 --- data/other/Makefile.am | 1 + data/other/efm_favorites.tar.gz | Bin 0 -> 459 bytes src/bin/e_includes.h | 1 + src/bin/e_int_config_background_import.c | 64 ++--- src/bin/e_main.c | 11 + src/bin/e_test.c | 15 +- src/bin/e_widget_framelist.c | 278 ++++----------------- src/bin/e_widget_framelist.h | 8 +- src/bin/e_widget_fsel.c | 293 +++++++++++++++++++---- src/bin/e_widget_fsel.h | 13 +- 10 files changed, 360 insertions(+), 324 deletions(-) create mode 100644 data/other/efm_favorites.tar.gz diff --git a/data/other/Makefile.am b/data/other/Makefile.am index 95e8cfa4b..8801d1780 100644 --- a/data/other/Makefile.am +++ b/data/other/Makefile.am @@ -2,6 +2,7 @@ MAINTAINERCLEANFILES = Makefile.in filesdir = $(datadir)/enlightenment/data/other files_DATA = \ applications.tar.gz \ +efm_favorites.tar.gz \ icon_example.tar.gz EXTRA_DIST = $(files_DATA) diff --git a/data/other/efm_favorites.tar.gz b/data/other/efm_favorites.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f5188c143894ac4f4dc2dfea97a3abf5a42f3126 GIT binary patch literal 459 zcmV;+0W|&}iwFR32*X4G1MQa2Yr-%TfIauG$YIy5Nt?7|(9={L%nd|OV@RfPmbHnb zanS#MiB_km=%MI_@4JNN2Pt{)%gZFqM9!r@;onN9MihRdcCaO8%(WzDc(Yy6Aecrt z!W1*oz+}-NR{yW;GA|6*2sJb>jL?VY9UK3rOm^ar$#AN2aW@vlmr=7C_HY4?C_Nbe zAgtma264b58~-S_DS>bedmrV>k|Q-vC$^tc`l?$`qPbGG*Z&=RNAG8XBjHhT%(!Lg_1l&F3Sq9U(Q6*RdZ>)LGL+n zoewvi*KW&uva6F-D!T0RE`2W7!XE#FVWoauSHMyKF{%6ygNOyz|CkaA{-1+W{I900 z#cw;Ck&;WvSEC2*_E$5uEU$74M87P1{11m(DRaj9Pa?YXpAtrCxTybO4E~>kQ~dAQ zbl9r;t^+M@fzlpIjy`xH_WJK{J3mp`SZGlG53$F8Iy8B0wcl~nfBWWN`@ekuvnT-n z&%r7F_eK6&{N0Dr+`jk^Kk9v(Kwv%q00000000000000000017j2{-#XafK!001pP B;^Y7T literal 0 HcmV?d00001 diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h index d34b30d46..75db4e093 100644 --- a/src/bin/e_includes.h +++ b/src/bin/e_includes.h @@ -142,3 +142,4 @@ #include "e_widget_scrollframe.h" #include "e_sha1.h" #include "e_widget_framelist.h" +#include "e_widget_fsel.h" diff --git a/src/bin/e_int_config_background_import.c b/src/bin/e_int_config_background_import.c index 64b35011e..8242c8076 100644 --- a/src/bin/e_int_config_background_import.c +++ b/src/bin/e_int_config_background_import.c @@ -79,7 +79,7 @@ static Ecore_Event_Handler *_edj_exe_exit_handler = NULL; -static void _efm_hilite_cb (Evas_Object *obj, char *file, void *data); +static void _efm_cb_selchange(void *data, Evas_Object *obj); static void _bg_edj_gen (Evas *evas, char *filename, int method); static int _edj_exe_exit_cb (void *data, int type, void *event); @@ -100,6 +100,7 @@ struct _Bg_Import_Window Evas_Object *box_obj; Evas_Object *event_obj; Evas_Object *content_obj; + Evas_Object *fsel_obj; Evas_Object *ok_obj; Evas_Object *close_obj; @@ -160,7 +161,7 @@ e_int_config_background_import(E_Config_Dialog *parent) e_widget_on_focus_hook_set(o, _import_cb_wid_on_focus, import); import->box_obj = o; edje_object_part_swallow(import->bg_obj, "buttons_swallow", o); - + o = evas_object_rectangle_add(evas); import->event_obj = o; mask = 0; @@ -179,8 +180,11 @@ e_int_config_background_import(E_Config_Dialog *parent) o = e_widget_list_add(evas, 0, 0); import->content_obj = o; - ofm = e_widget_fileman_add(evas, (&(cfdata->file))); - e_widget_fileman_hilite_callback_add(ofm, _efm_hilite_cb, import); + ofm = e_widget_fsel_add(evas, "~/", "/", NULL, NULL, + _efm_cb_selchange, import, + _efm_cb_selchange, import + ); + import->fsel_obj = ofm; e_widget_list_object_append(o, ofm, 1, 1, 0.5); of = e_widget_frametable_add(evas, _("Options"), 0); @@ -192,7 +196,7 @@ e_int_config_background_import(E_Config_Dialog *parent) ord = e_widget_radio_add(evas, _("Tile Image"), E_BG_TILE, rg); e_widget_frametable_object_append(of, ord, 0, 2, 1, 1, 1, 0, 1, 0); - e_widget_list_object_append(o, of, 1, 1, 0.5); + e_widget_list_object_append(o, of, 0, 0, 0.5); e_widget_min_size_get(o, &w, &h); edje_extern_object_min_size_set(o, w, h); @@ -200,7 +204,6 @@ e_int_config_background_import(E_Config_Dialog *parent) evas_object_show(o); import->ok_obj = e_widget_button_add(evas, _("OK"), NULL, _import_cb_ok, win, cfdata); - e_widget_disabled_set(import->ok_obj, 1); e_widget_list_object_append(import->box_obj, import->ok_obj, 1, 0, 0.5); import->close_obj = e_widget_button_add(evas, _("Cancel"), NULL, _import_cb_close, win, NULL); @@ -214,8 +217,8 @@ e_int_config_background_import(E_Config_Dialog *parent) edje_object_part_swallow(import->bg_obj, "buttons_swallow", o); edje_object_size_min_calc(import->bg_obj, &w, &h); - evas_object_resize(import->bg_obj, w, h); - e_win_resize(win, w, h); + evas_object_resize(import->bg_obj, w + 64, h + 128); + e_win_resize(win, w + 64, h + 128); e_win_size_min_set(win, w, h); e_win_size_max_set(win, 99999, 99999); e_win_show(win); @@ -228,23 +231,15 @@ e_int_config_background_import(E_Config_Dialog *parent) } static void -_efm_hilite_cb(Evas_Object *obj, char *file, void *data) +_efm_cb_selchange(void *data, Evas_Object *obj) { - E_Fm_File *f; Bg_Import_Window *import; - - f = e_fm_file_new(file); - if (!f) return; + const char *path; import = data; - if (!import) return; - - if (e_fm_file_is_image(f)) - e_widget_disabled_set(import->ok_obj, 0); - else - e_widget_disabled_set(import->ok_obj, 1); - - free(f); + path = e_widget_fsel_selection_path_get(import->fsel_obj); + E_FREE(import->cfdata->file); + if (path) import->cfdata->file = strdup(path); } static void @@ -378,33 +373,20 @@ _import_cb_ok(void *data, void *data2) E_Fm_File *f; Evas *evas; E_Win *win; - E_Config_Dialog_Data *cfdata; Bg_Import_Window *import; + const char *path; win = data; import = win->data; - cfdata = data2; - if (!cfdata->file[0]) + path = e_widget_fsel_selection_path_get(import->fsel_obj); + E_FREE(import->cfdata->file); + if (path) import->cfdata->file = strdup(path); + if (import->cfdata->file) { - if (import) e_widget_disabled_set(import->ok_obj, 1); - return; + evas = e_win_evas_get(win); + _bg_edj_gen(evas, import->cfdata->file, import->cfdata->method); } - - - f = e_fm_file_new(cfdata->file); - if (!f) return; - if (!e_fm_file_is_image(f)) - { - if (import) e_widget_disabled_set(import->ok_obj, 1); - return; - } - - free(f); - - evas = e_win_evas_get(win); - _bg_edj_gen(evas, cfdata->file, cfdata->method); - if (import) e_widget_disabled_set(import->ok_obj, 1); } static void diff --git a/src/bin/e_main.c b/src/bin/e_main.c index 946be4de6..a66a117ed 100644 --- a/src/bin/e_main.c +++ b/src/bin/e_main.c @@ -830,6 +830,17 @@ _e_main_dirs_init(void) homedir); system(buf); } + /* FIXME: THIS is to get people started - shoudl be in a wizard */ + snprintf(buf, sizeof(buf), "%s/.e/e/fileman/favorites", homedir); + if (!ecore_file_exists(buf)) + { + snprintf(buf, sizeof(buf), + "gzip -d -c < %s/data/other/efm_favorites.tar.gz | " + "(cd %s/.e/e/ ; tar -xf -)", + e_prefix_data_get(), + homedir); + system(buf); + } free(homedir); return 1; diff --git a/src/bin/e_test.c b/src/bin/e_test.c index 25ad91061..e4e1c9386 100644 --- a/src/bin/e_test.c +++ b/src/bin/e_test.c @@ -756,9 +756,16 @@ _e_test_internal(E_Container *con) } #elif 0 static void -_e_test_cb_selected(void *data, Evas_Object *obj, void *event_info) +_e_test_cb_changed(void *data, Evas_Object *obj) { - printf("SELECTED!\n"); + printf("CHANGED \"%s\"\n", e_widget_fsel_selection_path_get(obj)); +} + +static void +_e_test_cb_selected(void *data, Evas_Object *obj) +{ + printf("SELECTED \"%s\"\n", e_widget_fsel_selection_path_get(obj)); + e_object_del(E_OBJECT(data)); } static void @@ -771,7 +778,9 @@ _e_test_internal(E_Container *con) dia = e_dialog_new(con); e_dialog_title_set(dia, "A Test Dialog"); - o = e_widget_fsel_add(dia->win->evas, "~/", "/", NULL, NULL); + o = e_widget_fsel_add(dia->win->evas, "~/", "/", NULL, NULL, + _e_test_cb_selected, dia, + _e_test_cb_changed, dia); evas_object_show(o); e_widget_min_size_get(o, &mw, &mh); e_dialog_content_set(dia, o, mw, mh); diff --git a/src/bin/e_widget_framelist.c b/src/bin/e_widget_framelist.c index 0231bfe78..2c25ef9e4 100644 --- a/src/bin/e_widget_framelist.c +++ b/src/bin/e_widget_framelist.c @@ -6,265 +6,91 @@ typedef struct _E_Widget_Data E_Widget_Data; struct _E_Widget_Data { - Evas_Object *o_table; - Evas_Object *o_table2; - Evas_Object *o_up_button; - Evas_Object *o_favorites_frame; - Evas_Object *o_favorites_fm; - Evas_Object *o_files_frame; - Evas_Object *o_files_fm; - Evas_Object *o_entry; - char *entry_text; + Evas_Object *o_frame, *o_box; }; static void _e_wid_del_hook(Evas_Object *obj); /* local subsystem functions */ -static void -_e_wid_fsel_button_up(void *data1, void *data2) -{ - E_Widget_Data *wd; - - wd = data1; - e_fm2_parent_go(wd->o_files_fm); - e_widget_scrollframe_child_pos_set(wd->o_files_frame, 0, 0); -} - -static void -_e_wid_fsel_favorites_files_changed(void *data, Evas_Object *obj, void *event_info) -{ - E_Widget_Data *wd; - Evas_List *icons, *l; - E_Fm2_Icon_Info *ici; - const char *realpath; - char *p1, *p2; - - wd = data; - icons = e_fm2_all_list_get(wd->o_favorites_fm); - if (!icons) return; - realpath = e_fm2_real_path_get(wd->o_files_fm); - p1 = ecore_file_realpath(realpath); - if (!p1) goto done; - for (l = icons; l; l = l->next) - { - ici = l->data; - if (ici->link) - { - p2 = ecore_file_realpath(ici->link); - if (p2) - { - if (!strcmp(p1, p2)) - { - e_fm2_select_set(wd->o_favorites_fm, ici->file, 1); - E_FREE(p2); - goto done; - } - E_FREE(p2); - } - } - } - done: - E_FREE(p1); - evas_list_free(icons); -} - -static void -_e_wid_fsel_favorites_selected(void *data, Evas_Object *obj, void *event_info) -{ - E_Widget_Data *wd; - Evas_List *selected; - E_Fm2_Icon_Info *ici; - - wd = data; - selected = e_fm2_selected_list_get(wd->o_favorites_fm); - if (!selected) return; - ici = selected->data; - if ((ici->link) && (ici->mount)) - e_fm2_path_set(wd->o_files_fm, (char *)ici->link, "/"); - else if (ici->link) - e_fm2_path_set(wd->o_files_fm, NULL, (char *)ici->link); - evas_list_free(selected); - e_widget_scrollframe_child_pos_set(wd->o_files_frame, 0, 0); -} - -static void -_e_wid_fsel_files_changed(void *data, Evas_Object *obj, void *event_info) -{ - E_Widget_Data *wd; - - wd = data; - if (!e_fm2_has_parent_get(wd->o_files_fm)) - e_widget_disabled_set(wd->o_up_button, 1); - else - e_widget_disabled_set(wd->o_up_button, 0); -} - -static void -_e_wid_fsel_files_selection_change(void *data, Evas_Object *obj, void *event_info) -{ - E_Widget_Data *wd; - Evas_List *selected; - E_Fm2_Icon_Info *ici; - - wd = data; - selected = e_fm2_selected_list_get(wd->o_files_fm); - if (!selected) return; - ici = selected->data; - e_widget_entry_text_set(wd->o_entry, ici->file); - evas_list_free(selected); -} - -static void -_e_wid_fsel_files_selected(void *data, Evas_Object *obj, void *event_info) -{ - E_Widget_Data *wd; - Evas_List *selected; - E_Fm2_Icon_Info *ici; - char buf[4096]; - - wd = data; - selected = e_fm2_selected_list_get(wd->o_files_fm); - if (!selected) return; - ici = selected->data; - snprintf(buf, sizeof(buf), "%s/%s", - e_fm2_real_path_get(wd->o_files_fm), ici->file); - printf("SELECTED!!!! %s\n", buf); - evas_list_free(selected); -} /* externally accessible functions */ EAPI Evas_Object * -e_widget_fsel_add(Evas *evas, char *dev, char *path, char *selected, char *filter) +e_widget_framelist_add(Evas *evas, char *label, int horiz) { Evas_Object *obj, *o; E_Widget_Data *wd; Evas_Coord mw = 0, mh = 0; - E_Fm2_Config fmc; obj = e_widget_add(evas); e_widget_del_hook_set(obj, _e_wid_del_hook); wd = calloc(1, sizeof(E_Widget_Data)); e_widget_data_set(obj, wd); - - o = e_widget_table_add(evas, 0); - wd->o_table = o; + + o = edje_object_add(evas); + wd->o_frame = o; + e_theme_edje_object_set(o, "base/theme/widgets", + "widgets/frame"); + edje_object_part_text_set(o, "label", label); + evas_object_show(o); e_widget_sub_object_add(obj, o); e_widget_resize_object_set(obj, o); - o = e_widget_table_add(evas, 0); - wd->o_table2 = o; + o = e_box_add(evas); + wd->o_box = o; + e_box_orientation_set(o, horiz); + e_box_homogenous_set(o, 0); + edje_object_part_swallow(wd->o_frame, "items", o); e_widget_sub_object_add(obj, o); + evas_object_show(o); - o = e_widget_button_add(evas, _("Go up a Directory"), NULL, - _e_wid_fsel_button_up, wd, NULL); - wd->o_up_button = o; - e_widget_sub_object_add(obj, o); - e_widget_table_object_append(wd->o_table2, o, 1, 0, 1, 1, 0, 0, 1, 0); - - o = e_fm2_add(evas); - wd->o_favorites_fm = o; - e_widget_sub_object_add(obj, o); - memset(&fmc, 0, sizeof(E_Fm2_Config)); - fmc.view.mode = E_FM2_VIEW_MODE_LIST; - fmc.view.open_dirs_in_place = 1; - fmc.view.selector = 1; - fmc.view.single_click = 1; - fmc.view.no_subdir_jump = 1; - fmc.icon.list.w = 24; - fmc.icon.list.h = 24; - fmc.icon.fixed.w = 1; - fmc.icon.fixed.h = 1; - fmc.icon.extension.show = 0; - fmc.list.sort.no_case = 1; - fmc.list.sort.dirs.first = 0; - fmc.list.sort.dirs.last = 0; - fmc.selection.single = 1; - fmc.selection.windows_modifiers = 0; - e_fm2_config_set(o, &fmc); - e_fm2_path_set(o, "favorites", "/"); - evas_object_smart_callback_add(o, "files_changed", - _e_wid_fsel_favorites_files_changed, wd); - evas_object_smart_callback_add(o, "selected", - _e_wid_fsel_favorites_selected, wd); - - o = e_widget_scrollframe_pan_add(evas, wd->o_favorites_fm, - e_fm2_pan_set, - e_fm2_pan_get, - e_fm2_pan_max_get, - e_fm2_pan_child_size_get); - wd->o_favorites_frame = o; - e_widget_sub_object_add(obj, o); - e_widget_min_size_set(o, 128, 128); - e_widget_table_object_append(wd->o_table2, o, 0, 1, 1, 1, 0, 1, 0, 1); - - o = e_fm2_add(evas); - wd->o_files_fm = o; - e_widget_sub_object_add(obj, o); - memset(&fmc, 0, sizeof(E_Fm2_Config)); - fmc.view.mode = E_FM2_VIEW_MODE_LIST; - fmc.view.open_dirs_in_place = 1; - fmc.view.selector = 1; - fmc.view.single_click = 0; - fmc.view.no_subdir_jump = 0; - fmc.icon.list.w = 24; - fmc.icon.list.h = 24; - fmc.icon.fixed.w = 1; - fmc.icon.fixed.h = 1; - fmc.icon.extension.show = 0; - fmc.list.sort.no_case = 1; - fmc.list.sort.dirs.first = 1; - fmc.list.sort.dirs.last = 0; - fmc.selection.single = 1; - fmc.selection.windows_modifiers = 0; - e_fm2_config_set(o, &fmc); - e_fm2_path_set(o, dev, path); - evas_object_smart_callback_add(o, "changed", - _e_wid_fsel_files_changed, wd); - evas_object_smart_callback_add(o, "selection_change", - _e_wid_fsel_files_selection_change, wd); - evas_object_smart_callback_add(o, "selected", - _e_wid_fsel_files_selected, wd); - - o = e_widget_scrollframe_pan_add(evas, wd->o_files_fm, - e_fm2_pan_set, - e_fm2_pan_get, - e_fm2_pan_max_get, - e_fm2_pan_child_size_get); - wd->o_files_frame = o; - e_widget_sub_object_add(obj, o); - e_widget_min_size_set(o, 128, 128); - e_widget_table_object_append(wd->o_table2, o, 1, 1, 1, 1, 1, 1, 1, 1); - - o = e_widget_entry_add(evas, &(wd->entry_text)); - wd->o_entry = o; - e_widget_sub_object_add(obj, o); - - e_widget_table_object_append(wd->o_table, wd->o_table2, - 0, 0, 1, 1, 1, 1, 1, 1); - e_widget_table_object_append(wd->o_table, wd->o_entry, - 0, 1, 1, 1, 1, 0, 1, 0); - - e_widget_min_size_get(wd->o_table, &mw, &mh); + edje_object_size_min_calc(wd->o_frame, &mw, &mh); e_widget_min_size_set(obj, mw, mh); - evas_object_show(wd->o_up_button); - evas_object_show(wd->o_favorites_frame); - evas_object_show(wd->o_favorites_fm); - evas_object_show(wd->o_files_frame); - evas_object_show(wd->o_files_fm); - evas_object_show(wd->o_entry); - evas_object_show(wd->o_table2); - evas_object_show(wd->o_table); return obj; } +EAPI void +e_widget_framelist_object_append(Evas_Object *obj, Evas_Object *sobj) +{ + E_Widget_Data *wd; + Evas_Coord mw = 0, mh = 0; + + wd = e_widget_data_get(obj); + + e_box_pack_end(wd->o_box, sobj); + e_widget_min_size_get(sobj, &mw, &mh); + e_box_pack_options_set(sobj, + 1, 1, /* fill */ + 1, 0, /* expand */ + 0.5, 0.5, /* align */ + mw, mh, /* min */ + 99999, 99999 /* max */ + ); + e_box_min_size_get(wd->o_box, &mw, &mh); + edje_extern_object_min_size_set(wd->o_box, mw, mh); + edje_object_part_swallow(wd->o_frame, "items", wd->o_box); + edje_object_size_min_calc(wd->o_frame, &mw, &mh); + e_widget_min_size_set(obj, mw, mh); + e_widget_sub_object_add(obj, sobj); + evas_object_show(sobj); +} + +EAPI void +e_widget_framelist_content_align_set(Evas_Object *obj, double halign, double valign) +{ + E_Widget_Data *wd; + + wd = e_widget_data_get(obj); + e_box_align_set(wd->o_box, halign, valign); +} + + static void _e_wid_del_hook(Evas_Object *obj) { E_Widget_Data *wd; wd = e_widget_data_get(obj); - E_FREE(wd->entry_text); free(wd); } diff --git a/src/bin/e_widget_framelist.h b/src/bin/e_widget_framelist.h index 784865d31..cab6b3bb6 100644 --- a/src/bin/e_widget_framelist.h +++ b/src/bin/e_widget_framelist.h @@ -3,10 +3,12 @@ */ #ifdef E_TYPEDEFS #else -#ifndef E_WIDGET_FSEL_H -#define E_WIDGET_FSEL_H +#ifndef E_WIDGET_FRAMELIST_H +#define E_WIDGET_FRAMELIST_H -EAPI Evas_Object *e_widget_fsel_add(Evas *evas, char *dev, char *path, char *selected, char *filter); +EAPI Evas_Object *e_widget_framelist_add(Evas *evas, char *label, int horiz); +EAPI void e_widget_framelist_object_append(Evas_Object *obj, Evas_Object *sobj); +EAPI void e_widget_framelist_content_align_set(Evas_Object *obj, double halign, double valign); #endif #endif diff --git a/src/bin/e_widget_fsel.c b/src/bin/e_widget_fsel.c index 2c25ef9e4..c3a23f48a 100644 --- a/src/bin/e_widget_fsel.c +++ b/src/bin/e_widget_fsel.c @@ -6,91 +6,294 @@ typedef struct _E_Widget_Data E_Widget_Data; struct _E_Widget_Data { - Evas_Object *o_frame, *o_box; + Evas_Object *obj; + Evas_Object *o_table; + Evas_Object *o_table2; + Evas_Object *o_up_button; + Evas_Object *o_favorites_frame; + Evas_Object *o_favorites_fm; + Evas_Object *o_files_frame; + Evas_Object *o_files_fm; + Evas_Object *o_entry; + char *entry_text; + char *path; + void (*sel_func) (void *data, Evas_Object *obj); + void *sel_data; + void (*chg_func) (void *data, Evas_Object *obj); + void *chg_data; }; static void _e_wid_del_hook(Evas_Object *obj); /* local subsystem functions */ +static void +_e_wid_fsel_button_up(void *data1, void *data2) +{ + E_Widget_Data *wd; + + wd = data1; + e_fm2_parent_go(wd->o_files_fm); + e_widget_scrollframe_child_pos_set(wd->o_files_frame, 0, 0); +} + +static void +_e_wid_fsel_favorites_files_changed(void *data, Evas_Object *obj, void *event_info) +{ + E_Widget_Data *wd; + Evas_List *icons, *l; + E_Fm2_Icon_Info *ici; + const char *realpath; + char *p1, *p2; + + wd = data; + icons = e_fm2_all_list_get(wd->o_favorites_fm); + if (!icons) return; + realpath = e_fm2_real_path_get(wd->o_files_fm); + p1 = ecore_file_realpath(realpath); + if (!p1) goto done; + for (l = icons; l; l = l->next) + { + ici = l->data; + if (ici->link) + { + p2 = ecore_file_realpath(ici->link); + if (p2) + { + if (!strcmp(p1, p2)) + { + e_fm2_select_set(wd->o_favorites_fm, (char *)ici->file, 1); + E_FREE(p2); + goto done; + } + E_FREE(p2); + } + } + } + done: + E_FREE(p1); + evas_list_free(icons); +} + +static void +_e_wid_fsel_favorites_selected(void *data, Evas_Object *obj, void *event_info) +{ + E_Widget_Data *wd; + Evas_List *selected; + E_Fm2_Icon_Info *ici; + + wd = data; + selected = e_fm2_selected_list_get(wd->o_favorites_fm); + if (!selected) return; + ici = selected->data; + if ((ici->link) && (ici->mount)) + e_fm2_path_set(wd->o_files_fm, (char *)ici->link, "/"); + else if (ici->link) + e_fm2_path_set(wd->o_files_fm, NULL, (char *)ici->link); + evas_list_free(selected); + e_widget_scrollframe_child_pos_set(wd->o_files_frame, 0, 0); +} + +static void +_e_wid_fsel_files_changed(void *data, Evas_Object *obj, void *event_info) +{ + E_Widget_Data *wd; + + wd = data; + if (!e_fm2_has_parent_get(wd->o_files_fm)) + e_widget_disabled_set(wd->o_up_button, 1); + else + e_widget_disabled_set(wd->o_up_button, 0); + e_widget_scrollframe_child_pos_set(wd->o_files_frame, 0, 0); + E_FREE(wd->path); + if (wd->chg_func) wd->chg_func(wd->chg_data, wd->obj); +} + +static void +_e_wid_fsel_files_selection_change(void *data, Evas_Object *obj, void *event_info) +{ + E_Widget_Data *wd; + Evas_List *selected; + E_Fm2_Icon_Info *ici; + char buf[4096]; + + wd = data; + selected = e_fm2_selected_list_get(wd->o_files_fm); + if (!selected) return; + ici = selected->data; + E_FREE(wd->path); + snprintf(buf, sizeof(buf), "%s/%s", + e_fm2_real_path_get(wd->o_files_fm), ici->file); + wd->path = strdup(buf); + e_widget_entry_text_set(wd->o_entry, ici->file); + evas_list_free(selected); + if (wd->chg_func) wd->chg_func(wd->chg_data, wd->obj); +} + +static void +_e_wid_fsel_files_selected(void *data, Evas_Object *obj, void *event_info) +{ + E_Widget_Data *wd; + + wd = data; + if (wd->path) + { + if (wd->sel_func) wd->sel_func(wd->sel_data, wd->obj); + } +} /* externally accessible functions */ +/* FIXME: callback only exists for double-clicking and selecting. need to add + * one for when the selection changes as well + */ EAPI Evas_Object * -e_widget_framelist_add(Evas *evas, char *label, int horiz) +e_widget_fsel_add(Evas *evas, char *dev, char *path, char *selected, char *filter, + void (*sel_func) (void *data, Evas_Object *obj), void *sel_data, + void (*chg_func) (void *data, Evas_Object *obj), void *chg_data) { Evas_Object *obj, *o; E_Widget_Data *wd; Evas_Coord mw = 0, mh = 0; + E_Fm2_Config fmc; obj = e_widget_add(evas); e_widget_del_hook_set(obj, _e_wid_del_hook); wd = calloc(1, sizeof(E_Widget_Data)); e_widget_data_set(obj, wd); + + wd->obj = obj; + wd->sel_func = sel_func; + wd->sel_data = sel_data; + wd->chg_func = chg_func; + wd->chg_data = chg_data; - o = edje_object_add(evas); - wd->o_frame = o; - e_theme_edje_object_set(o, "base/theme/widgets", - "widgets/frame"); - edje_object_part_text_set(o, "label", label); - evas_object_show(o); + o = e_widget_table_add(evas, 0); + wd->o_table = o; e_widget_sub_object_add(obj, o); e_widget_resize_object_set(obj, o); - o = e_box_add(evas); - wd->o_box = o; - e_box_orientation_set(o, horiz); - e_box_homogenous_set(o, 0); - edje_object_part_swallow(wd->o_frame, "items", o); + o = e_widget_table_add(evas, 0); + wd->o_table2 = o; e_widget_sub_object_add(obj, o); - evas_object_show(o); - edje_object_size_min_calc(wd->o_frame, &mw, &mh); + o = e_widget_button_add(evas, _("Go up a Directory"), NULL, + _e_wid_fsel_button_up, wd, NULL); + wd->o_up_button = o; + e_widget_sub_object_add(obj, o); + e_widget_table_object_append(wd->o_table2, o, 1, 0, 1, 1, 0, 0, 1, 0); + + o = e_fm2_add(evas); + wd->o_favorites_fm = o; + e_widget_sub_object_add(obj, o); + memset(&fmc, 0, sizeof(E_Fm2_Config)); + fmc.view.mode = E_FM2_VIEW_MODE_LIST; + fmc.view.open_dirs_in_place = 1; + fmc.view.selector = 1; + fmc.view.single_click = 1; + fmc.view.no_subdir_jump = 1; + fmc.icon.list.w = 24; + fmc.icon.list.h = 24; + fmc.icon.fixed.w = 1; + fmc.icon.fixed.h = 1; + fmc.icon.extension.show = 0; + fmc.list.sort.no_case = 1; + fmc.list.sort.dirs.first = 0; + fmc.list.sort.dirs.last = 0; + fmc.selection.single = 1; + fmc.selection.windows_modifiers = 0; + e_fm2_config_set(o, &fmc); + e_fm2_path_set(o, "favorites", "/"); + evas_object_smart_callback_add(o, "files_changed", + _e_wid_fsel_favorites_files_changed, wd); + evas_object_smart_callback_add(o, "selected", + _e_wid_fsel_favorites_selected, wd); + + o = e_widget_scrollframe_pan_add(evas, wd->o_favorites_fm, + e_fm2_pan_set, + e_fm2_pan_get, + e_fm2_pan_max_get, + e_fm2_pan_child_size_get); + wd->o_favorites_frame = o; + e_widget_sub_object_add(obj, o); + e_widget_min_size_set(o, 128, 128); + e_widget_table_object_append(wd->o_table2, o, 0, 1, 1, 1, 0, 1, 0, 1); + + o = e_fm2_add(evas); + wd->o_files_fm = o; + e_widget_sub_object_add(obj, o); + memset(&fmc, 0, sizeof(E_Fm2_Config)); + fmc.view.mode = E_FM2_VIEW_MODE_LIST; + fmc.view.open_dirs_in_place = 1; + fmc.view.selector = 1; + fmc.view.single_click = 0; + fmc.view.no_subdir_jump = 0; + fmc.icon.list.w = 24; + fmc.icon.list.h = 24; + fmc.icon.fixed.w = 1; + fmc.icon.fixed.h = 1; + fmc.icon.extension.show = 0; + fmc.list.sort.no_case = 1; + fmc.list.sort.dirs.first = 1; + fmc.list.sort.dirs.last = 0; + fmc.selection.single = 1; + fmc.selection.windows_modifiers = 0; + e_fm2_config_set(o, &fmc); + e_fm2_path_set(o, dev, path); + evas_object_smart_callback_add(o, "changed", + _e_wid_fsel_files_changed, wd); + evas_object_smart_callback_add(o, "selection_change", + _e_wid_fsel_files_selection_change, wd); + evas_object_smart_callback_add(o, "selected", + _e_wid_fsel_files_selected, wd); + + o = e_widget_scrollframe_pan_add(evas, wd->o_files_fm, + e_fm2_pan_set, + e_fm2_pan_get, + e_fm2_pan_max_get, + e_fm2_pan_child_size_get); + wd->o_files_frame = o; + e_widget_sub_object_add(obj, o); + e_widget_min_size_set(o, 128, 128); + e_widget_table_object_append(wd->o_table2, o, 1, 1, 1, 1, 1, 1, 1, 1); + + o = e_widget_entry_add(evas, &(wd->entry_text)); + wd->o_entry = o; + e_widget_sub_object_add(obj, o); + + e_widget_table_object_append(wd->o_table, wd->o_table2, + 0, 0, 1, 1, 1, 1, 1, 1); + e_widget_table_object_append(wd->o_table, wd->o_entry, + 0, 1, 1, 1, 1, 0, 1, 0); + + e_widget_min_size_get(wd->o_table, &mw, &mh); e_widget_min_size_set(obj, mw, mh); + evas_object_show(wd->o_up_button); + evas_object_show(wd->o_favorites_frame); + evas_object_show(wd->o_favorites_fm); + evas_object_show(wd->o_files_frame); + evas_object_show(wd->o_files_fm); + evas_object_show(wd->o_entry); + evas_object_show(wd->o_table2); + evas_object_show(wd->o_table); return obj; } -EAPI void -e_widget_framelist_object_append(Evas_Object *obj, Evas_Object *sobj) +EAPI const char * +e_widget_fsel_selection_path_get(Evas_Object *obj) { E_Widget_Data *wd; - Evas_Coord mw = 0, mh = 0; - - wd = e_widget_data_get(obj); - - e_box_pack_end(wd->o_box, sobj); - e_widget_min_size_get(sobj, &mw, &mh); - e_box_pack_options_set(sobj, - 1, 1, /* fill */ - 1, 0, /* expand */ - 0.5, 0.5, /* align */ - mw, mh, /* min */ - 99999, 99999 /* max */ - ); - e_box_min_size_get(wd->o_box, &mw, &mh); - edje_extern_object_min_size_set(wd->o_box, mw, mh); - edje_object_part_swallow(wd->o_frame, "items", wd->o_box); - edje_object_size_min_calc(wd->o_frame, &mw, &mh); - e_widget_min_size_set(obj, mw, mh); - e_widget_sub_object_add(obj, sobj); - evas_object_show(sobj); -} -EAPI void -e_widget_framelist_content_align_set(Evas_Object *obj, double halign, double valign) -{ - E_Widget_Data *wd; - wd = e_widget_data_get(obj); - e_box_align_set(wd->o_box, halign, valign); + return wd->path; } - static void _e_wid_del_hook(Evas_Object *obj) { E_Widget_Data *wd; wd = e_widget_data_get(obj); + E_FREE(wd->entry_text); free(wd); } diff --git a/src/bin/e_widget_fsel.h b/src/bin/e_widget_fsel.h index cab6b3bb6..6803691fb 100644 --- a/src/bin/e_widget_fsel.h +++ b/src/bin/e_widget_fsel.h @@ -3,12 +3,13 @@ */ #ifdef E_TYPEDEFS #else -#ifndef E_WIDGET_FRAMELIST_H -#define E_WIDGET_FRAMELIST_H - -EAPI Evas_Object *e_widget_framelist_add(Evas *evas, char *label, int horiz); -EAPI void e_widget_framelist_object_append(Evas_Object *obj, Evas_Object *sobj); -EAPI void e_widget_framelist_content_align_set(Evas_Object *obj, double halign, double valign); +#ifndef E_WIDGET_FSEL_H +#define E_WIDGET_FSEL_H +EAPI Evas_Object *e_widget_fsel_add(Evas *evas, char *dev, char *path, char *selected, char *filter, + void (*sel_func) (void *data, Evas_Object *obj), void *sel_data, + void (*chg_func) (void *data, Evas_Object *obj), void *chg_data); +EAPI const char *e_widget_fsel_selection_path_get(Evas_Object *obj); + #endif #endif