/* * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 */ #include "e.h" typedef struct _E_Dialog_Button E_Dialog_Button; struct _E_Dialog_Button { E_Dialog *dialog; Evas_Object *obj; char *label; char *icon; void (*func) (void *data, E_Dialog *dia); void *data; }; /* local subsystem functions */ static void _e_dialog_free(E_Dialog *dia); static void _e_dialog_cb_button_clicked(void *data, Evas_Object *obj, const char *emission, const char *source); static void _e_dialog_cb_delete(E_Win *win); /* local subsystem globals */ /* externally accessible functions */ E_Dialog * e_dialog_new(E_Container *con) { E_Dialog *dia; E_Manager *man; Evas_Object *o; if (!con) { man = e_manager_current_get(); if (!man) return NULL; con = e_container_current_get(man); if (!con) con = e_manager_container_number_get(man, 0); if (!con) return NULL; } dia = E_OBJECT_ALLOC(E_Dialog, E_DIALOG_TYPE, _e_dialog_free); if (!dia) return NULL; dia->win = e_win_new(con); if (!dia->win) { free(dia); return NULL; } dia->win->data = dia; e_win_name_class_set(dia->win, "E", "_dialog"); o = edje_object_add(e_win_evas_get(dia->win)); dia->bg_object = o; e_theme_edje_object_set(o, "base/theme/dialog", "widgets/dialog/main"); evas_object_move(o, 0, 0); evas_object_show(o); o = evas_object_textblock_add(e_win_evas_get(dia->win)); dia->text_object = o; edje_object_part_swallow(dia->bg_object, "content_swallow", o); evas_object_show(o); { char format[1024]; char *fname; int fsize; fname = (char *)e_font_default_string_get("default", &fsize); snprintf(format, sizeof(format), "font='%s' size=%i wrap=word", fname, fsize); evas_object_textblock_format_insert(o, format); evas_object_textblock_format_insert(o, "color=#000"); evas_object_textblock_format_insert(o, "\n"); evas_object_textblock_text_insert(o, "Here is some text"); evas_object_textblock_format_insert(o, "\n"); evas_object_textblock_text_insert(o, "Here is some more text"); evas_object_textblock_format_insert(o, "\n"); evas_object_textblock_text_insert(o, "And even more text on this line to make it really long for testing"); evas_object_textblock_format_insert(o, "\n"); evas_object_textblock_text_insert(o, "Short"); evas_object_textblock_format_insert(o, "\n"); evas_object_textblock_text_insert(o, "Aaardvaaarks On!"); evas_object_textblock_format_insert(o, "\n"); evas_object_textblock_format_insert(o, "\n"); } o = e_box_add(e_win_evas_get(dia->win)); dia->box_object = o; e_box_orientation_set(o, 1); e_box_homogenous_set(o, 1); e_box_align_set(o, 0.5, 0.5); edje_object_part_swallow(dia->bg_object, "buttons_swallow", o); evas_object_show(o); return dia; } void e_dialog_button_add(E_Dialog *dia, char *label, char *icon, void (*func) (void *data, E_Dialog *dia), void *data) { E_Dialog_Button *db; Evas_Coord mw, mh; db = E_NEW(E_Dialog_Button, 1); db->dialog = dia; if (label) db->label = strdup(label); if (icon) db->icon = strdup(icon); db->func = func; db->data = data; db->obj = edje_object_add(e_win_evas_get(dia->win)); e_theme_edje_object_set(db->obj, "base/theme/dialog", "widgets/dialog/button"); edje_object_signal_callback_add(db->obj, "click", "", _e_dialog_cb_button_clicked, db); edje_object_part_text_set(db->obj, "button_text", db->label); edje_object_size_min_calc(db->obj, &mw, &mh); e_box_pack_end(dia->box_object, db->obj); e_box_pack_options_set(db->obj, 1, 1, /* fill */ 0, 1, /* expand */ 0.5, 0.5, /* align */ mw, mh, /* min */ 9999, mh /* max */ ); evas_object_show(db->obj); dia->buttons = evas_list_append(dia->buttons, db); } void e_dialog_title_set(E_Dialog *dia, char *title) { e_win_title_set(dia->win, title); } void e_dialog_text_set(E_Dialog *dia, char *text) { } void e_dialog_icon_set(E_Dialog *dia, char *icon) { } void e_dialog_show(E_Dialog *dia) { Evas_Coord mw, mh; Evas_Object *o; o = dia->text_object; // evas_object_textblock_format_size_get(o, &mw, &mh); evas_object_textblock_native_size_get(o, &mw, &mh); edje_extern_object_min_size_set(o, mw + 2, mh + 2); edje_object_part_swallow(dia->bg_object, "content_swallow", o); o = dia->box_object; e_box_min_size_get(o, &mw, &mh); edje_extern_object_min_size_set(o, mw, mh); edje_object_part_swallow(dia->bg_object, "buttons_swallow", o); edje_object_size_min_calc(dia->bg_object, &mw, &mh); evas_object_resize(dia->bg_object, mw, mh); e_win_resize(dia->win, mw, mh); e_win_size_min_set(dia->win, mw, mh); e_win_size_max_set(dia->win, mw, mh); e_win_show(dia->win); } /* local subsystem functions */ static void _e_dialog_free(E_Dialog *dia) { while (dia->buttons) { E_Dialog_Button *db; db = dia->buttons->data; dia->buttons = evas_list_remove_list(dia->buttons, dia->buttons); IF_FREE(db->label); IF_FREE(db->icon); evas_object_del(db->obj); free(db); } if (dia->text_object) evas_object_del(dia->text_object); if (dia->icon_object) evas_object_del(dia->icon_object); if (dia->box_object) evas_object_del(dia->box_object); if (dia->bg_object) evas_object_del(dia->bg_object); e_object_del(E_OBJECT(dia->win)); free(dia); } static void _e_dialog_cb_button_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) { E_Dialog_Button *db; db = data; if (db->func) db->func(db->data, db->dialog); else e_object_del(E_OBJECT(db->dialog)); } static void _e_dialog_cb_delete(E_Win *win) { E_Dialog *dia; dia = win->data; e_object_del(E_OBJECT(dia)); }