Enlightenment CVS committal Author : devilhorns Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_int_gadcon_config.c Log Message: Better Shelf Contents Dialog. - Allows multi-select so we don't have to constently reload the shelf. - Provides descriptions for the modules just like the module dialog. =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_int_gadcon_config.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -3 -r1.43 -r1.44 --- e_int_gadcon_config.c 9 Nov 2007 23:53:38 -0000 1.43 +++ e_int_gadcon_config.c 4 Jan 2008 09:18:42 -0000 1.44 @@ -1,33 +1,33 @@ -/* - * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 - */ #include "e.h" -/* PROTOTYPES - same all the time */ +/* local function protos */ +static void _e_int_gadcon_config(E_Gadcon *gc, const char *title); static void *_create_data(E_Config_Dialog *cfd); +static void _fill_data(E_Config_Dialog_Data *cfdata); 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 void _load_available_gadgets(void *data); -static void _load_selected_gadgets(void *data); +static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); static int _cb_mod_update(void *data, int type, void *event); -static void _e_int_gadcon_config(E_Gadcon *gc, const char *title); +static void _avail_list_cb_change(void *data, Evas_Object *obj); +static void _sel_list_cb_change(void *data, Evas_Object *obj); +static void _load_avail_gadgets(void *data); +static void _load_sel_gadgets(void *data); +static void _cb_add(void *data, void *data2); +static void _cb_del(void *data, void *data2); +static void _set_description(void *data, const char *name); + +struct _E_Config_Dialog_Data +{ + Evas_Object *o_avail, *o_sel; + Evas_Object *o_add, *o_del; + Evas_Object *o_desc; -/* Actual config data we will be playing with while the dialog is active */ -struct _E_Config_Dialog_Data -{ E_Gadcon *gc; - char *name_add; - char *id_remove; - Evas_Hash *ids; - Evas_Object *o_add, *o_remove, *o_instances, *o_avail; - - E_Config_Gadcon *cf_gc; - Ecore_Event_Handler *hdl; }; -EAPI void -e_int_gadcon_config_shelf(E_Gadcon *gc) +/* externals */ +EAPI void +e_int_gadcon_config_shelf(E_Gadcon *gc) { _e_int_gadcon_config(gc, _("Shelf Contents")); } @@ -38,281 +38,333 @@ _e_int_gadcon_config(gc, _("Toolbar Contents")); } -/* a nice easy setup function that does the dirty work */ +/* local functions */ static void _e_int_gadcon_config(E_Gadcon *gc, const char *title) { E_Config_Dialog *cfd; E_Config_Dialog_View *v; - + E_Container *con; + v = E_NEW(E_Config_Dialog_View, 1); if (!v) return; - v->create_cfdata = _create_data; - v->free_cfdata = _free_data; - v->basic.create_widgets = _basic_create_widgets; - v->override_auto_apply = 1; - - cfd = e_config_dialog_new(e_container_current_get(e_manager_current_get()), - title, "E", "_gadcon_config_dialog", - "enlightenment/shelf", 0, v, gc); - gc->config_dialog = cfd; - e_dialog_resizable_set(cfd->dia, 1); -} - -static void -_fill_data(E_Config_Dialog_Data *cfdata) -{ - Evas_List *l; - - cfdata->name_add = NULL; - cfdata->id_remove = NULL; - cfdata->cf_gc = cfdata->gc->cf; + con = e_container_current_get(e_manager_current_get()); - for (l = cfdata->cf_gc->clients; l; l = l->next) - { - char buf[32]; + v->create_cfdata = _create_data; + v->free_cfdata = _free_data; + v->basic.create_widgets = _basic_create; - snprintf(buf, sizeof(buf), "%p", l->data); - cfdata->ids = evas_hash_add(cfdata->ids, buf, l->data); - } + cfd = e_config_dialog_new(con, title, "E", "_gadcon_config_dialog", + "enlightenment/shelf", 0, v, gc); + gc->config_dialog = cfd; + e_dialog_resizable_set(cfd->dia, 1); } static void * -_create_data(E_Config_Dialog *cfd) +_create_data(E_Config_Dialog *cfd) { E_Config_Dialog_Data *cfdata; - + cfdata = E_NEW(E_Config_Dialog_Data, 1); cfdata->gc = cfd->data; - _fill_data(cfdata); +// _fill_data(cfdata); return cfdata; } -static void -_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +static void +_fill_data(E_Config_Dialog_Data *cfdata) { - cfdata->gc->config_dialog = NULL; - evas_hash_free(cfdata->ids); - if (cfdata->name_add) free(cfdata->name_add); - if (cfdata->id_remove) free(cfdata->id_remove); - if (cfdata->hdl) ecore_event_handler_del(cfdata->hdl); - E_FREE(cfdata); + } -static void -_cb_select_client(void *data) +static void +_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { - E_Config_Dialog_Data *cfdata; + E_Gadcon *gc = NULL; - cfdata = data; - e_widget_disabled_set(cfdata->o_add, 0); + if (cfdata->hdl) ecore_event_handler_del(cfdata->hdl); + E_FREE(cfdata); + + if (!(gc = cfd->data)) return; + gc->config_dialog = NULL; } -static void -_cb_select_client_instance(void *data) +static Evas_Object * +_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) { - E_Config_Dialog_Data *cfdata; + Evas_Object *o = NULL, *of = NULL; + Evas_Object *ow = NULL; + + o = e_widget_table_add(evas, 0); + of = e_widget_frametable_add(evas, _("Available Gadgets"), 0); + ow = e_widget_ilist_add(evas, 24, 24, NULL); + e_widget_ilist_multi_select_set(ow, 1); + e_widget_on_change_hook_set(ow, _avail_list_cb_change, cfdata); + cfdata->o_avail = ow; + _load_avail_gadgets(cfdata); + e_widget_frametable_object_append(of, ow, 0, 0, 1, 1, 1, 1, 1, 1); + ow = e_widget_button_add(evas, _("Add Gadget"), NULL, _cb_add, cfdata, NULL); + e_widget_disabled_set(ow, 1); + cfdata->o_add = ow; + e_widget_frametable_object_append(of, ow, 0, 1, 1, 1, 1, 1, 1, 0); + e_widget_table_object_append(o, of, 0, 0, 1, 1, 1, 1, 1, 1); + + of = e_widget_frametable_add(evas, _("Selected Gadgets"), 0); + ow = e_widget_ilist_add(evas, 24, 24, NULL); + e_widget_ilist_multi_select_set(ow, 1); + e_widget_on_change_hook_set(ow, _sel_list_cb_change, cfdata); + cfdata->o_sel = ow; + _load_sel_gadgets(cfdata); + e_widget_frametable_object_append(of, ow, 0, 0, 1, 1, 1, 1, 1, 1); + ow = e_widget_button_add(evas, _("Remove Gadget"), NULL, _cb_del, cfdata, NULL); + e_widget_disabled_set(ow, 1); + cfdata->o_del = ow; + e_widget_frametable_object_append(of, ow, 0, 1, 1, 1, 1, 1, 1, 0); + e_widget_table_object_append(o, of, 1, 0, 1, 1, 1, 1, 1, 1); + + ow = e_widget_textblock_add(evas); + e_widget_min_size_set(ow, 200, 70); + e_widget_textblock_markup_set(ow, _("Description: Unavailable")); + cfdata->o_desc = ow; + e_widget_table_object_append(o, ow, 0, 1, 2, 1, 1, 1, 1, 0); - cfdata = data; - e_widget_disabled_set(cfdata->o_remove, 0); + if (cfdata->hdl) ecore_event_handler_del(cfdata->hdl); + cfdata->hdl = ecore_event_handler_add(E_EVENT_MODULE_UPDATE, + _cb_mod_update, cfdata); + return o; } -static void -_cb_add_instance(void *data, void *data2) +static int +_cb_mod_update(void *data, int type, void *event) { - E_Config_Dialog_Data *cfdata; + E_Config_Dialog_Data *cfdata = NULL; - cfdata = data; - if (!cfdata) return; - - if (!e_gadcon_client_config_new(cfdata->gc, cfdata->name_add)) return; - - e_gadcon_unpopulate(cfdata->gc); - e_gadcon_populate(cfdata->gc); - e_config_save_queue(); - - _load_selected_gadgets(cfdata); - e_widget_ilist_selected_set(cfdata->o_instances, - e_widget_ilist_count(cfdata->o_instances) - 1); + if (type != E_EVENT_MODULE_UPDATE) return 1; + if (!(cfdata = data)) return 1; + _load_avail_gadgets(cfdata); + _load_sel_gadgets(cfdata); + return 1; } -static void -_cb_remove_instance(void *data, void *data2) +static void +_avail_list_cb_change(void *data, Evas_Object *obj) { - E_Config_Dialog_Data *cfdata; - int i; - - cfdata = data; - i = e_widget_ilist_selected_get(cfdata->o_instances); - - e_gadcon_client_config_del(cfdata->cf_gc, - evas_hash_find(cfdata->ids, cfdata->id_remove)); - - _load_selected_gadgets(cfdata); - - if (i >= evas_list_count(cfdata->cf_gc->clients)) - i = evas_list_count(cfdata->cf_gc->clients) - 1; - - if (i < 0) - e_widget_disabled_set(cfdata->o_remove, 1); - else - { - e_widget_ilist_selected_set(cfdata->o_instances, i); - e_widget_disabled_set(cfdata->o_remove, 0); + E_Config_Dialog_Data *cfdata = NULL; + const char *name; + int sel, count; + + if (!(cfdata = data)) return; + e_widget_ilist_unselect(cfdata->o_sel); + e_widget_disabled_set(cfdata->o_del, 1); + e_widget_disabled_set(cfdata->o_add, 0); + count = e_widget_ilist_selected_count_get(cfdata->o_avail); + if ((count > 1) || (count == 0)) + e_widget_textblock_markup_set(cfdata->o_desc, _("Description: Unavailable")); + else + { + sel = e_widget_ilist_selected_get(cfdata->o_avail); + name = (char *)e_widget_ilist_nth_data_get(cfdata->o_avail, sel); + _set_description(cfdata, name); } - e_gadcon_unpopulate(cfdata->gc); - e_gadcon_populate(cfdata->gc); - e_config_save_queue(); } -static Evas_Object * -_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +static void +_sel_list_cb_change(void *data, Evas_Object *obj) { - Evas_Object *o, *of, *ob, *oi; - Evas_Coord wmw, wmh; - - o = e_widget_list_add(evas, 0, 1); - - of = e_widget_frametable_add(evas, _("Available Gadgets"), 0); - oi = e_widget_ilist_add(evas, 24, 24, &(cfdata->name_add)); - cfdata->o_avail = oi; - _load_available_gadgets(cfdata); - e_widget_min_size_get(oi, &wmw, &wmh); - if (wmw < 200) wmw = 200; - e_widget_min_size_set(oi, wmw, 250); - e_widget_frametable_object_append(of, oi, 0, 0, 1, 1, 1, 1, 1, 1); - ob = e_widget_button_add(evas, _("Add Gadget"), NULL, _cb_add_instance, cfdata, NULL); - e_widget_disabled_set(ob, 1); - cfdata->o_add = ob; - e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 1, 1, 0); - e_widget_list_object_append(o, of, 1, 1, 0.5); - - of = e_widget_frametable_add(evas, _("Selected Gadgets"), 0); - oi = e_widget_ilist_add(evas, 24, 24, &(cfdata->id_remove)); - cfdata->o_instances = oi; - _load_selected_gadgets(cfdata); - e_widget_min_size_get(oi, &wmw, &wmh); - if (wmw < 200) wmw = 200; - e_widget_min_size_set(oi, wmw, 250); - e_widget_frametable_object_append(of, oi, 0, 0, 1, 1, 1, 1, 1, 1); - ob = e_widget_button_add(evas, _("Remove Gadget"), NULL, _cb_remove_instance, cfdata, NULL); - e_widget_disabled_set(ob, 1); - cfdata->o_remove = ob; - e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 1, 1, 0); - e_widget_list_object_append(o, of, 1, 1, 0.5); - - if (cfdata->hdl) ecore_event_handler_del(cfdata->hdl); - cfdata->hdl = ecore_event_handler_add(E_EVENT_MODULE_UPDATE, _cb_mod_update, cfdata); - - return o; + E_Config_Dialog_Data *cfdata = NULL; + const char *name; + int sel, count; + + if (!(cfdata = data)) return; + e_widget_ilist_unselect(cfdata->o_avail); + e_widget_disabled_set(cfdata->o_add, 1); + e_widget_disabled_set(cfdata->o_del, 0); + count = e_widget_ilist_selected_count_get(cfdata->o_sel); + if ((count > 1) || (count == 0)) + e_widget_textblock_markup_set(cfdata->o_desc, _("Description: Unavailable")); + else + { + sel = e_widget_ilist_selected_get(cfdata->o_sel); + name = (char *)e_widget_ilist_nth_data_get(cfdata->o_sel, sel); + _set_description(cfdata, name); + } } static void -_load_available_gadgets(void *data) +_load_avail_gadgets(void *data) { - E_Config_Dialog_Data *cfdata; - Evas_Object *oi; - Evas_List *l; + E_Config_Dialog_Data *cfdata = NULL; + Evas_List *l = NULL; Evas *evas; - - cfdata = data; - if (!cfdata) return; - - oi = cfdata->o_avail; - evas = evas_object_evas_get(oi); + int w; + if (!(cfdata = data)) return; + evas = evas_object_evas_get(cfdata->o_avail); evas_event_freeze(evas); edje_freeze(); - e_widget_ilist_freeze(oi); - - e_widget_ilist_clear(oi); - for (l = e_gadcon_provider_list(); l; l = l->next) + e_widget_ilist_freeze(cfdata->o_avail); + e_widget_ilist_clear(cfdata->o_avail); + for (l = e_gadcon_provider_list(); l; l = l->next) { - E_Gadcon_Client_Class *cc; - char *label; - Evas_Object *icon; - - cc = l->data; - icon = NULL; - label = NULL; - if (cc->func.label) label = cc->func.label(); - if (!label) label = cc->name; - if (cc->func.icon) icon = cc->func.icon(evas); - e_widget_ilist_append(oi, icon, label, _cb_select_client, cfdata, cc->name); + E_Gadcon_Client_Class *cc; + Evas_Object *icon = NULL; + char *lbl = NULL; + + if (!(cc = l->data)) continue; + if (cc->func.label) lbl = cc->func.label(); + if (!lbl) lbl = cc->name; + if (cc->func.icon) icon = cc->func.icon(evas); + e_widget_ilist_append(cfdata->o_avail, icon, lbl, NULL, + cc->name, NULL); } - e_widget_ilist_go(oi); - e_widget_ilist_thaw(oi); + e_widget_ilist_go(cfdata->o_avail); + e_widget_min_size_get(cfdata->o_avail, &w, NULL); + e_widget_min_size_set(cfdata->o_avail, w, 250); + e_widget_ilist_thaw(cfdata->o_avail); edje_thaw(); evas_event_thaw(evas); } static void -_load_selected_gadgets(void *data) +_load_sel_gadgets(void *data) { - E_Config_Dialog_Data *cfdata; - Evas_List *l, *l2; - Evas_Object *oi; + E_Config_Dialog_Data *cfdata = NULL; + Evas_List *l = NULL, *l2 = NULL; Evas *evas; - - cfdata = data; - if (!cfdata) return; - - oi = cfdata->o_instances; - evas = evas_object_evas_get(oi); + int w; + if (!(cfdata = data)) return; + evas = evas_object_evas_get(cfdata->o_sel); evas_event_freeze(evas); edje_freeze(); - e_widget_ilist_freeze(oi); - - e_widget_ilist_clear(oi); - for (l = cfdata->cf_gc->clients; l; l = l->next) + e_widget_ilist_freeze(cfdata->o_sel); + e_widget_ilist_clear(cfdata->o_sel); + for (l = cfdata->gc->cf->clients; l; l = l->next) { - E_Config_Gadcon_Client *cf_gcc; - char *label; - Evas_Object *icon; - - cf_gcc = l->data; - for (l2 = e_gadcon_provider_list(); l2; l2 = l2->next) - { - E_Gadcon_Client_Class *cc; - - cc = l2->data; - label = NULL; - icon = NULL; - if ((cc->name) && (cf_gcc->name) && - (!strcmp(cc->name, cf_gcc->name))) - { - char buf[32]; - - snprintf(buf, sizeof(buf), "%p", cf_gcc); - if (cc->func.label) label = cc->func.label(); - if (!label) label = cc->name; - if (cc->func.icon) icon = cc->func.icon(evas); - e_widget_ilist_append(oi, icon, label, - _cb_select_client_instance, cfdata, buf); - } - } + E_Config_Gadcon_Client *cgc; + + if (!(cgc = l->data)) continue; + for (l2 = e_gadcon_provider_list(); l2; l2 = l2->next) + { + E_Gadcon_Client_Class *gcc; + Evas_Object *icon = NULL; + char *lbl = NULL; + + if (!(gcc = l2->data)) continue; + if ((cgc->name) && (gcc->name) && + (!strcmp(cgc->name, gcc->name))) + { + if (gcc->func.label) lbl = gcc->func.label(); + if (!lbl) lbl = gcc->name; + if (gcc->func.icon) icon = gcc->func.icon(evas); + e_widget_ilist_append(cfdata->o_sel, icon, lbl, NULL, + gcc->name, NULL); + } + } } - e_widget_ilist_go(oi); - e_widget_ilist_thaw(oi); + e_widget_ilist_go(cfdata->o_sel); + e_widget_min_size_get(cfdata->o_sel, &w, NULL); + e_widget_min_size_set(cfdata->o_sel, w, 250); + e_widget_ilist_thaw(cfdata->o_sel); edje_thaw(); evas_event_thaw(evas); + if (l) evas_list_free(l); + if (l2) evas_list_free(l2); } -static int -_cb_mod_update(void *data, int type, void *event) +static void +_cb_add(void *data, void *data2) { - E_Event_Module_Update *ev; - E_Config_Dialog_Data *cfdata; - - if (type != E_EVENT_MODULE_UPDATE) return 1; - - cfdata = data; - ev = event; - if (!cfdata) return 1; - - _load_available_gadgets(cfdata); - _load_selected_gadgets(cfdata); - return 1; + E_Config_Dialog_Data *cfdata = NULL; + Evas_List *l = NULL; + int i = 0, update = 0; + + 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; + const char *name = NULL; + + if (!(item = l->data)) continue; + if (!item->selected) continue; + name = (char *)e_widget_ilist_nth_data_get(cfdata->o_avail, i); + if (!name) continue; + if (!e_gadcon_client_config_new(cfdata->gc, name)) continue; + update = 1; + } + if (update) + { + e_gadcon_unpopulate(cfdata->gc); + e_gadcon_populate(cfdata->gc); + e_config_save_queue(); + + _load_sel_gadgets(cfdata); + e_widget_ilist_selected_set(cfdata->o_sel, i); + } + if (l) evas_list_free(l); +} + +static void +_cb_del(void *data, void *data2) +{ + E_Config_Dialog_Data *cfdata = NULL; + Evas_List *l = NULL, *g = NULL; + int i = 0, update = 0; + + if (!(cfdata = data)) return; + for (i = 0, l = e_widget_ilist_items_get(cfdata->o_sel); l; l = l->next, i++) + { + E_Ilist_Item *item = NULL; + const char *name = NULL; + + if (!(item = l->data)) continue; + if (!item->selected) continue; + name = (char *)e_widget_ilist_nth_data_get(cfdata->o_sel, i); + if (!name) continue; + for (g = cfdata->gc->cf->clients; g; g = g->next) + { + E_Config_Gadcon_Client *cgc; + + if (!(cgc = g->data)) continue; + if (strcmp(name, cgc->name)) continue; + e_gadcon_client_config_del(cfdata->gc->cf, cgc); + update = 1; + } + } + if (update) + { + e_gadcon_unpopulate(cfdata->gc); + e_gadcon_populate(cfdata->gc); + e_config_save_queue(); + + _load_sel_gadgets(cfdata); + + /* we just default to selecting first one here as the user may have had + * more than one selected */ + e_widget_ilist_selected_set(cfdata->o_sel, 0); + } + if (g) evas_list_free(g); + if (l) evas_list_free(l); +} + +static void +_set_description(void *data, const char *name) +{ + E_Config_Dialog_Data *cfdata = NULL; + E_Module *mod = NULL; + Efreet_Desktop *desk = NULL; + char buf[4096]; + char *tmp; + + if (!(cfdata = data)) return; + if (!name) return; + if (!(mod = e_module_find(name))) return; + + snprintf(buf, sizeof(buf), "%s/module.desktop", e_module_dir_get(mod)); + if (!ecore_file_exists(buf)) return; + if (!(desk = efreet_desktop_get(buf))) return; + if (desk->comment) + e_widget_textblock_markup_set(cfdata->o_desc, desk->comment); + efreet_desktop_free(desk); } ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs