add config widget thingy

This commit is contained in:
Mike Blumenkrantz 2016-01-13 16:58:57 -05:00
parent ae23b2dfbc
commit 74aa33bf60
6 changed files with 434 additions and 60 deletions

View File

@ -5,6 +5,7 @@ module_la_SOURCES += \
src/gadgets/bryce.c \
src/gadgets/bryce.h \
src/gadgets/core.c \
src/gadgets/site_config.c \
src/gadgets/demo.c \
src/gadgets/gadget.h \
src/gadgets/start/start.c \

View File

@ -193,13 +193,19 @@ _bryce_autohide_show(Bryce *b)
b->hidden = 0;
}
static void
_bryce_autohide_hide(Bryce *b)
{
if (!b->autohide_blocked)
b->autohide_timer = ecore_timer_add(1.0, (Ecore_Task_Cb)_bryce_autohide_timeout, b);
}
static void
_bryce_autohide_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Bryce *b = data;
if (!b->autohide_blocked)
b->autohide_timer = ecore_timer_add(1.0, (Ecore_Task_Cb)_bryce_autohide_timeout, b);
_bryce_autohide_hide(b);
b->mouse_in = 0;
}
@ -280,20 +286,72 @@ _bryce_style_menu(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
}
static void
_bryce_owner_menu(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
_bryce_gadgets_menu_close(void *data, Evas_Object *obj)
{
Bryce *b = data;
b->autohide_blocked--;
evas_object_layer_set(b->bryce, b->layer);
evas_object_hide(obj);
evas_object_del(obj);
if (!b->mouse_in)
_bryce_autohide_hide(b);
}
static Eina_Bool
_bryce_gadgets_menu_key()
{
return EINA_TRUE;
}
static void
_bryce_popup_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
_bryce_gadgets_menu(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
{
Bryce *b = data;
Evas_Object *editor, *comp_object;
int w, h;
b->autohide_blocked++;
editor = z_gadget_editor_add(e_comp->elm, b->site);
comp_object = e_comp_object_util_add(editor, E_COMP_OBJECT_TYPE_POPUP);
evas_object_resize(comp_object, 300 * e_scale, 300 * e_scale);
e_comp_object_util_center(comp_object);
evas_object_layer_set(comp_object, E_LAYER_POPUP);
evas_object_show(comp_object);
evas_object_layer_set(b->bryce, E_LAYER_POPUP);
evas_object_size_hint_min_get(editor, &w, &h);
evas_object_resize(comp_object, 300 * e_scale, h * e_scale);
e_comp_object_util_center(comp_object);
e_comp_object_util_autoclose(comp_object, _bryce_gadgets_menu_close, _bryce_gadgets_menu_key, b);
}
static void
_bryce_owner_menu(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Bryce *b = data;
E_Menu_Item *mi = event_info;
E_Menu *subm;
e_menu_item_label_set(mi, "Bryce");
subm = e_menu_new();
e_menu_item_submenu_set(mi, subm);
e_object_unref(E_OBJECT(subm));
mi = e_menu_item_new(subm);
e_menu_item_label_set(mi, "Gadgets");
e_menu_item_callback_set(mi, _bryce_gadgets_menu, b);
}
static void
_bryce_popup_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Bryce *b = data;
b->autohide_blocked--;
if (!b->autohide) return;
if (!b->mouse_in)
b->autohide_timer = ecore_timer_add(1.0, (Ecore_Task_Cb)_bryce_autohide_timeout, b);
_bryce_autohide_hide(b);
}
static void
@ -404,7 +462,7 @@ z_bryce_autohide_set(Evas_Object *bryce, Eina_Bool set)
evas_object_geometry_set(b->autohide_event, x, y, w, h);
evas_object_color_set(b->autohide_event, 0, 0, 0, 0);
evas_object_repeat_events_set(b->autohide_event, 1);
evas_object_layer_set(b->autohide_event, E_LAYER_POPUP);
evas_object_layer_set(b->autohide_event, E_LAYER_POPUP + 1);
evas_object_show(b->autohide_event);
evas_object_event_callback_add(b->autohide_event, EVAS_CALLBACK_MOUSE_IN, _bryce_autohide_mouse_in, b);
evas_object_event_callback_add(b->autohide_event, EVAS_CALLBACK_MOUSE_OUT, _bryce_autohide_mouse_out, b);
@ -412,7 +470,7 @@ z_bryce_autohide_set(Evas_Object *bryce, Eina_Bool set)
evas_object_event_callback_add(bryce, EVAS_CALLBACK_RESIZE, _bryce_autohide_moveresize, b);
ecore_evas_pointer_xy_get(e_comp->ee, &x, &y);
if (!E_INSIDE(x, y, b->x, b->y, w, h))
b->autohide_timer = ecore_timer_add(1.0, (Ecore_Task_Cb)_bryce_autohide_timeout, b);
_bryce_autohide_hide(b);
}
else
{

View File

@ -49,6 +49,7 @@ struct Z_Gadget_Config
} style;
Eina_Stringshare *type;
Z_Gadget_Configure_Cb configure;
Z_Gadget_Configure_Cb wizard;
Evas_Object *cfg_object;
Z_Gadget_Site *site;
E_Menu *menu;
@ -150,7 +151,7 @@ _gadget_reparent(Z_Gadget_Site *zgs, Z_Gadget_Config *zgc)
break;
default:
/* right aligned: pack on left */
elm_box_pack_start(zgs->layout, zgc->display);
elm_box_pack_start(zgs->layout, zgc->display);
}
}
@ -178,6 +179,39 @@ _gadget_object_free(E_Object *eobj)
E_FREE(zgc->e_obj_inherit);
}
static void
_gadget_object_create(Z_Gadget_Config *zgc)
{
Z_Gadget_Create_Cb cb;
Evas_Object *g;
cb = eina_hash_find(gadget_types, zgc->type);
if (!cb) return; //can't create yet
/* if id is < 0, gadget creates dummy config for demo use
* if id is 0, gadget creates new config and returns id
* otherwise, config of `id` is applied to created object
*/
g = cb(zgc->site->layout, &zgc->id, zgc->site->orient);
EINA_SAFETY_ON_NULL_RETURN(g);
zgc->e_obj_inherit = E_OBJECT_ALLOC(E_Object, Z_GADGET_TYPE, _gadget_object_free);
e_object_data_set(zgc->e_obj_inherit, g);
zgc->gadget = zgc->display = g;
evas_object_data_set(g, "__z_gadget", zgc);
if (zgc->site->style_cb)
zgc->site->style_cb(zgc->site->layout, NULL, g);
evas_object_event_callback_add(g, EVAS_CALLBACK_DEL, _gadget_del, zgc);
_gadget_reparent(zgc->site, zgc);
evas_object_raise(zgc->site->events);
evas_object_smart_callback_call(zgc->site->layout, "gadget_added", g);
evas_object_smart_callback_call(zgc->site->layout, "gadget_gravity", g);
evas_object_show(zgc->display);
}
static void
_site_gadget_resize(Evas_Object *g, int w, int h, Evas_Coord *ww, Evas_Coord *hh, Evas_Coord *ow, Evas_Coord *oh)
{
@ -292,7 +326,7 @@ _site_layout(Evas_Object *o, Evas_Object_Box_Data *priv EINA_UNUSED, void *data)
yy += oh;
}
}
else
else if (zgs->gravity)
{
if (IS_HORIZ(zgs->orient))
px += w;
@ -820,23 +854,22 @@ _gadget_act_menu(E_Object *obj, const char *params EINA_UNUSED, E_Binding_Event_
else
e_object_del(E_OBJECT(subm));
mi = e_menu_item_new(zgc->menu);
evas_object_smart_callback_call(zgc->site->layout, "gadget_owner_menu", mi);
if (mi->label)
{
mi = e_menu_item_new(zgc->menu);
e_menu_item_separator_set(mi, 1);
}
else
e_object_del(E_OBJECT(mi));
mi = e_menu_item_new(zgc->menu);
e_menu_item_label_set(mi, _("Remove"));
e_util_menu_item_theme_icon_set(mi, "list-remove");
e_menu_item_callback_set(mi, _gadget_menu_remove, zgc);
subm = e_menu_new();
evas_object_smart_callback_call(zgc->site->layout, "gadget_owner_menu", subm);
if (subm->items)
{
mi = e_menu_item_new(zgc->menu);
e_menu_item_label_set(mi, _("Look"));
e_util_menu_item_theme_icon_set(mi, "preferences-look");
e_menu_item_submenu_set(mi, subm);
e_object_unref(E_OBJECT(subm));
}
else
e_object_del(E_OBJECT(subm));
evas_pointer_canvas_xy_get(e_comp->evas, &x, &y);
e_menu_activate_mouse(zgc->menu,
e_zone_current_get(),
@ -884,6 +917,90 @@ _site_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_
}
}
static void
_site_drop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Z_Gadget_Site *zgs = data, *drop;
Eina_List *l;
Z_Gadget_Config *zgc, *dzgc;
int mx, my;
int x, y, w, h;
drop = evas_object_data_get(event_info, "__z_gadget_site");
evas_pointer_canvas_xy_get(e_comp->evas, &mx, &my);
evas_object_geometry_get(zgs->layout, &x, &y, &w, &h);
if (!E_INSIDE(mx, my, x, y, w, h)) return;
EINA_LIST_FOREACH(zgs->gadgets, l, zgc)
{
if (!zgc->display) continue;
evas_object_geometry_get(zgc->display, &x, &y, &w, &h);
if (E_INSIDE(mx, my, x, y, w, h)) break;
}
if (zgc)
{
Eina_Bool pre = EINA_FALSE;
if (IS_HORIZ(zgs->orient))
{
if (mx <= x + (w / 2))
pre = EINA_TRUE;
}
else if (IS_VERT(zgs->orient))
{
if (my <= y + (h / 2))
pre = EINA_TRUE;
}
else {} //FIXME
if (zgs->orient)
{
Eina_List *ll;
if (pre)
EINA_LIST_REVERSE_FOREACH(drop->gadgets, ll, dzgc)
{
evas_object_del(dzgc->gadget);
zgs->gadgets = eina_list_prepend_relative_list(zgs->gadgets, dzgc, l);
dzgc->site = zgs;
_gadget_object_create(dzgc);
}
else
EINA_LIST_REVERSE_FOREACH(drop->gadgets, ll, dzgc)
{
evas_object_del(dzgc->gadget);
zgs->gadgets = eina_list_append_relative_list(zgs->gadgets, dzgc, l);
dzgc->site = zgs;
_gadget_object_create(dzgc);
}
}
}
else
{
if (zgs->orient)
{
if (mx >= x) //right of all exiting gadgets
{
EINA_LIST_FOREACH(drop->gadgets, l, dzgc)
{
evas_object_del(dzgc->gadget);
zgs->gadgets = eina_list_append(zgs->gadgets, dzgc);
dzgc->site = zgs;
_gadget_object_create(dzgc);
}
}
else
{
EINA_LIST_REVERSE_FOREACH(drop->gadgets, l, dzgc)
{
evas_object_del(dzgc->gadget);
zgs->gadgets = eina_list_prepend(zgs->gadgets, dzgc);
dzgc->site = zgs;
_gadget_object_create(dzgc);
}
}
}
}
}
Z_API Evas_Object *
z_gadget_site_add(Evas_Object *parent, Z_Gadget_Site_Orient orient)
{
@ -910,6 +1027,7 @@ z_gadget_site_add(Evas_Object *parent, Z_Gadget_Site_Orient orient)
zgs->events = evas_object_rectangle_add(evas_object_evas_get(parent));
evas_object_event_callback_add(zgs->layout, EVAS_CALLBACK_MOVE, _site_move, zgs);
evas_object_smart_callback_add(zgs->layout, "gadget_site_dropped", _site_drop, zgs);
evas_object_pointer_mode_set(zgs->events, EVAS_OBJECT_POINTER_MODE_NOGRAB);
evas_object_smart_member_add(zgs->events, zgs->layout);
evas_object_color_set(zgs->events, 0, 0, 0, 0);
@ -973,50 +1091,51 @@ z_gadget_site_gravity_get(Evas_Object *obj)
}
Z_API void
z_gadget_site_gadget_add(Evas_Object *obj, const char *type)
z_gadget_site_gravity_set(Evas_Object *obj, Z_Gadget_Site_Gravity gravity)
{
ZGS_GET(obj);
zgs->gravity = gravity;
evas_object_smart_need_recalculate_set(zgs->layout, 1);
}
Z_API Eina_List *
z_gadget_site_gadgets_list(Evas_Object *obj)
{
Eina_List *l, *list = NULL;
Z_Gadget_Config *zgc;
ZGS_GET(obj);
EINA_LIST_FOREACH(zgs->gadgets, l, zgc)
if (zgc->display)
list = eina_list_append(list, zgc->display);
return list;
}
Z_API void
z_gadget_site_gadget_add(Evas_Object *obj, const char *type, Eina_Bool demo)
{
char buf[1024];
Z_Gadget_Create_Cb cb;
Evas_Object *g;
Z_Gadget_Config *zgc;
int id = 0;
EINA_SAFETY_ON_NULL_RETURN(gadget_types);
ZGS_GET(obj);
strncpy(buf, type, sizeof(buf));
cb = eina_hash_find(gadget_types, buf);
EINA_SAFETY_ON_NULL_RETURN(cb);
/* if id is 0, gadget creates new config and returns id
* otherwise, config of `id` is applied to created object
*/
g = cb(obj, &id, zgs->orient);
EINA_SAFETY_ON_NULL_RETURN(g);
demo = !!demo;
id -= demo;
zgc = E_NEW(Z_Gadget_Config, 1);
zgc->e_obj_inherit = E_OBJECT_ALLOC(E_Object, Z_GADGET_TYPE, _gadget_object_free);
e_object_data_set(zgc->e_obj_inherit, g);
zgc->id = id;
zgc->type = eina_stringshare_add(buf);
zgc->gadget = zgc->display = g;
zgc->type = eina_stringshare_add(type);
zgc->x = -1;
zgc->y = -1;
zgc->site = zgs;
evas_object_data_set(g, "__z_gadget", zgc);
if (zgs->style_cb)
zgs->style_cb(zgs->layout, NULL, g);
evas_object_event_callback_add(g, EVAS_CALLBACK_DEL, _gadget_del, zgc);
zgs->gadgets = eina_list_append(zgs->gadgets, zgc);
_gadget_reparent(zgs, zgc);
evas_object_raise(zgs->events);
evas_object_smart_callback_call(obj, "gadget_added", g);
evas_object_smart_callback_call(obj, "gadget_gravity", g);
evas_object_show(zgc->display);
_gadget_object_create(zgc);
if (zgc->display)
{
zgc->site->gadgets = eina_list_append(zgc->site->gadgets, zgc);
return;
}
eina_stringshare_del(zgc->type);
free(zgc);
}
Z_API Evas_Object *
@ -1052,6 +1171,28 @@ z_gadget_configure(Evas_Object *g)
_gadget_configure(zgc);
}
Z_API Eina_Bool
z_gadget_has_wizard(Evas_Object *g)
{
Z_Gadget_Config *zgc;
EINA_SAFETY_ON_NULL_RETURN_VAL(g, EINA_FALSE);
zgc = evas_object_data_get(g, "__z_gadget");
EINA_SAFETY_ON_NULL_RETURN_VAL(zgc, EINA_FALSE);
return !!zgc->wizard;
}
Z_API Eina_Stringshare *
z_gadget_type_get(Evas_Object *g)
{
Z_Gadget_Config *zgc;
EINA_SAFETY_ON_NULL_RETURN_VAL(g, NULL);
zgc = evas_object_data_get(g, "__z_gadget");
EINA_SAFETY_ON_NULL_RETURN_VAL(zgc, NULL);
return zgc->type;
}
Z_API void
z_gadget_type_add(const char *type, Z_Gadget_Create_Cb callback)
{
@ -1082,6 +1223,12 @@ z_gadget_type_del(const char *type)
}
}
Z_API Eina_Iterator *
z_gadget_type_iterator_get(void)
{
return gadget_types ? eina_hash_iterator_key_new(gadget_types) : NULL;
}
Z_API Evas_Object *
z_gadget_util_layout_style_init(Evas_Object *g, Evas_Object *style)
{
@ -1103,12 +1250,19 @@ z_gadget_util_layout_style_init(Evas_Object *g, Evas_Object *style)
else
eina_stringshare_replace(&zgc->style.name, NULL);
zgc->display = style ?: zgc->gadget;
elm_box_pack_before(zgc->site->layout, zgc->display, prev ?: zgc->gadget);
if (prev)
elm_box_unpack(zgc->site->layout, prev);
E_FILL(zgc->display);
E_EXPAND(zgc->display);
if (zgc->site->gravity)
{
elm_box_pack_before(zgc->site->layout, zgc->display, prev ?: zgc->gadget);
if (prev)
elm_box_unpack(zgc->site->layout, prev);
}
evas_object_raise(zgc->site->events);
if (!style) return prev;
evas_object_data_set(style, "__z_gadget", zgc);
elm_layout_sizing_eval(style);
evas_object_smart_calculate(style);
evas_object_size_hint_min_get(style, &zgc->style.minw, &zgc->style.minh);

View File

@ -22,9 +22,9 @@ gadget_demo(void)
b = z_bryce_add(e_comp->elm);
site = z_bryce_site_get(b);
z_gadget_site_gadget_add(site, "Start");
z_gadget_site_gadget_add(site, "Clock");
z_gadget_site_gadget_add(site, "IBar");
z_gadget_site_gadget_add(site, "Start", 0);
z_gadget_site_gadget_add(site, "Clock", 0);
z_gadget_site_gadget_add(site, "IBar", 0);
z_bryce_autosize_set(b, 1);
z_bryce_autohide_set(b, 1);
}

