parent
dd71fee254
commit
7c2f28556a
12 changed files with 413 additions and 10 deletions
@ -0,0 +1,58 @@ |
||||
group { |
||||
name: "e/widgets/deskpreview/desk"; |
||||
parts { |
||||
part { |
||||
name: "clip"; |
||||
mouse_events: 0; |
||||
type: RECT; |
||||
description { |
||||
state: "default" 0.0; |
||||
rel1 { |
||||
offset: 2 2; |
||||
} |
||||
rel2 { |
||||
offset: -3 -3; |
||||
} |
||||
color: 255 255 255 255; |
||||
} |
||||
} |
||||
part { |
||||
name: "overlay"; |
||||
mouse_events: 1; |
||||
description { |
||||
state: "default" 0.0; |
||||
rel1 { |
||||
offset: 1 1; |
||||
} |
||||
rel2 { |
||||
offset: -2 -2; |
||||
} |
||||
image { |
||||
normal: "e17_pager_desk.png"; |
||||
border: 2 2 2 2; |
||||
middle: 0; |
||||
} |
||||
fill { |
||||
smooth: 0; |
||||
} |
||||
color: 255 255 255 255; |
||||
} |
||||
} |
||||
part { |
||||
name: "e.swallow.desk"; |
||||
mouse_events: 0; |
||||
type: SWALLOW; |
||||
clip_to: "clip"; |
||||
description { |
||||
state: "default" 0.0; |
||||
rel1 { |
||||
offset: 2 2; |
||||
} |
||||
rel2 { |
||||
offset: -3 -3; |
||||
} |
||||
color: 0 0 0 0; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,119 @@ |
||||
/*
|
||||
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 |
||||
*/ |
||||
|
||||
/* TODO: support different preference modes ala edje */ |
||||
#include "e.h" |
||||
|
||||
typedef struct _E_Widget_Data E_Widget_Data; |
||||
struct _E_Widget_Data |
||||
{ |
||||
Evas_Object *obj; |
||||
|
||||
Evas_Object *child; |
||||
int aspect_w, aspect_h; |
||||
int aspect_preference; |
||||
}; |
||||
|
||||
|
||||
static void |
||||
_e_wid_del_hook(Evas_Object *obj) |
||||
{ |
||||
E_Widget_Data *wd; |
||||
|
||||
wd = e_widget_data_get(obj); |
||||
if (!wd) return; |
||||
|
||||
free(wd); |
||||
} |
||||
|
||||
static void |
||||
_e_wid_reconfigure(E_Widget_Data *wd) |
||||
{ |
||||
int px, py, pw, ph; |
||||
int cx, cy, cw, ch; |
||||
double ap, ad; |
||||
|
||||
if (!wd->obj || !wd->child) return; |
||||
|
||||
evas_object_geometry_get(wd->obj, &px, &py, &pw, &ph); |
||||
|
||||
ap = (double)pw / ph; |
||||
ad = (double)(wd->aspect_w) / wd->aspect_h; |
||||
if (ap >= ad) |
||||
{ |
||||
ch = ph; |
||||
cw = (ch * wd->aspect_w) / wd->aspect_h; |
||||
} |
||||
else |
||||
{ |
||||
cw = pw; |
||||
ch = (cw * wd->aspect_h) / wd->aspect_w; |
||||
} |
||||
|
||||
cx = px + ((pw - cw) / 2); |
||||
cy = py + ((ph - ch) / 2); |
||||
|
||||
evas_object_resize(wd->child, cw, ch); |
||||
evas_object_move(wd->child, cx, cy); |
||||
} |
||||
|
||||
static void |
||||
_e_wid_resize_intercept(void *data, Evas_Object *obj, int w, int h) |
||||
{ |
||||
E_Widget_Data *wd; |
||||
|
||||
wd = e_widget_data_get(obj); |
||||
if (!wd) return; |
||||
|
||||
evas_object_resize(obj, w, h); |
||||
_e_wid_reconfigure(wd); |
||||
} |
||||
|
||||
Evas_Object * |
||||
e_widget_aspect_add(Evas *evas, int w, int h) |
||||
{ |
||||
Evas_Object *obj; |
||||
E_Widget_Data *wd; |
||||
|
||||
obj = e_widget_add(evas); |
||||
wd = calloc(1, sizeof(E_Widget_Data)); |
||||
|
||||
wd->obj = obj; |
||||
e_widget_data_set(obj, wd); |
||||
e_widget_del_hook_set(obj, _e_wid_del_hook); |
||||
|
||||
evas_object_intercept_resize_callback_add(obj, _e_wid_resize_intercept, wd); |
||||
e_widget_aspect_aspect_set(obj, w, h); |
||||
|
||||
return obj; |
||||
} |
||||
|
||||
void |
||||
e_widget_aspect_aspect_set(Evas_Object *obj, int w, int h) |
||||
{ |
||||
E_Widget_Data *wd; |
||||
|
||||
wd = e_widget_data_get(obj); |
||||
if (!wd) return; |
||||
|
||||
wd->aspect_w = w; |
||||
wd->aspect_h = h; |
||||
_e_wid_reconfigure(wd); |
||||
} |
||||
|
||||
void |
||||
e_widget_aspect_child_set(Evas_Object *obj, Evas_Object *child) |
||||
{ |
||||
E_Widget_Data *wd; |
||||
|
||||
wd = e_widget_data_get(obj); |
||||
if (!wd) return; |
||||
|
||||
wd->child = child; |
||||
_e_wid_reconfigure(wd); |
||||
} |
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,6 @@ |
||||
#ifndef E_WIDGET_ASPECT_H |
||||
#define E_WIDGET_ASPECT_H |
||||
Evas_Object *e_widget_aspect_add(Evas *evas, int w, int h); |
||||
void e_widget_aspect_aspect_set(Evas_Object *obj, int w, int h); |
||||
void e_widget_aspect_child_set(Evas_Object *obj, Evas_Object *child); |
||||
#endif |
@ -0,0 +1,183 @@ |
||||
/*
|
||||
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 |
||||
*/ |
||||
|
||||
#include "e.h" |
||||
|
||||
typedef struct _E_Widget_Data E_Widget_Data; |
||||
struct _E_Widget_Data |
||||
{ |
||||
Evas_Object *obj; |
||||
Evas_Object *aspect; |
||||
Evas_Object *table; |
||||
Evas_List *desks; |
||||
|
||||
int w, h; |
||||
int desk_count_x, desk_count_y; |
||||
}; |
||||
|
||||
|
||||
static void |
||||
_e_wid_desks_free(E_Widget_Data *wd) |
||||
{ |
||||
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; |
||||
} |
||||
|
||||
static void |
||||
_e_wid_del_hook(Evas_Object *obj) |
||||
{ |
||||
E_Widget_Data *wd; |
||||
|
||||
wd = e_widget_data_get(obj); |
||||
if (!wd) return; |
||||
|
||||
_e_wid_desks_free(wd); |
||||
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 |
||||
*/ |
||||
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_desks_free(wd); |
||||
|
||||
zone = e_zone_current_get(e_container_current_get(e_manager_current_get())); |
||||
|
||||
o = e_widget_aspect_add(evas_object_evas_get(obj), zone->w * nx, zone->h * ny); |
||||
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); |
||||
evas_object_show(o); |
||||
e_widget_aspect_child_set(wd->aspect, o);
|
||||
wd->table = o; |
||||
|
||||
evas_object_geometry_get(wd->aspect, NULL, NULL, &aw, &ah); |
||||
|
||||
if (ny > nx) |
||||
{ |
||||
mh = ah / ny; |
||||
mw = (mh * zone->w) / zone->h; |
||||
} |
||||
else |
||||
{ |
||||
mw = aw / nx; |
||||
mh = (mw * zone->h) / zone->w; |
||||
} |
||||
/* this happens when aw == 0 */ |
||||
if (!mw) |
||||
{ |
||||
mw = 10; |
||||
mh = (mw * zone->h) / zone->w; |
||||
} |
||||
e_widget_aspect_aspect_set(wd->aspect, mw * nx, mh * ny); |
||||
|
||||
if (mw < 50) |
||||
tw = 50; |
||||
else if (mw < 150) |
||||
tw = 150; |
||||
else |
||||
tw = 300; |
||||
th = (tw * zone->h) / zone->w; |
||||
|
||||
for (y = 0; y < ny; y++) |
||||
{ |
||||
for (x = 0; 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)); |
||||
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.desk", 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); |
||||
} |
||||
} |
||||
} |
||||
|
||||
Evas_Object * |
||||
e_widget_desk_preview_add(Evas *evas, int nx, int ny) |
||||
{ |
||||
Evas_Object *obj, *o; |
||||
E_Widget_Data *wd; |
||||
Evas_Coord iw, ih; |
||||
|
||||
obj = e_widget_add(evas); |
||||
wd = calloc(1, sizeof(E_Widget_Data)); |
||||
|
||||
wd->obj = obj; |
||||
e_widget_data_set(obj, wd); |
||||
e_widget_del_hook_set(obj, _e_wid_del_hook); |
||||
|
||||
e_widget_desk_preview_num_desks_set(obj, nx, ny); |
||||
|
||||
return obj; |
||||
} |
||||
|
||||
|
@ -0,0 +1,5 @@ |
||||
#ifndef E_WIDGET_DESK_PREVIEW_H |
||||
#define E_WIDGET_DESK_PREVIEW_H |
||||
Evas_Object *e_widget_desk_preview_add(Evas *evas, int nx, int ny); |
||||
void e_widget_desk_preview_num_desks_set(Evas_Object *obj, int nx, int ny); |
||||
#endif |
Loading…
Reference in new issue