overhaul gadman to utilize the new gadget config dialogs, also streamline gadman gadget deletion to work like regular gadgets

SVN revision: 76258
This commit is contained in:
Mike Blumenkrantz 2012-09-06 18:28:02 +00:00
parent b4f5a3c614
commit d28abd0421
3 changed files with 136 additions and 117 deletions

View File

@ -5,8 +5,8 @@
struct _E_Config_Dialog_Data
{
Evas_Object *o_avail; //List of available gadgets
Evas_Object *o_add; //Add button
Evas_Object *o_avail;
Evas_Object *o_config;
Evas_Object *o_fm; //Filemanager Object
Evas_Object *o_sf; //Filemanager Scrollframe
Evas_Object *o_btn; //Filemanager updir button
@ -15,6 +15,16 @@ struct _E_Config_Dialog_Data
int anim_bg; //Anim the background
int anim_gad; //Anim the gadgets
int fmdir; //Filemanager dir (personal or system)
Ecore_Event_Handler *add;
Eina_List *waiting;
E_Config_Dialog *cfd;
};
static const char *gadman_layer_names[] =
{
"Background",
"Hover",
NULL
};
/* Local protos */
@ -22,9 +32,7 @@ static void *_create_data(E_Config_Dialog *cfd);
static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static void _fill_gadgets_list(Evas_Object *ilist);
static void _cb_add(void *data, void *data2);
static void _avail_list_cb_change(void *data, Evas_Object *obj);
static void _avail_list_cb_change(void *data);
static void _cb_fm_radio_change(void *data, Evas_Object *obj);
static void _cb_color_changed(void *data, Evas_Object *o);
static void _cb_fm_change(void *data, Evas_Object *obj, void *event_info);
@ -52,7 +60,7 @@ _config_gadman_module(E_Container *con, const char *params __UNUSED__)
v->basic.apply_cfdata = _basic_apply_data;
snprintf(buf, sizeof(buf), "%s/e-module-gadman.edj", Man->module->dir);
cfd = e_config_dialog_new(con, _("Gadgets Manager"),
cfd = e_config_dialog_new(con, _("Desktop Gadgets"),
"E", "extensions/gadman",
buf, 0, v, Man);
@ -60,12 +68,30 @@ _config_gadman_module(E_Container *con, const char *params __UNUSED__)
return Man->config_dialog;
}
static Eina_Bool
_gcc_add(E_Config_Dialog_Data *cfdata, int type __UNUSED__, E_Event_Gadcon_Client_Add *ev)
{
Eina_List *l;
if (!cfdata->waiting) return ECORE_CALLBACK_RENEW;
l = eina_list_data_find_list(cfdata->waiting, ev->gcc->gadcon);
if (!l) return ECORE_CALLBACK_RENEW;
if (ev->gcc->cf != eina_list_data_get(eina_list_last(ev->gcc->gadcon->cf->clients))) return ECORE_CALLBACK_RENEW;
gadman_gadget_edit_start(ev->gcc);
ev->gcc->cf->style = eina_stringshare_add(ev->gcc->client_class->default_style);
ev->gcc->cf->geom.pos_x = DEFAULT_POS_X;
ev->gcc->cf->geom.pos_y = DEFAULT_POS_Y;
ev->gcc->cf->geom.size_w = DEFAULT_SIZE_W;
ev->gcc->cf->geom.size_h = DEFAULT_SIZE_H;
return ECORE_CALLBACK_RENEW;
}
static void *
_create_data(E_Config_Dialog *cfd __UNUSED__)
_create_data(E_Config_Dialog *cfd)
{
E_Config_Dialog_Data *cfdata;
cfdata = E_NEW(E_Config_Dialog_Data, 1);
cfdata->cfd = cfd;
cfdata->bg_method = Man->conf->bg_type;
if (Man->conf->custom_bg)
{
@ -73,6 +99,7 @@ _create_data(E_Config_Dialog *cfd __UNUSED__)
cfdata->fmdir = 1;
}
cfdata->add = ecore_event_handler_add(E_EVENT_GADCON_CLIENT_ADD, (Ecore_Event_Handler_Cb)_gcc_add, cfdata);
cfdata->color = E_NEW(E_Color, 1);
cfdata->color->r = Man->conf->color_r;
cfdata->color->g = Man->conf->color_g;
@ -90,12 +117,49 @@ _create_data(E_Config_Dialog *cfd __UNUSED__)
static void
_free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
int layer;
Eina_List *l;
E_Gadcon *gc;
Man->config_dialog = NULL;
ecore_event_handler_del(cfdata->add);
E_FREE(cfdata->color);
_cfdata = NULL;
for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
EINA_LIST_FOREACH(Man->gadcons[layer], l, gc)
gc->config_dialog = NULL;
eina_list_free(cfdata->waiting);
E_FREE(cfdata);
}
static void
_cb_config_del(void *data)
{
E_Config_Dialog_Data *cfdata = e_object_data_get(data);
cfdata->waiting = eina_list_remove(cfdata->waiting, data);
}
static void
_cb_config(void *data, void *data2 __UNUSED__)
{
int x;
E_Config_Dialog_Data *cfdata = data;
Eina_List *l;
E_Gadcon *gc;
x = e_widget_ilist_selected_get(cfdata->o_avail);
EINA_LIST_FOREACH(Man->gadcons[x], l, gc)
{
if (gc->zone != cfdata->cfd->dia->win->border->zone) continue;
if (gc->config_dialog) return;
e_int_gadcon_config_hook(gc, _("Desktop Gadgets"), E_GADCON_SITE_DESKTOP);
cfdata->waiting = eina_list_append(cfdata->waiting, gc);
e_object_data_set(E_OBJECT(gc->config_dialog), cfdata);
e_object_del_attach_func_set(E_OBJECT(gc->config_dialog), _cb_config_del);
break;
}
}
static Evas_Object *
_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
{
@ -104,24 +168,24 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
Evas_Coord mw, mh;
E_Fm2_Config fmc;
char path[PATH_MAX];
int layer;
otb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale);
o = e_widget_list_add(evas, 0, 0);
of = e_widget_framelist_add(evas, _("Available Gadgets"), 0);
of = e_widget_framelist_add(evas, _("Available Layers"), 0);
//o_avail List of available gadgets
//o_avail List of available layers
ol = e_widget_ilist_add(evas, 24, 24, NULL);
e_widget_ilist_multi_select_set(ol, 0);
e_widget_on_change_hook_set(ol, _avail_list_cb_change, cfdata);
cfdata->o_avail = ol;
_fill_gadgets_list(ol);
for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
e_widget_ilist_append(ol, NULL, _(gadman_layer_names[layer]), _avail_list_cb_change, cfdata, NULL);
e_widget_framelist_object_append(of, ol);
//o_add Button to add a gadget
ob = e_widget_button_add(evas, _("Add Gadget"), NULL, _cb_add, cfdata, NULL);
//o_config Button to configure a layer
ob = e_widget_button_add(evas, _("Configure Layer"), NULL, _cb_config, cfdata, NULL);
e_widget_disabled_set(ob, 1);
cfdata->o_add = ob;
cfdata->o_config = ob;
e_widget_size_min_get(ob, &mw, &mh);
e_widget_framelist_object_append_full(of, ob,
1, 1, /* fill */
@ -134,7 +198,8 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
e_widget_list_object_append(o, of, 1, 1, 0.5);
e_dialog_resizable_set(cfd->dia, 1);
e_widget_toolbook_page_append(otb, NULL, _("Add Gadget"), o, 1, 1, 1, 1, 0.5, 0.0);
e_widget_toolbook_page_append(otb, NULL, _("Layers"), o, 1, 1, 1, 1, 0.5, 0.0);
/////////////////////////////////////////////////////////////////////
ft = e_widget_table_add(evas, 0);
//Background mode
@ -280,74 +345,12 @@ _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
//Basic Callbacks
static void
_fill_gadgets_list(Evas_Object *ilist)
{
Eina_List *l = NULL;
Evas *evas;
int w;
e_widget_ilist_freeze(ilist);
e_widget_ilist_clear(ilist);
evas = evas_object_evas_get(ilist);
for (l = e_gadcon_provider_list(); l; l = l->next)
{
E_Gadcon_Client_Class *cc;
Evas_Object *icon = NULL;
const char *lbl = NULL;
if (!(cc = l->data)) continue;
if (cc->func.is_site && !cc->func.is_site(E_GADCON_SITE_DESKTOP))
continue;
if (cc->func.label) lbl = cc->func.label(cc);
if (!lbl) lbl = cc->name;
if (cc->func.icon) icon = cc->func.icon(cc, evas);
e_widget_ilist_append(ilist, icon, lbl, NULL, (void *)cc, NULL);
}
e_widget_ilist_go(ilist);
e_widget_size_min_get(ilist, &w, NULL);
if (w < 200) w = 200;
e_widget_size_min_set(ilist, w, 100);
e_widget_ilist_thaw(ilist);
}
static void
_cb_add(void *data, void *data2 __UNUSED__)
{
E_Config_Dialog_Data *cfdata;
Eina_List *l = NULL;
int i;
if (!(cfdata = data)) return;
for (i = 0, l = e_widget_ilist_items_get(cfdata->o_avail); l; l = l->next, i++)
{
E_Ilist_Item *item = NULL;
E_Gadcon_Client_Class *cc;
E_Gadcon_Client *gcc;
if (!(item = l->data)) continue;
if (!item->selected) continue;
cc = e_widget_ilist_nth_data_get(cfdata->o_avail, i);
if (!cc) continue;
gcc = gadman_gadget_add(cc, GADMAN_LAYER_BG);
if (gcc) gadman_gadget_edit_start(gcc);
}
if (l) eina_list_free(l);
}
static void
_avail_list_cb_change(void *data, Evas_Object *obj __UNUSED__)
_avail_list_cb_change(void *data)
{
E_Config_Dialog_Data *cfdata;
if (!(cfdata = data)) return;
e_widget_disabled_set(cfdata->o_add, 0);
e_widget_disabled_set(cfdata->o_config, 0);
}
//Advanced Callbacks
@ -428,10 +431,3 @@ _cb_button_up(void *data1, void *data2 __UNUSED__)
e_fm2_parent_go(cfdata->o_fm);
e_widget_scrollframe_child_pos_set(cfdata->o_sf, 0, 0);
}
EAPI void
e_config_gadman_list_refresh(void)
{
if (!_cfdata) return;
_fill_gadgets_list(_cfdata->o_avail);
}

