enlightenment/src/bin/e_confirm_dialog.c

111 lines
3.0 KiB
C

#include "e.h"
/******** private function definitions **********/
static void _e_confirm_dialog_free(E_Confirm_Dialog *cd);
static void _e_confirm_dialog_delete(E_Dialog *dia, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
static void _e_confirm_dialog_yes(void *data, E_Dialog *dia);
static void _e_confirm_dialog_no(void *data, E_Dialog *dia);
static void
_dia_del(void *data)
{
E_Dialog *dia = data;
e_object_del(dia->data);
}
/********** externally accessible functions ****************/
E_API E_Confirm_Dialog *
e_confirm_dialog_show(const char *title, const char *icon, const char *text,
const char *button_text, const char *button2_text,
void (*func)(void *data), void (*func2)(void *data),
void *data, void *data2,
void (*del_func)(void *data), void *del_data)
{
E_Confirm_Dialog *cd;
E_Dialog *dia;
cd = E_OBJECT_ALLOC(E_Confirm_Dialog, E_CONFIRM_DIALOG_TYPE, _e_confirm_dialog_free);
cd->yes.func = func;
cd->yes.data = data;
cd->no.func = func2;
cd->no.data = data2;
cd->del.func = del_func;
cd->del.data = del_data;
dia = e_dialog_new(NULL, "E", "_confirm_dialog");
if (!dia)
{
e_object_del(E_OBJECT(cd));
return NULL;
}
dia->data = cd;
cd->dia = dia;
evas_object_event_callback_add(dia->win, EVAS_CALLBACK_DEL, (Evas_Object_Event_Cb)_e_confirm_dialog_delete, dia);
e_object_del_attach_func_set(E_OBJECT(dia), _dia_del);
if (title) e_dialog_title_set(dia, title);
if (icon) e_dialog_icon_set(dia, icon, 64);
if (text) e_dialog_text_set(dia, text);
e_dialog_button_add(dia, !button_text ? _("Yes") : button_text, NULL, _e_confirm_dialog_yes, cd);
e_dialog_button_add(dia, !button2_text ? _("No") : button2_text, NULL, _e_confirm_dialog_no, cd);
e_dialog_button_focus_num(dia, 0);
elm_win_center(dia->win, 1, 1);
e_dialog_show(dia);
return cd;
}
/********* private function bodies ************/
static void
_e_confirm_dialog_free(E_Confirm_Dialog *cd)
{
if (!cd->no_run)
{
e_object_ref(E_OBJECT(cd));
cd->no_run = EINA_TRUE;
if (cd->no.func) cd->no.func(cd->no.data);
e_object_unref(E_OBJECT(cd));
return;
}
if (cd->del.func) cd->del.func(cd->del.data);
e_object_del(E_OBJECT(cd->dia));
free(cd);
}
static void
_e_confirm_dialog_yes(void *data, E_Dialog *dia EINA_UNUSED)
{
E_Confirm_Dialog *cd;
cd = data;
e_object_ref(data);
cd->no_run = EINA_TRUE;
if (cd->yes.func) cd->yes.func(cd->yes.data);
e_object_del(data);
e_object_unref(data);
}
static void
_e_confirm_dialog_no(void *data, E_Dialog *dia EINA_UNUSED)
{
E_Confirm_Dialog *cd;
cd = data;
e_object_ref(data);
cd->no_run = EINA_TRUE;
if (cd->no.func) cd->no.func(cd->no.data);
e_object_del(data);
e_object_unref(data);
}
static void
_e_confirm_dialog_delete(E_Dialog *dia, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
e_object_del(dia->data);
}