1 #include <Elementary.h>
3 #include "elm_widget_ctxpopup.h"
5 EAPI Eo_Op ELM_OBJ_CTXPOPUP_BASE_ID = EO_NOOP;
7 #define MY_CLASS ELM_OBJ_CTXPOPUP_CLASS
9 #define MY_CLASS_NAME "elm_ctxpopup"
11 EAPI const char ELM_CTXPOPUP_SMART_NAME[] = "elm_ctxpopup";
13 static const char SIG_DISMISSED[] = "dismissed";
14 static const char SIG_LANG_CHANGED[] = "language,changed";
16 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
18 {SIG_LANG_CHANGED, ""},
23 _elm_ctxpopup_smart_translate(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
25 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
26 evas_object_hide(obj);
28 if (ret) *ret = EINA_TRUE;
32 _elm_ctxpopup_smart_focus_next_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
34 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
39 _elm_ctxpopup_smart_focus_direction_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
41 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
46 _elm_ctxpopup_smart_focus_next(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
48 Elm_Ctxpopup_Smart_Data *sd = _pd;
50 Elm_Focus_Direction dir = va_arg(*list, Elm_Focus_Direction);
51 Evas_Object **next = va_arg(*list, Evas_Object **);
52 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
53 if (ret) *ret = EINA_FALSE;
58 if (!elm_widget_focus_next_get(sd->box, dir, next))
60 elm_widget_focused_object_clear(sd->box);
61 elm_widget_focus_next_get(sd->box, dir, next);
64 if (ret) *ret = EINA_TRUE;
68 _elm_ctxpopup_smart_event(Eo *obj, void *_pd, va_list *list)
70 Evas_Object *src = va_arg(*list, Evas_Object *);
72 Evas_Callback_Type type = va_arg(*list, Evas_Callback_Type);
73 void *event_info = va_arg(*list, void *);
74 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
75 if (ret) *ret = EINA_FALSE;
77 Evas_Event_Key_Down *ev = event_info;
79 Elm_Ctxpopup_Smart_Data *sd = _pd;
81 if (elm_widget_disabled_get(obj)) return;
82 if (type != EVAS_CALLBACK_KEY_DOWN) return;
83 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
85 if (!strcmp(ev->keyname, "Tab"))
87 if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
88 elm_widget_focus_cycle(sd->box, ELM_FOCUS_PREVIOUS);
90 elm_widget_focus_cycle(sd->box, ELM_FOCUS_NEXT);
91 if (ret) *ret = EINA_TRUE;
95 if (strcmp(ev->keyname, "Escape")) return;
97 evas_object_hide(obj);
98 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
99 if (ret) *ret = EINA_TRUE;
103 _x_pos_adjust(Evas_Coord_Point *pos,
104 Evas_Coord_Point *base_size,
105 Evas_Coord_Rectangle *hover_area)
107 pos->x -= (base_size->x / 2);
109 if (pos->x < hover_area->x)
110 pos->x = hover_area->x;
111 else if ((pos->x + base_size->x) > (hover_area->x + hover_area->w))
112 pos->x = (hover_area->x + hover_area->w) - base_size->x;
114 if (base_size->x > hover_area->w)
115 base_size->x -= (base_size->x - hover_area->w);
117 if (pos->x < hover_area->x)
118 pos->x = hover_area->x;
122 _y_pos_adjust(Evas_Coord_Point *pos,
123 Evas_Coord_Point *base_size,
124 Evas_Coord_Rectangle *hover_area)
126 pos->y -= (base_size->y / 2);
128 if (pos->y < hover_area->y)
129 pos->y = hover_area->y;
130 else if ((pos->y + base_size->y) > (hover_area->y + hover_area->h))
131 pos->y = hover_area->y + hover_area->h - base_size->y;
133 if (base_size->y > hover_area->h)
134 base_size->y -= (base_size->y - hover_area->h);
136 if (pos->y < hover_area->y)
137 pos->y = hover_area->y;
140 static Elm_Ctxpopup_Direction
141 _base_geometry_calc(Evas_Object *obj,
142 Evas_Coord_Rectangle *rect)
144 Elm_Ctxpopup_Direction dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
145 Evas_Coord_Rectangle hover_area;
146 Evas_Coord_Point pos = {0, 0};
147 Evas_Coord_Point arrow_size;
148 Evas_Coord_Point base_size;
149 Evas_Coord_Point max_size;
150 Evas_Coord_Point min_size;
151 Evas_Coord_Point temp;
154 ELM_CTXPOPUP_DATA_GET(obj, sd);
155 Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
157 if (!rect) return ELM_CTXPOPUP_DIRECTION_DOWN;
159 edje_object_part_geometry_get
160 (sd->arrow, "ctxpopup_arrow", NULL, NULL, &arrow_size.x, &arrow_size.y);
161 evas_object_resize(sd->arrow, arrow_size.x, arrow_size.y);
163 //Initialize Area Rectangle.
164 evas_object_geometry_get
165 (sd->parent, &hover_area.x, &hover_area.y, &hover_area.w,
167 if (sd->parent && !strcmp(evas_object_type_get(sd->parent), "elm_win"))
168 hover_area.x = hover_area.y = 0;
170 evas_object_geometry_get(obj, &pos.x, &pos.y, NULL, NULL);
173 edje_object_size_min_calc
174 (wd->resize_obj, &base_size.x, &base_size.y);
175 evas_object_smart_calculate(wd->resize_obj);
178 evas_object_size_hint_max_get(obj, &max_size.x, &max_size.y);
180 if ((max_size.y > 0) && (base_size.y > max_size.y))
181 base_size.y = max_size.y;
183 if ((max_size.x > 0) && (base_size.x > max_size.x))
184 base_size.x = max_size.x;
187 evas_object_size_hint_min_get(obj, &min_size.x, &min_size.y);
189 if ((min_size.y > 0) && (base_size.y < min_size.y))
190 base_size.y = min_size.y;
192 if ((min_size.x > 0) && (base_size.x < min_size.x))
193 base_size.x = min_size.x;
195 //Check the Which direction is available.
196 //If find a avaialble direction, it adjusts position and size.
197 for (idx = 0; idx < 4; idx++)
199 switch (sd->dir_priority[idx])
201 case ELM_CTXPOPUP_DIRECTION_UP:
202 temp.y = (pos.y - base_size.y);
203 if ((temp.y - arrow_size.y) < hover_area.y)
206 _x_pos_adjust(&pos, &base_size, &hover_area);
207 pos.y -= base_size.y;
208 dir = ELM_CTXPOPUP_DIRECTION_UP;
211 case ELM_CTXPOPUP_DIRECTION_LEFT:
212 temp.x = (pos.x - base_size.x);
213 if ((temp.x - arrow_size.x) < hover_area.x)
216 _y_pos_adjust(&pos, &base_size, &hover_area);
217 pos.x -= base_size.x;
218 dir = ELM_CTXPOPUP_DIRECTION_LEFT;
221 case ELM_CTXPOPUP_DIRECTION_RIGHT:
222 temp.x = (pos.x + base_size.x);
223 if ((temp.x + arrow_size.x) >
224 (hover_area.x + hover_area.w))
227 _y_pos_adjust(&pos, &base_size, &hover_area);
228 dir = ELM_CTXPOPUP_DIRECTION_RIGHT;
231 case ELM_CTXPOPUP_DIRECTION_DOWN:
232 temp.y = (pos.y + base_size.y);
233 if ((temp.y + arrow_size.y) >
234 (hover_area.y + hover_area.h))
237 _x_pos_adjust(&pos, &base_size, &hover_area);
238 dir = ELM_CTXPOPUP_DIRECTION_DOWN;
247 //In this case, all directions are invalid because of lack of space.
250 Evas_Coord length[2];
254 length[0] = pos.y - hover_area.y;
255 length[1] = (hover_area.y + hover_area.h) - pos.y;
257 // ELM_CTXPOPUP_DIRECTION_UP
258 if (length[0] > length[1])
260 _x_pos_adjust(&pos, &base_size, &hover_area);
261 pos.y -= base_size.y;
262 dir = ELM_CTXPOPUP_DIRECTION_UP;
263 if (pos.y < (hover_area.y + arrow_size.y))
265 base_size.y -= ((hover_area.y + arrow_size.y) - pos.y);
266 pos.y = hover_area.y + arrow_size.y;
269 //ELM_CTXPOPUP_DIRECTION_DOWN
272 _x_pos_adjust(&pos, &base_size, &hover_area);
273 dir = ELM_CTXPOPUP_DIRECTION_DOWN;
274 if ((pos.y + arrow_size.y + base_size.y) >
275 (hover_area.y + hover_area.h))
277 ((pos.y + arrow_size.y + base_size.y) -
278 (hover_area.y + hover_area.h));
283 length[0] = pos.x - hover_area.x;
284 length[1] = (hover_area.x + hover_area.w) - pos.x;
286 //ELM_CTXPOPUP_DIRECTION_LEFT
287 if (length[0] > length[1])
289 _y_pos_adjust(&pos, &base_size, &hover_area);
290 pos.x -= base_size.x;
291 dir = ELM_CTXPOPUP_DIRECTION_LEFT;
292 if (pos.x < (hover_area.x + arrow_size.x))
294 base_size.x -= ((hover_area.x + arrow_size.x) - pos.x);
295 pos.x = hover_area.x + arrow_size.x;
298 //ELM_CTXPOPUP_DIRECTION_RIGHT
301 _y_pos_adjust(&pos, &base_size, &hover_area);
302 dir = ELM_CTXPOPUP_DIRECTION_RIGHT;
303 if (pos.x + (arrow_size.x + base_size.x) >
304 hover_area.x + hover_area.w)
306 ((pos.x + arrow_size.x + base_size.x) -
307 (hover_area.x + hover_area.w));
312 //Final position and size.
315 rect->w = base_size.x;
316 rect->h = base_size.y;
322 _arrow_update(Evas_Object *obj,
323 Elm_Ctxpopup_Direction dir,
324 Evas_Coord_Rectangle base_size)
326 Evas_Coord_Rectangle arrow_size;
330 ELM_CTXPOPUP_DATA_GET(obj, sd);
331 Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
333 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
334 evas_object_geometry_get
335 (sd->arrow, NULL, NULL, &arrow_size.w, &arrow_size.h);
337 /* arrow is not being kept as sub-object on purpose, here. the
338 * design of the widget does not help with the contrary */
342 case ELM_CTXPOPUP_DIRECTION_RIGHT:
343 edje_object_signal_emit(sd->arrow, "elm,state,left", "elm");
344 edje_object_part_swallow
346 (elm_widget_mirrored_get(obj) ? "elm.swallow.arrow_right" :
347 "elm.swallow.arrow_left"), sd->arrow);
351 if (y < ((arrow_size.h * 0.5) + base_size.y))
353 else if (y > base_size.y + base_size.h - (arrow_size.h * 0.5))
354 y = base_size.h - arrow_size.h;
356 y = y - base_size.y - (arrow_size.h * 0.5);
357 drag = (double)(y) / (double)(base_size.h - arrow_size.h);
358 edje_object_part_drag_value_set
360 (elm_widget_mirrored_get(obj) ? "elm.swallow.arrow_right" :
361 "elm.swallow.arrow_left"), 1, drag);
365 case ELM_CTXPOPUP_DIRECTION_LEFT:
366 edje_object_signal_emit(sd->arrow, "elm,state,right", "elm");
367 edje_object_part_swallow
369 (elm_widget_mirrored_get(obj) ? "elm.swallow.arrow_left" :
370 "elm.swallow.arrow_right"), sd->arrow);
374 if (y < ((arrow_size.h * 0.5) + base_size.y))
376 else if (y > (base_size.y + base_size.h - (arrow_size.h * 0.5)))
377 y = base_size.h - arrow_size.h;
379 y = y - base_size.y - (arrow_size.h * 0.5);
380 drag = (double)(y) / (double)(base_size.h - arrow_size.h);
381 edje_object_part_drag_value_set
383 (elm_widget_mirrored_get(obj) ? "elm.swallow.arrow_left" :
384 "elm.swallow.arrow_right"), 0, drag);
388 case ELM_CTXPOPUP_DIRECTION_DOWN:
389 edje_object_signal_emit(sd->arrow, "elm,state,top", "elm");
390 edje_object_part_swallow
391 (wd->resize_obj, "elm.swallow.arrow_up",
396 if (x < ((arrow_size.w * 0.5) + base_size.x))
398 else if (x > (base_size.x + base_size.w - (arrow_size.w * 0.5)))
399 x = base_size.w - arrow_size.w;
401 x = x - base_size.x - (arrow_size.w * 0.5);
402 drag = (double)(x) / (double)(base_size.w - arrow_size.w);
403 edje_object_part_drag_value_set
404 (wd->resize_obj, "elm.swallow.arrow_up", drag,
409 case ELM_CTXPOPUP_DIRECTION_UP:
410 edje_object_signal_emit(sd->arrow, "elm,state,bottom", "elm");
411 edje_object_part_swallow
412 (wd->resize_obj, "elm.swallow.arrow_down",
417 if (x < ((arrow_size.w * 0.5) + base_size.x))
419 else if (x > (base_size.x + base_size.w - (arrow_size.w * 0.5)))
420 x = base_size.w - arrow_size.w;
421 else x = x - base_size.x - (arrow_size.w * 0.5);
422 drag = (double)(x) / (double)(base_size.w - arrow_size.w);
423 edje_object_part_drag_value_set
424 (wd->resize_obj, "elm.swallow.arrow_down",
433 //should be here for getting accurate geometry value
434 evas_object_smart_calculate(wd->resize_obj);
438 _show_signals_emit(Evas_Object *obj,
439 Elm_Ctxpopup_Direction dir)
441 ELM_CTXPOPUP_DATA_GET(obj, sd);
443 if (!sd->visible) return;
444 if ((sd->list) && (!sd->list_visible)) return;
448 case ELM_CTXPOPUP_DIRECTION_UP:
449 elm_layout_signal_emit(obj, "elm,state,show,up", "elm");
452 case ELM_CTXPOPUP_DIRECTION_LEFT:
453 elm_layout_signal_emit(obj,
454 (elm_widget_mirrored_get(obj) ? "elm,state,show,right" :
455 "elm,state,show,left"), "elm");
458 case ELM_CTXPOPUP_DIRECTION_RIGHT:
459 elm_layout_signal_emit(obj,
460 (elm_widget_mirrored_get(obj) ? "elm,state,show,left" :
461 "elm,state,show,right"), "elm");
464 case ELM_CTXPOPUP_DIRECTION_DOWN:
465 elm_layout_signal_emit(obj, "elm,state,show,down", "elm");
472 edje_object_signal_emit(sd->bg, "elm,state,show", "elm");
473 elm_layout_signal_emit(obj, "elm,state,show", "elm");
477 _hide_signals_emit(Evas_Object *obj,
478 Elm_Ctxpopup_Direction dir)
480 ELM_CTXPOPUP_DATA_GET(obj, sd);
482 if (!sd->visible) return;
486 case ELM_CTXPOPUP_DIRECTION_UP:
487 elm_layout_signal_emit(obj, "elm,state,hide,up", "elm");
490 case ELM_CTXPOPUP_DIRECTION_LEFT:
491 elm_layout_signal_emit(obj,
492 (elm_widget_mirrored_get(obj) ? "elm,state,hide,right" :
493 "elm,state,hide,left"), "elm");
496 case ELM_CTXPOPUP_DIRECTION_RIGHT:
497 elm_layout_signal_emit(obj,
498 (elm_widget_mirrored_get(obj) ? "elm,state,hide,left" :
499 "elm,state,hide,right"), "elm");
502 case ELM_CTXPOPUP_DIRECTION_DOWN:
503 elm_layout_signal_emit(obj, "elm,state,hide,down", "elm");
510 edje_object_signal_emit(sd->bg, "elm,state,hide", "elm");
514 _base_shift_by_arrow(Evas_Object *arrow,
515 Elm_Ctxpopup_Direction dir,
516 Evas_Coord_Rectangle *rect)
518 Evas_Coord arrow_w, arrow_h;
520 evas_object_geometry_get(arrow, NULL, NULL, &arrow_w, &arrow_h);
523 case ELM_CTXPOPUP_DIRECTION_RIGHT:
527 case ELM_CTXPOPUP_DIRECTION_LEFT:
531 case ELM_CTXPOPUP_DIRECTION_DOWN:
535 case ELM_CTXPOPUP_DIRECTION_UP:
545 _elm_ctxpopup_smart_layout_sub_object_add_enable(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
547 Eina_Bool *enable = va_arg(*list, Eina_Bool *);
548 *enable = EINA_FALSE;
552 _elm_ctxpopup_smart_sub_object_add(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
554 Evas_Object *sobj = va_arg(*list, Evas_Object *);
555 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
558 eo_do_super(obj, MY_CLASS, elm_wdg_sub_object_add(sobj, &int_ret));
560 if (ret) *ret = int_ret;
564 _elm_ctxpopup_smart_sizing_eval(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
566 Evas_Coord_Rectangle rect = { 0, 0, 1, 1 };
567 Evas_Coord_Point list_size = { 0, 0 };
569 Elm_Ctxpopup_Smart_Data *sd = _pd;
570 Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
572 if (!sd->arrow) return; /* simple way to flag "under deletion" */
575 sd->dir = _base_geometry_calc(obj, &rect);
577 _arrow_update(obj, sd->dir, rect);
579 _base_shift_by_arrow(sd->arrow, sd->dir, &rect);
581 if ((sd->list) && (sd->list_visible))
583 evas_object_geometry_get(sd->list, 0, 0, &list_size.x, &list_size.y);
584 if ((list_size.x >= rect.w) || (list_size.y >= rect.h))
586 elm_list_mode_set(sd->list, ELM_LIST_COMPRESS);
587 evas_object_size_hint_min_set(sd->box, rect.w, rect.h);
588 evas_object_size_hint_min_set(obj, rect.w, rect.h);
592 evas_object_move(wd->resize_obj, rect.x, rect.y);
593 evas_object_resize(wd->resize_obj, rect.w, rect.h);
595 _show_signals_emit(obj, sd->dir);
599 _on_parent_del(void *data,
601 Evas_Object *obj __UNUSED__,
602 void *event_info __UNUSED__)
604 evas_object_del(data);
608 _on_parent_move(void *data,
610 Evas_Object *obj __UNUSED__,
611 void *event_info __UNUSED__)
613 ELM_CTXPOPUP_DATA_GET(data, sd);
615 sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
617 if (sd->visible) elm_layout_sizing_eval(data);
621 _on_parent_resize(void *data,
623 Evas_Object *obj __UNUSED__,
624 void *event_info __UNUSED__)
626 ELM_CTXPOPUP_DATA_GET(data, sd);
628 sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
630 evas_object_hide(data);
631 evas_object_smart_callback_call(data, SIG_DISMISSED, NULL);
635 _parent_detach(Evas_Object *obj)
637 ELM_CTXPOPUP_DATA_GET(obj, sd);
639 if (!sd->parent) return;
641 evas_object_event_callback_del_full
642 (sd->parent, EVAS_CALLBACK_DEL, _on_parent_del, obj);
643 evas_object_event_callback_del_full
644 (sd->parent, EVAS_CALLBACK_MOVE, _on_parent_move, obj);
645 evas_object_event_callback_del_full
646 (sd->parent, EVAS_CALLBACK_RESIZE, _on_parent_resize, obj);
650 _on_content_resized(void *data,
652 Evas_Object *obj __UNUSED__,
653 void *event_info __UNUSED__)
655 ELM_CTXPOPUP_DATA_GET(data, sd);
657 elm_box_recalculate(sd->box);
658 elm_layout_sizing_eval(data);
661 //FIXME: lost the content size when theme hook is called.
663 _elm_ctxpopup_smart_theme(Eo *obj, void *_pd, va_list *list)
665 Elm_Ctxpopup_Smart_Data *sd = _pd;
668 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
669 if (ret) *ret = EINA_FALSE;
671 eo_do_super(obj, MY_CLASS, elm_wdg_theme(&int_ret));
672 if (!int_ret) return;
674 elm_widget_theme_object_set
675 (obj, sd->bg, "ctxpopup", "bg", elm_widget_style_get(obj));
676 elm_widget_theme_object_set
677 (obj, sd->arrow, "ctxpopup", "arrow", elm_widget_style_get(obj));
681 if (!strncmp(elm_object_style_get(obj), "default", strlen("default")))
682 elm_object_style_set(sd->list, "ctxpopup");
684 elm_object_style_set(sd->list, elm_object_style_get(obj));
687 sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
689 if (sd->visible) elm_layout_sizing_eval(obj);
691 if (ret) *ret = EINA_TRUE;
694 /* kind of a big and tricky override here: an internal box will hold
695 * the actual content. content aliases won't be of much help here */
697 _elm_ctxpopup_smart_content_set(Eo *obj, void *_pd, va_list *list)
699 Evas_Coord min_w = -1, min_h = -1;
701 Elm_Ctxpopup_Smart_Data *sd = _pd;
702 const char *part = va_arg(*list, const char *);
703 Evas_Object *content = va_arg(*list, Evas_Object *);
704 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
705 Eina_Bool int_ret = EINA_TRUE;
707 if ((part) && (strcmp(part, "default")))
709 eo_do_super(obj, MY_CLASS, elm_obj_container_content_set(part, content, &int_ret));
715 int_ret = EINA_FALSE;
719 if (content == sd->content) goto end;
721 if (sd->content) evas_object_del(sd->content);
722 if (sd->content == sd->list) sd->list = NULL;
724 evas_object_size_hint_weight_set
725 (content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
726 evas_object_size_hint_fill_set
727 (content, EVAS_HINT_FILL, EVAS_HINT_FILL);
729 /* since it's going to be a box content, not a layout's... */
730 evas_object_show(content);
732 evas_object_size_hint_min_get(content, &min_w, &min_h);
733 evas_object_size_hint_min_set(sd->box, min_w, min_h);
734 elm_box_pack_end(sd->box, content);
736 sd->content = content;
737 sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
739 if (sd->visible) elm_layout_sizing_eval(obj);
742 if (ret) *ret = int_ret;
746 _elm_ctxpopup_smart_content_get(Eo *obj, void *_pd, va_list *list)
748 const char *part = va_arg(*list, const char *);
749 Evas_Object **ret = va_arg(*list, Evas_Object **);
752 if ((part) && (strcmp(part, "default")))
754 eo_do_super(obj, MY_CLASS, elm_obj_container_content_get(part, ret));
758 Elm_Ctxpopup_Smart_Data *sd = _pd;
764 _elm_ctxpopup_smart_content_unset(Eo *obj, void *_pd, va_list *list)
766 Evas_Object *content;
768 const char *part = va_arg(*list, const char *);
769 Evas_Object **ret = va_arg(*list, Evas_Object **);
771 if ((part) && (strcmp(part, "default")))
773 eo_do_super(obj, MY_CLASS, elm_obj_container_content_unset(part, &content));
777 Elm_Ctxpopup_Smart_Data *sd = _pd;
778 content = sd->content;
779 if (!content) goto end;
782 sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
784 if (sd->visible) elm_layout_sizing_eval(obj);
787 if (ret) *ret = content;
791 _item_text_set_hook(Elm_Object_Item *it,
795 Elm_Ctxpopup_Item *ctxpopup_it;
797 if ((part) && (strcmp(part, "default"))) return;
799 ctxpopup_it = (Elm_Ctxpopup_Item *)it;
801 ELM_CTXPOPUP_DATA_GET(WIDGET(ctxpopup_it), sd);
803 elm_object_item_part_text_set(ctxpopup_it->list_item, "default", label);
804 sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
806 if (sd->visible) elm_layout_sizing_eval(WIDGET(ctxpopup_it));
810 _item_text_get_hook(const Elm_Object_Item *it,
813 Elm_Ctxpopup_Item *ctxpopup_it;
815 if (part && strcmp(part, "default")) return NULL;
817 ctxpopup_it = (Elm_Ctxpopup_Item *)it;
818 return elm_object_item_part_text_get(ctxpopup_it->list_item, "default");
822 _item_content_set_hook(Elm_Object_Item *it,
824 Evas_Object *content)
826 Elm_Ctxpopup_Item *ctxpopup_it;
828 if ((part) && (strcmp(part, "icon"))
829 && (strcmp(part, "start"))
830 && (strcmp(part, "end"))) return;
832 ctxpopup_it = (Elm_Ctxpopup_Item *)it;
834 ELM_CTXPOPUP_DATA_GET(WIDGET(ctxpopup_it), sd);
836 if ((part) && (!strcmp(part, "end")))
837 elm_object_item_part_content_set(ctxpopup_it->list_item, "end", content);
839 elm_object_item_part_content_set
840 (ctxpopup_it->list_item, "start", content);
842 sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
844 if (sd->visible) elm_layout_sizing_eval(WIDGET(ctxpopup_it));
848 _item_content_get_hook(const Elm_Object_Item *it,
851 Elm_Ctxpopup_Item *ctxpopup_it;
853 if (part && strcmp(part, "icon") && strcmp(part, "start")
854 && strcmp(part, "end")) return NULL;
856 ctxpopup_it = (Elm_Ctxpopup_Item *)it;
858 if (part && !strcmp(part, "end"))
859 return elm_object_item_part_content_get(ctxpopup_it->list_item, "end");
861 return elm_object_item_part_content_get(ctxpopup_it->list_item, "start");
865 _item_disable_hook(Elm_Object_Item *it)
867 Elm_Ctxpopup_Item *ctxpopup_it = (Elm_Ctxpopup_Item *)it;
869 elm_object_item_disabled_set
870 (ctxpopup_it->list_item, elm_widget_item_disabled_get(ctxpopup_it));
874 _item_signal_emit_hook(Elm_Object_Item *it,
875 const char *emission,
878 Elm_Ctxpopup_Item *ctxpopup_it = (Elm_Ctxpopup_Item *)it;
880 elm_object_item_signal_emit(ctxpopup_it->list_item, emission, source);
884 _bg_clicked_cb(void *data,
885 Evas_Object *obj __UNUSED__,
886 const char *emission __UNUSED__,
887 const char *source __UNUSED__)
889 ELM_CTXPOPUP_DATA_GET(data, sd);
891 _hide_signals_emit(data, sd->dir);
895 _on_show(void *data __UNUSED__,
898 void *event_info __UNUSED__)
900 ELM_CTXPOPUP_DATA_GET(obj, sd);
904 elm_list_go(sd->list);
905 sd->visible = EINA_TRUE;
906 elm_object_focus_set(obj, EINA_TRUE);
910 if (!sd->content) return;
912 sd->visible = EINA_TRUE;
914 evas_object_show(sd->bg);
915 evas_object_show(sd->arrow);
917 edje_object_signal_emit(sd->bg, "elm,state,show", "elm");
918 elm_layout_signal_emit(obj, "elm,state,show", "elm");
920 elm_layout_sizing_eval(obj);
922 elm_object_focus_set(obj, EINA_TRUE);
926 _on_hide(void *data __UNUSED__,
929 void *event_info __UNUSED__)
931 ELM_CTXPOPUP_DATA_GET(obj, sd);
933 if (!sd->visible) return;
935 evas_object_hide(sd->bg);
936 evas_object_hide(sd->arrow);
938 sd->visible = EINA_FALSE;
939 sd->list_visible = EINA_FALSE;
943 _on_move(void *data __UNUSED__,
946 void *event_info __UNUSED__)
948 ELM_CTXPOPUP_DATA_GET(obj, sd);
950 if (sd->visible) evas_object_show(sd->arrow);
952 elm_layout_sizing_eval(obj);
956 _hide_finished_cb(void *data,
957 Evas_Object *obj __UNUSED__,
958 const char *emission __UNUSED__,
959 const char *source __UNUSED__)
961 evas_object_hide(data);
962 evas_object_smart_callback_call(data, SIG_DISMISSED, NULL);
966 _list_resize_cb(void *data,
968 Evas_Object *obj __UNUSED__,
969 void *event_info __UNUSED__)
971 ELM_CTXPOPUP_DATA_GET(data, sd);
973 if (!sd->visible) return;
974 if (sd->list_visible) return;
976 sd->list_visible = EINA_TRUE;
978 evas_object_show(sd->bg);
979 evas_object_show(sd->arrow);
981 elm_layout_sizing_eval(data);
985 _ctxpopup_restack_cb(void *data __UNUSED__,
988 void *event_info __UNUSED__)
990 ELM_CTXPOPUP_DATA_GET(obj, sd);
991 evas_object_stack_below(sd->bg, obj);
995 _list_del(Elm_Ctxpopup_Smart_Data *sd)
997 if (!sd->list) return;
999 evas_object_del(sd->list);
1004 _item_del_pre_hook(Elm_Object_Item *it)
1007 Elm_Ctxpopup_Item *ctxpopup_it = (Elm_Ctxpopup_Item *)it;
1009 ELM_CTXPOPUP_DATA_GET(WIDGET(ctxpopup_it), sd);
1011 sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
1013 list = elm_object_item_widget_get(ctxpopup_it->list_item);
1015 if (eina_list_count(elm_list_items_get(list)) < 2)
1017 elm_object_item_del(ctxpopup_it->list_item);
1018 sd->items = eina_list_remove(sd->items, ctxpopup_it);
1019 evas_object_hide(WIDGET(ctxpopup_it));
1024 elm_object_item_del(ctxpopup_it->list_item);
1025 sd->items = eina_list_remove(sd->items, ctxpopup_it);
1026 if (sd->list_visible) elm_layout_sizing_eval(WIDGET(ctxpopup_it));
1032 _elm_ctxpopup_smart_disable(Eo *obj, void *_pd, va_list *list)
1034 Elm_Ctxpopup_Smart_Data *sd = _pd;
1036 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
1037 if (ret) *ret = EINA_FALSE;
1040 eo_do_super(obj, MY_CLASS, elm_wdg_disable(&int_ret));
1041 if (!int_ret) return;
1043 elm_object_disabled_set(sd->list, elm_widget_disabled_get(obj));
1045 if (ret) *ret = EINA_TRUE;
1049 _elm_ctxpopup_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
1051 Elm_Ctxpopup_Smart_Data *priv = _pd;
1053 eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
1055 if (!elm_layout_theme_set
1056 (obj, "ctxpopup", "base", elm_widget_style_get(obj)))
1057 CRITICAL("Failed to set layout!");
1059 elm_layout_signal_callback_add
1060 (obj, "elm,action,hide,finished", "", _hide_finished_cb, obj);
1063 priv->bg = edje_object_add(evas_object_evas_get(obj));
1064 elm_widget_theme_object_set(obj, priv->bg, "ctxpopup", "bg", "default");
1065 edje_object_signal_callback_add
1066 (priv->bg, "elm,action,click", "", _bg_clicked_cb, obj);
1068 evas_object_stack_below(priv->bg, obj);
1071 priv->arrow = edje_object_add(evas_object_evas_get(obj));
1072 elm_widget_theme_object_set
1073 (obj, priv->arrow, "ctxpopup", "arrow", "default");
1075 priv->dir_priority[0] = ELM_CTXPOPUP_DIRECTION_UP;
1076 priv->dir_priority[1] = ELM_CTXPOPUP_DIRECTION_LEFT;
1077 priv->dir_priority[2] = ELM_CTXPOPUP_DIRECTION_RIGHT;
1078 priv->dir_priority[3] = ELM_CTXPOPUP_DIRECTION_DOWN;
1079 priv->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
1081 evas_object_event_callback_add
1082 (obj, EVAS_CALLBACK_RESTACK, _ctxpopup_restack_cb, obj);
1084 priv->box = elm_box_add(obj);
1085 evas_object_size_hint_weight_set
1086 (priv->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1088 evas_object_event_callback_add
1089 (priv->box, EVAS_CALLBACK_RESIZE, _on_content_resized, obj);
1091 /* box will be our content placeholder, thus the parent's version call */
1093 eo_do_super(obj, MY_CLASS, elm_obj_container_content_set("elm.swallow.content", priv->box, &ret));
1095 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _on_show, NULL);
1096 evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _on_hide, NULL);
1097 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _on_move, NULL);
1099 elm_widget_can_focus_set(obj, EINA_TRUE);
1103 _elm_ctxpopup_smart_del(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
1105 Elm_Ctxpopup_Smart_Data *sd = _pd;
1106 Elm_Ctxpopup_Item *it;
1108 evas_object_event_callback_del_full
1109 (sd->box, EVAS_CALLBACK_RESIZE, _on_content_resized, obj);
1110 _parent_detach(obj);
1112 elm_ctxpopup_clear(obj);
1113 evas_object_del(sd->arrow);
1114 sd->arrow = NULL; /* stops _sizing_eval() from going on on deletion */
1116 evas_object_del(sd->bg);
1119 EINA_LIST_FREE(sd->items, it)
1120 elm_widget_item_free(it);
1122 eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
1126 _elm_ctxpopup_smart_parent_set(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
1128 Evas_Object *parent = va_arg(*list, Evas_Object *);
1129 //default parent is to be hover parent
1130 elm_ctxpopup_hover_parent_set(obj, parent);
1134 elm_ctxpopup_add(Evas_Object *parent)
1136 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1137 Evas_Object *obj = eo_add(MY_CLASS, parent);
1140 /* access: parent could be any object such as elm_list which does
1141 not know elc_ctxpopup as its child object in the focus_next(); */
1142 Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
1143 wd->highlight_root = EINA_TRUE;
1149 _constructor(Eo *obj, void *_pd EINA_UNUSED, va_list *list EINA_UNUSED)
1151 eo_do_super(obj, MY_CLASS, eo_constructor());
1153 evas_obj_type_set(MY_CLASS_NAME),
1154 evas_obj_smart_callbacks_descriptions_set(_smart_callbacks, NULL));
1156 elm_widget_sub_object_add(eo_parent_get(obj), obj);
1160 elm_ctxpopup_hover_parent_set(Evas_Object *obj,
1161 Evas_Object *parent)
1163 ELM_CTXPOPUP_CHECK(obj);
1164 eo_do(obj, elm_obj_ctxpopup_hover_parent_set(parent));
1168 _hover_parent_set(Eo *obj, void *_pd, va_list *list)
1170 Evas_Coord x, y, w, h;
1171 Evas_Object *parent = va_arg(*list, Evas_Object *);
1173 Elm_Ctxpopup_Smart_Data *sd = _pd;
1175 if (!parent) return;
1177 _parent_detach(obj);
1179 evas_object_event_callback_add
1180 (parent, EVAS_CALLBACK_DEL, _on_parent_del, obj);
1181 evas_object_event_callback_add
1182 (parent, EVAS_CALLBACK_MOVE, _on_parent_move, obj);
1183 evas_object_event_callback_add
1184 (parent, EVAS_CALLBACK_RESIZE, _on_parent_resize, obj);
1186 sd->parent = parent;
1189 evas_object_geometry_get(parent, &x, &y, &w, &h);
1190 if (!strcmp(evas_object_type_get(parent), "elm_win"))
1192 evas_object_move(sd->bg, x, y);
1193 evas_object_resize(sd->bg, w, h);
1195 if (sd->visible) elm_layout_sizing_eval(obj);
1199 elm_ctxpopup_hover_parent_get(const Evas_Object *obj)
1201 ELM_CTXPOPUP_CHECK(obj) NULL;
1202 Evas_Object *ret = NULL;
1203 eo_do((Eo *) obj, elm_obj_ctxpopup_hover_parent_get(&ret));
1208 _hover_parent_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
1210 Evas_Object **ret = va_arg(*list, Evas_Object **);
1211 Elm_Ctxpopup_Smart_Data *sd = _pd;
1216 elm_ctxpopup_clear(Evas_Object *obj)
1218 ELM_CTXPOPUP_CHECK(obj);
1219 eo_do(obj, elm_obj_ctxpopup_clear());
1223 _clear(Eo *obj EINA_UNUSED, void *_pd, va_list *list EINA_UNUSED)
1225 Elm_Ctxpopup_Smart_Data *sd = _pd;
1228 sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
1232 elm_ctxpopup_horizontal_set(Evas_Object *obj,
1233 Eina_Bool horizontal)
1235 ELM_CTXPOPUP_CHECK(obj);
1236 eo_do(obj, elm_obj_ctxpopup_horizontal_set(horizontal));
1240 _horizontal_set(Eo *obj, void *_pd, va_list *list)
1242 Eina_Bool horizontal = va_arg(*list, int);
1243 Elm_Ctxpopup_Smart_Data *sd = _pd;
1245 sd->horizontal = !!horizontal;
1247 if (!sd->list) return;
1249 elm_list_horizontal_set(sd->list, sd->horizontal);
1251 sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
1253 if (sd->visible) elm_layout_sizing_eval(obj);
1257 elm_ctxpopup_horizontal_get(const Evas_Object *obj)
1259 ELM_CTXPOPUP_CHECK(obj) EINA_FALSE;
1260 Eina_Bool ret = EINA_FALSE;
1261 eo_do((Eo *) obj, elm_obj_ctxpopup_horizontal_get(&ret));
1266 _horizontal_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
1268 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
1269 Elm_Ctxpopup_Smart_Data *sd = _pd;
1271 *ret = sd->horizontal;
1274 EAPI Elm_Object_Item *
1275 elm_ctxpopup_item_append(Evas_Object *obj,
1282 ELM_CTXPOPUP_CHECK(obj) NULL;
1283 Elm_Object_Item *ret = NULL;
1284 eo_do(obj, elm_obj_ctxpopup_item_append(label, icon, func, data, &ret));
1289 _item_wrap_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1291 Elm_Ctxpopup_Item *item = data;
1292 item->wcb.org_func_cb((void *)item->wcb.org_data, item->wcb.cobj, item);
1296 _item_append(Eo *obj, void *_pd, va_list *list)
1298 const char *label = va_arg(*list, const char *);
1299 Evas_Object *icon = va_arg(*list, Evas_Object *);
1300 Evas_Smart_Cb func = va_arg(*list, Evas_Smart_Cb);
1301 const void *data = va_arg(*list, const void *);
1302 Elm_Object_Item **ret = va_arg(*list, Elm_Object_Item **);
1305 Elm_Ctxpopup_Item *item;
1307 Elm_Ctxpopup_Smart_Data *sd = _pd;
1309 item = elm_widget_item_new(obj, Elm_Ctxpopup_Item);
1312 elm_widget_item_del_pre_hook_set(item, _item_del_pre_hook);
1313 elm_widget_item_disable_hook_set(item, _item_disable_hook);
1314 elm_widget_item_text_set_hook_set(item, _item_text_set_hook);
1315 elm_widget_item_text_get_hook_set(item, _item_text_get_hook);
1316 elm_widget_item_content_set_hook_set(item, _item_content_set_hook);
1317 elm_widget_item_content_get_hook_set(item, _item_content_get_hook);
1318 elm_widget_item_signal_emit_hook_set(item, _item_signal_emit_hook);
1322 //The first item is appended.
1323 sd->list = elm_list_add(obj);
1324 elm_list_mode_set(sd->list, ELM_LIST_EXPAND);
1325 elm_list_horizontal_set(sd->list, sd->horizontal);
1326 evas_object_event_callback_add
1327 (sd->list, EVAS_CALLBACK_RESIZE, _list_resize_cb, obj);
1328 elm_layout_content_set(obj, "default", sd->list);
1331 item->wcb.org_func_cb = func;
1332 item->wcb.org_data = data;
1333 item->wcb.cobj = obj;
1335 elm_list_item_append(sd->list, label, icon, NULL, _item_wrap_cb, item);
1336 sd->items = eina_list_append(sd->items, item);
1338 sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
1340 if (sd->visible) elm_layout_sizing_eval(obj);
1342 *ret = (Elm_Object_Item *)item;
1346 elm_ctxpopup_direction_priority_set(Evas_Object *obj,
1347 Elm_Ctxpopup_Direction first,
1348 Elm_Ctxpopup_Direction second,
1349 Elm_Ctxpopup_Direction third,
1350 Elm_Ctxpopup_Direction fourth)
1352 ELM_CTXPOPUP_CHECK(obj);
1353 eo_do(obj, elm_obj_ctxpopup_direction_priority_set(first, second, third, fourth));
1357 _direction_priority_set(Eo *obj, void *_pd, va_list *list)
1359 Elm_Ctxpopup_Direction first = va_arg(*list, Elm_Ctxpopup_Direction);
1360 Elm_Ctxpopup_Direction second = va_arg(*list, Elm_Ctxpopup_Direction);
1361 Elm_Ctxpopup_Direction third = va_arg(*list, Elm_Ctxpopup_Direction);
1362 Elm_Ctxpopup_Direction fourth = va_arg(*list, Elm_Ctxpopup_Direction);
1364 Elm_Ctxpopup_Smart_Data *sd = _pd;
1366 sd->dir_priority[0] = first;
1367 sd->dir_priority[1] = second;
1368 sd->dir_priority[2] = third;
1369 sd->dir_priority[3] = fourth;
1371 if (sd->visible) elm_layout_sizing_eval(obj);
1375 elm_ctxpopup_direction_priority_get(Evas_Object *obj,
1376 Elm_Ctxpopup_Direction *first,
1377 Elm_Ctxpopup_Direction *second,
1378 Elm_Ctxpopup_Direction *third,
1379 Elm_Ctxpopup_Direction *fourth)
1381 ELM_CTXPOPUP_CHECK(obj);
1382 eo_do(obj, elm_obj_ctxpopup_direction_priority_get(first, second, third, fourth));
1386 _direction_priority_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
1388 Elm_Ctxpopup_Direction *first = va_arg(*list, Elm_Ctxpopup_Direction *);
1389 Elm_Ctxpopup_Direction *second = va_arg(*list, Elm_Ctxpopup_Direction *);
1390 Elm_Ctxpopup_Direction *third = va_arg(*list, Elm_Ctxpopup_Direction *);
1391 Elm_Ctxpopup_Direction *fourth = va_arg(*list, Elm_Ctxpopup_Direction *);
1393 Elm_Ctxpopup_Smart_Data *sd = _pd;
1395 if (first) *first = sd->dir_priority[0];
1396 if (second) *second = sd->dir_priority[1];
1397 if (third) *third = sd->dir_priority[2];
1398 if (fourth) *fourth = sd->dir_priority[3];
1401 EAPI Elm_Ctxpopup_Direction
1402 elm_ctxpopup_direction_get(const Evas_Object *obj)
1404 ELM_CTXPOPUP_CHECK(obj) ELM_CTXPOPUP_DIRECTION_UNKNOWN;
1405 Elm_Ctxpopup_Direction ret = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
1406 eo_do((Eo *) obj, elm_obj_ctxpopup_direction_get(&ret));
1411 _direction_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
1413 Elm_Ctxpopup_Direction *ret = va_arg(*list, Elm_Ctxpopup_Direction *);
1414 Elm_Ctxpopup_Smart_Data *sd = _pd;
1420 elm_ctxpopup_dismiss(Evas_Object *obj)
1422 ELM_CTXPOPUP_CHECK(obj);
1423 eo_do(obj, elm_obj_ctxpopup_dismiss());
1427 _dismiss(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
1429 Elm_Ctxpopup_Smart_Data *sd = _pd;
1431 _hide_signals_emit(obj, sd->dir);
1435 _class_constructor(Eo_Class *klass)
1437 const Eo_Op_Func_Description func_desc[] = {
1438 EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_CONSTRUCTOR), _constructor),
1440 EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_ADD), _elm_ctxpopup_smart_add),
1441 EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_DEL), _elm_ctxpopup_smart_del),
1443 EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_PARENT_SET), _elm_ctxpopup_smart_parent_set),
1444 EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_DISABLE), _elm_ctxpopup_smart_disable),
1445 EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_EVENT), _elm_ctxpopup_smart_event),
1446 EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_THEME), _elm_ctxpopup_smart_theme),
1447 EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_SUB_OBJECT_ADD), _elm_ctxpopup_smart_sub_object_add),
1448 EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_NEXT_MANAGER_IS), _elm_ctxpopup_smart_focus_next_manager_is),
1449 EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_NEXT), _elm_ctxpopup_smart_focus_next),
1450 EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_DIRECTION_MANAGER_IS), _elm_ctxpopup_smart_focus_direction_manager_is),
1451 EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_TRANSLATE), _elm_ctxpopup_smart_translate),
1453 EO_OP_FUNC(ELM_OBJ_CONTAINER_ID(ELM_OBJ_CONTAINER_SUB_ID_CONTENT_SET), _elm_ctxpopup_smart_content_set),
1454 EO_OP_FUNC(ELM_OBJ_CONTAINER_ID(ELM_OBJ_CONTAINER_SUB_ID_CONTENT_GET), _elm_ctxpopup_smart_content_get),
1455 EO_OP_FUNC(ELM_OBJ_CONTAINER_ID(ELM_OBJ_CONTAINER_SUB_ID_CONTENT_UNSET), _elm_ctxpopup_smart_content_unset),
1457 EO_OP_FUNC(ELM_OBJ_LAYOUT_ID(ELM_OBJ_LAYOUT_SUB_ID_SIZING_EVAL), _elm_ctxpopup_smart_sizing_eval),
1458 EO_OP_FUNC(ELM_OBJ_LAYOUT_ID(ELM_OBJ_LAYOUT_SUB_ID_SUB_OBJECT_ADD_ENABLE), _elm_ctxpopup_smart_layout_sub_object_add_enable),
1460 EO_OP_FUNC(ELM_OBJ_CTXPOPUP_ID(ELM_OBJ_CTXPOPUP_SUB_ID_HOVER_PARENT_SET), _hover_parent_set),
1461 EO_OP_FUNC(ELM_OBJ_CTXPOPUP_ID(ELM_OBJ_CTXPOPUP_SUB_ID_HOVER_PARENT_GET), _hover_parent_get),
1462 EO_OP_FUNC(ELM_OBJ_CTXPOPUP_ID(ELM_OBJ_CTXPOPUP_SUB_ID_CLEAR), _clear),
1463 EO_OP_FUNC(ELM_OBJ_CTXPOPUP_ID(ELM_OBJ_CTXPOPUP_SUB_ID_HORIZONTAL_SET), _horizontal_set),
1464 EO_OP_FUNC(ELM_OBJ_CTXPOPUP_ID(ELM_OBJ_CTXPOPUP_SUB_ID_HORIZONTAL_GET), _horizontal_get),
1465 EO_OP_FUNC(ELM_OBJ_CTXPOPUP_ID(ELM_OBJ_CTXPOPUP_SUB_ID_ITEM_APPEND), _item_append),
1466 EO_OP_FUNC(ELM_OBJ_CTXPOPUP_ID(ELM_OBJ_CTXPOPUP_SUB_ID_DIRECTION_PRIORITY_SET), _direction_priority_set),
1467 EO_OP_FUNC(ELM_OBJ_CTXPOPUP_ID(ELM_OBJ_CTXPOPUP_SUB_ID_DIRECTION_PRIORITY_GET), _direction_priority_get),
1468 EO_OP_FUNC(ELM_OBJ_CTXPOPUP_ID(ELM_OBJ_CTXPOPUP_SUB_ID_DIRECTION_GET), _direction_get),
1469 EO_OP_FUNC(ELM_OBJ_CTXPOPUP_ID(ELM_OBJ_CTXPOPUP_SUB_ID_DISMISS), _dismiss),
1472 eo_class_funcs_set(klass, func_desc);
1474 evas_smart_legacy_type_register(MY_CLASS_NAME, klass);
1476 static const Eo_Op_Description op_desc[] = {
1477 EO_OP_DESCRIPTION(ELM_OBJ_CTXPOPUP_SUB_ID_HOVER_PARENT_SET, "Set the Ctxpopup's parent."),
1478 EO_OP_DESCRIPTION(ELM_OBJ_CTXPOPUP_SUB_ID_HOVER_PARENT_GET, "Get the Ctxpopup's parent."),
1479 EO_OP_DESCRIPTION(ELM_OBJ_CTXPOPUP_SUB_ID_CLEAR, "Clear all items in the given ctxpopup object."),
1480 EO_OP_DESCRIPTION(ELM_OBJ_CTXPOPUP_SUB_ID_HORIZONTAL_SET, "Change the ctxpopup's orientation to horizontal or vertical."),
1481 EO_OP_DESCRIPTION(ELM_OBJ_CTXPOPUP_SUB_ID_HORIZONTAL_GET, "Get the value of current ctxpopup object's orientation."),
1482 EO_OP_DESCRIPTION(ELM_OBJ_CTXPOPUP_SUB_ID_ITEM_APPEND, "Add a new item to a ctxpopup object."),
1483 EO_OP_DESCRIPTION(ELM_OBJ_CTXPOPUP_SUB_ID_DIRECTION_PRIORITY_SET, "Set the direction priority of a ctxpopup."),
1484 EO_OP_DESCRIPTION(ELM_OBJ_CTXPOPUP_SUB_ID_DIRECTION_PRIORITY_GET, "Get the direction priority of a ctxpopup."),
1485 EO_OP_DESCRIPTION(ELM_OBJ_CTXPOPUP_SUB_ID_DIRECTION_GET, "Get the current direction of a ctxpopup."),
1486 EO_OP_DESCRIPTION(ELM_OBJ_CTXPOPUP_SUB_ID_DISMISS, "Dismiss a ctxpopup object."),
1487 EO_OP_DESCRIPTION_SENTINEL
1489 static const Eo_Class_Description class_desc = {
1492 EO_CLASS_TYPE_REGULAR,
1493 EO_CLASS_DESCRIPTION_OPS(&ELM_OBJ_CTXPOPUP_BASE_ID, op_desc, ELM_OBJ_CTXPOPUP_SUB_ID_LAST),
1495 sizeof(Elm_Ctxpopup_Smart_Data),
1499 EO_DEFINE_CLASS(elm_obj_ctxpopup_class_get, &class_desc, ELM_OBJ_LAYOUT_CLASS, NULL);