View File

@ -4,7 +4,6 @@
#define E_MOD_CONFIG_H
E_Config_Dialog *_config_gadman_module(E_Container *con, const char *params __UNUSED__);
EAPI void e_config_gadman_list_refresh(void);
#endif
#endif

View File

@ -48,7 +48,7 @@ static void _e_gadman_handler_del(void);
static Eina_Bool _e_gadman_cb_zone_add(void *data __UNUSED__, int type __UNUSED__, void *event);
static Eina_Bool _e_gadman_cb_zone_del(void *data __UNUSED__, int type __UNUSED__, void *event);
static E_Gadcon_Client *gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Config_Gadcon_Client *cf, Gadman_Layer_Type layer, E_Zone *zone);
static void gadman_gadget_del(E_Gadcon_Client *gcc);
static E_Gadcon *gadman_gadcon_get(const E_Zone *zone, Gadman_Layer_Type layer);
E_Gadcon_Client *current = NULL;
@ -213,6 +213,40 @@ gadman_gadcon_get(const E_Zone *zone, Gadman_Layer_Type layer)
return NULL;
}
static void
gadman_gadcon_place_job(E_Gadcon_Client *gcc)
{
_apply_widget_position(gcc);
if (gcc == current)
gadman_gadget_edit_start(gcc);
evas_object_show(gcc->o_frame);
}
static void
_gadman_gadget_free(void *data __UNUSED__, void *obj)
{
E_Gadcon_Client *gcc = obj;
Eina_List *l;
int layer;
Eina_Bool edit;
layer = gcc->gadcon->id - ID_GADMAN_LAYER_BASE;
// edje_object_part_unswallow(gcc->o_frame, gcc->o_base);
if (gcc->cf)
{
Man->gadgets[layer] = eina_list_remove(Man->gadgets[layer], gcc->cf);
l = eina_hash_find(_gadman_gadgets, gcc->name);
if (l)
{
eina_hash_set(_gadman_gadgets, gcc->name, eina_list_remove(l, gcc->cf));
}
gcc->cf = NULL;
}
edit = (gcc == current);
current = NULL;
if (edit) gadman_gadget_edit_end(NULL, NULL, NULL, NULL);
}
static E_Gadcon_Client *
gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Config_Gadcon_Client *cf, Gadman_Layer_Type layer, E_Zone *zone)
{
@ -246,6 +280,7 @@ gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Con
{
gcc = cc->func.init(gc, cf->name, cf->id, cc->default_style);
if (!gcc) return NULL;
e_object_delfn_add(E_OBJECT(gcc), _gadman_gadget_free, NULL);
gcc->cf = cf;
gcc->client_class = cc;
@ -272,8 +307,6 @@ gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Con
evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOUSE_DOWN,
on_frame_click, gcc);
_apply_widget_position(gcc);
if (gcc->gadcon->id == ID_GADMAN_LAYER_TOP)
edje_object_signal_emit(gcc->o_frame, "e,state,visibility,hide", "e");
if (cc->name)
@ -281,7 +314,7 @@ gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Con
l = eina_hash_find(_gadman_gadgets, cc->name);
eina_hash_set(_gadman_gadgets, cc->name, eina_list_append(l, gcc->cf));
}
evas_object_show(gcc->o_frame);
ecore_job_add((Ecore_Cb)gadman_gadcon_place_job, gcc);
return gcc;
}
@ -347,24 +380,9 @@ _gadman_gadget_add(const E_Gadcon_Client_Class *cc, Gadman_Layer_Type layer, E_C
}
static void
gadman_gadget_del(E_Gadcon_Client *gcc)
gadman_edit(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Gadman_Layer_Type layer;
Eina_List *l;
if (!gcc) return;
layer = gcc->gadcon->id - ID_GADMAN_LAYER_BASE;
// edje_object_part_unswallow(gcc->o_frame, gcc->o_base);
if (gcc->cf)
{
Man->gadgets[layer] = eina_list_remove(Man->gadgets[layer], gcc->cf);
l = eina_hash_find(_gadman_gadgets, gcc->name);
eina_hash_set(_gadman_gadgets, gcc->name, eina_list_remove(l, gcc->cf));
e_gadcon_client_config_del(gcc->gadcon->cf, gcc->cf);
gcc->cf = NULL;
}
e_object_del(E_OBJECT(gcc));
current = NULL;
_apply_widget_position(data);
}
void
@ -374,19 +392,21 @@ gadman_gadget_edit_start(E_Gadcon_Client *gcc)
Evas_Object *mover;
int x, y, w, h;
current = gcc;
gc = gcc->gadcon;
gc->editing = 1;
/* Move/resize the correct mover */
evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h);
mover = _get_mover(gcc);
if (!mover) return;
evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h);
evas_object_move(mover, x, y);
evas_object_resize(mover, w, h);
evas_object_raise(mover);
evas_object_show(mover);
evas_object_event_callback_del(mover, EVAS_CALLBACK_HIDE, gadman_edit);
evas_object_event_callback_add(mover, EVAS_CALLBACK_HIDE, gadman_edit, gcc);
current = gcc;
}
void
@ -399,6 +419,7 @@ gadman_gadget_edit_end(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const
const Eina_List *l;
E_Gadcon *gc;
evas_object_event_callback_del(Man->movers[layer], EVAS_CALLBACK_HIDE, gadman_edit);
evas_object_hide(Man->movers[layer]);
EINA_LIST_FOREACH(Man->gadcons[layer], l, gc)
@ -572,6 +593,7 @@ _gadman_gadcon_free(E_Gadcon *gc)
eina_stringshare_del(gc->name);
if (gc->config_dialog) e_object_del(E_OBJECT(gc->config_dialog));
eina_list_free(gc->populated_classes);
free(gc);
}
@ -1127,7 +1149,8 @@ _on_menu_layer(E_Gadcon_Client *gcc, Gadman_Layer_Type layer)
cf = gcc->cf;
new_gcc = _gadman_gadget_add(cc, layer, cf);
gadman_gadget_del(gcc);
gcc->cf = NULL;
e_object_del(E_OBJECT(gcc));
current = new_gcc;
e_config_save_queue();
@ -1163,7 +1186,9 @@ on_menu_add(void *data __UNUSED__, E_Menu *m, E_Menu_Item *mi __UNUSED__)
static void
on_menu_delete(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
{
gadman_gadget_del(data);
E_Gadcon_Client *gcc = data;
e_gadcon_client_config_del(gcc->gadcon->cf, gcc->cf);
e_object_del(data);
e_config_save_queue();
}
@ -1488,7 +1513,7 @@ _e_gadman_client_add(void *data __UNUSED__, const E_Gadcon_Client_Class *cc)
static void
_e_gadman_client_remove(void *data __UNUSED__, E_Gadcon_Client *gcc)
{
gadman_gadget_del(gcc);
e_object_del(E_OBJECT(gcc));
}
static void
@ -1527,10 +1552,9 @@ _gadman_module_cb(void *d __UNUSED__, int type __UNUSED__, E_Event_Module_Update
gcc = e_gadcon_client_find(NULL, cf_gcc);
if (!gcc) continue;
gcc->cf = NULL;
gadman_gadget_del(gcc);
e_object_del(E_OBJECT(gcc));
}
}
e_config_gadman_list_refresh();
return ECORE_CALLBACK_RENEW;
}