Dynamically add and remove desks in the preview when you change the # of virtual desks.

A few small fixmes still to go


SVN revision: 26662
This commit is contained in:
rephorm 2006-10-16 23:45:16 +00:00 committed by rephorm
parent 9c2590121e
commit 1532587bcb
6 changed files with 179 additions and 112 deletions

View File

@ -10,55 +10,55 @@ static void _e_bg_signal(void *data, Evas_Object *obj, const char *emission, con
/* externally accessible functions */ /* externally accessible functions */
EAPI const char * EAPI const char *
e_bg_file_get(E_Zone *zone, E_Desk *desk) e_bg_file_get(int container_num, int zone_num, int desk_x, int desk_y)
{ {
Evas_List *l, *ll, *entries; Evas_List *l, *ll, *entries;
int ok; int ok;
int current_spec; int current_spec;
const char *bgfile = ""; const char *bgfile = "";
if (!zone) zone = e_zone_current_get(e_container_current_get(e_manager_current_get()));
ok = 0; ok = 0;
current_spec = 0; /* how specific the setting is - we want the least general one that applies */ current_spec = 0; /* how specific the setting is - we want the least general one that applies */
/* look for desk specific background. if desk is NULL this is skipped */ /* look for desk specific background. */
for (l = e_config->desktop_backgrounds; desk && l; l = l->next) if (container_num >= 0 || zone_num >= 0 || desk_x >= 0 || desk_y >= 0)
{ {
E_Config_Desktop_Background *cfbg; for (l = e_config->desktop_backgrounds; l; l = l->next)
int spec;
cfbg = l->data;
if ((cfbg->container >= 0) && (zone->container->num != cfbg->container)) continue;
if ((cfbg->zone >= 0) && (zone->num != cfbg->zone)) continue;
if ((cfbg->desk_x >= 0) && (cfbg->desk_x != desk->x)) continue;
if ((cfbg->desk_y >= 0) && (cfbg->desk_y != desk->y)) continue;
spec = 0;
if (cfbg->container >= 0) spec++;
if (cfbg->zone >= 0) spec++;
if (cfbg->desk_x >= 0) spec++;
if (cfbg->desk_y >= 0) spec++;
if (spec <= current_spec) continue;
entries = edje_file_collection_list(cfbg->file);
if (entries)
{ {
for (ll = entries; ll; ll = ll->next) E_Config_Desktop_Background *cfbg;
int spec;
cfbg = l->data;
spec = 0;
if (cfbg->container == container_num) spec++;
else if (cfbg->container >= 0) continue;
if (cfbg->zone == zone_num) spec++;
else if (cfbg->zone >= 0) continue;
if (cfbg->desk_x == desk_x) spec++;
else if (cfbg->desk_x >= 0) continue;
if (cfbg->desk_y == desk_y) spec++;
else if (cfbg->desk_y >= 0) continue;
if (spec <= current_spec) continue;
entries = edje_file_collection_list(cfbg->file);
if (entries)
{ {
if (!strcmp(ll->data, "e/desktop/background")) for (ll = entries; ll; ll = ll->next)
{ {
bgfile = cfbg->file; if (!strcmp(ll->data, "e/desktop/background"))
current_spec = spec; {
ok = 1; bgfile = cfbg->file;
current_spec = spec;
ok = 1;
}
} }
edje_file_collection_list_free(entries);
} }
edje_file_collection_list_free(entries);
} }
} }
/* fall back to default bg for zone */ /* fall back to default */
if (!ok) if (!ok)
{ {
entries = edje_file_collection_list(e_config->desktop_default_background); entries = edje_file_collection_list(e_config->desktop_default_background);
@ -89,13 +89,18 @@ e_bg_zone_update(E_Zone *zone, E_Bg_Transition transition)
Evas_Object *o; Evas_Object *o;
const char *bgfile = ""; const char *bgfile = "";
const char *trans = ""; const char *trans = "";
E_Desk *desk;
if (transition == E_BG_TRANSITION_START) trans = e_config->transition_start; if (transition == E_BG_TRANSITION_START) trans = e_config->transition_start;
else if (transition == E_BG_TRANSITION_DESK) trans = e_config->transition_desk; else if (transition == E_BG_TRANSITION_DESK) trans = e_config->transition_desk;
else if (transition == E_BG_TRANSITION_CHANGE) trans = e_config->transition_change; else if (transition == E_BG_TRANSITION_CHANGE) trans = e_config->transition_change;
if ((!trans) || (strlen(trans) < 1)) transition = E_BG_TRANSITION_NONE; if ((!trans) || (strlen(trans) < 1)) transition = E_BG_TRANSITION_NONE;
bgfile = e_bg_file_get(zone, e_desk_current_get(zone)); desk = e_desk_current_get(zone);
if (desk)
bgfile = e_bg_file_get(zone->container->num, zone->num, desk->x, desk->y);
else
bgfile = e_bg_file_get(zone->container->num, zone->num, -1, -1);
if (zone->bg_object) if (zone->bg_object)
{ {

View File

@ -14,7 +14,7 @@ typedef enum {
#ifndef E_BG_H #ifndef E_BG_H
#define E_BG_H #define E_BG_H
EAPI const char *e_bg_file_get(E_Zone *zone, E_Desk *desk); EAPI const char *e_bg_file_get(int container_num, int zone_num, int desk_x, int desk_y);
EAPI void e_bg_zone_update(E_Zone *zone, E_Bg_Transition transition); EAPI void e_bg_zone_update(E_Zone *zone, E_Bg_Transition transition);
EAPI void e_bg_add(int container, int zone, int desk_x, int desk_y, char *file); EAPI void e_bg_add(int container, int zone, int desk_x, int desk_y, char *file);
EAPI void e_bg_del(int container, int zone, int desk_x, int desk_y); EAPI void e_bg_del(int container, int zone, int desk_x, int desk_y);

View File

@ -140,7 +140,7 @@ e_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj)
printf("----------EEEEEK! dupe sub obj is a sub obj!\n"); printf("----------EEEEEK! dupe sub obj is a sub obj!\n");
abort(); abort();
} }
*/ */
sd->subobjs = evas_list_append(sd->subobjs, sobj); sd->subobjs = evas_list_append(sd->subobjs, sobj);
if (!sd->child_can_focus) if (!sd->child_can_focus)
{ {

View File

@ -2,6 +2,10 @@
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 * 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" #include "e.h"
typedef struct _E_Widget_Data E_Widget_Data; typedef struct _E_Widget_Data E_Widget_Data;
@ -13,35 +17,18 @@ struct _E_Widget_Data
Evas_List *desks; Evas_List *desks;
int w, h; int w, h;
int cur_x, cur_y; /* currently drawn */
int desk_count_x, desk_count_y; int desk_count_x, desk_count_y;
}; };
typedef struct _E_Widget_Desk_Data E_Widget_Desk_Data;
static void struct _E_Widget_Desk_Data
_e_wid_desks_free(E_Widget_Data *wd)
{ {
Evas_List *l; Evas_Object *thumb;
for (l = wd->desks; l; l = l->next) int x, y;
{ };
Evas_Object *desk = l->data;
e_widget_sub_object_del(wd->obj, desk); static void _e_wid_reconfigure(E_Widget_Data *wd);
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 static void
_e_wid_del_hook(Evas_Object *obj) _e_wid_del_hook(Evas_Object *obj)
@ -51,47 +38,95 @@ _e_wid_del_hook(Evas_Object *obj)
wd = e_widget_data_get(obj); wd = e_widget_data_get(obj);
if (!wd) return; if (!wd) return;
_e_wid_desks_free(wd); evas_list_free(wd->desks);
free(wd); free(wd);
} }
/* static void
* XXX break this into num_desks_set and _reconfigure calls _e_wid_desk_del_hook(Evas_Object *obj)
* XXX don't completely redraw on change just add/del rows/columns and update min sizes {
*/ E_Widget_Desk_Data *dd;
dd = e_widget_data_get(obj);
if (!dd) return;
free(dd);
}
void void
e_widget_desk_preview_num_desks_set(Evas_Object *obj, int nx, int ny) e_widget_desk_preview_num_desks_set(Evas_Object *obj, int nx, int ny)
{ {
E_Widget_Data *wd; 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); wd = e_widget_data_get(obj);
if (!wd) return; if (!wd) return;
wd->desk_count_x = nx; wd->desk_count_x = nx;
wd->desk_count_y = ny; wd->desk_count_y = ny;
_e_wid_reconfigure(wd);
}
_e_wid_desks_free(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;
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;
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);
evas_object_show(o);
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_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())); 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->table, NULL, NULL, &aw, &ah); evas_object_geometry_get(wd->table, NULL, NULL, &aw, &ah);
if (ny > nx) if (ny > nx)
@ -120,45 +155,50 @@ e_widget_desk_preview_num_desks_set(Evas_Object *obj, int nx, int ny)
tw = 300; tw = 300;
th = (tw * zone->h) / zone->w; 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 (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; Evas_Object *dw;
const char *bgfile;
E_Desk *desk = NULL;
if (x < zone->desk_x_count && y < zone->desk_y_count) dw = e_widget_deskpreview_desk_add(evas_object_evas_get(wd->obj), zone, x, y, tw, th);
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); 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); 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->desks = evas_list_append(wd->desks, dw);
} }
} }
wd->cur_x = wd->desk_count_x;
wd->cur_y = wd->desk_count_y;
} }
Evas_Object * Evas_Object *
@ -167,6 +207,7 @@ e_widget_desk_preview_add(Evas *evas, int nx, int ny)
Evas_Object *obj, *o; Evas_Object *obj, *o;
E_Widget_Data *wd; E_Widget_Data *wd;
Evas_Coord iw, ih; Evas_Coord iw, ih;
E_Zone *zone;
obj = e_widget_add(evas); obj = e_widget_add(evas);
wd = calloc(1, sizeof(E_Widget_Data)); 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_data_set(obj, wd);
e_widget_del_hook_set(obj, _e_wid_del_hook); 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); e_widget_desk_preview_num_desks_set(obj, nx, ny);
return obj; return obj;

