From 6ca152fef80320c8876e6a7a0bcb87254541e18b Mon Sep 17 00:00:00 2001 From: Viktor Kojouharov Date: Thu, 23 Apr 2009 02:12:55 +0000 Subject: [PATCH] From: Viktor Kojouharov This little patch adds 'tabs' to the fileman module window. The tabs are implemented using the toolbar widget. Currently you can add tabs and switch between them. The only problem right now is that when adding more than two tabs, the toolbar/scrollbar area is moved off the canvas for some reason, until the user resizes the window - raster though it might be a problem with the toolbar widget itself, but he didn't see the patch, so it might as well be something on my side. SVN revision: 40306 --- src/bin/e_widget_toolbar.c | 49 +++++++++ src/bin/e_widget_toolbar.h | 2 + src/modules/fileman/e_fwin.c | 191 +++++++++++++++++++++++++++++++---- 3 files changed, 223 insertions(+), 19 deletions(-) diff --git a/src/bin/e_widget_toolbar.c b/src/bin/e_widget_toolbar.c index e416bab9e..f46896a92 100644 --- a/src/bin/e_widget_toolbar.c +++ b/src/bin/e_widget_toolbar.c @@ -11,6 +11,7 @@ struct _E_Widget_Data int icon_w, icon_h; Eina_List *items; Evas_Bool scrollable : 1; + Evas_Bool focus_steal : 1; }; struct _Item @@ -49,6 +50,7 @@ e_widget_toolbar_add(Evas *evas, int icon_w, int icon_h) e_widget_data_set(obj, wd); wd->icon_w = icon_w; wd->icon_h = icon_h; + wd->focus_steal = 1; o = e_scrollframe_add(evas); wd->o_base = o; @@ -167,6 +169,30 @@ e_widget_toolbar_item_select(Evas_Object *obj, int num) } } +EAPI void +e_widget_toolbar_item_label_set(Evas_Object *obj, int num, const char *label) +{ + E_Widget_Data *wd; + Item *it; + + wd = e_widget_data_get(obj); + it = eina_list_nth(wd->items, num); + if (it) + { + int mw, mh; + + edje_object_part_text_set(it->o_base, "e.text.label", label); + edje_object_size_min_calc(it->o_base, &mw, &mh); + e_box_pack_options_set(it->o_base, + 1, 1, /* fill */ + 0, 0, /* expand */ + 0.5, 0.5, /* align */ + mw, mh, /* min */ + 9999, 9999 /* max */ + ); + } +} + EAPI void e_widget_toolbar_scrollable_set(Evas_Object *obj, Evas_Bool scrollable) { @@ -185,6 +211,29 @@ e_widget_toolbar_scrollable_set(Evas_Object *obj, Evas_Bool scrollable) e_widget_min_size_set(obj, mw + (500 - vw), mh + (500 - vh)); } +EAPI void +e_widget_toolbar_focus_steal_set(Evas_Object *obj, Evas_Bool steal) +{ + E_Widget_Data *wd; + + wd = e_widget_data_get(obj); + if (wd->focus_steal == steal) return; + if (steal) + { + evas_object_event_callback_add(e_scrollframe_edje_object_get(wd->o_base), + EVAS_CALLBACK_MOUSE_DOWN, + _e_wid_focus_steal, obj); + wd->focus_steal = 1; + } + else + { + evas_object_event_callback_del(e_scrollframe_edje_object_get(wd->o_base), + EVAS_CALLBACK_MOUSE_DOWN, + _e_wid_focus_steal); + wd->focus_steal = 0; + } +} + static void _e_wid_del_hook(Evas_Object *obj) { diff --git a/src/bin/e_widget_toolbar.h b/src/bin/e_widget_toolbar.h index 5595b872e..04556252d 100644 --- a/src/bin/e_widget_toolbar.h +++ b/src/bin/e_widget_toolbar.h @@ -9,7 +9,9 @@ EAPI Evas_Object *e_widget_toolbar_add(Evas *evas, int icon_w, int icon_h); EAPI void e_widget_toolbar_item_append(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data1, void *data2), const void *data1, const void *data2); EAPI void e_widget_toolbar_item_select(Evas_Object *obj, int num); +EAPI void e_widget_toolbar_item_label_set(Evas_Object *obj, int num, const char *label); EAPI void e_widget_toolbar_scrollable_set(Evas_Object *obj, Evas_Bool scrollable); +EAPI void e_widget_toolbar_focus_steal_set(Evas_Object *obj, Evas_Bool steal); #endif #endif diff --git a/src/modules/fileman/e_fwin.c b/src/modules/fileman/e_fwin.c index 142f11495..8495b2f57 100644 --- a/src/modules/fileman/e_fwin.c +++ b/src/modules/fileman/e_fwin.c @@ -15,6 +15,7 @@ */ typedef struct _E_Fwin E_Fwin; +typedef struct _E_Fwin_Page_Info E_Fwin_Page_Info; typedef struct _E_Fwin_Apps_Dialog E_Fwin_Apps_Dialog; #define E_FWIN_TYPE 0xE0b0101f @@ -26,10 +27,14 @@ struct _E_Fwin E_Win *win; E_Zone *zone; Evas_Object *scrollframe_obj; + Evas_Object *tb_obj; Evas_Object *fm_obj; Evas_Object *bg_obj; E_Fwin_Apps_Dialog *fad; + Eina_List *page_info; + int page_index; + Evas_Object *under_obj; Evas_Object *over_obj; struct { @@ -49,6 +54,18 @@ struct _E_Fwin unsigned char geom_save_ready : 1; }; +struct _E_Fwin_Page_Info +{ + const char *dev; + const char *path; + + struct { + Evas_Coord x, y; + } scroll; + + int index; +}; + struct _E_Fwin_Apps_Dialog { E_Dialog *dia; @@ -72,6 +89,9 @@ typedef enum /* local subsystem prototypes */ static E_Fwin *_e_fwin_new(E_Container *con, const char *dev, const char *path); static void _e_fwin_free(E_Fwin *fwin); +static void _e_fwin_page_new(E_Fwin *fwin); +static E_Fwin_Page_Info *_e_fwin_page_info_new(E_Fwin *fwin); +static void _e_fwin_cb_page_change(void *data1, void *data2); static void _e_fwin_cb_delete(E_Win *win); static void _e_fwin_cb_move(E_Win *win); static void _e_fwin_cb_resize(E_Win *win); @@ -490,6 +510,8 @@ _e_fwin_new(E_Container *con, const char *dev, const char *path) static void _e_fwin_free(E_Fwin *fwin) { + E_Fwin_Page_Info *info; + if (!fwin) return; //safety if (fwin->fm_obj) evas_object_del(fwin->fm_obj); @@ -502,6 +524,13 @@ _e_fwin_free(E_Fwin *fwin) _e_fwin_zone_cb_mouse_down); } + + EINA_LIST_FREE(fwin->page_info, info) + { + eina_stringshare_del(info->dev); + eina_stringshare_del(info->path); + E_FREE(info); + } if (fwin->zone_handler) ecore_event_handler_del(fwin->zone_handler); if (fwin->zone_del_handler) @@ -862,42 +891,132 @@ _e_fwin_window_title_set(E_Fwin *fwin) static void _e_fwin_toolbar_resize(E_Fwin *fwin) { + int tx, ty, tw, th, offset = 0; int x, y, w, h; - e_toolbar_position_calc(fwin->tbar); + if (fwin->tb_obj) + evas_object_geometry_get(fwin->tb_obj, NULL, NULL, NULL, &offset); w = fwin->win->w; h = fwin->win->h; switch (fwin->tbar->gadcon->orient) { + case E_GADCON_ORIENT_HORIZ: case E_GADCON_ORIENT_TOP: - x = 0; - y = fwin->tbar->h; - h = (h - fwin->tbar->h); - break; + tx = 0; + ty = offset; + th = 32; + tw = w; + + x = 0; + y = offset + th; + h = (h - offset - th); + break; case E_GADCON_ORIENT_BOTTOM: - x = 0; - y = 0; - h = (h - fwin->tbar->h); - break; + tx = 0; + th = 32; + tw = w; + ty = h - th; + + x = 0; + y = offset; + h = (h - offset - th); + break; + case E_GADCON_ORIENT_VERT: case E_GADCON_ORIENT_LEFT: - x = (fwin->tbar->x + fwin->tbar->w); - y = 0; - w = (w - fwin->tbar->w); - break; + tx = 0; + tw = 32; + th = h - offset; + ty = offset; + + x = (tx + tw); + y = offset; + w = (w - tw); + break; case E_GADCON_ORIENT_RIGHT: - x = 0; - y = 0; - w = (fwin->win->w - fwin->tbar->w); - break; + ty = offset; + tw = 32; + tx = w - tw; + th = h - offset; + + x = 0; + y = offset; + w = (w - tw); + break; default: - return; + return; } + e_toolbar_move_resize(fwin->tbar, tx, ty, tw, th); evas_object_move(fwin->scrollframe_obj, x, y); evas_object_resize(fwin->scrollframe_obj, w, h); } /* fwin callbacks */ +static void +_e_fwin_page_new(E_Fwin *fwin) +{ + E_Fwin_Page_Info *info; + const char *real; + + if (!fwin->tb_obj) + { + /* There is no toolbar yet */ + fwin->tb_obj = e_widget_toolbar_add(evas_object_evas_get(fwin->fm_obj), + 48 * e_scale, 48 * e_scale); + + e_widget_toolbar_focus_steal_set(fwin->tb_obj, 0); + info = _e_fwin_page_info_new(fwin); + real = ecore_file_file_get(e_fm2_real_path_get(fwin->fm_obj)); + e_widget_toolbar_item_append(fwin->tb_obj, NULL, real, + _e_fwin_cb_page_change, fwin, info); + + evas_object_move(fwin->tb_obj, 0, 0); + evas_object_show(fwin->tb_obj); + } + + info = _e_fwin_page_info_new(fwin); + real = ecore_file_file_get(e_fm2_real_path_get(fwin->fm_obj)); + e_widget_toolbar_item_append(fwin->tb_obj, NULL, real, + _e_fwin_cb_page_change, fwin, info); + e_widget_toolbar_item_select(fwin->tb_obj, info->index); + + _e_fwin_cb_resize(fwin->win); +} + +static E_Fwin_Page_Info * +_e_fwin_page_info_new(E_Fwin *fwin) +{ + E_Fwin_Page_Info *info; + const char *dev, *path; + + e_fm2_path_get(fwin->fm_obj, &dev, &path); + info = E_NEW(E_Fwin_Page_Info, 1); + info->dev = eina_stringshare_add(dev); + info->path = eina_stringshare_add(path); + info->index = eina_list_count(fwin->page_info); + + fwin->page_info = eina_list_append(fwin->page_info, info); + + return info; +} + +static void +_e_fwin_cb_page_change(void *data1, void *data2) +{ + E_Fwin *fwin = data1; + E_Fwin_Page_Info *info = data2, *prev; + Evas_Coord x, y; + + if (!fwin || !info) return; + prev = eina_list_nth(fwin->page_info, fwin->page_index); + e_scrollframe_child_pos_get(fwin->scrollframe_obj, &x, &y); + prev->scroll.x = x; + prev->scroll.y = y; + fwin->page_index = info->index; + e_fm2_path_set(fwin->fm_obj, info->dev, info->path); + e_scrollframe_child_pos_set(fwin->scrollframe_obj, x, y); +} + static void _e_fwin_cb_delete(E_Win *win) { @@ -956,10 +1075,24 @@ _e_fwin_cb_resize(E_Win *win) } if (fwin->win) { + if (fwin->tb_obj) + { + int height; + + e_widget_min_size_get(fwin->tb_obj, NULL, &height); + evas_object_resize(fwin->tb_obj, fwin->win->w, height); + } if (fwin->tbar) _e_fwin_toolbar_resize(fwin); else - evas_object_resize(fwin->scrollframe_obj, fwin->win->w, fwin->win->h); + { + int offset = 0; + + if (fwin->tb_obj) + evas_object_geometry_get(fwin->tb_obj, NULL, NULL, NULL, &offset); + evas_object_move(fwin->scrollframe_obj, 0, offset); + evas_object_resize(fwin->scrollframe_obj, fwin->win->w, fwin->win->h - offset); + } } else if (fwin->zone) evas_object_resize(fwin->scrollframe_obj, fwin->zone->w, fwin->zone->h); @@ -1036,6 +1169,21 @@ _e_fwin_changed(void *data, Evas_Object *obj, void *event_info) } e_scrollframe_child_pos_set(fwin->scrollframe_obj, 0, 0); } + if (fwin->tb_obj) + { + E_Fwin_Page_Info *info; + const char *file, *dev, *path; + + e_fm2_path_get(fwin->fm_obj, &dev, &path); + info = eina_list_nth(fwin->page_info, fwin->page_index); + eina_stringshare_del(info->dev); + eina_stringshare_del(info->path); + info->dev = eina_stringshare_add(dev); + info->path = eina_stringshare_add(path); + + file = ecore_file_file_get(e_fm2_real_path_get(fwin->fm_obj)); + e_widget_toolbar_item_label_set(fwin->tb_obj, fwin->page_index, file); + } if ((fwin->theme_file) && (ecore_file_exists(fwin->theme_file))) e_fm2_custom_theme_set(obj, fwin->theme_file); else @@ -1115,6 +1263,11 @@ _e_fwin_cb_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info) e_fm2_all_sel(fwin->fm_obj); return; } + if (!strcmp(ev->key, "t")) + { + _e_fwin_page_new(fwin); + return; + } } }