forked from enlightenment/enlightenment
Rework deskpreview widget so play nice w/ toolbook.
- e_widget_aspect has issues when used in toolbook (so we don't use it here). - Still a couple of TODOs in this: Respect zone aspect. Use livethumb for previews. SVN revision: 46803
This commit is contained in:
parent
4a4faa95b5
commit
8dd6d9fa23
|
@ -150,7 +150,7 @@ e_sys.h \
|
|||
e_obj_dialog.h \
|
||||
e_widget_aspect.h \
|
||||
e_filereg.h \
|
||||
e_widget_desk_preview.h \
|
||||
e_widget_deskpreview.h \
|
||||
e_fm_prop.h \
|
||||
e_mouse.h \
|
||||
e_order.h \
|
||||
|
@ -289,7 +289,7 @@ e_color_dialog.c \
|
|||
e_sys.c \
|
||||
e_obj_dialog.c \
|
||||
e_widget_aspect.c \
|
||||
e_widget_desk_preview.c \
|
||||
e_widget_deskpreview.c \
|
||||
e_filereg.c \
|
||||
e_fm_prop.c \
|
||||
e_mouse.c \
|
||||
|
|
|
@ -120,7 +120,7 @@
|
|||
#include "e_obj_dialog.h"
|
||||
#include "e_filereg.h"
|
||||
#include "e_widget_aspect.h"
|
||||
#include "e_widget_desk_preview.h"
|
||||
#include "e_widget_deskpreview.h"
|
||||
#include "e_fm_prop.h"
|
||||
#include "e_mouse.h"
|
||||
#include "e_order.h"
|
||||
|
|
|
@ -1,296 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
Eina_List *desks;
|
||||
|
||||
Ecore_Event_Handler *update_handler;
|
||||
|
||||
int w, h;
|
||||
int cur_x, cur_y; /* currently drawn */
|
||||
int desk_count_x, desk_count_y;
|
||||
};
|
||||
|
||||
typedef struct _E_Widget_Desk_Data E_Widget_Desk_Data;
|
||||
struct _E_Widget_Desk_Data
|
||||
{
|
||||
Evas_Object *thumb;
|
||||
int container, zone;
|
||||
int x, y;
|
||||
};
|
||||
|
||||
static void _e_wid_reconfigure(E_Widget_Data *wd);
|
||||
static void _e_wid_desk_cb_config(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||
static int _e_wid_cb_bg_update(void *data, int type, void *event);
|
||||
|
||||
static void
|
||||
_e_wid_del_hook(Evas_Object *obj)
|
||||
{
|
||||
E_Widget_Data *wd;
|
||||
Eina_List *l;
|
||||
Evas_Object *o;
|
||||
|
||||
wd = e_widget_data_get(obj);
|
||||
if (!wd) return;
|
||||
|
||||
if (wd->update_handler) ecore_event_handler_del(wd->update_handler);
|
||||
EINA_LIST_FOREACH(wd->desks, l, o)
|
||||
{
|
||||
e_thumb_icon_end(o);
|
||||
}
|
||||
eina_list_free(wd->desks);
|
||||
free(wd);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
EAPI void
|
||||
e_widget_desk_preview_num_desks_set(Evas_Object *obj, int nx, int ny)
|
||||
{
|
||||
E_Widget_Data *wd;
|
||||
|
||||
wd = e_widget_data_get(obj);
|
||||
if (!wd) return;
|
||||
|
||||
wd->desk_count_x = nx;
|
||||
wd->desk_count_y = ny;
|
||||
_e_wid_reconfigure(wd);
|
||||
}
|
||||
|
||||
EAPI 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->container = zone->container->num;
|
||||
dd->zone = zone->num;
|
||||
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;
|
||||
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_desk_cb_config, dd);
|
||||
|
||||
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)
|
||||
{
|
||||
Eina_List *l, *delete = NULL;
|
||||
Evas_Object *dw;
|
||||
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);
|
||||
|
||||
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;
|
||||
|
||||
EINA_LIST_FOREACH(wd->desks, l, dw)
|
||||
{
|
||||
E_Widget_Desk_Data *dd = e_widget_data_get(dw);
|
||||
if (dd->x < nx && dd->y < ny)
|
||||
{
|
||||
e_widget_size_min_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_rethumb(dd->thumb);
|
||||
}
|
||||
else
|
||||
{
|
||||
delete = eina_list_append(delete, dw);
|
||||
}
|
||||
}
|
||||
EINA_LIST_FREE(delete, dw)
|
||||
{
|
||||
e_widget_table_unpack(wd->table, dw);
|
||||
evas_object_del(dw);
|
||||
wd->desks = eina_list_remove(wd->desks, dw);
|
||||
}
|
||||
|
||||
for (y = 0; y < ny; y++)
|
||||
{
|
||||
int sx;
|
||||
if (y >= wd->cur_y) sx = 0;
|
||||
else sx = wd->cur_x;
|
||||
for (x = sx; x < nx; x++)
|
||||
{
|
||||
Evas_Object *dw;
|
||||
|
||||
dw = e_widget_deskpreview_desk_add(evas_object_evas_get(wd->obj), zone, x, y, tw, th);
|
||||
e_widget_size_min_set(dw, mw, mh);
|
||||
|
||||
e_widget_table_object_append(wd->table, dw, x, y, 1, 1, 1, 1, 1, 1);
|
||||
wd->desks = eina_list_append(wd->desks, dw);
|
||||
}
|
||||
}
|
||||
|
||||
wd->cur_x = wd->desk_count_x;
|
||||
wd->cur_y = wd->desk_count_y;
|
||||
}
|
||||
|
||||
Evas_Object *
|
||||
e_widget_desk_preview_add(Evas *evas, int nx, int ny)
|
||||
{
|
||||
Evas_Object *obj, *o;
|
||||
E_Widget_Data *wd;
|
||||
E_Zone *zone;
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
wd->update_handler = ecore_event_handler_add(E_EVENT_BG_UPDATE, _e_wid_cb_bg_update, wd);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
static void
|
||||
_e_wid_desk_cb_config(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
||||
{
|
||||
E_Widget_Desk_Data *dd;
|
||||
Evas_Event_Mouse_Down *ev;
|
||||
|
||||
dd = data;
|
||||
ev = event_info;
|
||||
if (ev->button == 1)
|
||||
{
|
||||
E_Container *con;
|
||||
char buf[256];
|
||||
|
||||
con = e_container_current_get(e_manager_current_get());
|
||||
snprintf(buf, sizeof(buf), "%i %i %i %i",
|
||||
dd->container, dd->zone, dd->x, dd->y);
|
||||
e_configure_registry_call("internal/desk", con, buf);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
_e_wid_cb_bg_update(void *data, int type, void *event)
|
||||
{
|
||||
E_Event_Bg_Update *ev;
|
||||
E_Widget_Data *wd;
|
||||
Eina_List *l;
|
||||
Evas_Object *o;
|
||||
|
||||
if (type != E_EVENT_BG_UPDATE) return 1;
|
||||
|
||||
wd = data;
|
||||
ev = event;
|
||||
|
||||
EINA_LIST_FOREACH(wd->desks, l, o)
|
||||
{
|
||||
E_Widget_Desk_Data *dd;
|
||||
dd = e_widget_data_get(o);
|
||||
|
||||
if (!dd)
|
||||
continue;
|
||||
|
||||
if (((ev->container < 0) || (dd->container == ev->container)) &&
|
||||
((ev->zone < 0) || (dd->zone == ev->zone)) &&
|
||||
((ev->desk_x < 0) || (dd->x == ev->desk_x)) &&
|
||||
((ev->desk_y < 0) || (dd->y == ev->desk_y)))
|
||||
{
|
||||
const char *bgfile = e_bg_file_get(dd->container, dd->zone, dd->x, dd->y);
|
||||
e_thumb_icon_file_set(dd->thumb, bgfile, "e/desktop/background");
|
||||
e_thumb_icon_rethumb(dd->thumb);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
#ifndef E_WIDGET_DESK_PREVIEW_H
|
||||
#define E_WIDGET_DESK_PREVIEW_H
|
||||
|
||||
EAPI Evas_Object *e_widget_desk_preview_add(Evas *evas, int nx, int ny);
|
||||
EAPI void e_widget_desk_preview_num_desks_set(Evas_Object *obj, int nx, int ny);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,198 @@
|
|||
/*
|
||||
* 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, *table;
|
||||
Eina_List *desks;
|
||||
int w, h, dx, dy, cx, cy;
|
||||
};
|
||||
typedef struct _E_Widget_Desk_Data E_Widget_Desk_Data;
|
||||
struct _E_Widget_Desk_Data
|
||||
{
|
||||
Evas_Object *icon, *thumb;
|
||||
int zone, con, x, y;
|
||||
};
|
||||
|
||||
/* local function prototypes */
|
||||
static void _e_wid_del_hook(Evas_Object *obj);
|
||||
static void _e_wid_desk_del_hook(Evas_Object *obj);
|
||||
static void _e_wid_reconfigure(E_Widget_Data *wd);
|
||||
static void _e_wid_desk_cb_config(void *data, Evas *evas, Evas_Object *obj, void *event);
|
||||
static void _e_wid_cb_resize(void *data, Evas *evas, Evas_Object *obj, void *event);
|
||||
|
||||
EAPI Evas_Object *
|
||||
e_widget_deskpreview_add(Evas *evas, int nx, int ny)
|
||||
{
|
||||
Evas_Object *obj;
|
||||
E_Widget_Data *wd;
|
||||
|
||||
obj = e_widget_add(evas);
|
||||
wd = E_NEW(E_Widget_Data, 1);
|
||||
wd->obj = obj;
|
||||
wd->dx = nx;
|
||||
wd->dy = ny;
|
||||
e_widget_data_set(obj, wd);
|
||||
e_widget_del_hook_set(obj, _e_wid_del_hook);
|
||||
|
||||
wd->table = evas_object_table_add(evas);
|
||||
evas_object_table_homogeneous_set(wd->table, EINA_TRUE);
|
||||
evas_object_table_align_set(wd->table, 0.5, 0.5);
|
||||
e_widget_resize_object_set(wd->obj, wd->table);
|
||||
evas_object_show(wd->table);
|
||||
e_widget_sub_object_add(wd->obj, wd->table);
|
||||
|
||||
e_widget_deskpreview_num_desks_set(obj, wd->dx, wd->dy);
|
||||
|
||||
evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE,
|
||||
_e_wid_cb_resize, NULL);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
EAPI void
|
||||
e_widget_deskpreview_num_desks_set(Evas_Object *obj, int nx, int ny)
|
||||
{
|
||||
E_Widget_Data *wd;
|
||||
|
||||
if (!(wd = e_widget_data_get(obj))) return;
|
||||
wd->dx = nx;
|
||||
wd->dy = ny;
|
||||
_e_wid_reconfigure(wd);
|
||||
}
|
||||
|
||||
EAPI Evas_Object *
|
||||
e_widget_deskpreview_desk_add(Evas_Object *obj, E_Zone *zone, int x, int y, int w, int h)
|
||||
{
|
||||
E_Widget_Desk_Data *dd;
|
||||
const char *bgfile;
|
||||
|
||||
bgfile = e_bg_file_get(zone->container->num, zone->num, x, y);
|
||||
|
||||
dd = E_NEW(E_Widget_Desk_Data, 1);
|
||||
dd->con = zone->container->num;
|
||||
dd->zone = zone->num;
|
||||
dd->x = x;
|
||||
dd->y = y;
|
||||
|
||||
dd->icon = e_icon_add(evas_object_evas_get(obj));
|
||||
evas_object_data_set(dd->icon, "desk_data", dd);
|
||||
e_icon_fill_inside_set(dd->icon, EINA_FALSE);
|
||||
e_icon_file_edje_set(dd->icon, bgfile, "e/desktop/background");
|
||||
evas_object_size_hint_min_set(dd->icon, w, h);
|
||||
evas_object_size_hint_max_set(dd->icon, w, h);
|
||||
evas_object_resize(dd->icon, w, h);
|
||||
evas_object_show(dd->icon);
|
||||
|
||||
evas_object_event_callback_add(dd->icon, EVAS_CALLBACK_MOUSE_DOWN,
|
||||
_e_wid_desk_cb_config, dd);
|
||||
|
||||
return dd->icon;
|
||||
}
|
||||
|
||||
/* local function prototypes */
|
||||
static void
|
||||
_e_wid_del_hook(Evas_Object *obj)
|
||||
{
|
||||
E_Widget_Data *wd;
|
||||
|
||||
if (!(wd = e_widget_data_get(obj))) return;
|
||||
|
||||
E_FREE(wd);
|
||||
}
|
||||
|
||||
static void
|
||||
_e_wid_desk_del_hook(Evas_Object *obj)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
_e_wid_reconfigure(E_Widget_Data *wd)
|
||||
{
|
||||
Eina_List *l, *del = NULL;
|
||||
Evas_Object *dw;
|
||||
E_Zone *zone;
|
||||
int tw, th, mw, mh, y;
|
||||
|
||||
zone = e_util_zone_current_get(e_manager_current_get());
|
||||
|
||||
evas_object_geometry_get(wd->table, NULL, NULL, &tw, &th);
|
||||
|
||||
/* TODO: Make these values an aspect of zone */
|
||||
mw = (tw / wd->dx);
|
||||
mh = (th / wd->dy);
|
||||
|
||||
EINA_LIST_FOREACH(wd->desks, l, dw)
|
||||
{
|
||||
E_Widget_Desk_Data *dd;
|
||||
|
||||
if (!(dd = evas_object_data_get(dw, "desk_data"))) continue;
|
||||
if ((dd->x < wd->dx) && (dd->y < wd->dy))
|
||||
{
|
||||
evas_object_size_hint_min_set(dw, mw, mh);
|
||||
evas_object_size_hint_max_set(dw, mw, mh);
|
||||
evas_object_resize(dw, mw, mh);
|
||||
}
|
||||
else
|
||||
del = eina_list_append(del, dw);
|
||||
}
|
||||
EINA_LIST_FREE(del, dw)
|
||||
{
|
||||
evas_object_table_unpack(wd->table, dw);
|
||||
evas_object_del(dw);
|
||||
wd->desks = eina_list_remove(wd->desks, dw);
|
||||
}
|
||||
|
||||
for (y = 0; y < wd->dy; y++)
|
||||
{
|
||||
int x, sx;
|
||||
|
||||
if (y >= wd->cy) sx = 0;
|
||||
else sx = wd->cx;
|
||||
for (x = sx; x < wd->dx; x++)
|
||||
{
|
||||
Evas_Object *dw;
|
||||
|
||||
dw = e_widget_deskpreview_desk_add(wd->obj, zone, x, y, mw, mh);
|
||||
evas_object_table_pack(wd->table, dw, x, y, 1, 1);
|
||||
wd->desks = eina_list_append(wd->desks, dw);
|
||||
}
|
||||
}
|
||||
|
||||
wd->cx = wd->dx;
|
||||
wd->cy = wd->dy;
|
||||
}
|
||||
|
||||
static void
|
||||
_e_wid_desk_cb_config(void *data, Evas *evas, Evas_Object *obj, void *event)
|
||||
{
|
||||
E_Widget_Desk_Data *dd;
|
||||
Evas_Event_Mouse_Down *ev;
|
||||
|
||||
ev = event;
|
||||
if (!(dd = data)) return;
|
||||
if (ev->button == 1)
|
||||
{
|
||||
E_Container *con;
|
||||
char buff[256];
|
||||
|
||||
con = e_container_current_get(e_manager_current_get());
|
||||
snprintf(buff, sizeof(buff), "%i %i %i %i",
|
||||
dd->con, dd->zone, dd->x, dd->y);
|
||||
e_configure_registry_call("internal/desk", con, buff);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_e_wid_cb_resize(void *data, Evas *evas, Evas_Object *obj, void *event)
|
||||
{
|
||||
E_Widget_Data *wd;
|
||||
|
||||
if (!(wd = e_widget_data_get(obj))) return;
|
||||
_e_wid_reconfigure(wd);
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
#ifndef E_WIDGET_DESK_PREVIEW_H
|
||||
#define E_WIDGET_DESK_PREVIEW_H
|
||||
|
||||
EAPI Evas_Object *e_widget_deskpreview_add(Evas *evas, int nx, int ny);
|
||||
EAPI void e_widget_deskpreview_num_desks_set(Evas_Object *obj, int nx, int ny);
|
||||
EAPI Evas_Object *e_widget_deskpreview_desk_add(Evas_Object *obj, E_Zone *zone, int x, int y, int w, int h);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue