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
This commit is contained in:
Christopher Michael 2007-07-10 11:15:34 +00:00
parent ee2298b2db
commit dc7f614937
5 changed files with 367 additions and 0 deletions

View File

@ -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)
{

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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)
{

View File

@ -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);