|
|
|
@ -2,6 +2,10 @@ |
|
|
|
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* XXX need to detect when bg's change and update |
|
|
|
|
* XXX thumb doesn't properly change size
|
|
|
|
|
*/ |
|
|
|
|
#include "e.h" |
|
|
|
|
|
|
|
|
|
typedef struct _E_Widget_Data E_Widget_Data; |
|
|
|
@ -13,35 +17,18 @@ struct _E_Widget_Data |
|
|
|
|
Evas_List *desks; |
|
|
|
|
|
|
|
|
|
int w, h; |
|
|
|
|
int cur_x, cur_y; /* currently drawn */ |
|
|
|
|
int desk_count_x, desk_count_y; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
_e_wid_desks_free(E_Widget_Data *wd) |
|
|
|
|
typedef struct _E_Widget_Desk_Data E_Widget_Desk_Data; |
|
|
|
|
struct _E_Widget_Desk_Data |
|
|
|
|
{ |
|
|
|
|
Evas_List *l; |
|
|
|
|
for (l = wd->desks; l; l = l->next) |
|
|
|
|
{ |
|
|
|
|
Evas_Object *desk = l->data; |
|
|
|
|
e_widget_sub_object_del(wd->obj, desk); |
|
|
|
|
evas_object_del(desk); |
|
|
|
|
} |
|
|
|
|
evas_list_free(wd->desks); |
|
|
|
|
wd->desks = NULL; |
|
|
|
|
if (wd->table)
|
|
|
|
|
{ |
|
|
|
|
e_widget_sub_object_del(wd->obj, wd->table); |
|
|
|
|
evas_object_del(wd->table); |
|
|
|
|
} |
|
|
|
|
wd->table = NULL; |
|
|
|
|
if (wd->aspect)
|
|
|
|
|
{ |
|
|
|
|
e_widget_sub_object_del(wd->obj, wd->aspect); |
|
|
|
|
evas_object_del(wd->aspect); |
|
|
|
|
} |
|
|
|
|
wd->aspect = NULL; |
|
|
|
|
} |
|
|
|
|
Evas_Object *thumb; |
|
|
|
|
int x, y; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static void _e_wid_reconfigure(E_Widget_Data *wd); |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
_e_wid_del_hook(Evas_Object *obj) |
|
|
|
@ -51,46 +38,94 @@ _e_wid_del_hook(Evas_Object *obj) |
|
|
|
|
wd = e_widget_data_get(obj); |
|
|
|
|
if (!wd) return; |
|
|
|
|
|
|
|
|
|
_e_wid_desks_free(wd); |
|
|
|
|
evas_list_free(wd->desks); |
|
|
|
|
free(wd); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* XXX break this into num_desks_set and _reconfigure calls
|
|
|
|
|
* XXX don't completely redraw on change just add/del rows/columns and update min sizes |
|
|
|
|
*/ |
|
|
|
|
static void |
|
|
|
|
_e_wid_desk_del_hook(Evas_Object *obj) |
|
|
|
|
{ |
|
|
|
|
E_Widget_Desk_Data *dd; |
|
|
|
|
|
|
|
|
|
dd = e_widget_data_get(obj); |
|
|
|
|
if (!dd) return; |
|
|
|
|
|
|
|
|
|
free(dd); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
e_widget_desk_preview_num_desks_set(Evas_Object *obj, int nx, int ny) |
|
|
|
|
{ |
|
|
|
|
E_Widget_Data *wd; |
|
|
|
|
Evas_Object *o; |
|
|
|
|
int x, y; |
|
|
|
|
int aw, ah; /* available */ |
|
|
|
|
int mw, mh; /* min size for each desk */ |
|
|
|
|
int tw, th; /* size to thumb at */ |
|
|
|
|
E_Zone *zone; |
|
|
|
|
|
|
|
|
|
wd = e_widget_data_get(obj); |
|
|
|
|
if (!wd) return; |
|
|
|
|
|
|
|
|
|
wd->desk_count_x = nx; |
|
|
|
|
wd->desk_count_y = ny; |
|
|
|
|
_e_wid_reconfigure(wd); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Evas_Object * |
|
|
|
|
e_widget_deskpreview_desk_add(Evas *evas, E_Zone *zone, int x, int y, int tw, int th) |
|
|
|
|
{ |
|
|
|
|
Evas_Object *overlay; |
|
|
|
|
Evas_Object *obj, *o; |
|
|
|
|
const char *bgfile; |
|
|
|
|
E_Widget_Desk_Data *dd = NULL; |
|
|
|
|
|
|
|
|
|
_e_wid_desks_free(wd); |
|
|
|
|
|
|
|
|
|
zone = e_zone_current_get(e_container_current_get(e_manager_current_get())); |
|
|
|
|
bgfile = e_bg_file_get(zone->container->num, zone->num, x, y); |
|
|
|
|
|
|
|
|
|
/* wrap desks in a widget (to set min size) */ |
|
|
|
|
obj = e_widget_add(evas); |
|
|
|
|
|
|
|
|
|
dd = calloc(1, sizeof(E_Widget_Desk_Data)); |
|
|
|
|
e_widget_data_set(obj, dd); |
|
|
|
|
dd->x = x; |
|
|
|
|
dd->y = y; |
|
|
|
|
|
|
|
|
|
o = e_widget_aspect_add(evas_object_evas_get(obj), zone->w * nx, zone->h * ny); |
|
|
|
|
e_widget_del_hook_set(obj, _e_wid_desk_del_hook); |
|
|
|
|
|
|
|
|
|
o = edje_object_add(evas); |
|
|
|
|
e_theme_edje_object_set(o, "base/theme/widgets", "e/widgets/deskpreview/desk"); |
|
|
|
|
e_widget_resize_object_set(obj, o); |
|
|
|
|
e_widget_sub_object_add(obj, o); |
|
|
|
|
evas_object_show(o); |
|
|
|
|
wd->aspect = o; |
|
|
|
|
|
|
|
|
|
o = e_widget_table_add(evas_object_evas_get(obj), 1); |
|
|
|
|
e_widget_sub_object_add(obj, o); |
|
|
|
|
overlay = o; |
|
|
|
|
|
|
|
|
|
o = e_thumb_icon_add(evas); |
|
|
|
|
e_icon_fill_inside_set(o, 0); |
|
|
|
|
e_thumb_icon_file_set(o, bgfile, "e/desktop/background"); |
|
|
|
|
e_thumb_icon_size_set(o, tw, th); |
|
|
|
|
edje_object_part_swallow(overlay, "e.swallow.content", o); |
|
|
|
|
e_thumb_icon_begin(o); |
|
|
|
|
evas_object_show(o); |
|
|
|
|
e_widget_aspect_child_set(wd->aspect, o);
|
|
|
|
|
wd->table = o; |
|
|
|
|
e_widget_sub_object_add(obj, o); |
|
|
|
|
dd->thumb = o; |
|
|
|
|
|
|
|
|
|
return obj; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
_e_wid_reconfigure(E_Widget_Data *wd) |
|
|
|
|
{ |
|
|
|
|
Evas_List *l, *delete = NULL; |
|
|
|
|
Evas_Object *o; |
|
|
|
|
int x, y; |
|
|
|
|
int aw, ah; /* available */ |
|
|
|
|
int mw, mh; /* min size for each desk */ |
|
|
|
|
int tw, th; /* size to thumb at */ |
|
|
|
|
int nx, ny; |
|
|
|
|
E_Zone *zone; |
|
|
|
|
|
|
|
|
|
if (wd->desk_count_x == wd->cur_x && wd->desk_count_y == wd->cur_y) return; |
|
|
|
|
|
|
|
|
|
nx = wd->desk_count_x; |
|
|
|
|
ny = wd->desk_count_y; |
|
|
|
|
|
|
|
|
|
zone = e_zone_current_get(e_container_current_get(e_manager_current_get())); |
|
|
|
|
|
|
|
|
|
evas_object_geometry_get(wd->table, NULL, NULL, &aw, &ah); |
|
|
|
|
|
|
|
|
@ -120,45 +155,50 @@ e_widget_desk_preview_num_desks_set(Evas_Object *obj, int nx, int ny) |
|
|
|
|
tw = 300; |
|
|
|
|
th = (tw * zone->h) / zone->w; |
|
|
|
|
|
|
|
|
|
for (l = wd->desks; l; l = l->next) |
|
|
|
|
{ |
|
|
|
|
Evas_Object *dw = l->data; |
|
|
|
|
E_Widget_Desk_Data *dd = e_widget_data_get(dw); |
|
|
|
|
if (dd->x < nx && dd->y < ny) |
|
|
|
|
{ |
|
|
|
|
e_widget_min_size_set(dw, mw, mh); |
|
|
|
|
e_widget_table_object_repack(wd->table, dw, dd->x, dd->y, 1, 1, 1, 1, 1, 1); |
|
|
|
|
e_thumb_icon_size_set(dd->thumb, tw, th); |
|
|
|
|
e_thumb_icon_begin(dd->thumb); /* XXX this isn't working - never ggetting new thumb */ |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
delete = evas_list_append(delete, dw); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
while (delete) |
|
|
|
|
{ |
|
|
|
|
Evas_Object *dw = delete->data; |
|
|
|
|
e_widget_table_unpack(wd->table, dw); |
|
|
|
|
evas_object_del(dw); |
|
|
|
|
wd->desks = evas_list_remove(wd->desks, dw); |
|
|
|
|
delete = evas_list_remove_list(delete, delete); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (y = 0; y < ny; y++) |
|
|
|
|
{ |
|
|
|
|
for (x = 0; x < nx; x++) |
|
|
|
|
int sx; |
|
|
|
|
if (y >= wd->cur_y) sx = 0; |
|
|
|
|
else sx = wd->cur_x; |
|
|
|
|
for (x = sx; x < nx; x++) |
|
|
|
|
{ |
|
|
|
|
Evas_Object *overlay; |
|
|
|
|
Evas_Object *dw; |
|
|
|
|
const char *bgfile; |
|
|
|
|
E_Desk *desk = NULL; |
|
|
|
|
|
|
|
|
|
if (x < zone->desk_x_count && y < zone->desk_y_count) |
|
|
|
|
desk = zone->desks[x + (y * zone->desk_x_count)]; |
|
|
|
|
bgfile = e_bg_file_get(zone, desk); |
|
|
|
|
|
|
|
|
|
/* wrap desks in a widget (to set min size) */ |
|
|
|
|
dw = e_widget_add(evas_object_evas_get(obj)); |
|
|
|
|
dw = e_widget_deskpreview_desk_add(evas_object_evas_get(wd->obj), zone, x, y, tw, th); |
|
|
|
|
e_widget_min_size_set(dw, mw, mh); |
|
|
|
|
|
|
|
|
|
o = edje_object_add(evas_object_evas_get(obj)); |
|
|
|
|
e_theme_edje_object_set(o, "base/theme/widgets", "e/widgets/deskpreview/desk"); |
|
|
|
|
e_widget_resize_object_set(dw, o); |
|
|
|
|
e_widget_sub_object_add(dw, o); |
|
|
|
|
|
|
|
|
|
evas_object_show(o); |
|
|
|
|
e_widget_sub_object_add(dw, o); |
|
|
|
|
overlay = o; |
|
|
|
|
|
|
|
|
|
o = e_thumb_icon_add(evas_object_evas_get(obj)); |
|
|
|
|
e_icon_fill_inside_set(o, 0); |
|
|
|
|
e_thumb_icon_file_set(o, bgfile, "e/desktop/background"); |
|
|
|
|
e_thumb_icon_size_set(o, tw, th); |
|
|
|
|
edje_object_part_swallow(overlay, "e.swallow.content", o); |
|
|
|
|
e_thumb_icon_begin(o); |
|
|
|
|
evas_object_show(o); |
|
|
|
|
e_widget_sub_object_add(dw, o); |
|
|
|
|
|
|
|
|
|
e_widget_table_object_append(wd->table, dw, x, y, 1, 1, 1, 1, 1, 1); |
|
|
|
|
wd->desks = evas_list_append(wd->desks, dw); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
wd->cur_x = wd->desk_count_x; |
|
|
|
|
wd->cur_y = wd->desk_count_y; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Evas_Object * |
|
|
|
@ -167,6 +207,7 @@ e_widget_desk_preview_add(Evas *evas, int nx, int ny) |
|
|
|
|
Evas_Object *obj, *o; |
|
|
|
|
E_Widget_Data *wd; |
|
|
|
|
Evas_Coord iw, ih; |
|
|
|
|
E_Zone *zone; |
|
|
|
|
|
|
|
|
|
obj = e_widget_add(evas); |
|
|
|
|
wd = calloc(1, sizeof(E_Widget_Data)); |
|
|
|
@ -175,6 +216,19 @@ e_widget_desk_preview_add(Evas *evas, int nx, int ny) |
|
|
|
|
e_widget_data_set(obj, wd); |
|
|
|
|
e_widget_del_hook_set(obj, _e_wid_del_hook); |
|
|
|
|
|
|
|
|
|
zone = e_zone_current_get(e_container_current_get(e_manager_current_get())); |
|
|
|
|
o = e_widget_aspect_add(evas, zone->w * nx, zone->h * ny); |
|
|
|
|
e_widget_resize_object_set(wd->obj, o); |
|
|
|
|
e_widget_sub_object_add(wd->obj, o); |
|
|
|
|
evas_object_show(o); |
|
|
|
|
wd->aspect = o; |
|
|
|
|
|
|
|
|
|
o = e_widget_table_add(evas, 1); |
|
|
|
|
e_widget_sub_object_add(wd->obj, o); |
|
|
|
|
evas_object_show(o); |
|
|
|
|
e_widget_aspect_child_set(wd->aspect, o);
|
|
|
|
|
wd->table = o; |
|
|
|
|
|
|
|
|
|
e_widget_desk_preview_num_desks_set(obj, nx, ny); |
|
|
|
|
|
|
|
|
|
return obj; |
|
|
|
|