add frame object selection ability - broke move of the framed "ibar" test.

need to fix framed gadcon clients to account for frame size.


SVN revision: 21807
This commit is contained in:
Carsten Haitzler 2006-04-04 15:42:25 +00:00
parent 5828935a95
commit cc6b6a326c
8 changed files with 291 additions and 212 deletions

View File

@ -1,6 +1,8 @@
images { images {
image: "e17_shelf_bg_h.png" COMP; image: "e17_shelf_bg_h.png" COMP;
image: "e17_shelf_sh_h.png" COMP; image: "e17_shelf_sh_h.png" COMP;
image: "e17_ibar_bg_h.png" COMP;
image: "e17_ibar_over_h.png" COMP;
} }
group { group {
@ -112,3 +114,76 @@ group {
} }
} }
} }
group {
name: "shelf/default/inset";
parts {
part {
name: "background";
mouse_events: 0;
description {
state: "default" 0.0;
rel1 {
to: "overlay";
}
rel2 {
to: "overlay";
}
image {
normal: "e17_ibar_bg_h.png";
border: 6 6 6 6;
}
fill {
smooth: 0;
}
}
}
part {
name: "items_clip";
type: RECT;
mouse_events: 0;
description {
state: "default" 0.0;
rel1 {
to: "background";
offset: 4 4;
}
rel2 {
to: "background";
offset: -5 -5;
}
color: 255 255 255 255;
}
}
part {
name: "items";
type: SWALLOW;
mouse_events: 0;
clip_to: "items_clip";
description {
state: "default" 0.0;
rel1 {
offset: 4 4;
}
rel2 {
offset: -5 -5;
}
color: 0 0 0 0;
}
}
part {
name: "overlay";
mouse_events: 0;
description {
state: "default" 0.0;
image {
normal: "e17_ibar_over_h.png";
border: 13 13 13 13;
middle: 0;
}
fill {
smooth: 0;
}
}
}
}
}

View File

@ -38,7 +38,6 @@ static E_Config_DD *_e_config_color_class_edd = NULL;
static E_Config_DD *_e_config_gadcon_edd = NULL; static E_Config_DD *_e_config_gadcon_edd = NULL;
static E_Config_DD *_e_config_gadcon_client_edd = NULL; static E_Config_DD *_e_config_gadcon_client_edd = NULL;
static E_Config_DD *_e_config_shelf_edd = NULL; static E_Config_DD *_e_config_shelf_edd = NULL;
static E_Config_DD *_e_config_shelf_config_edd = NULL;
/* externally accessible functions */ /* externally accessible functions */
@ -90,6 +89,8 @@ e_config_init(void)
E_CONFIG_VAL(D, T, geom.pos, INT); E_CONFIG_VAL(D, T, geom.pos, INT);
E_CONFIG_VAL(D, T, geom.size, INT); E_CONFIG_VAL(D, T, geom.size, INT);
E_CONFIG_VAL(D, T, geom.res, INT); E_CONFIG_VAL(D, T, geom.res, INT);
E_CONFIG_VAL(D, T, style, STR);
E_CONFIG_VAL(D, T, autoscroll, UCHAR);
_e_config_gadcon_edd = E_CONFIG_DD_NEW("E_Config_Gadcon", E_Config_Gadcon); _e_config_gadcon_edd = E_CONFIG_DD_NEW("E_Config_Gadcon", E_Config_Gadcon);
#undef T #undef T
@ -100,22 +101,6 @@ e_config_init(void)
E_CONFIG_VAL(D, T, id, STR); E_CONFIG_VAL(D, T, id, STR);
E_CONFIG_LIST(D, T, clients, _e_config_gadcon_client_edd); E_CONFIG_LIST(D, T, clients, _e_config_gadcon_client_edd);
_e_config_shelf_config_edd = E_CONFIG_DD_NEW("E_Config_Shelf_Config", E_Config_Shelf_Config);
#undef T
#undef D
#define T E_Config_Shelf_Config
#define D _e_config_shelf_config_edd
E_CONFIG_VAL(D, T, res.w, INT);
E_CONFIG_VAL(D, T, res.h, INT);
E_CONFIG_VAL(D, T, x, INT);
E_CONFIG_VAL(D, T, y, INT);
E_CONFIG_VAL(D, T, w, INT);
E_CONFIG_VAL(D, T, h, INT);
E_CONFIG_VAL(D, T, orient, INT);
E_CONFIG_VAL(D, T, style, STR);
E_CONFIG_VAL(D, T, fit_along, UCHAR);
E_CONFIG_VAL(D, T, fit_size, UCHAR);
_e_config_shelf_edd = E_CONFIG_DD_NEW("E_Config_Shelf", E_Config_Shelf); _e_config_shelf_edd = E_CONFIG_DD_NEW("E_Config_Shelf", E_Config_Shelf);
#undef T #undef T
#undef D #undef D
@ -126,7 +111,11 @@ e_config_init(void)
E_CONFIG_VAL(D, T, zone, INT); E_CONFIG_VAL(D, T, zone, INT);
E_CONFIG_VAL(D, T, layer, INT); E_CONFIG_VAL(D, T, layer, INT);
E_CONFIG_VAL(D, T, popup, UCHAR); E_CONFIG_VAL(D, T, popup, UCHAR);
E_CONFIG_LIST(D, T, configs, _e_config_shelf_config_edd); E_CONFIG_VAL(D, T, orient, INT);
E_CONFIG_VAL(D, T, fit_along, UCHAR);
E_CONFIG_VAL(D, T, fit_size, UCHAR);
E_CONFIG_VAL(D, T, style, STR);
E_CONFIG_VAL(D, T, size, INT);
_e_config_desktop_bg_edd = E_CONFIG_DD_NEW("E_Config_Desktop_Background", E_Config_Desktop_Background); _e_config_desktop_bg_edd = E_CONFIG_DD_NEW("E_Config_Desktop_Background", E_Config_Desktop_Background);
#undef T #undef T
@ -1026,10 +1015,14 @@ e_config_init(void)
E_BINDING_MODIFIER_ALT, 0, E_BINDING_MODIFIER_ALT, 0,
"desk_linear_flip_by", "1"); "desk_linear_flip_by", "1");
} }
IFCFGEND;
/* yes - this causes a small leak - i know. it is for testing temporarily x*/
e_config->shelves = NULL;
e_config->gadcons = NULL;
// IFCFG(0x008e); /* the version # where this value(s) was introduced */
#if 1 // this is liable to change #if 1 // this is liable to change
{ {
E_Config_Shelf *cf_es; E_Config_Shelf *cf_es;
E_Config_Shelf_Config *cf_escf;
cf_es = E_NEW(E_Config_Shelf, 1); cf_es = E_NEW(E_Config_Shelf, 1);
cf_es->name = evas_stringshare_add("shelf"); cf_es->name = evas_stringshare_add("shelf");
@ -1037,20 +1030,12 @@ e_config_init(void)
cf_es->zone = 0; cf_es->zone = 0;
cf_es->popup = 1; cf_es->popup = 1;
cf_es->layer = 200; cf_es->layer = 200;
cf_es->orient = E_GADCON_ORIENT_TOP;
cf_es->fit_along = 1;
cf_es->fit_size = 0;
cf_es->style = evas_stringshare_add("default");
cf_es->size = 40;
e_config->shelves = evas_list_append(e_config->shelves, cf_es); e_config->shelves = evas_list_append(e_config->shelves, cf_es);
cf_escf = E_NEW(E_Config_Shelf_Config, 1);
cf_escf->res.w = 800;
cf_escf->res.h = 600;
cf_escf->x = 0;
cf_escf->y = 0;
cf_escf->w = 800;
cf_escf->h = 40;
cf_escf->orient = E_GADCON_ORIENT_TOP;
cf_escf->fit_along = 1;
cf_escf->fit_size = 0;
cf_escf->style = evas_stringshare_add("default");
cf_es->configs = evas_list_append(cf_es->configs, cf_escf);
} }
{ {
E_Config_Gadcon *cf_gc; E_Config_Gadcon *cf_gc;
@ -1067,6 +1052,8 @@ e_config_init(void)
cf_gcc->geom.res = 800; cf_gcc->geom.res = 800;
cf_gcc->geom.size = 200; cf_gcc->geom.size = 200;
cf_gcc->geom.pos = 400 - (cf_gcc->geom.size / 2); cf_gcc->geom.pos = 400 - (cf_gcc->geom.size / 2);
cf_gcc->style = evas_stringshare_add("inset");
cf_gcc->autoscroll = 0;
cf_gc->clients = evas_list_append(cf_gc->clients, cf_gcc); cf_gc->clients = evas_list_append(cf_gc->clients, cf_gcc);
cf_gcc = E_NEW(E_Config_Gadcon_Client, 1); cf_gcc = E_NEW(E_Config_Gadcon_Client, 1);
@ -1075,6 +1062,8 @@ e_config_init(void)
cf_gcc->geom.res = 800; cf_gcc->geom.res = 800;
cf_gcc->geom.size = 32; cf_gcc->geom.size = 32;
cf_gcc->geom.pos = 800 - (cf_gcc->geom.size); cf_gcc->geom.pos = 800 - (cf_gcc->geom.size);
cf_gcc->style = NULL;
cf_gcc->autoscroll = 0;
cf_gc->clients = evas_list_append(cf_gc->clients, cf_gcc); cf_gc->clients = evas_list_append(cf_gc->clients, cf_gcc);
cf_gcc = E_NEW(E_Config_Gadcon_Client, 1); cf_gcc = E_NEW(E_Config_Gadcon_Client, 1);
@ -1083,10 +1072,12 @@ e_config_init(void)
cf_gcc->geom.res = 800; cf_gcc->geom.res = 800;
cf_gcc->geom.size = 32; cf_gcc->geom.size = 32;
cf_gcc->geom.pos = 0; cf_gcc->geom.pos = 0;
cf_gcc->style = NULL;
cf_gcc->autoscroll = 0;
cf_gc->clients = evas_list_append(cf_gc->clients, cf_gcc); cf_gc->clients = evas_list_append(cf_gc->clients, cf_gcc);
} }
#endif #endif
IFCFGEND; // IFCFGEND;
#if 0 /* example of new config */ #if 0 /* example of new config */
IFCFG(0x008e); /* the version # where this value(s) was introduced */ IFCFG(0x008e); /* the version # where this value(s) was introduced */
@ -1201,7 +1192,6 @@ e_config_shutdown(void)
E_CONFIG_DD_FREE(_e_config_gadcon_edd); E_CONFIG_DD_FREE(_e_config_gadcon_edd);
E_CONFIG_DD_FREE(_e_config_gadcon_client_edd); E_CONFIG_DD_FREE(_e_config_gadcon_client_edd);
E_CONFIG_DD_FREE(_e_config_shelf_edd); E_CONFIG_DD_FREE(_e_config_shelf_edd);
E_CONFIG_DD_FREE(_e_config_shelf_config_edd);
return 1; return 1;
} }

View File

