From dc7f61493799164a96552497f1835a0e15155de5 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Tue, 10 Jul 2007 11:15:34 +0000 Subject: [PATCH] Give menu apps dialogs (favs, ibar, etc, etc) ability to move items up/down in the list. Allows user to "customize" their order in the menus, as per ManoWarrior feature request. Added some API to ilist widget to help with this. iList can now do append_relative, prepend, and prepend_relative. SVN revision: 30701 --- src/bin/e_ilist.c | 169 ++++++++++++++++++++++++++++++++++++ src/bin/e_ilist.h | 3 + src/bin/e_int_config_apps.c | 119 +++++++++++++++++++++++++ src/bin/e_widget_ilist.c | 73 ++++++++++++++++ src/bin/e_widget_ilist.h | 3 + 5 files changed, 367 insertions(+) diff --git a/src/bin/e_ilist.c b/src/bin/e_ilist.c index 46448f72c..8ec618d6a 100644 --- a/src/bin/e_ilist.c +++ b/src/bin/e_ilist.c @@ -94,6 +94,175 @@ e_ilist_append(Evas_Object *obj, Evas_Object *icon, const char *label, int heade evas_object_show(si->o_base); } +EAPI void +e_ilist_append_relative(Evas_Object *obj, Evas_Object *icon, const char *label, int header, void (*func) (void *data, void *data2), void (*func_hilight) (void *data, void *data2), void *data, void *data2, int relative) +{ + E_Ilist_Item *si, *ri; + Evas_Coord mw = 0, mh = 0; + + API_ENTRY return; + si = E_NEW(E_Ilist_Item, 1); + si->sd = sd; + si->o_base = edje_object_add(evas_object_evas_get(sd->o_smart)); + + if (header) + e_theme_edje_object_set(si->o_base, "base/theme/widgets", + "e/widgets/ilist_header"); + else if (evas_list_count(sd->items) & 0x1) + e_theme_edje_object_set(si->o_base, "base/theme/widgets", + "e/widgets/ilist_odd"); + else + e_theme_edje_object_set(si->o_base, "base/theme/widgets", + "e/widgets/ilist"); + if (label) + edje_object_part_text_set(si->o_base, "e.text.label", label); + si->o_icon = icon; + if (si->o_icon) + { + edje_extern_object_min_size_set(si->o_icon, sd->iw, sd->ih); + edje_object_part_swallow(si->o_base, "e.swallow.icon", si->o_icon); + evas_object_show(si->o_icon); + } + si->func = func; + si->func_hilight = func_hilight; + si->data = data; + si->data2 = data2; + si->header = header; + + ri = evas_list_nth(sd->items, relative); + if (ri) + sd->items = evas_list_append_relative(sd->items, si, ri); + else + sd->items = evas_list_append(sd->items, si); + + edje_object_size_min_calc(si->o_base, &mw, &mh); + e_box_freeze(sd->o_box); + if (ri) + e_box_pack_after(sd->o_box, si->o_base, ri->o_base); + else + e_box_pack_end(sd->o_box, si->o_base); + e_box_pack_options_set(si->o_base, 1, 1, 1, 1, 0.5, 0.5, + mw, mh, 99999, 99999); + e_box_thaw(sd->o_box); + + evas_object_lower(sd->o_box); + evas_object_event_callback_add(si->o_base, EVAS_CALLBACK_MOUSE_DOWN, + _e_smart_event_mouse_down, si); + evas_object_event_callback_add(si->o_base, EVAS_CALLBACK_MOUSE_UP, + _e_smart_event_mouse_up, si); + evas_object_show(si->o_base); +} + +EAPI void +e_ilist_prepend(Evas_Object *obj, Evas_Object *icon, const char *label, int header, void (*func) (void *data, void *data2), void (*func_hilight) (void *data, void *data2), void *data, void *data2) +{ + E_Ilist_Item *si; + Evas_Coord mw = 0, mh = 0; + + API_ENTRY return; + si = E_NEW(E_Ilist_Item, 1); + si->sd = sd; + si->o_base = edje_object_add(evas_object_evas_get(sd->o_smart)); + + if (header) + e_theme_edje_object_set(si->o_base, "base/theme/widgets", + "e/widgets/ilist_header"); + else if (evas_list_count(sd->items) & 0x1) + e_theme_edje_object_set(si->o_base, "base/theme/widgets", + "e/widgets/ilist_odd"); + else + e_theme_edje_object_set(si->o_base, "base/theme/widgets", + "e/widgets/ilist"); + if (label) + edje_object_part_text_set(si->o_base, "e.text.label", label); + si->o_icon = icon; + if (si->o_icon) + { + edje_extern_object_min_size_set(si->o_icon, sd->iw, sd->ih); + edje_object_part_swallow(si->o_base, "e.swallow.icon", si->o_icon); + evas_object_show(si->o_icon); + } + si->func = func; + si->func_hilight = func_hilight; + si->data = data; + si->data2 = data2; + si->header = header; + sd->items = evas_list_prepend(sd->items, si); + + edje_object_size_min_calc(si->o_base, &mw, &mh); + e_box_freeze(sd->o_box); + e_box_pack_start(sd->o_box, si->o_base); + e_box_pack_options_set(si->o_base, 1, 1, 1, 1, 0.5, 0.5, + mw, mh, 99999, 99999); + e_box_thaw(sd->o_box); + + evas_object_lower(sd->o_box); + evas_object_event_callback_add(si->o_base, EVAS_CALLBACK_MOUSE_DOWN, + _e_smart_event_mouse_down, si); + evas_object_event_callback_add(si->o_base, EVAS_CALLBACK_MOUSE_UP, + _e_smart_event_mouse_up, si); + evas_object_show(si->o_base); +} + +EAPI void +e_ilist_prepend_relative(Evas_Object *obj, Evas_Object *icon, const char *label, int header, void (*func) (void *data, void *data2), void (*func_hilight) (void *data, void *data2), void *data, void *data2, int relative) +{ + E_Ilist_Item *si, *ri; + Evas_Coord mw = 0, mh = 0; + + API_ENTRY return; + si = E_NEW(E_Ilist_Item, 1); + si->sd = sd; + si->o_base = edje_object_add(evas_object_evas_get(sd->o_smart)); + + if (header) + e_theme_edje_object_set(si->o_base, "base/theme/widgets", + "e/widgets/ilist_header"); + else if (evas_list_count(sd->items) & 0x1) + e_theme_edje_object_set(si->o_base, "base/theme/widgets", + "e/widgets/ilist_odd"); + else + e_theme_edje_object_set(si->o_base, "base/theme/widgets", + "e/widgets/ilist"); + if (label) + edje_object_part_text_set(si->o_base, "e.text.label", label); + si->o_icon = icon; + if (si->o_icon) + { + edje_extern_object_min_size_set(si->o_icon, sd->iw, sd->ih); + edje_object_part_swallow(si->o_base, "e.swallow.icon", si->o_icon); + evas_object_show(si->o_icon); + } + si->func = func; + si->func_hilight = func_hilight; + si->data = data; + si->data2 = data2; + si->header = header; + + ri = evas_list_nth(sd->items, relative); + if (ri) + sd->items = evas_list_prepend_relative(sd->items, si, ri); + else + sd->items = evas_list_prepend(sd->items, si); + + edje_object_size_min_calc(si->o_base, &mw, &mh); + e_box_freeze(sd->o_box); + if (ri) + e_box_pack_before(sd->o_box, si->o_base, ri->o_base); + else + e_box_pack_end(sd->o_box, si->o_base); + e_box_pack_options_set(si->o_base, 1, 1, 1, 1, 0.5, 0.5, + mw, mh, 99999, 99999); + e_box_thaw(sd->o_box); + + evas_object_lower(sd->o_box); + evas_object_event_callback_add(si->o_base, EVAS_CALLBACK_MOUSE_DOWN, + _e_smart_event_mouse_down, si); + evas_object_event_callback_add(si->o_base, EVAS_CALLBACK_MOUSE_UP, + _e_smart_event_mouse_up, si); + evas_object_show(si->o_base); +} + EAPI void e_ilist_clear(Evas_Object *obj) { diff --git a/src/bin/e_ilist.h b/src/bin/e_ilist.h index b528b51e1..47ae0ea4d 100644 --- a/src/bin/e_ilist.h +++ b/src/bin/e_ilist.h @@ -21,6 +21,9 @@ struct _E_Ilist_Item EAPI Evas_Object *e_ilist_add (Evas *evas); EAPI void e_ilist_append (Evas_Object *obj, Evas_Object *icon, const char *label, int header, void (*func) (void *data, void *data2), void (*func_hilight) (void *data, void *data2), void *data, void *data2); +EAPI void e_ilist_append_relative (Evas_Object *obj, Evas_Object *icon, const char *label, int header, void (*func) (void *data, void *data2), void (*func_hilight) (void *data, void *data2), void *data, void *data2, int relative); +EAPI void e_ilist_prepend (Evas_Object *obj, Evas_Object *icon, const char *label, int header, void (*func) (void *data, void *data2), void (*func_hilight) (void *data, void *data2), void *data, void *data2); +EAPI void e_ilist_prepend_relative (Evas_Object *obj, Evas_Object *icon, const char *label, int header, void (*func) (void *data, void *data2), void (*func_hilight) (void *data, void *data2), void *data, void *data2, int relative); EAPI void e_ilist_clear (Evas_Object *obj); EAPI void e_ilist_freeze (Evas_Object *obj); EAPI void e_ilist_thaw (Evas_Object *obj); diff --git a/src/bin/e_int_config_apps.c b/src/bin/e_int_config_apps.c index 06f498222..d8ed4b3c4 100644 --- a/src/bin/e_int_config_apps.c +++ b/src/bin/e_int_config_apps.c @@ -18,6 +18,8 @@ static void _list_cb_selected(void *data); static void _cb_categories(void *data, void *data2); static void _cb_add(void *data, void *data2); static void _cb_del(void *data, void *data2); +static void _cb_up(void *data, void *data2); +static void _cb_down(void *data, void *data2); static int _cb_desktop_name_sort(Efreet_Desktop *a, Efreet_Desktop *b); static int _save_menu(E_Config_Dialog_Data *cfdata); @@ -41,6 +43,7 @@ struct _E_Config_Dialog_Data Evas_Object *o_apps, *o_list; Evas_Object *o_add, *o_del, *o_categories; + Evas_Object *o_up, *o_down; Ecore_List *apps; const char *category; int category_n; @@ -304,6 +307,18 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) e_widget_framelist_object_append(of, ob); e_widget_table_object_append(ot, of, 2, 0, 1, 4, 1, 1, 1, 1); + ob = e_widget_button_add(evas, _("Up"), "widget/up_arrow", + _cb_up, cfdata, NULL); + cfdata->o_up = ob; + e_widget_disabled_set(ob, 1); + e_widget_table_object_append(ot, ob, 3, 1, 1, 1, 1, 0, 0, 0); + + ob = e_widget_button_add(evas, _("Down"), "widget/down_arrow", + _cb_down, cfdata, NULL); + cfdata->o_down = ob; + e_widget_disabled_set(ob, 1); + e_widget_table_object_append(ot, ob, 3, 2, 1, 1, 1, 0, 0, 0); + e_dialog_resizable_set(cfd->dia, 1); return ot; } @@ -497,9 +512,21 @@ static void _list_cb_selected(void *data) { E_Config_Dialog_Data *cfdata; + int sel, count; cfdata = data; e_widget_disabled_set(cfdata->o_del, 0); + + count = e_widget_ilist_count(cfdata->o_list); + sel = e_widget_ilist_selected_get(cfdata->o_list); + if (sel == 0) + e_widget_disabled_set(cfdata->o_up, 1); + else + e_widget_disabled_set(cfdata->o_up, 0); + if (sel < (count -1)) + e_widget_disabled_set(cfdata->o_down, 0); + else + e_widget_disabled_set(cfdata->o_down, 1); } static void @@ -579,3 +606,95 @@ _cb_del(void *data, void *data2) if (ecore_list_goto(cfdata->apps, desk)) ecore_list_remove(cfdata->apps); } + +static void +_cb_up(void *data, void *data2) +{ + E_Config_Dialog_Data *cfdata; + Efreet_Desktop *desk; + Evas *evas; + Evas_Object *icon; + Evas_Coord w; + int sel, i; + + cfdata = data; + if (!cfdata->apps) return; + + sel = e_widget_ilist_selected_get(cfdata->o_list); + if (sel < 0) return; + + desk = efreet_desktop_get(cfdata->fav); + if (!desk) return; + + evas = evas_object_evas_get(cfdata->o_list); + evas_event_freeze(evas); + edje_freeze(); + e_widget_ilist_freeze(cfdata->o_list); + e_widget_ilist_remove_num(cfdata->o_list, sel); + e_widget_ilist_go(cfdata->o_list); + + icon = e_util_desktop_icon_add(desk, "24x24", evas); + e_widget_ilist_prepend_relative(cfdata->o_list, icon, desk->name, + _list_cb_selected, cfdata, cfdata->fav, (sel - 1)); + e_widget_ilist_selected_set(cfdata->o_list, (sel - 1)); + e_widget_ilist_go(cfdata->o_list); + e_widget_min_size_get(cfdata->o_list, &w, NULL); + e_widget_min_size_set(cfdata->o_list, w, 200); + e_widget_ilist_thaw(cfdata->o_list); + edje_thaw(); + evas_event_thaw(evas); + + if (ecore_list_goto(cfdata->apps, desk)) + { + i = ecore_list_index(cfdata->apps); + ecore_list_remove(cfdata->apps); + ecore_list_goto_index(cfdata->apps, (i - 1)); + ecore_list_insert(cfdata->apps, desk); + } +} + +static void +_cb_down(void *data, void *data2) +{ + E_Config_Dialog_Data *cfdata; + Efreet_Desktop *desk; + Evas *evas; + Evas_Object *icon; + Evas_Coord w; + int sel, i; + + cfdata = data; + if (!cfdata->apps) return; + + sel = e_widget_ilist_selected_get(cfdata->o_list); + if (sel < 0) return; + + desk = efreet_desktop_get(cfdata->fav); + if (!desk) return; + + evas = evas_object_evas_get(cfdata->o_list); + evas_event_freeze(evas); + edje_freeze(); + e_widget_ilist_freeze(cfdata->o_list); + e_widget_ilist_remove_num(cfdata->o_list, sel); + e_widget_ilist_go(cfdata->o_list); + + icon = e_util_desktop_icon_add(desk, "24x24", evas); + e_widget_ilist_append_relative(cfdata->o_list, icon, desk->name, + _list_cb_selected, cfdata, cfdata->fav, sel); + e_widget_ilist_selected_set(cfdata->o_list, (sel + 1)); + e_widget_ilist_go(cfdata->o_list); + e_widget_min_size_get(cfdata->o_list, &w, NULL); + e_widget_min_size_set(cfdata->o_list, w, 200); + e_widget_ilist_thaw(cfdata->o_list); + edje_thaw(); + evas_event_thaw(evas); + + if (ecore_list_goto(cfdata->apps, desk)) + { + i = ecore_list_index(cfdata->apps); + ecore_list_remove(cfdata->apps); + ecore_list_goto_index(cfdata->apps, (i + 1)); + ecore_list_insert(cfdata->apps, desk); + } +} diff --git a/src/bin/e_widget_ilist.c b/src/bin/e_widget_ilist.c index a1f190031..86fd9fb89 100644 --- a/src/bin/e_widget_ilist.c +++ b/src/bin/e_widget_ilist.c @@ -99,6 +99,79 @@ e_widget_ilist_append(Evas_Object *obj, Evas_Object *icon, const char *label, vo if (icon) evas_object_show(icon); } +EAPI void +e_widget_ilist_append_relative(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val, int relative) +{ + E_Widget_Data *wd; + E_Widget_Callback *wcb, *rcb; + + wd = e_widget_data_get(obj); + wcb = E_NEW(E_Widget_Callback, 1); + if (!wcb) return; + wcb->func = func; + wcb->data = data; + if (val) wcb->value = strdup(val); + + rcb = evas_list_nth(wd->callbacks, relative); + if (rcb) + { + wd->callbacks = evas_list_append_relative(wd->callbacks, wcb, rcb); + e_ilist_append_relative(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb, relative); + } + else + { + wd->callbacks = evas_list_append(wd->callbacks, wcb); + e_ilist_append(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb); + } + + if (icon) evas_object_show(icon); +} + +EAPI void +e_widget_ilist_prepend(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val) +{ + E_Widget_Data *wd; + E_Widget_Callback *wcb; + + wd = e_widget_data_get(obj); + wcb = E_NEW(E_Widget_Callback, 1); + if (!wcb) return; + wcb->func = func; + wcb->data = data; + if (val) wcb->value = strdup(val); + wd->callbacks = evas_list_prepend(wd->callbacks, wcb); + e_ilist_prepend(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb); + if (icon) evas_object_show(icon); +} + +EAPI void +e_widget_ilist_prepend_relative(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val, int relative) +{ + E_Widget_Data *wd; + E_Widget_Callback *wcb, *rcb; + + wd = e_widget_data_get(obj); + wcb = E_NEW(E_Widget_Callback, 1); + if (!wcb) return; + wcb->func = func; + wcb->data = data; + if (val) wcb->value = strdup(val); + + rcb = evas_list_nth(wd->callbacks, relative); + if (rcb) + { + wd->callbacks = evas_list_prepend_relative(wd->callbacks, wcb, rcb); + e_ilist_prepend_relative(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb, relative); + } + else + { + wd->callbacks = evas_list_prepend(wd->callbacks, wcb); + e_ilist_prepend(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb); + } + + if (icon) evas_object_show(icon); +} + EAPI void e_widget_ilist_header_append(Evas_Object *obj, Evas_Object *icon, const char *label) { diff --git a/src/bin/e_widget_ilist.h b/src/bin/e_widget_ilist.h index 92f590ffc..ddda4b324 100644 --- a/src/bin/e_widget_ilist.h +++ b/src/bin/e_widget_ilist.h @@ -10,6 +10,9 @@ EAPI Evas_Object *e_widget_ilist_add(Evas *evas, int icon_w, int icon_h, char ** EAPI void e_widget_ilist_freeze(Evas_Object *obj); EAPI void e_widget_ilist_thaw(Evas_Object *obj); EAPI void e_widget_ilist_append(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val); +EAPI void e_widget_ilist_append_relative(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val, int relative); +EAPI void e_widget_ilist_prepend(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val); +EAPI void e_widget_ilist_prepend_relative(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val, int relative); EAPI void e_widget_ilist_header_append(Evas_Object *obj, Evas_Object *icon, const char *label); EAPI void e_widget_ilist_selector_set(Evas_Object *obj, int selector); EAPI void e_widget_ilist_go(Evas_Object *obj);