group { "elm/popup/base/event_bg";
parts {
rect { "base";
- repeat;
desc { "default";
- color: 0 255 0 128;
+ color: 0 0 0 64;
}
+ desc { "show_image";
+ inherit: "default";
+ hid;
+ }
+ }
+ swallow { "elm.swallow.image";
+ desc { "default";
+ rel.to: "base";
+ hid;
+ }
+ desc { "show_image";
+ inherit: "default";
+ vis;
+ }
+ }
+ rect { "block";
+ desc { "default";
+ rel.to: "base";
+ color: 0 0 0 0;
+ }
+ }
+ }
+
+ programs {
+ program {
+ signal: "elm,state,image,visible"; source: "elm";
+ action: STATE_SET "show_image" 0.0;
+ target: "base";
+ target: "elm.swallow.image";
+ }
+ program {
+ signal: "elm,state,image,hidden"; source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "base";
+ target: "elm.swallow.image";
+ }
+ program {
+ signal: "mouse,clicked,1"; source: "block";
+ action: SIGNAL_EMIT "elm,action,clicked" "elm";
}
}
}
evas_object_show(win);
}
+static void
+_bg_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ printf("Popup's background is clicked.\n");
+}
+
+static void
+_image_change_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ static int k = 0;
+
+ if (k == 0)
+ {
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get());
+ efl_ui_popup_bg_set(data, buf, NULL);
+ efl_ui_popup_bg_repeat_events_set(data, EINA_TRUE);
+ }
+ else
+ {
+ efl_ui_popup_bg_set(data, NULL, NULL);
+ efl_ui_popup_bg_repeat_events_set(data, EINA_FALSE);
+ }
+ k = !k;
+}
+
void
test_efl_ui_popup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- Evas_Object *win;
+ Evas_Object *win, *btn;
win = elm_win_util_standard_add("Efl UI Popup", "Efl UI Popup");
elm_win_autodel_set(win, EINA_TRUE);
evas_object_resize(win, 320, 320);
evas_object_show(win);
+ btn = elm_button_add(win);
+ elm_object_text_set(btn, "bg repeat events test");
+ evas_object_move(btn, 0, 0);
+ evas_object_resize(btn, 150, 150);
+ evas_object_show(btn);
+
Evas_Object *efl_ui_popup= efl_add(EFL_UI_POPUP_CLASS, win);
+ evas_object_smart_callback_add(efl_ui_popup, "bg,clicked", _bg_clicked, NULL);
+
evas_object_move(efl_ui_popup, 80, 80);
evas_object_resize(efl_ui_popup, 160, 160);
evas_object_show(efl_ui_popup);
evas_object_geometry_get(efl_ui_popup, &x, &y, &w, &h);
printf("efl_ui_popup: %d %d %d %d\n", x, y, w, h);
- Evas_Object *btn = elm_button_add(efl_ui_popup);
+ btn = elm_button_add(efl_ui_popup);
elm_object_text_set(btn, "Efl.Ui.Popup content");
+ evas_object_smart_callback_add(btn, "clicked", _image_change_btn_cb, efl_ui_popup);
evas_object_show(btn);
efl_content_set(efl_ui_popup, btn);
#define MY_CLASS_NAME "Efl.Ui.Popup"
#define MY_CLASS_NAME_LEGACY "elm_popup"
+static void
+_bg_clicked_cb(void *data,
+ Evas_Object *o EINA_UNUSED,
+ const char *emission EINA_UNUSED,
+ const char *source EINA_UNUSED)
+{
+ Evas_Object *obj = data;
+ efl_event_callback_legacy_call(obj, EFL_UI_POPUP_EVENT_BG_CLICKED, NULL);
+}
+
EOLIAN static void
_efl_ui_popup_efl_gfx_position_set(Eo *obj, Efl_Ui_Popup_Data *pd EINA_UNUSED, Eina_Position2D pos)
{
elm_widget_theme_object_set(obj, pd->event_bg, "popup", "base", "event_bg");
evas_object_smart_member_add(pd->event_bg, obj);
evas_object_stack_below(pd->event_bg, wd->resize_obj);
+
+ edje_object_signal_callback_add(pd->event_bg, "elm,action,clicked", "*", _bg_clicked_cb, obj);
}
EOLIAN static void
}
EOLIAN static void
+_efl_ui_popup_bg_set(Eo *obj, Efl_Ui_Popup_Data *pd, const char* file, const char* group)
+{
+ Evas_Object *prev_obj = edje_object_part_swallow_get(pd->event_bg, "elm.swallow.image");
+ if (prev_obj)
+ {
+ edje_object_part_unswallow(pd->event_bg, prev_obj);
+ evas_object_del(prev_obj);
+ }
+
+ Evas_Object *image = elm_image_add(obj);
+ Eina_Bool ret = elm_image_file_set(image, file, group);
+ if (!ret)
+ {
+ edje_object_signal_emit(pd->event_bg, "elm,state,image,hidden", "elm");
+ evas_object_del(image);
+ return;
+ }
+ edje_object_part_swallow(pd->event_bg, "elm.swallow.image", image);
+ edje_object_signal_emit(pd->event_bg, "elm,state,image,visible", "elm");
+}
+
+EOLIAN static void
+_efl_ui_popup_bg_repeat_events_set(Eo *obj EINA_UNUSED, Efl_Ui_Popup_Data *pd, Eina_Bool repeat)
+{
+ pd->bg_repeat_events = repeat;
+
+ evas_object_repeat_events_set(pd->event_bg, repeat);
+}
+
+EOLIAN static Eina_Bool
+_efl_ui_popup_bg_repeat_events_get(Eo *obj EINA_UNUSED, Efl_Ui_Popup_Data *pd)
+{
+ return pd->bg_repeat_events;
+}
+
+EOLIAN static void
_efl_ui_popup_class_constructor(Efl_Class *klass)
{
evas_smart_legacy_type_register(MY_CLASS_NAME, klass);
legacy_prefix: elm_popup;
methods {
@property parent_window @protected {
- get {
- [[Get the parent window of Popup.]]
- }
- values {
- window: Efl.Canvas.Object;
- }
- }
+ get {
+ [[Get the parent window of Popup.]]
+ }
+ values {
+ window: Efl.Canvas.Object;
+ }
+ }
+ bg_set {
+ params {
+ @in file: string; [[The image file path.]]
+ @in group: string; [[The image key in $file (if its an Eet one), or
+ $null, otherwise.]]
+ }
+ }
+ @property bg_repeat_events {
+ set {
+ [[Sets whether events should be passed to by a click outside.
+
+ Note: The default value is $false.
+ ]]
+ }
+ get {
+ [[Returns value indicating whether bg repeat events is enabled or not.]]
+ }
+ values {
+ repeat: bool; [[If $true, events are passed to lower objects.]]
+ }
+ }
}
implements {
class.constructor;
Efl.Container.content { get; set; }
Efl.Container.content_unset;
}
+ events {
+ bg,clicked; [[This is called whenever the user click background of popup.]]
+ }
}
{
Evas_Object *win_parent;
Evas_Object *event_bg;
+ Eina_Bool bg_repeat_events : 1;
};
#endif