@ -36,7 +36,6 @@ typedef struct _E_Config_Desktop_Name E_Config_Desktop_Name;
typedef struct _E_Config_Gadcon E_Config_Gadcon; typedef struct _E_Config_Gadcon E_Config_Gadcon;
typedef struct _E_Config_Gadcon_Client E_Config_Gadcon_Client; typedef struct _E_Config_Gadcon_Client E_Config_Gadcon_Client;
typedef struct _E_Config_Shelf E_Config_Shelf; typedef struct _E_Config_Shelf E_Config_Shelf;
typedef struct _E_Config_Shelf_Config E_Config_Shelf_Config;
typedef Eet_Data_Descriptor E_Config_DD; typedef Eet_Data_Descriptor E_Config_DD;
@ -316,6 +315,8 @@ struct _E_Config_Gadcon_Client
struct { struct {
int pos, size, res; int pos, size, res;
} geom; } geom;
const char *style;
unsigned char autoscroll;
}; };
struct _E_Config_Shelf struct _E_Config_Shelf
@ -324,19 +325,11 @@ struct _E_Config_Shelf
int container, zone; int container, zone;
int layer; int layer;
unsigned char popup; unsigned char popup;
Evas_List *configs;
};
struct _E_Config_Shelf_Config
{
struct {
int w, h;
} res;
int x, y, w, h;
int orient; int orient;
const char *style;
unsigned char fit_along; unsigned char fit_along;
unsigned char fit_size; unsigned char fit_size;
const char *style;
int size;
}; };
EAPI int e_config_init(void); EAPI int e_config_init(void);

View File

@ -8,7 +8,7 @@ static void _e_gadcon_client_free(E_Gadcon_Client *gcc);
static void _e_gadcon_client_save(E_Gadcon_Client *gcc); static void _e_gadcon_client_save(E_Gadcon_Client *gcc);
static void _e_gadcon_cb_size_request(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_gadcon_cb_size_request(void *data, Evas_Object *obj, void *event_info);
static void _e_gadcon_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info); static void _e_gadcon_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info);
static void _e_gadcon_cb_mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event_info); static void _e_gadcon_cb_mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event_info);
static void _e_gadcon_cb_mouse_in(void *data, Evas *evas, Evas_Object *obj, void *event_info); static void _e_gadcon_cb_mouse_in(void *data, Evas *evas, Evas_Object *obj, void *event_info);
@ -51,17 +51,17 @@ static Evas_Hash *providers = NULL;
static Evas_List *gadcons = NULL; static Evas_List *gadcons = NULL;
static E_Gadcon_Client * static E_Gadcon_Client *
__test(E_Gadcon *gc, char *name, char *id) __test(E_Gadcon *gc, char *name, char *id, char *style)
{ {
Evas_Object *o; Evas_Object *o;
E_Gadcon_Client *gcc; E_Gadcon_Client *gcc;
printf("create gadcon client \"%s\" \"%s\" for \"%s\" \"%s\"\n", printf("create gadcon client \"%s\" \"%s\" \"%s\" for \"%s\" \"%s\"\n",
name, id, name, id, style,
gc->name, gc->id); gc->name, gc->id);
o = evas_object_rectangle_add(gc->evas); o = evas_object_rectangle_add(gc->evas);
evas_object_color_set(o, rand() & 0xff, rand() & 0xff, rand() & 0xff, 150); evas_object_color_set(o, rand() & 0xff, rand() & 0xff, rand() & 0xff, 150);
gcc = e_gadcon_client_new(gc, name, id, o); gcc = e_gadcon_client_new(gc, name, id, style, o);
gcc->data = NULL; // this is where a module would hook private data gcc->data = NULL; // this is where a module would hook private data
return gcc; return gcc;
} }
@ -181,6 +181,16 @@ e_gadcon_size_request_callback_set(E_Gadcon *gc, void (*func) (void *data, E_Gad
gc->resize_request.data = data; gc->resize_request.data = data;
} }
EAPI void
e_gadcon_frame_request_callback_set(E_Gadcon *gc, Evas_Object *(*func) (void *data, E_Gadcon_Client *gcc, const char *style), void *data)
{
E_OBJECT_CHECK(gc);
E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
gc->frame_request.func = func;
gc->frame_request.data = data;
}
EAPI void EAPI void
e_gadcon_layout_policy_set(E_Gadcon *gc, E_Gadcon_Layout_Policy layout_policy) e_gadcon_layout_policy_set(E_Gadcon *gc, E_Gadcon_Layout_Policy layout_policy)
{ {
@ -227,17 +237,24 @@ e_gadcon_populate(E_Gadcon *gc)
{ {
E_Gadcon_Client *gcc; E_Gadcon_Client *gcc;
gcc = cc->func.init(gc, cf_gcc->name, cf_gcc->id); gcc = cc->func.init(gc, cf_gcc->name, cf_gcc->id,
cf_gcc->style);
if (gcc) if (gcc)
{ {
gcc->client_class = *cc; gcc->client_class = *cc;
gcc->config.pos = cf_gcc->geom.pos; gcc->config.pos = cf_gcc->geom.pos;
gcc->config.size = cf_gcc->geom.size; gcc->config.size = cf_gcc->geom.size;
gcc->config.res = cf_gcc->geom.res; gcc->config.res = cf_gcc->geom.res;
e_gadcon_layout_pack_options_set(gcc->o_base, if (gcc->o_frame)
gcc->config.pos, e_gadcon_layout_pack_options_set(gcc->o_frame,
gcc->config.size, gcc->config.pos,
gcc->config.res); gcc->config.size,
gcc->config.res);
else
e_gadcon_layout_pack_options_set(gcc->o_base,
gcc->config.pos,
gcc->config.size,
gcc->config.res);
if (gcc->client_class.func.orient) if (gcc->client_class.func.orient)
gcc->client_class.func.orient(gcc); gcc->client_class.func.orient(gcc);
} }
@ -372,7 +389,7 @@ e_gadcon_canvas_zone_geometry_get(E_Gadcon *gc, int *x, int *y, int *w, int *h)
} }
EAPI E_Gadcon_Client * EAPI E_Gadcon_Client *
e_gadcon_client_new(E_Gadcon *gc, char *name, char *id, Evas_Object *base_obj) e_gadcon_client_new(E_Gadcon *gc, char *name, char *id, char *style, Evas_Object *base_obj)
{ {
E_Gadcon_Client *gcc; E_Gadcon_Client *gcc;
@ -385,7 +402,20 @@ e_gadcon_client_new(E_Gadcon *gc, char *name, char *id, Evas_Object *base_obj)
gcc->name = evas_stringshare_add(name); gcc->name = evas_stringshare_add(name);
gcc->id = evas_stringshare_add(id); gcc->id = evas_stringshare_add(id);
gc->clients = evas_list_append(gc->clients, gcc); gc->clients = evas_list_append(gc->clients, gcc);
e_gadcon_layout_pack(gc->o_container, gcc->o_base); if ((gc->frame_request.func) && (style))
{
gcc->o_frame = gc->frame_request.func(gc->frame_request.data, gcc,
style);
if (gcc->o_frame)
{
edje_object_part_swallow(gcc->o_frame, "items", gcc->o_base);
evas_object_show(gcc->o_frame);
}
}
if (gcc->o_frame)
e_gadcon_layout_pack(gc->o_container, gcc->o_frame);
else
e_gadcon_layout_pack(gc->o_container, gcc->o_base);
evas_object_show(gcc->o_base); evas_object_show(gcc->o_base);
return gcc; return gcc;
} }
@ -402,7 +432,10 @@ e_gadcon_client_edit_begin(E_Gadcon_Client *gcc)
gcc->o_control = edje_object_add(gcc->gadcon->evas); gcc->o_control = edje_object_add(gcc->gadcon->evas);
evas_object_layer_set(gcc->o_control, 100); evas_object_layer_set(gcc->o_control, 100);
evas_object_geometry_get(gcc->o_base, &x, &y, &w, &h); if (gcc->o_frame)
evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h);
else
evas_object_geometry_get(gcc->o_base, &x, &y, &w, &h);
evas_object_move(gcc->o_control, x, y); evas_object_move(gcc->o_control, x, y);
evas_object_resize(gcc->o_control, w, h); evas_object_resize(gcc->o_control, w, h);
e_theme_edje_object_set(gcc->o_control, "base/theme/gadman", e_theme_edje_object_set(gcc->o_control, "base/theme/gadman",
@ -467,6 +500,10 @@ e_gadcon_client_edit_end(E_Gadcon_Client *gcc)
{ {
E_OBJECT_CHECK(gcc); E_OBJECT_CHECK(gcc);
E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE); E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
evas_object_event_callback_del(gcc->o_base, EVAS_CALLBACK_MOVE, _e_gadcon_cb_move);
evas_object_event_callback_del(gcc->o_base, EVAS_CALLBACK_RESIZE, _e_gadcon_cb_resize);
if (gcc->moving) if (gcc->moving)
{ {
gcc->moving = 0; gcc->moving = 0;
@ -488,12 +525,18 @@ e_gadcon_client_size_request(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h)
case E_GADCON_ORIENT_HORIZ: case E_GADCON_ORIENT_HORIZ:
case E_GADCON_ORIENT_TOP: case E_GADCON_ORIENT_TOP:
case E_GADCON_ORIENT_BOTTOM: case E_GADCON_ORIENT_BOTTOM:
e_gadcon_layout_pack_size_set(gcc->o_base, w); if (gcc->o_frame)
e_gadcon_layout_pack_size_set(gcc->o_frame, w);
else
e_gadcon_layout_pack_size_set(gcc->o_base, w);
break; break;
case E_GADCON_ORIENT_VERT: case E_GADCON_ORIENT_VERT:
case E_GADCON_ORIENT_LEFT: case E_GADCON_ORIENT_LEFT:
case E_GADCON_ORIENT_RIGHT: case E_GADCON_ORIENT_RIGHT:
e_gadcon_layout_pack_size_set(gcc->o_base, h); if (gcc->o_frame)
e_gadcon_layout_pack_size_set(gcc->o_frame, h);
else
e_gadcon_layout_pack_size_set(gcc->o_base, h);
break; break;
case E_GADCON_ORIENT_FLOAT: case E_GADCON_ORIENT_FLOAT:
case E_GADCON_ORIENT_CORNER_TL: case E_GADCON_ORIENT_CORNER_TL:
@ -510,7 +553,10 @@ e_gadcon_client_min_size_set(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h)
{ {
E_OBJECT_CHECK(gcc); E_OBJECT_CHECK(gcc);
E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE); E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
e_gadcon_layout_pack_min_size_set(gcc->o_base, w, h); if (gcc->o_frame)
e_gadcon_layout_pack_min_size_set(gcc->o_frame, w, h);
else
e_gadcon_layout_pack_min_size_set(gcc->o_base, w, h);
} }
EAPI void EAPI void
@ -518,7 +564,10 @@ e_gadcon_client_aspect_set(E_Gadcon_Client *gcc, int w, int h)
{ {
E_OBJECT_CHECK(gcc); E_OBJECT_CHECK(gcc);
E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE); E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
e_gadcon_layout_pack_aspect_set(gcc->o_base, w, h); if (gcc->o_frame)
e_gadcon_layout_pack_aspect_set(gcc->o_frame, w, h);
else
e_gadcon_layout_pack_aspect_set(gcc->o_base, w, h);
} }
/* local subsystem functions */ /* local subsystem functions */
@ -536,7 +585,9 @@ _e_gadcon_free(E_Gadcon *gc)
static void static void
_e_gadcon_client_free(E_Gadcon_Client *gcc) _e_gadcon_client_free(E_Gadcon_Client *gcc)
{ {
e_gadcon_client_edit_end(gcc);
gcc->gadcon->clients = evas_list_remove(gcc->gadcon->clients, gcc); gcc->gadcon->clients = evas_list_remove(gcc->gadcon->clients, gcc);
if (gcc->o_frame) evas_object_del(gcc->o_frame);
evas_stringshare_del(gcc->name); evas_stringshare_del(gcc->name);
evas_stringshare_del(gcc->id); evas_stringshare_del(gcc->id);
free(gcc); free(gcc);
@ -598,7 +649,7 @@ _e_gadcon_client_save(E_Gadcon_Client *gcc)
} }
static void static void
_e_gadcon_cb_size_request(void *data, Evas *e, Evas_Object *obj, void *event_info) _e_gadcon_cb_size_request(void *data, Evas_Object *obj, void *event_info)
{ {
E_Gadcon *gc; E_Gadcon *gc;
@ -722,7 +773,10 @@ _e_gadcon_cb_signal_move_go(void *data, Evas_Object *obj, const char *emission,
evas_object_geometry_get(gcc->o_base, NULL, NULL, &w, &h); evas_object_geometry_get(gcc->o_base, NULL, NULL, &w, &h);
if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container)) if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
{ {
e_gadcon_layout_pack_request_set(gcc->o_base, gcc->sx + x, w); if (gcc->o_frame)
e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->sx + x, w);
else
e_gadcon_layout_pack_request_set(gcc->o_base, gcc->sx + x, w);
gcc->config.pos = gcc->sx + x; gcc->config.pos = gcc->sx + x;
gcc->config.size = w; gcc->config.size = w;
evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h); evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
@ -730,7 +784,10 @@ _e_gadcon_cb_signal_move_go(void *data, Evas_Object *obj, const char *emission,
} }
else else
{ {
e_gadcon_layout_pack_request_set(gcc->o_base, gcc->sy + y, h); if (gcc->o_frame)
e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->sy + y, h);
else
e_gadcon_layout_pack_request_set(gcc->o_base, gcc->sy + y, h);
gcc->config.pos = gcc->sy + y; gcc->config.pos = gcc->sy + y;
gcc->config.size = h; gcc->config.size = h;
evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h); evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
@ -947,12 +1004,17 @@ static void
e_gadcon_layout_min_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) e_gadcon_layout_min_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
{ {
E_Smart_Data *sd; E_Smart_Data *sd;
/*
Evas_List *l; Evas_List *l;
Evas_Coord tw = 0, th = 0; Evas_Coord tw = 0, th = 0;
*/
sd = evas_object_smart_data_get(obj); sd = evas_object_smart_data_get(obj);
if (!sd) return; if (!sd) return;
if (w) *w = sd->minw;
if (h) *h = sd->minh;
/*
for (l = sd->items; l; l = l->next) for (l = sd->items; l; l = l->next)
{ {
E_Gadcon_Layout_Item *bi; E_Gadcon_Layout_Item *bi;
@ -973,6 +1035,7 @@ e_gadcon_layout_min_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
} }
if (w) *w = tw; if (w) *w = tw;
if (h) *h = th; if (h) *h = th;
*/
} }
static void static void
@ -1266,10 +1329,14 @@ _e_gadcon_layout_smart_reconfigure(E_Smart_Data *sd)
if (sd->horizontal) if (sd->horizontal)
{ {
bi->ask.size2 = (h * bi->aspect.w) / bi->aspect.h; bi->ask.size2 = (h * bi->aspect.w) / bi->aspect.h;
if (bi->ask.size2 > bi->min.w)
min += (bi->ask.size2 - bi->min.w);
} }
else else
{ {
bi->ask.size2 = (w * bi->aspect.h) / bi->aspect.w; bi->ask.size2 = (w * bi->aspect.h) / bi->aspect.w;
if (bi->ask.size2 > bi->min.h)
min += (bi->ask.size2 - bi->min.h);
} }
} }
} }

