aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTaehyub Kim <taehyub.kim@samsung.com>2017-08-23 15:50:18 +0900
committerJaehyun Cho <jae_hyun.cho@samsung.com>2017-11-21 14:01:48 +0900
commit6e87b9c6ad1e8ef3318d27f29b4d9b90a4a17aae (patch)
tree06bc5ef2b6b26d10cc48c4de7877c1e9ce60d474
parentefl_ui_popup: make popup size expandable (diff)
downloadefl-6e87b9c6ad1e8ef3318d27f29b4d9b90a4a17aae.tar.gz
efl_ui_popup_alert: add Efl.Ui.Popup.Alert class
Summary: Add initial code for Efl.Ui.Popup.Alert class. It supports setting title and buttons. Test Plan: 1. run elementary_test -to efluipopupalert Reviewers: Jaehyun_Cho, jpeg, cedric, thiepha, Blackmole, woohyun Differential Revision: https://phab.enlightenment.org/D5108
-rw-r--r--data/elementary/objects/test.edc32
-rw-r--r--data/elementary/themes/edc/elm/popup.edc163
-rw-r--r--src/Makefile_Elementary.am3
-rw-r--r--src/bin/elementary/test.c2
-rw-r--r--src/bin/elementary/test_popup.c44
-rw-r--r--src/lib/elementary/Elementary.h1
-rw-r--r--src/lib/elementary/efl_ui_popup_alert.c218
-rw-r--r--src/lib/elementary/efl_ui_popup_alert.eo40
-rw-r--r--src/lib/elementary/efl_ui_popup_alert_private.h22
9 files changed, 525 insertions, 0 deletions
diff --git a/data/elementary/objects/test.edc b/data/elementary/objects/test.edc
index 9e95ffd8be..834bea4e27 100644
--- a/data/elementary/objects/test.edc
+++ b/data/elementary/objects/test.edc
@@ -901,4 +901,36 @@ collections {
}
}
+ group { "efl_ui_popup_scroll_content";
+ parts {
+ rect { "base";
+ desc { "default";
+ min: 200 200;
+ color: 255 0 0 255;
+ }
+ }
+ rect { "top";
+ desc { "default";
+ fixed: 0 1;
+ min: 100 20;
+ color: 255 255 0 255;
+ rel1.to: "base";
+ rel2.to: "base";
+ rel2.relative: 1.0 0.0;
+ align: 0.5 0;
+ }
+ }
+ rect { "bottom";
+ desc { "default";
+ fixed: 0 1;
+ min: 100 20;
+ color: 255 255 0 255;
+ rel1.to: "base";
+ rel2.to: "base";
+ rel1.relative: 0.0 1.0;
+ align: 0.5 1.0;
+ }
+ }
+ }
+ }
}
diff --git a/data/elementary/themes/edc/elm/popup.edc b/data/elementary/themes/edc/elm/popup.edc
index 7fb127b812..cb534a837a 100644
--- a/data/elementary/themes/edc/elm/popup.edc
+++ b/data/elementary/themes/edc/elm/popup.edc
@@ -141,6 +141,14 @@ group { name: "elm/label/base/popup/default";
tag: "whitecolor" "+ color=#fff";
tag: "tab" "\t";
}
+ style { name: "popup_title_style_ellipsis";
+ base: "font="FNBD" font_size=10 text_class=label align=center color=#fff color_class=popup_title_text style=shadow,bottom shadow_color=#00000080 ellipsis=1.0 wrap=mixed";
+ tag: "br" "\n";
+ tag: "hilight" "+ font="FNBD" text_class=label_light";
+ tag: "b" "+ font="FNBD" text_class=label_light";
+ tag: "whitecolor" "+ color=#fff";
+ tag: "tab" "\t";
+ }
}
parts {
part { name: "elm.text"; type: TEXTBLOCK; mouse_events: 0;
@@ -533,6 +541,91 @@ group { "elm/popup/base/view";
}
}
+group { "elm/popup/base/alert";
+ images.image: "rounded_square.png" COMP;
+ parts {
+ image { "bg";
+ desc { "default";
+ min: 100 100;
+ image.border: 15 15 15 15;
+ image.normal: "rounded_square.png";
+ }
+ }
+ spacer { "base";
+ desc { "default";
+ rel.to: "bg";
+ rel1.offset: 10 10;
+ rel2.offset: -11 -11;
+ }
+ }
+ rect { "title_bg";
+ desc { "default";
+ fixed: 0 1;
+ min: 0 0;
+ rel.to: "base";
+ rel2.relative: 1.0 0.0;
+ align: 0.5 0.0;
+ color: 0 0 0 0;
+ }
+ desc { "title_visible";
+ inherit: "default";
+ min: 0 20;
+ }
+ }
+ textblock { "elm.text.title";
+ scale;
+ desc { "default";
+ fixed: 1 1;
+ text {
+ style: "popup_title_style_ellipsis";
+ }
+ rel.to: "title_bg";
+ hid;
+ }
+ desc { "title_visible";
+ inherit: "default";
+ vis;
+ }
+ }
+ swallow { "buttons";
+ desc { "default";
+ fixed: 0 1;
+ rel.to: "base";
+ rel1.relative: 0.0 1.0;
+ align: 0.5 1.0;
+ min: 0 0;
+ }
+ desc { "button_visible";
+ inherit: "default";
+ min: 0 30;
+ }
+ }
+ swallow { "elm.swallow.content";
+ desc { "default";
+ rel1.to_x: "base";
+ rel1.to_y: "title_bg";
+ rel2.to_x: "base";
+ rel2.to_y: "buttons";
+ rel1.relative: 0.0 1.0;
+ rel2.relative: 1.0 0.0;
+ }
+ }
+ }
+ programs {
+ program {
+ signal: "elm,title,show"; source: "elm";
+ action: STATE_SET "title_visible" 0.0;
+ target: "title_bg";
+ target: "elm.text.title";
+ }
+ program {
+ signal: "elm,buttons,show"; source: "elm";
+ action: STATE_SET "button_visible" 0.0;
+ target: "buttons";
+ }
+ }
+}
+
group { "elm/popup/base/event_bg";
parts {
rect { "base";
@@ -581,3 +674,73 @@ group { "elm/popup/base/event_bg";
}
}
}
+
+group { "elm/popup/base/button1";
+ parts {
+ swallow { "elm.swallow.button1";
+ }
+ }
+}
+
+group { "elm/popup/base/button2";
+ parts {
+ spacer { "div1";
+ desc { "default";
+ rel1.relative: 0.5 0.5;
+ rel2.relative: 0.5 0.5;
+ min: 5 5;
+ }
+ }
+ swallow { "elm.swallow.button1";
+ desc { "default";
+ rel2.to_x: "div1";
+ rel2.relative: 0.0 1.0;
+ }
+ }
+ swallow { "elm.swallow.button2";
+ desc { "default";
+ rel1.to_x: "div1";
+ rel1.relative: 1.0 0.0;
+ }
+ }
+ }
+}
+
+group { "elm/popup/base/button3";
+ parts {
+ spacer { "div1";
+ desc { "default";
+ rel1.relative: 0.333 0.5;
+ rel2.relative: 0.333 0.5;
+ min: 5 5;
+ }
+ }
+ spacer { "div2";
+ desc { "default";
+ rel1.relative: 0.666 0.5;
+ rel2.relative: 0.666 0.5;
+ min: 5 5;
+ }
+ }
+ swallow { "elm.swallow.button1";
+ desc { "default";
+ rel2.to_x: "div1";
+ rel2.relative: 0.0 1.0;
+ }
+ }
+ swallow { "elm.swallow.button2";
+ desc { "default";
+ rel1.to_x: "div1";
+ rel2.to_x: "div2";
+ rel1.relative: 1.0 0.0;
+ rel2.relative: 0.0 1.0;
+ }
+ }
+ swallow { "elm.swallow.button3";
+ desc { "default";
+ rel1.to_x: "div2";
+ rel1.relative: 1.0 0.0;
+ }
+ }
+ }
+}
diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am
index 934aec43d5..2a14bc7fee 100644
--- a/src/Makefile_Elementary.am
+++ b/src/Makefile_Elementary.am
@@ -32,6 +32,7 @@ elm_public_eolian_files = \
lib/elementary/efl_ui_text_interactive.eo \
lib/elementary/efl_ui_text.eo \
lib/elementary/efl_ui_popup.eo \
+ lib/elementary/efl_ui_popup_alert.eo \
lib/elementary/efl_ui_text_editable.eo \
lib/elementary/efl_ui_text_async.eo \
lib/elementary/efl_ui_textpath.eo \
@@ -292,6 +293,7 @@ includesunstable_HEADERS = \
lib/elementary/elm_widget_icon.h \
lib/elementary/efl_ui_widget_image.h \
lib/elementary/efl_ui_popup_private.h \
+ lib/elementary/efl_ui_popup_alert_private.h \
lib/elementary/elm_widget_index.h \
lib/elementary/elm_widget_inwin.h \
lib/elementary/elm_widget_label.h \
@@ -703,6 +705,7 @@ lib_elementary_libelementary_la_SOURCES = \
lib/elementary/efl_ui_box_layout.c \
lib/elementary/efl_ui_box_private.h \
lib/elementary/efl_ui_popup.c \
+ lib/elementary/efl_ui_popup_alert.c \
lib/elementary/efl_ui_grid.c \
lib/elementary/efl_ui_grid_static.c \
lib/elementary/efl_ui_grid_private.h \
diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c
index 9e936d96e4..f746fabb71 100644
--- a/src/bin/elementary/test.c
+++ b/src/bin/elementary/test.c
@@ -275,6 +275,7 @@ void test_datetime(void *data, Evas_Object *obj, void *event_info);
void test_ui_clock(void *data, Evas_Object *obj, void *event_info);
void test_popup(void *data, Evas_Object *obj, void *event_info);
void test_efl_ui_popup(void *data, Evas_Object *obj, void *event_info);
+void test_efl_ui_popup_alert(void *data, Evas_Object *obj, void *event_info);
void test_dayselector(void *data, Evas_Object *obj, void *event_info);
void test_image(void *data, Evas_Object *obj, void *event_info);
void test_image_scale_type(void *data, Evas_Object *obj, void *event_info);
@@ -1008,6 +1009,7 @@ add_tests:
ADD_TEST(NULL, "Popups", "Tooltip 4", test_tooltip4);
ADD_TEST(NULL, "Popups", "Popup", test_popup);
ADD_TEST(NULL, "Popups", "Efl UI Popup", test_efl_ui_popup);
+ ADD_TEST(NULL, "Popups", "Efl UI Popup Alert", test_efl_ui_popup_alert);
//------------------------------//
ADD_TEST(NULL, "Times & Dates", "Calendar", test_calendar);
diff --git a/src/bin/elementary/test_popup.c b/src/bin/elementary/test_popup.c
index e42b7dc4a9..4074862175 100644
--- a/src/bin/elementary/test_popup.c
+++ b/src/bin/elementary/test_popup.c
@@ -1092,3 +1092,47 @@ test_efl_ui_popup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ev
efl_content_set(efl_ui_popup, btn);
}
+
+static void
+efl_ui_popup_alert_clicked_cb(void *data EINA_UNUSED, const Efl_Event *ev)
+{
+ Efl_Ui_Popup_Alert_Button type = (Efl_Ui_Popup_Alert_Button)ev->info;
+ if (type == EFL_UI_POPUP_ALERT_BUTTON_POSITIVE)
+ printf("Positive Button is clicked\n");
+ else if(type == EFL_UI_POPUP_ALERT_BUTTON_NEGATIVE)
+ printf("Negative Button is clicked\n");
+ else if(type == EFL_UI_POPUP_ALERT_BUTTON_USER)
+ printf("User Button is clicked\n");
+}
+
+void
+test_efl_ui_popup_alert(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *win;
+ char buf[PATH_MAX];
+
+ win = elm_win_util_standard_add("Efl UI Popup Alert", "Efl UI Popup Alert");
+ elm_win_autodel_set(win, EINA_TRUE);
+
+ evas_object_resize(win, 320, 320);
+ evas_object_show(win);
+
+ Evas_Object *efl_ui_popup= efl_add(EFL_UI_POPUP_ALERT_CLASS, win);
+
+ efl_ui_popup_alert_title_set(efl_ui_popup, "title");
+
+ evas_object_resize(efl_ui_popup, 160, 160);
+ evas_object_show(efl_ui_popup);
+
+ Evas_Object *layout = elm_layout_add(efl_ui_popup);
+ snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get());
+ elm_layout_file_set(layout, buf, "efl_ui_popup_scroll_content");
+ evas_object_show(layout);
+
+ efl_content_set(efl_ui_popup, layout);
+ efl_ui_popup_alert_button_set(efl_ui_popup, EFL_UI_POPUP_ALERT_BUTTON_POSITIVE, "Yes");
+ efl_ui_popup_alert_button_set(efl_ui_popup, EFL_UI_POPUP_ALERT_BUTTON_NEGATIVE, "No");
+ efl_ui_popup_alert_button_set(efl_ui_popup, EFL_UI_POPUP_ALERT_BUTTON_USER, "Cancel");
+
+ efl_event_callback_add(efl_ui_popup, EFL_UI_POPUP_ALERT_EVENT_CLICKED, efl_ui_popup_alert_clicked_cb, NULL);
+}
diff --git a/src/lib/elementary/Elementary.h b/src/lib/elementary/Elementary.h
index c8b1e90ce7..8467673431 100644
--- a/src/lib/elementary/Elementary.h
+++ b/src/lib/elementary/Elementary.h
@@ -282,6 +282,7 @@ EAPI extern Elm_Version *elm_version;
# include <efl_ui_text_interactive.eo.h>
# include <efl_ui_text.eo.h>
# include <efl_ui_popup.eo.h>
+# include <efl_ui_popup_alert.eo.h>
# include <efl_ui_text_editable.eo.h>
# include <efl_ui_text_async.eo.h>
# include <efl_ui_clock.eo.h>
diff --git a/src/lib/elementary/efl_ui_popup_alert.c b/src/lib/elementary/efl_ui_popup_alert.c
new file mode 100644
index 0000000000..6c7a9a57a1
--- /dev/null
+++ b/src/lib/elementary/efl_ui_popup_alert.c
@@ -0,0 +1,218 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include <Elementary.h>
+
+#include "elm_priv.h"
+#include "efl_ui_popup_alert_private.h"
+
+#define MY_CLASS EFL_UI_POPUP_ALERT_CLASS
+#define MY_CLASS_NAME "Efl.Ui.Popup.Alert"
+
+EOLIAN static void
+_efl_ui_popup_alert_elm_layout_sizing_eval(Eo *obj, Efl_Ui_Popup_Alert_Data *pd EINA_UNUSED)
+{
+ elm_layout_sizing_eval(efl_super(obj, MY_CLASS));
+
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+ Evas_Coord minw = -1, minh = -1;
+
+ elm_coords_finger_size_adjust(1, &minw, 1, &minh);
+ edje_object_size_min_restricted_calc
+ (wd->resize_obj, &minw, &minh, minw, minh);
+ evas_object_size_hint_min_set(obj, minw, minh);
+
+ Evas_Coord w, h;
+ evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+}
+
+EOLIAN static void
+_efl_ui_popup_alert_title_set(Eo *obj, Efl_Ui_Popup_Alert_Data *pd, const char *text)
+{
+ if (pd->title_text)
+ {
+ eina_stringshare_del(pd->title_text);
+ pd->title_text = NULL;
+ }
+
+ pd->title_text = eina_stringshare_add(text);
+ elm_object_part_text_set(obj, "elm.text.title", text);
+ elm_layout_signal_emit(obj, "elm,title,show", "elm");
+
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+ edje_object_message_signal_process(wd->resize_obj);
+ elm_layout_sizing_eval(obj);
+}
+
+EOLIAN static const char *
+_efl_ui_popup_alert_title_get(Eo *obj EINA_UNUSED, Efl_Ui_Popup_Alert_Data *pd)
+{
+ if (pd->title_text)
+ return pd->title_text;
+ return NULL;
+}
+
+static void
+_positive_button_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Eo *popup_obj = data;
+ efl_event_callback_call(popup_obj, EFL_UI_POPUP_ALERT_EVENT_CLICKED, (void *)(uintptr_t)EFL_UI_POPUP_ALERT_BUTTON_POSITIVE);
+}
+
+static void
+_negative_button_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Eo *popup_obj = data;
+ efl_event_callback_call(popup_obj, EFL_UI_POPUP_ALERT_EVENT_CLICKED, (void *)(uintptr_t)EFL_UI_POPUP_ALERT_BUTTON_NEGATIVE);
+}
+
+static void
+_user_button_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Eo *popup_obj = data;
+ efl_event_callback_call(popup_obj, EFL_UI_POPUP_ALERT_EVENT_CLICKED, (void *)(uintptr_t)EFL_UI_POPUP_ALERT_BUTTON_USER);
+}
+
+EOLIAN static void
+_efl_ui_popup_alert_button_set(Eo *obj, Efl_Ui_Popup_Alert_Data *pd, Efl_Ui_Popup_Alert_Button type, const char *text)
+{
+ if (pd->button[type])
+ {
+ evas_object_del(pd->button[type]);
+ pd->button[type] = NULL;
+ }
+ pd->button[type] = elm_button_add(obj);
+ elm_object_text_set(pd->button[type], text);
+
+ switch (type)
+ {
+ case EFL_UI_POPUP_ALERT_BUTTON_POSITIVE:
+ evas_object_smart_callback_add(pd->button[type], "clicked",
+ _positive_button_clicked_cb,
+ obj);
+ break;
+ case EFL_UI_POPUP_ALERT_BUTTON_NEGATIVE:
+ evas_object_smart_callback_add(pd->button[type], "clicked",
+ _negative_button_clicked_cb,
+ obj);
+ break;
+ case EFL_UI_POPUP_ALERT_BUTTON_USER:
+ evas_object_smart_callback_add(pd->button[type], "clicked",
+ _user_button_clicked_cb,
+ obj);
+ break;
+ default:
+ break;
+ }
+
+ Evas_Object * cur_content = efl_content_unset(efl_part(obj, "buttons"));
+ if (cur_content)
+ {
+ efl_content_unset(efl_part(cur_content, "elm.swallow.button1"));
+ efl_content_unset(efl_part(cur_content, "elm.swallow.button2"));
+ efl_content_unset(efl_part(cur_content, "elm.swallow.button3"));
+ evas_object_del(cur_content);
+ }
+
+ if (pd->button[EFL_UI_POPUP_ALERT_BUTTON_POSITIVE]
+ && pd->button[EFL_UI_POPUP_ALERT_BUTTON_NEGATIVE]
+ && pd->button[EFL_UI_POPUP_ALERT_BUTTON_USER])
+ {
+ pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_3] = elm_layout_add(obj);
+ elm_layout_theme_set(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_3], "popup", "base", "button3");
+ efl_content_set(efl_part(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_3], "elm.swallow.button1"), pd->button[EFL_UI_POPUP_ALERT_BUTTON_USER]);
+ efl_content_set(efl_part(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_3], "elm.swallow.button2"), pd->button[EFL_UI_POPUP_ALERT_BUTTON_POSITIVE]);
+ efl_content_set(efl_part(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_3], "elm.swallow.button3"), pd->button[EFL_UI_POPUP_ALERT_BUTTON_NEGATIVE]);
+ efl_content_set(efl_part(obj, "buttons"), pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_3]);
+ }
+ else if (pd->button[EFL_UI_POPUP_ALERT_BUTTON_POSITIVE]
+ && pd->button[EFL_UI_POPUP_ALERT_BUTTON_NEGATIVE])
+ {
+ pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2] = elm_layout_add(obj);
+ elm_layout_theme_set(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2], "popup", "base", "button2");
+ efl_content_set(efl_part(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2], "elm.swallow.button1"), pd->button[EFL_UI_POPUP_ALERT_BUTTON_POSITIVE]);
+ efl_content_set(efl_part(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2], "elm.swallow.button2"), pd->button[EFL_UI_POPUP_ALERT_BUTTON_NEGATIVE]);
+ efl_content_set(efl_part(obj, "buttons"), pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2]);
+ }
+ else if (pd->button[EFL_UI_POPUP_ALERT_BUTTON_NEGATIVE]
+ && pd->button[EFL_UI_POPUP_ALERT_BUTTON_USER])
+ {
+ pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2] = elm_layout_add(obj);
+ elm_layout_theme_set(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2], "popup", "base", "button2");
+ efl_content_set(efl_part(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2], "elm.swallow.button1"), pd->button[EFL_UI_POPUP_ALERT_BUTTON_USER]);
+ efl_content_set(efl_part(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2], "elm.swallow.button2"), pd->button[EFL_UI_POPUP_ALERT_BUTTON_NEGATIVE]);
+ efl_content_set(efl_part(obj, "buttons"), pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2]);
+ }
+ else if (pd->button[EFL_UI_POPUP_ALERT_BUTTON_POSITIVE]
+ && pd->button[EFL_UI_POPUP_ALERT_BUTTON_USER])
+ {
+ pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2] = elm_layout_add(obj);
+ elm_layout_theme_set(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2], "popup", "base", "button2");
+ efl_content_set(efl_part(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2], "elm.swallow.button1"), pd->button[EFL_UI_POPUP_ALERT_BUTTON_USER]);
+ efl_content_set(efl_part(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2], "elm.swallow.button2"), pd->button[EFL_UI_POPUP_ALERT_BUTTON_POSITIVE]);
+ efl_content_set(efl_part(obj, "buttons"), pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_2]);
+ }
+ else if (pd->button[EFL_UI_POPUP_ALERT_BUTTON_POSITIVE])
+ {
+ pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_1] = elm_layout_add(obj);
+ elm_layout_theme_set(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_1], "popup", "base", "button1");
+ efl_content_set(efl_part(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_1], "elm.swallow.button1"), pd->button[EFL_UI_POPUP_ALERT_BUTTON_POSITIVE]);
+ efl_content_set(efl_part(obj, "buttons"), pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_1]);
+ }
+ else if (pd->button[EFL_UI_POPUP_ALERT_BUTTON_NEGATIVE])
+ {
+ pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_1] = elm_layout_add(obj);
+ elm_layout_theme_set(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_1], "popup", "base", "button1");
+ efl_content_set(efl_part(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_1], "elm.swallow.button1"), pd->button[EFL_UI_POPUP_ALERT_BUTTON_NEGATIVE]);
+ efl_content_set(efl_part(obj, "buttons"), pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_1]);
+ }
+ else if (pd->button[EFL_UI_POPUP_ALERT_BUTTON_USER])
+ {
+ pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_1] = elm_layout_add(obj);
+ elm_layout_theme_set(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_1], "popup", "base", "button1");
+ efl_content_set(efl_part(pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_1], "elm.swallow.button1"), pd->button[EFL_UI_POPUP_ALERT_BUTTON_USER]);
+ efl_content_set(efl_part(obj, "buttons"), pd->button_layout[EFL_UI_POPUP_ALERT_BUTTON_1]);
+ }
+
+ elm_layout_signal_emit(obj, "elm,buttons,show", "elm");
+ elm_layout_sizing_eval(obj);
+}
+
+EOLIAN static void
+_efl_ui_popup_alert_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Popup_Alert_Data *pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+ efl_canvas_group_add(efl_super(obj, MY_CLASS));
+ elm_widget_sub_object_parent_add(obj);
+
+ elm_layout_theme_set(efl_super(obj, MY_CLASS), "popup", "base", "alert");
+}
+
+EOLIAN static void
+_efl_ui_popup_alert_efl_canvas_group_group_del(Eo *obj, Efl_Ui_Popup_Alert_Data *pd)
+{
+ if (pd->title_text)
+ {
+ eina_stringshare_del(pd->title_text);
+ pd->title_text = NULL;
+ }
+
+ efl_canvas_group_del(efl_super(obj, MY_CLASS));
+}
+
+EOLIAN static void
+_efl_ui_popup_alert_class_constructor(Efl_Class *klass)
+{
+ evas_smart_legacy_type_register(MY_CLASS_NAME, klass);
+}
+
+#define EFL_UI_POPUP_ALERT_EXTRA_OPS \
+ EFL_CANVAS_GROUP_ADD_DEL_OPS(efl_ui_popup_alert), \
+ ELM_LAYOUT_SIZING_EVAL_OPS(efl_ui_popup_alert)
+
+#include "efl_ui_popup_alert.eo.c"
diff --git a/src/lib/elementary/efl_ui_popup_alert.eo b/src/lib/elementary/efl_ui_popup_alert.eo
new file mode 100644
index 0000000000..8ac37993a7
--- /dev/null
+++ b/src/lib/elementary/efl_ui_popup_alert.eo
@@ -0,0 +1,40 @@
+enum Efl.Ui.Popup.Alert.Button {
+ [[Defines the type of the alert button.]]
+ positive = 0, [[Button having positive meaning. e.g. "Yes"]]
+ negative, [[Button having negative meaning. e.g. "No"]]
+ user [[Button having user-defined meaning. e.g. "Cancel"]]
+}
+
+class Efl.Ui.Popup.Alert(Efl.Ui.Popup)
+{
+ methods {
+ @property title {
+ set {
+ [[Set the title of popup.]]
+ }
+ get {
+ [[Get the title of popup.]]
+ }
+ values {
+ text: string;
+ }
+ }
+ @property button {
+ set {
+ [[Set popup buttons.]]
+ }
+ keys {
+ type: Efl.Ui.Popup.Alert.Button;
+ }
+ values {
+ text: string;
+ }
+ }
+ }
+ implements {
+ class.constructor;
+ }
+ events {
+ clicked;
+ }
+}
diff --git a/src/lib/elementary/efl_ui_popup_alert_private.h b/src/lib/elementary/efl_ui_popup_alert_private.h
new file mode 100644
index 0000000000..15e7691d56
--- /dev/null
+++ b/src/lib/elementary/efl_ui_popup_alert_private.h
@@ -0,0 +1,22 @@
+#ifndef EFL_UI_POPUP_ALERT_H
+#define EFL_UI_POPUP_ALERT_H
+
+#include "Elementary.h"
+
+typedef enum
+{
+ EFL_UI_POPUP_ALERT_BUTTON_1 = 0,
+ EFL_UI_POPUP_ALERT_BUTTON_2,
+ EFL_UI_POPUP_ALERT_BUTTON_3,
+ EFL_UI_POPUP_ALERT_BUTTON_COUNT
+} Efl_Ui_Popup_Alert_Button_Type;
+
+typedef struct _Efl_Ui_Popup_Alert_Data Efl_Ui_Popup_Alert_Data;
+struct _Efl_Ui_Popup_Alert_Data
+{
+ const char *title_text;
+ Evas_Object *button[EFL_UI_POPUP_ALERT_BUTTON_COUNT];
+ Evas_Object *button_layout[EFL_UI_POPUP_ALERT_BUTTON_COUNT];
+};
+
+#endif