View File

@ -81,6 +81,13 @@ e_widget_table_object_repack(Evas_Object *obj, Evas_Object *sobj, int col, int r
e_widget_min_size_set(obj, mw, mh); e_widget_min_size_set(obj, mw, mh);
} }
EAPI void
e_widget_table_unpack(Evas_Object *obj, Evas_Object *sobj)
{
e_widget_sub_object_del(obj, sobj);
e_table_unpack(sobj);
}
static void static void
_e_wid_del_hook(Evas_Object *obj) _e_wid_del_hook(Evas_Object *obj)
{ {

View File

@ -9,6 +9,7 @@
EAPI Evas_Object *e_widget_table_add(Evas *evas, int homogenous); EAPI Evas_Object *e_widget_table_add(Evas *evas, int homogenous);
EAPI void e_widget_table_object_append(Evas_Object *obj, Evas_Object *sobj, int col, int row, int colspan, int rowspan, int fill_w, int fill_h, int expand_w, int expand_h); EAPI void e_widget_table_object_append(Evas_Object *obj, Evas_Object *sobj, int col, int row, int colspan, int rowspan, int fill_w, int fill_h, int expand_w, int expand_h);
EAPI void e_widget_table_object_repack(Evas_Object *obj, Evas_Object *sobj, int col, int row, int colspan, int rowspan, int fill_w, int fill_h, int expand_w, int expand_h); EAPI void e_widget_table_object_repack(Evas_Object *obj, Evas_Object *sobj, int col, int row, int colspan, int rowspan, int fill_w, int fill_h, int expand_w, int expand_h);
EAPI void e_widget_table_unpack(Evas_Object *obj, Evas_Object *sobj);
#endif #endif
#endif #endif