View File

@ -62,6 +62,10 @@ struct _E_Gadcon
void (*func) (void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h); void (*func) (void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h);
void *data; void *data;
} resize_request; } resize_request;
struct {
Evas_Object *(*func) (void *data, E_Gadcon_Client *gcc, const char *style);
void *data;
} frame_request;
}; };
#define GADCON_CLIENT_CLASS_VERSION 1 #define GADCON_CLIENT_CLASS_VERSION 1
@ -70,7 +74,7 @@ struct _E_Gadcon_Client_Class
int version; int version;
char *name; char *name;
struct { struct {
E_Gadcon_Client *(*init) (E_Gadcon *gc, char *name, char *id); E_Gadcon_Client *(*init) (E_Gadcon *gc, char *name, char *id, char *style);
void (*shutdown) (E_Gadcon_Client *gcc); void (*shutdown) (E_Gadcon_Client *gcc);
void (*orient) (E_Gadcon_Client *gcc); void (*orient) (E_Gadcon_Client *gcc);
} func; } func;
@ -83,6 +87,7 @@ struct _E_Gadcon_Client
char *name; char *name;
char *id; char *id;
Evas_Object *o_base; Evas_Object *o_base;
Evas_Object *o_frame;
Evas_Object *o_control; Evas_Object *o_control;
Evas_Object *o_event; Evas_Object *o_event;
E_Gadcon_Client_Class client_class; E_Gadcon_Client_Class client_class;
@ -102,6 +107,7 @@ EAPI void e_gadcon_provider_unregister(E_Gadcon_Client_Class *cc);
EAPI E_Gadcon *e_gadcon_swallowed_new(const char *name, char *id, Evas_Object *obj, char *swallow_name); EAPI E_Gadcon *e_gadcon_swallowed_new(const char *name, char *id, Evas_Object *obj, char *swallow_name);
EAPI void e_gadcon_swallowed_min_size_set(E_Gadcon *gc, Evas_Coord w, Evas_Coord h); EAPI void e_gadcon_swallowed_min_size_set(E_Gadcon *gc, Evas_Coord w, Evas_Coord h);
EAPI void e_gadcon_size_request_callback_set(E_Gadcon *gc, void (*func) (void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h), void *data); EAPI void e_gadcon_size_request_callback_set(E_Gadcon *gc, void (*func) (void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h), void *data);
EAPI void e_gadcon_frame_request_callback_set(E_Gadcon *gc, Evas_Object *(*func) (void *data, E_Gadcon_Client *gcc, const char *style), void *data);
EAPI void e_gadcon_layout_policy_set(E_Gadcon *gc, E_Gadcon_Layout_Policy layout_policy); EAPI void e_gadcon_layout_policy_set(E_Gadcon *gc, E_Gadcon_Layout_Policy layout_policy);
EAPI void e_gadcon_populate(E_Gadcon *gc); EAPI void e_gadcon_populate(E_Gadcon *gc);
EAPI void e_gadcon_orient(E_Gadcon *gc, E_Gadcon_Orient orient); EAPI void e_gadcon_orient(E_Gadcon *gc, E_Gadcon_Orient orient);
@ -114,7 +120,7 @@ EAPI E_Zone *e_gadcon_zone_get(E_Gadcon *gc);
EAPI void e_gadcon_ecore_evas_set(E_Gadcon *gc, Ecore_Evas *ee); EAPI void e_gadcon_ecore_evas_set(E_Gadcon *gc, Ecore_Evas *ee);
EAPI int e_gadcon_canvas_zone_geometry_get(E_Gadcon *gc, int *x, int *y, int *w, int *h); EAPI int e_gadcon_canvas_zone_geometry_get(E_Gadcon *gc, int *x, int *y, int *w, int *h);
EAPI E_Gadcon_Client *e_gadcon_client_new(E_Gadcon *gc, char *name, char *id, Evas_Object *base_obj); EAPI E_Gadcon_Client *e_gadcon_client_new(E_Gadcon *gc, char *name, char *id, char *style, Evas_Object *base_obj);
EAPI void e_gadcon_client_size_request(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h); EAPI void e_gadcon_client_size_request(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h);
EAPI void e_gadcon_client_min_size_set(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h); EAPI void e_gadcon_client_min_size_set(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h);
EAPI void e_gadcon_client_aspect_set(E_Gadcon_Client *gcc, int w, int h); EAPI void e_gadcon_client_aspect_set(E_Gadcon_Client *gcc, int w, int h);