View File

@ -41,16 +41,23 @@ Z_API Z_Gadget_Site_Anchor z_gadget_site_anchor_get(Evas_Object *obj);
Z_API void z_gadget_site_owner_setup(Evas_Object *obj, Z_Gadget_Site_Anchor an, Z_Gadget_Style_Cb cb);
Z_API Z_Gadget_Site_Orient z_gadget_site_orient_get(Evas_Object *obj);
Z_API Z_Gadget_Site_Gravity z_gadget_site_gravity_get(Evas_Object *obj);
Z_API void z_gadget_site_gadget_add(Evas_Object *obj, const char *type);
Z_API void z_gadget_site_gravity_set(Evas_Object *obj, Z_Gadget_Site_Gravity gravity);
Z_API void z_gadget_site_gadget_add(Evas_Object *obj, const char *type, Eina_Bool demo);
Z_API Eina_List *z_gadget_site_gadgets_list(Evas_Object *obj);
Z_API void z_gadget_configure_cb_set(Evas_Object *g, Z_Gadget_Configure_Cb cb);
Z_API void z_gadget_configure(Evas_Object *g);
Z_API Eina_Bool z_gadget_has_wizard(Evas_Object *g);
Z_API Evas_Object *z_gadget_site_get(Evas_Object *g);
Z_API Eina_Stringshare *z_gadget_type_get(Evas_Object *g);
Z_API void z_gadget_type_add(const char *type, Z_Gadget_Create_Cb callback);
Z_API void z_gadget_type_del(const char *type);
Z_API Eina_Iterator *z_gadget_type_iterator_get(void);
Z_API Evas_Object *z_gadget_util_layout_style_init(Evas_Object *g, Evas_Object *style);
Z_API Evas_Object *z_gadget_editor_add(Evas_Object *parent, Evas_Object *site);
#endif

154
src/gadgets/site_config.c Normal file
View File

@ -0,0 +1,154 @@
#include "e_mod_main.h"
#include "gadget.h"
typedef struct Gadget_Item
{
Evas_Object *editor;
Evas_Object *gadget;
Evas_Object *site;
} Gadget_Item;
static Evas_Object *pointer_site;
static Eina_List *handlers;
static void
_editor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
E_FREE_LIST(data, free);
}
static void
_editor_pointer_site_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
free(data);
}
static void
_editor_site_hints(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
{
int x, y, w, h;
evas_object_size_hint_min_get(obj, &w, &h);
evas_pointer_canvas_xy_get(e_comp->evas, &x, &y);
evas_object_geometry_set(pointer_site, x - (w / 2), y - (h / 2), w, h);
}
static Eina_Bool
_editor_pointer_button(Gadget_Item *active, int t EINA_UNUSED, Ecore_Event_Mouse_Button *ev)
{
if (ev->buttons == 1)
evas_object_smart_callback_call(active->site, "gadget_site_dropped", pointer_site);
evas_object_pass_events_set(active->site, 0);
elm_object_disabled_set(active->editor, 1);
E_FREE_FUNC(pointer_site, evas_object_del);
E_FREE_LIST(handlers, ecore_event_handler_del);
return ECORE_CALLBACK_RENEW;
}
static Eina_Bool
_editor_pointer_move(Gadget_Item *active EINA_UNUSED, int t EINA_UNUSED, Ecore_Event_Mouse_Move *ev)
{
int w, h;
evas_object_geometry_get(pointer_site, NULL, NULL, &w, &h);
evas_object_move(pointer_site, ev->x - (w / 2), ev->y - (h / 2));
return ECORE_CALLBACK_RENEW;
}
static void
_editor_gadget_new(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Gadget_Item *active, *gi = data;
Evas_Object *site;
Z_Gadget_Site_Orient orient;
int size;
orient = z_gadget_site_orient_get(gi->site);
pointer_site = site = z_gadget_site_add(e_comp->elm, orient);
if (orient == Z_GADGET_SITE_ORIENT_HORIZONTAL)
evas_object_geometry_get(gi->site, NULL, NULL, NULL, &size);
else if (orient == Z_GADGET_SITE_ORIENT_VERTICAL)
evas_object_geometry_get(gi->site, NULL, NULL, &size, NULL);
else
{} /* FIXME */
evas_object_resize(site, size, size);
evas_object_layer_set(site, E_LAYER_MENU);
evas_object_pass_events_set(site, 1);
evas_object_show(site);
active = E_NEW(Gadget_Item, 1);
active->editor = gi->editor;
active->site = gi->site;
evas_object_pass_events_set(active->site, 1);
evas_object_event_callback_add(site, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _editor_site_hints, active);
evas_object_event_callback_add(site, EVAS_CALLBACK_DEL, _editor_pointer_site_del, active);
E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_MOUSE_MOVE, _editor_pointer_move, active);
E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_MOUSE_BUTTON_DOWN, _editor_pointer_button, active);
z_gadget_site_gadget_add(site, z_gadget_type_get(gi->gadget), 0);
elm_object_disabled_set(gi->editor, 1);
elm_list_item_selected_set(event_info, 0);
}
static void
_editor_gadget_configure(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
}
Z_API Evas_Object *
z_gadget_editor_add(Evas_Object *parent, Evas_Object *site)
{
Evas_Object *list, *tempsite, *g;
Eina_Iterator *it;
Eina_List *gadgets, *items = NULL;
const char *type;
list = elm_list_add(parent);
E_EXPAND(list);
E_FILL(list);
elm_list_mode_set(list, ELM_LIST_COMPRESS);
elm_scroller_content_min_limit(list, 0, 1);
tempsite = z_gadget_site_add(list, Z_GADGET_SITE_ORIENT_HORIZONTAL);
z_gadget_site_gravity_set(tempsite, Z_GADGET_SITE_GRAVITY_NONE);
it = z_gadget_type_iterator_get();
/* FIXME: no types available */
EINA_ITERATOR_FOREACH(it, type)
z_gadget_site_gadget_add(tempsite, type, 1);
eina_iterator_free(it);
gadgets = z_gadget_site_gadgets_list(tempsite);
EINA_LIST_FREE(gadgets, g)
{
Evas_Object *box, *button = NULL;
char buf[1024];
Gadget_Item *gi;
gi = E_NEW(Gadget_Item, 1);
gi->editor = list;
gi->gadget = g;
gi->site = site;
items = eina_list_append(items, gi);
box = elm_box_add(list);
elm_box_horizontal_set(box, 1);
E_EXPAND(g);
E_FILL(g);
elm_box_pack_end(box, g);
evas_object_pass_events_set(g, 1);
if (z_gadget_has_wizard(g))
{
button = elm_button_add(list);
elm_object_text_set(button, "Configure...");
evas_object_smart_callback_add(button, "clicked", _editor_gadget_configure, gi);
evas_object_propagate_events_set(button, 0);
}
strncpy(buf, z_gadget_type_get(g), sizeof(buf) - 1);
buf[0] = toupper(buf[0]);
elm_list_item_append(list, buf, box, button, _editor_gadget_new, gi);
elm_box_recalculate(box);
}
evas_object_data_set(list, "__gadget_items", items);
evas_object_event_callback_add(list, EVAS_CALLBACK_DEL, _editor_del, items);
elm_list_go(list);
return list;
}