169 lines
5.5 KiB
C
169 lines
5.5 KiB
C
#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);
|
|
pointer_site = NULL;
|
|
E_FREE_LIST(handlers, ecore_event_handler_del);
|
|
}
|
|
|
|
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)
|
|
{
|
|
int x, y, w, h;
|
|
|
|
evas_object_geometry_get(active->site, &x, &y, &w, &h);
|
|
if ((ev->buttons == 1) && E_INSIDE(ev->x, ev->y, x, y, w, h))
|
|
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_comp_object_util_del_list_remove(active->editor, pointer_site);
|
|
E_FREE_FUNC(pointer_site, evas_object_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, *rect;
|
|
Z_Gadget_Site_Orient orient;
|
|
int size;
|
|
|
|
orient = z_gadget_site_orient_get(gi->site);
|
|
|
|
pointer_site = site = z_gadget_site_add(orient, NULL);
|
|
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
|
|
size = 96 * e_scale;
|
|
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;
|
|
e_comp_object_util_del_list_append(gi->editor, pointer_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);
|
|
|
|
rect = evas_object_rectangle_add(e_comp->evas);
|
|
evas_object_resize(rect, e_comp->w, e_comp->h);
|
|
evas_object_color_set(rect, 0, 0, 0, 0);
|
|
evas_object_layer_set(rect, E_LAYER_MENU + 1);
|
|
e_comp_object_util_del_list_append(pointer_site, rect);
|
|
evas_object_show(rect);
|
|
|
|
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, 1, 1);
|
|
tempsite = z_gadget_site_add(Z_GADGET_SITE_ORIENT_HORIZONTAL, NULL);
|
|
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;
|
|
}
|