View File

@ -4,8 +4,9 @@
#include "e.h" #include "e.h"
static void _e_shelf_free(E_Shelf *es); static void _e_shelf_free(E_Shelf *es);
static void _e_shelf_config_port(E_Config_Shelf_Config *cf1, E_Config_Shelf_Config *cf2); static void _e_shelf_position_calc(E_Shelf *es);
static void _e_shelf_gadcon_size_request(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h); static void _e_shelf_gadcon_size_request(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h);
static Evas_Object *_e_shelf_gadcon_frame_request(void *data, E_Gadcon_Client *gcc, const char *style);
static Evas_List *shelves = NULL; static Evas_List *shelves = NULL;
static int shelf_id = 0; static int shelf_id = 0;
@ -38,7 +39,6 @@ e_shelf_config_init(void)
for (l = e_config->shelves; l; l = l->next) for (l = e_config->shelves; l; l = l->next)
{ {
E_Config_Shelf *cf_es; E_Config_Shelf *cf_es;
E_Config_Shelf_Config *cf_escf, *cf_escf2;
E_Zone *zone; E_Zone *zone;
int closeness; int closeness;
@ -46,60 +46,17 @@ e_shelf_config_init(void)
zone = e_util_container_zone_number_get(cf_es->container, cf_es->zone); zone = e_util_container_zone_number_get(cf_es->container, cf_es->zone);
if (zone) if (zone)
{ {
cf_escf2 = NULL; E_Shelf *es;
closeness = 0x7fffffff;
for (l2 = cf_es->configs; l2; l2 = l2->next) es = e_shelf_zone_new(zone, cf_es->name, cf_es->style,
cf_es->popup, cf_es->layer);
if (es)
{ {
cf_escf = l2->data; es->cfg = cf_es;
if ((cf_escf->res.w == zone->w) && e_shelf_orient(es, cf_es->orient);
(cf_escf->res.h == zone->h)) _e_shelf_position_calc(es);
{ e_shelf_populate(es);
cf_escf2 = cf_escf; e_shelf_show(es);
closeness = 0;
break;
}
else
{
int difx, dify;
difx = cf_escf->res.w - zone->w;
if (difx < 0) difx = -difx;
dify = cf_escf->res.h - zone->h;
if (dify < 0) dify = -dify;
difx = difx * dify;
if (difx < closeness)
{
closeness = difx;
cf_escf2 = cf_escf;
}
}
}
if ((closeness != 0) && (cf_escf2))
{
cf_escf = E_NEW(E_Config_Shelf_Config, 1);
cf_escf->res.w = zone->w;
cf_escf->res.h = zone->h;
cf_escf->orient = cf_escf2->orient;
cf_escf->style = evas_stringshare_add(cf_escf2->style);
_e_shelf_config_port(cf_escf2, cf_escf);
cf_escf2 = cf_escf;
e_config_save_queue();
}
if (cf_escf2)
{
E_Shelf *es;
es = e_shelf_zone_new(zone, cf_es->name, cf_escf2->style,
cf_es->popup, cf_es->layer);
if (es)
{
es->cfg = cf_es;
e_shelf_move_resize(es, cf_escf2->x, cf_escf2->y,
cf_escf2->w, cf_escf2->h);
e_shelf_orient(es, cf_escf2->orient);
e_shelf_populate(es);
e_shelf_show(es);
}
} }
} }
} }
@ -156,8 +113,12 @@ e_shelf_zone_new(E_Zone *zone, const char *name, const char *style, int popup, i
snprintf(buf, sizeof(buf), "%i", shelf_id); snprintf(buf, sizeof(buf), "%i", shelf_id);
shelf_id++; shelf_id++;
es->gadcon = e_gadcon_swallowed_new(es->name, buf, es->o_base, "items"); es->gadcon = e_gadcon_swallowed_new(es->name, buf, es->o_base, "items");
e_gadcon_size_request_callback_set(es->gadcon, _e_shelf_gadcon_size_request, e_gadcon_size_request_callback_set(es->gadcon,
_e_shelf_gadcon_size_request,
es); es);
e_gadcon_frame_request_callback_set(es->gadcon,
_e_shelf_gadcon_frame_request,
es);
e_gadcon_orient(es->gadcon, E_GADCON_ORIENT_TOP); e_gadcon_orient(es->gadcon, E_GADCON_ORIENT_TOP);
edje_object_signal_emit(es->o_base, "set_orientation", "top"); edje_object_signal_emit(es->o_base, "set_orientation", "top");
e_gadcon_zone_set(es->gadcon, zone); e_gadcon_zone_set(es->gadcon, zone);
@ -266,42 +227,13 @@ e_shelf_save(E_Shelf *es)
E_OBJECT_TYPE_CHECK(es, E_GADMAN_SHELF_TYPE); E_OBJECT_TYPE_CHECK(es, E_GADMAN_SHELF_TYPE);
if (es->cfg) if (es->cfg)
{ {
Evas_List *l; es->cfg->orient = es->gadcon->orient;
E_Config_Shelf_Config *cf_escf = NULL; if (es->cfg->style) evas_stringshare_del(es->cfg->style);
es->cfg->style = evas_stringshare_add(es->style);
for (l = es->cfg->configs; l; l = l->next)
{
cf_escf = l->data;
if ((cf_escf->res.w == es->zone->w) &&
(cf_escf->res.h == es->zone->h))
break;
cf_escf = NULL;
}
if (!cf_escf)
{
cf_escf = E_NEW(E_Config_Shelf_Config, 1);
if (cf_escf)
{
cf_escf->res.w = es->zone->w;
cf_escf->res.h = es->zone->h;
es->cfg->configs = evas_list_append(es->cfg->configs, cf_escf);
}
}
if (cf_escf)
{
cf_escf->x = es->x;
cf_escf->y = es->y;
cf_escf->w = es->w;
cf_escf->h = es->h;
cf_escf->orient = es->gadcon->orient;
if (cf_escf->style) evas_stringshare_del(cf_escf->style);
cf_escf->style = evas_stringshare_add(es->style);
}
} }
else else
{ {
E_Config_Shelf *cf_es; E_Config_Shelf *cf_es;
E_Config_Shelf_Config *cf_escf = NULL;
cf_es = E_NEW(E_Config_Shelf, 1); cf_es = E_NEW(E_Config_Shelf, 1);
cf_es->name = evas_stringshare_add(es->name); cf_es->name = evas_stringshare_add(es->name);
@ -310,18 +242,11 @@ e_shelf_save(E_Shelf *es)
if (es->popup) cf_es->popup = 1; if (es->popup) cf_es->popup = 1;
cf_es->layer = es->layer; cf_es->layer = es->layer;
e_config->shelves = evas_list_append(e_config->shelves, cf_es); e_config->shelves = evas_list_append(e_config->shelves, cf_es);
cf_es->orient = es->gadcon->orient;
cf_es->style = evas_stringshare_add(es->style);
cf_es->fit_along = es->fit_along;
cf_es->fit_size = es->fit_size;
es->cfg = cf_es; es->cfg = cf_es;
cf_escf = E_NEW(E_Config_Shelf_Config, 1);
cf_escf->res.w = es->zone->w;
cf_escf->res.h = es->zone->h;
cf_escf->x = es->x;
cf_escf->y = es->y;
cf_escf->w = es->w;
cf_escf->h = es->h;
cf_escf->orient = es->gadcon->orient;
cf_escf->style = evas_stringshare_add(es->style);
cf_es->configs = evas_list_append(cf_es->configs, cf_escf);
} }
e_config_save_queue(); e_config_save_queue();
} }
@ -335,15 +260,7 @@ e_shelf_unsave(E_Shelf *es)
{ {
e_config->shelves = evas_list_remove(e_config->shelves, es->cfg); e_config->shelves = evas_list_remove(e_config->shelves, es->cfg);
evas_stringshare_del(es->cfg->name); evas_stringshare_del(es->cfg->name);
while (es->cfg->configs) if (es->cfg->style) evas_stringshare_del(es->cfg->style);
{
E_Config_Shelf_Config *cf_escf;
cf_escf = es->cfg->configs->data;
if (cf_escf->style) evas_stringshare_del(cf_escf->style);
free(cf_escf);
es->cfg->configs = evas_list_remove_list(es->cfg->configs, es->cfg->configs);
}
free(es->cfg); free(es->cfg);
} }
} }
@ -408,43 +325,54 @@ _e_shelf_free(E_Shelf *es)
} }
static void static void
_e_shelf_config_port(E_Config_Shelf_Config *cf1, E_Config_Shelf_Config *cf2) _e_shelf_position_calc(E_Shelf *es)
{ {
int px[4], py[4]; E_Gadcon_Orient orient = E_GADCON_ORIENT_FLOAT;
int i; int size = 40;
/* if (es->cfg)
* We have 4 corners. figure out what gravity zone (3x3 grid) they are in
* then lock them in relative to the edge or middle of that zone and re
* calculate it all then.
*/
px[0] = cf1->x;
px[1] = cf1->x + cf1->w - 1;
px[2] = cf1->x;
px[3] = cf1->x + cf1->w - 1;
py[0] = cf1->y;
py[1] = cf1->y;
py[2] = cf1->y + cf1->h - 1;
py[3] = cf1->y + cf1->h - 1;
for (i = 0; i < 4; i++)
{ {
if (px[i] < (cf1->res.w / 3)) orient = es->cfg->orient;
px[i] = px[i]; size = es->cfg->size;
else if (px[i] > ((2 * cf1->res.w) / 3))
px[i] = (cf2->res.w) + (px[i] - cf1->res.w);
else
px[i] = (cf2->res.w / 2) + (px[i] - (cf1->res.w / 2));
if (py[i] < (cf1->res.h / 3))
py[i] = py[i];
else if (py[i] > ((2 * cf1->res.h) / 3))
py[i] = (cf2->res.h) + (py[i] - cf1->res.h);
else
py[i] = (cf2->res.h / 2) + (py[i] - (cf1->res.h / 2));
} }
cf2->x = px[0]; else
cf2->y = py[0]; orient = es->gadcon->orient;
cf2->w = px[3] - px[0] + 1; switch (orient)
cf2->h = py[3] = py[0] + 1; {
case E_GADCON_ORIENT_FLOAT:
break;
case E_GADCON_ORIENT_HORIZ:
break;
case E_GADCON_ORIENT_VERT:
break;
case E_GADCON_ORIENT_LEFT:
break;
case E_GADCON_ORIENT_RIGHT:
break;
case E_GADCON_ORIENT_TOP:
if (!es->fit_along) es->w = es->zone->w;
if (!es->fit_size) es->h = size;
es->x = (es->zone->w - es->w) / 2;
es->y = 0;
break;
case E_GADCON_ORIENT_BOTTOM:
if (!es->fit_along) es->w = es->zone->w;
if (!es->fit_size) es->h = size;
es->x = (es->zone->w - es->w) / 2;
es->y = es->zone->h - es->h;
break;
case E_GADCON_ORIENT_CORNER_TL:
break;
case E_GADCON_ORIENT_CORNER_TR:
break;
case E_GADCON_ORIENT_CORNER_BL:
break;
case E_GADCON_ORIENT_CORNER_BR:
break;
default:
break;
}
e_shelf_move_resize(es, es->x, es->y, es->w, es->h);
} }
static void static void
@ -537,3 +465,21 @@ _e_shelf_gadcon_size_request(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord
} }
e_shelf_move_resize(es, nx, ny, nw, nh); e_shelf_move_resize(es, nx, ny, nw, nh);
} }
static Evas_Object *
_e_shelf_gadcon_frame_request(void *data, E_Gadcon_Client *gcc, const char *style)
{
E_Shelf *es;
Evas_Object *o;
char buf[4096];
es = data;
o = edje_object_add(gcc->gadcon->evas);
snprintf(buf, sizeof(buf), "shelf/%s/%s", es->style, style);
if (!e_theme_edje_object_set(o, "base/theme/shelf", buf))
{
evas_object_del(o);
return NULL;
}
return o;
}

