elfe: Enable Remove app/widgets from desktops and from config

SVN revision: 57635
This commit is contained in:
Nicolas Aguirre 2011-03-09 20:29:38 +00:00
parent 8a6486fe20
commit c098372d87
6 changed files with 141 additions and 32 deletions

View File

@ -783,6 +783,12 @@ collections
transition: "ACCELERATE" 0.3; transition: "ACCELERATE" 0.3;
after: "vib1"; after: "vib1";
} }
program {
name: "delete_click";
signal: "mouse,clicked,1";
source: "badge_delete";
action: SIGNAL_EMIT "elfe,delete,clicked" "";
}
} }
} }

View File

@ -10,12 +10,22 @@ struct _Elfe_Desktop_Item
{ {
Evas_Object *frame; Evas_Object *frame;
Evas_Object *item; Evas_Object *item;
Evas_Object *icon;
Efreet_Desktop *desktop;
E_Gadcon_Client *gcc;
E_Gadcon_Client_Class *cc;
int row; int row;
int col; int col;
Efreet_Desktop *desktop;
Eina_Bool edit_mode; Eina_Bool edit_mode;
}; };
static void
_gadget_del(E_Gadcon_Client *gcc)
{
e_object_del(E_OBJECT(gcc));
}
static Evas_Object * static Evas_Object *
_gadget_add(Elfe_Desktop_Item *dit, const char *name, E_Gadcon *gc) _gadget_add(Elfe_Desktop_Item *dit, const char *name, E_Gadcon *gc)
{ {
@ -26,19 +36,26 @@ _gadget_add(Elfe_Desktop_Item *dit, const char *name, E_Gadcon *gc)
if (!gc) return NULL; if (!gc) return NULL;
item = edje_object_add(evas_object_evas_get(dit->frame));
edje_object_file_set(item, elfe_home_cfg->theme, "elfe/desktop/gadget/frame");
cc = elfe_utils_gadcon_client_class_from_name(name); cc = elfe_utils_gadcon_client_class_from_name(name);
if (!cc) if (!cc)
{ {
printf("Error unable to retrieve gadcon client class for %s\n", name); printf("Error unable to retrieve gadcon client class for %s\n", name);
return NULL; return NULL;
} }
gcc = cc->func.init(gc, cc->name, "test", cc->default_style); gcc = cc->func.init(gc, cc->name, "test", cc->default_style);
if (!gcc) return NULL;
e_object_del_func_set(E_OBJECT(gcc), E_OBJECT_CLEANUP_FUNC(_gadget_del));
item = edje_object_add(evas_object_evas_get(dit->frame));
edje_object_file_set(item, elfe_home_cfg->theme, "elfe/desktop/gadget/frame");
gcc->cf = NULL; gcc->cf = NULL;
gcc->client_class = cc; gcc->client_class = cc;
edje_object_part_swallow(item, "elfe.swallow.content", gcc->o_base); edje_object_part_swallow(item, "elfe.swallow.content", gcc->o_base);
dit->gcc = gcc;
dit->cc = cc;
return item; return item;
} }
@ -59,6 +76,16 @@ _clicked_signal_cb(void *data, Evas_Object *obj, const char *emission, const cha
_app_exec_cb, NULL); _app_exec_cb, NULL);
} }
static void
_delete_signal_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
{
Elfe_Desktop_Item *dit = data;
if (dit->edit_mode)
evas_object_smart_callback_call(dit->frame,
"item,delete", dit->frame);
}
static Evas_Object * static Evas_Object *
_app_add(Elfe_Desktop_Item *dit, const char *name) _app_add(Elfe_Desktop_Item *dit, const char *name)
@ -71,6 +98,7 @@ _app_add(Elfe_Desktop_Item *dit, const char *name)
icon = elfe_utils_fdo_icon_add(dit->frame, dit->desktop->icon, 96); icon = elfe_utils_fdo_icon_add(dit->frame, dit->desktop->icon, 96);
edje_object_part_swallow(item, "elfe.swallow.content", icon); edje_object_part_swallow(item, "elfe.swallow.content", icon);
dit->icon = icon;
edje_object_part_text_set(item, "elfe.text.label", dit->desktop->name); edje_object_part_text_set(item, "elfe.text.label", dit->desktop->name);
edje_object_signal_callback_add(item, "mouse,clicked,1", "*", _clicked_signal_cb, dit); edje_object_signal_callback_add(item, "mouse,clicked,1", "*", _clicked_signal_cb, dit);
@ -79,7 +107,7 @@ _app_add(Elfe_Desktop_Item *dit, const char *name)
} }
void void
elfe_desktop_item_pos_get(Evas_Object *obj, int *col, int *row) elfe_desktop_item_pos_get(Evas_Object *obj, int *row, int *col)
{ {
Elfe_Desktop_Item *dit = evas_object_data_get(obj, "desktop_item"); Elfe_Desktop_Item *dit = evas_object_data_get(obj, "desktop_item");
@ -104,6 +132,26 @@ elfe_desktop_item_edit_mode_set(Evas_Object *obj, Eina_Bool mode)
edje_object_signal_emit(dit->frame, "action,edit,on", "elfe"); edje_object_signal_emit(dit->frame, "action,edit,on", "elfe");
} }
static void
_obj_del_cb(void *data , Evas *e , Evas_Object *obj, void *event_info )
{
Elfe_Desktop_Item *dit = data;
/* FIXME delay object deletion and add edje effect before deleting */
if (dit->icon)
evas_object_del(dit->icon);
if (dit->gcc)
e_object_del(E_OBJECT(dit->gcc));
if (dit->item)
evas_object_del(dit->item);
if (dit->desktop)
efreet_desktop_free(dit->desktop);
free(dit);
dit = NULL;
}
Evas_Object * Evas_Object *
elfe_desktop_item_add(Evas_Object *parent, elfe_desktop_item_add(Evas_Object *parent,
int row, int col, int row, int col,
@ -119,8 +167,8 @@ elfe_desktop_item_add(Evas_Object *parent,
if (!dit) if (!dit)
return NULL; return NULL;
dit->col = col;
dit->row = row; dit->row = row;
dit->col = col;
layout = edje_object_add(evas_object_evas_get(parent)); layout = edje_object_add(evas_object_evas_get(parent));
edje_object_file_set(layout, elfe_home_cfg->theme, "elfe/desktop/frame"); edje_object_file_set(layout, elfe_home_cfg->theme, "elfe/desktop/frame");
@ -144,16 +192,27 @@ elfe_desktop_item_add(Evas_Object *parent,
break; break;
case ELFE_DESKTOP_ITEM_GADGET: case ELFE_DESKTOP_ITEM_GADGET:
item = _gadget_add(dit, name, gc); item = _gadget_add(dit, name, gc);
if (!item)
{
printf("ERROR unable to create gadget %s\n", name);
evas_object_del(layout);
free(dit);
return NULL;
}
break; break;
default: default:
break; break;
} }
edje_object_part_swallow(layout, "elfe.swallow.content", item); edje_object_part_swallow(layout, "elfe.swallow.content", item);
edje_object_signal_callback_add(layout, "elfe,delete,clicked", "*", _delete_signal_cb, dit);
evas_object_show(item); evas_object_show(item);
dit->item = item; dit->item = item;
evas_object_event_callback_add(dit->frame, EVAS_CALLBACK_DEL,
_obj_del_cb, dit);
evas_object_data_set(dit->frame, "desktop_item", dit); evas_object_data_set(dit->frame, "desktop_item", dit);
return dit->frame; return dit->frame;

View File

@ -19,7 +19,7 @@ struct _Elfe_Desktop_Page
static void static void
_pos_to_geom(Elfe_Desktop_Page *page, _pos_to_geom(Elfe_Desktop_Page *page,
int col, int row, int row, int col,
Evas_Coord *x, Evas_Coord *y, Evas_Coord *x, Evas_Coord *y,
Evas_Coord *w, Evas_Coord *h) Evas_Coord *w, Evas_Coord *h)
{ {
@ -43,7 +43,7 @@ _pos_to_geom(Elfe_Desktop_Page *page,
static void static void
_xy_to_pos(Elfe_Desktop_Page *page, Evas_Coord x, Evas_Coord y, _xy_to_pos(Elfe_Desktop_Page *page, Evas_Coord x, Evas_Coord y,
int *col, int *row) int *row, int *col)
{ {
Evas_Coord ow, oh; Evas_Coord ow, oh;
Evas_Coord w = 0, h = 0; Evas_Coord w = 0, h = 0;
@ -124,6 +124,21 @@ static void _gadcon_del(E_Gadcon *gc)
/* FIXME delete gadcon */ /* FIXME delete gadcon */
} }
static void
_item_delete_cb(void *data , Evas_Object *obj, void *event_info)
{
Evas_Object *item = event_info;
Elfe_Desktop_Page *page = data;
int row, col;
elfe_desktop_item_pos_get(item, &row, &col);
eina_matrixsparse_cell_idx_clear(page->items, row, col);
evas_object_del(item);
elfe_home_config_desktop_item_del(page->desktop,
row, col);
}
static void static void
_populate_page(Elfe_Desktop_Page *page) _populate_page(Elfe_Desktop_Page *page)
{ {
@ -137,22 +152,26 @@ _populate_page(Elfe_Desktop_Page *page)
{ {
Evas_Coord x = 0, y = 0, w = 0, h = 0; Evas_Coord x = 0, y = 0, w = 0, h = 0;
printf("Page %d populage item [%d %d]: %s\n", page->desktop, dic->col, dic->row, dic->name); printf("Page %d populage item [%d %d]: %s\n", page->desktop, dic->row, dic->col, dic->name);
/* This position is already in use, this is a conf issue! */ /* This position is already in use, this is a conf issue! */
/* FIXME: delete item from config ? */ /* FIXME: delete item from config ? */
if (eina_matrixsparse_data_idx_get(page->items, dic->col, dic->row)) if (eina_matrixsparse_data_idx_get(page->items, dic->row, dic->col))
continue; continue;
item = elfe_desktop_item_add(page->layout, dic->row, dic->col, item = elfe_desktop_item_add(page->layout, dic->row, dic->col,
dic->name, dic->type, page->gc); dic->name, dic->type, page->gc);
if (!item)
continue;
evas_object_smart_callback_add(item, "item,delete", _item_delete_cb, page);
e_layout_pack(page->layout, item); e_layout_pack(page->layout, item);
_pos_to_geom(page, dic->col, dic->row, &x, &y, &w, &h); _pos_to_geom(page, dic->row, dic->col, &x, &y, &w, &h);
e_layout_child_resize(item, w, h); e_layout_child_resize(item, w, h);
e_layout_child_move(item, x, y); e_layout_child_move(item, x, y);
evas_object_show(item); evas_object_show(item);
eina_matrixsparse_data_idx_set(page->items, dic->col, dic->row, item); eina_matrixsparse_data_idx_set(page->items, dic->row, dic->col, item);
} }
} }
@ -175,8 +194,8 @@ _page_resize_cb(void *data , Evas *e , Evas_Object *obj, void *event_info )
EINA_ITERATOR_FOREACH(iter, cell) EINA_ITERATOR_FOREACH(iter, cell)
{ {
item = eina_matrixsparse_cell_data_get(cell); item = eina_matrixsparse_cell_data_get(cell);
elfe_desktop_item_pos_get(item, &col, &row); elfe_desktop_item_pos_get(item, &row, &col);
_pos_to_geom(page, col, row, &x, &y, &w, &h); _pos_to_geom(page, row, col, &x, &y, &w, &h);
e_layout_child_resize(item, w, h); e_layout_child_resize(item, w, h);
e_layout_child_move(item, x, y); e_layout_child_move(item, x, y);
evas_object_show(item); evas_object_show(item);
@ -185,10 +204,10 @@ _page_resize_cb(void *data , Evas *e , Evas_Object *obj, void *event_info )
} }
Eina_Bool Eina_Bool
elfe_desktop_page_pos_is_free(Evas_Object *obj, int col, int row) elfe_desktop_page_pos_is_free(Evas_Object *obj, int row, int col)
{ {
Elfe_Desktop_Page *page = evas_object_data_get(obj, "desktop_page"); Elfe_Desktop_Page *page = evas_object_data_get(obj, "desktop_page");
if (eina_matrixsparse_data_idx_get(page->items, col, row)) if (eina_matrixsparse_data_idx_get(page->items, row, col))
return EINA_TRUE; return EINA_TRUE;
else else
return EINA_FALSE; return EINA_FALSE;
@ -203,26 +222,28 @@ elfe_desktop_page_item_gadget_add(Evas_Object *obj, const char *name,
Evas_Coord ox = 0, oy = 0, ow = 0, oh = 0; Evas_Coord ox = 0, oy = 0, ow = 0, oh = 0;
int row = 0, col = 0; int row = 0, col = 0;
_xy_to_pos(page, x, y, &col, &row); _xy_to_pos(page, x, y, &row, &col);
/* This position is already used by another item! */ /* This position is already used by another item! */
if (eina_matrixsparse_data_idx_get(page->items, col, row)) return; if (eina_matrixsparse_data_idx_get(page->items, row, col)) return;
item = elfe_desktop_item_add(page->layout, col, row, item = elfe_desktop_item_add(page->layout, row, col,
name, name,
ELFE_DESKTOP_ITEM_GADGET, page->gc); ELFE_DESKTOP_ITEM_GADGET, page->gc);
e_layout_pack(page->layout, item); e_layout_pack(page->layout, item);
_pos_to_geom(page, col, row, &ox, &oy, &ow, &oh); _pos_to_geom(page, row, col, &ox, &oy, &ow, &oh);
e_layout_child_resize(item, ow, oh); e_layout_child_resize(item, ow, oh);
e_layout_child_move(item, ox, oy); e_layout_child_move(item, ox, oy);
evas_object_show(item); evas_object_show(item);
eina_matrixsparse_data_idx_set(page->items, col, row, item); evas_object_raise(item);
eina_matrixsparse_data_idx_set(page->items, row, col, item);
elfe_home_config_desktop_item_add(page->desktop, elfe_home_config_desktop_item_add(page->desktop,
ELFE_DESKTOP_ITEM_GADGET, ELFE_DESKTOP_ITEM_GADGET,
col, row, row, col,
0, 0, 0, 0, 0, 0, 0, 0,
name); name);
evas_object_smart_callback_add(item, "item,delete", _item_delete_cb, page);
} }
void void
@ -234,27 +255,29 @@ elfe_desktop_page_item_app_add(Evas_Object *obj, Efreet_Menu *menu,
Evas_Coord ox = 0, oy = 0, ow = 0, oh = 0; Evas_Coord ox = 0, oy = 0, ow = 0, oh = 0;
int row = 0, col = 0; int row = 0, col = 0;
_xy_to_pos(page, x, y, &col, &row); _xy_to_pos(page, x, y, &row, &col);
/* This position is already used by another item! */ /* This position is already used by another item! */
if (eina_matrixsparse_data_idx_get(page->items, col, row)) return; if (eina_matrixsparse_data_idx_get(page->items, row, col)) return;
item = elfe_desktop_item_add(page->layout, col, row, item = elfe_desktop_item_add(page->layout, row, col,
menu->desktop->orig_path, menu->desktop->orig_path,
ELFE_DESKTOP_ITEM_APP, NULL); ELFE_DESKTOP_ITEM_APP, NULL);
e_layout_pack(page->layout, item); e_layout_pack(page->layout, item);
_pos_to_geom(page, col, row, &ox, &oy, &ow, &oh); _pos_to_geom(page, row, col, &ox, &oy, &ow, &oh);
e_layout_child_resize(item, ow, oh); e_layout_child_resize(item, ow, oh);
e_layout_child_move(item, ox, oy); e_layout_child_move(item, ox, oy);
evas_object_show(item); evas_object_show(item);
evas_object_raise(item);
eina_matrixsparse_data_idx_set(page->items, col, row, item); eina_matrixsparse_data_idx_set(page->items, row, col, item);
elfe_home_config_desktop_item_add(page->desktop, elfe_home_config_desktop_item_add(page->desktop,
ELFE_DESKTOP_ITEM_APP, ELFE_DESKTOP_ITEM_APP,
col, row, row, col,
0, 0, 0, 0, 0, 0, 0, 0,
menu->desktop->orig_path); menu->desktop->orig_path);
evas_object_smart_callback_add(item, "item,delete", _item_delete_cb, page);
} }
void void
@ -286,7 +309,7 @@ elfe_desktop_page_add(Evas_Object *parent, E_Zone *zone,
if (!page) if (!page)
return NULL; return NULL;
page->items = eina_matrixsparse_new(elfe_home_cfg->cols, elfe_home_cfg->rows, page->items = eina_matrixsparse_new(elfe_home_cfg->rows, elfe_home_cfg->cols,
NULL, NULL); NULL, NULL);
page->layout = e_layout_add(evas_object_evas_get(parent)); page->layout = e_layout_add(evas_object_evas_get(parent));

View File

@ -165,7 +165,7 @@ _elfe_home_config_change_timeout(void *data __UNUSED__)
void elfe_home_config_desktop_item_add(int desktop, void elfe_home_config_desktop_item_add(int desktop,
Elfe_Desktop_Item_Type type, Elfe_Desktop_Item_Type type,
int col, int row, int row, int col,
Evas_Coord x, Evas_Coord y, Evas_Coord x, Evas_Coord y,
Evas_Coord w, Evas_Coord h, Evas_Coord w, Evas_Coord h,
const char *name) const char *name)
@ -190,3 +190,24 @@ void elfe_home_config_desktop_item_add(int desktop,
elfe_home_config_save(); elfe_home_config_save();
} }
void elfe_home_config_desktop_item_del(int desktop,
int row, int col)
{
Elfe_Desktop_Config *dc;
Elfe_Desktop_Item_Config *dic;
Eina_List *l;
printf("DELETE CONFIG ITEM %d %d\n", col, row);
dc = eina_list_nth(elfe_home_cfg->desktops, desktop);
EINA_LIST_FOREACH(dc->items, l, dic)
{
if ((dic->row == row) && (dic->col == col))
{
printf("Delete %d %d\n", row, col);
dc->items = eina_list_remove(dc->items, dic);
elfe_home_config_save();
return;
}
}
}

View File

@ -47,7 +47,7 @@ int elfe_home_config_save(void);
void elfe_home_config_show(E_Container *con, const char *params); void elfe_home_config_show(E_Container *con, const char *params);
void elfe_home_config_desktop_item_add(int desktop, void elfe_home_config_desktop_item_add(int desktop,
Elfe_Desktop_Item_Type type, Elfe_Desktop_Item_Type type,
int col, int row, int row, int col,
Evas_Coord x, Evas_Coord y, Evas_Coord x, Evas_Coord y,
Evas_Coord w, Evas_Coord h, Evas_Coord w, Evas_Coord h,
const char *name); const char *name);

View File

@ -17,7 +17,7 @@ _list_longpress(void *data, Evas_Object *obj, void *event_info)
name = elm_list_item_data_get(it); name = elm_list_item_data_get(it);
evas_object_smart_callback_call(data, evas_object_smart_callback_call(data,
"list,longpressed", name); "list,longpressed", (void*)name);
} }
Evas_Object * Evas_Object *