View File

@ -27,6 +27,7 @@ struct _E_Shelf
E_Config_Shelf *cfg; E_Config_Shelf *cfg;
unsigned char fit_along : 1; unsigned char fit_along : 1;
unsigned char fit_size : 1; unsigned char fit_size : 1;
int size;
}; };
EAPI int e_shelf_init(void); EAPI int e_shelf_init(void);

View File

@ -7,7 +7,7 @@
/***************************************************************************/ /***************************************************************************/
/**/ /**/
/* gadcon requirements */ /* gadcon requirements */
static E_Gadcon_Client *_gc_init(E_Gadcon *gc, char *name, char *id); static E_Gadcon_Client *_gc_init(E_Gadcon *gc, char *name, char *id, char *style);
static void _gc_shutdown(E_Gadcon_Client *gcc); static void _gc_shutdown(E_Gadcon_Client *gcc);
static void _gc_orient(E_Gadcon_Client *gcc); static void _gc_orient(E_Gadcon_Client *gcc);
/* and actually define the gadcon class that this module provides (just 1) */ /* and actually define the gadcon class that this module provides (just 1) */
@ -39,7 +39,7 @@ static void _button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *e
static void _menu_cb_post(void *data, E_Menu *m); static void _menu_cb_post(void *data, E_Menu *m);
static E_Gadcon_Client * static E_Gadcon_Client *
_gc_init(E_Gadcon *gc, char *name, char *id) _gc_init(E_Gadcon *gc, char *name, char *id, char *style)
{ {
Evas_Object *o; Evas_Object *o;
E_Gadcon_Client *gcc; E_Gadcon_Client *gcc;
@ -52,7 +52,7 @@ _gc_init(E_Gadcon *gc, char *name, char *id)
e_theme_edje_object_set(o, "base/theme/modules/start", "modules/start/main"); e_theme_edje_object_set(o, "base/theme/modules/start", "modules/start/main");
edje_object_signal_emit(o, "passive", ""); edje_object_signal_emit(o, "passive", "");
gcc = e_gadcon_client_new(gc, name, id, o); gcc = e_gadcon_client_new(gc, name, id, style, o);
gcc->data = inst; gcc->data = inst;
inst->gcc = gcc; inst->gcc = gcc;
@ -85,6 +85,7 @@ _gc_orient(E_Gadcon_Client *gcc)
inst = gcc->data; inst = gcc->data;
printf("OREINT to %i\n", gcc->gadcon->orient); printf("OREINT to %i\n", gcc->gadcon->orient);
e_gadcon_client_aspect_set(gcc, 20, 20);
e_gadcon_client_min_size_set(gcc, 20, 20); e_gadcon_client_min_size_set(gcc, 20, 20);
} }
/**/ /**/