1 #include <Elementary.h>
3 #include "elm_widget_panel.h"
7 EAPI const char ELM_PANEL_SMART_NAME[] = "elm_panel";
9 static const char ACCESS_OUTLINE_PART[] = "elm.swallow.content";
11 static const char SIG_SCROLL[] = "scroll";
13 static const Evas_Smart_Cb_Description _smart_callbacks[] =
18 static const Evas_Smart_Interface *_smart_interfaces[] =
20 (Evas_Smart_Interface *)&ELM_SCROLLABLE_IFACE, NULL
23 EVAS_SMART_SUBCLASS_IFACE_NEW
24 (ELM_PANEL_SMART_NAME, _elm_panel, Elm_Panel_Smart_Class,
25 Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks,
29 _mirrored_set(Evas_Object *obj,
32 ELM_PANEL_DATA_GET(obj, sd);
34 elm_widget_mirrored_set(sd->bx, rtl);
35 elm_panel_orient_set(obj, elm_panel_orient_get(obj));
39 _hidden_content_region_set(Evas_Object *obj, Evas_Coord w, Evas_Coord h,
42 ELM_PANEL_DATA_GET(obj, sd);
46 //Move the content to the outside of the panel in order to be hidden.
47 if (sd->orient == ELM_PANEL_ORIENT_TOP ||
48 sd->orient == ELM_PANEL_ORIENT_LEFT)
50 if (anim) sd->s_iface->region_bring_in(obj, sd->panel_w, 0, w, h);
53 sd->s_iface->content_region_show(obj, sd->panel_w, 0, w, h);
56 sd->s_iface->hold_set(obj, EINA_TRUE);
58 elm_layout_signal_emit(sd->ly, "elm,state,content,hidden", "elm");
59 elm_object_signal_emit(obj, "elm,state,hold", "elm");
60 sd->scrolled = EINA_FALSE;
66 //FIXME: Set position properly in case of panel visible.
67 if (anim) sd->s_iface->region_bring_in(obj, 0, 0, w, h);
70 sd->s_iface->content_region_show(obj, 0, 0, w, h);
73 sd->s_iface->hold_set(obj, EINA_TRUE);
75 elm_layout_signal_emit(sd->ly, "elm,state,content,hidden", "elm");
76 elm_object_signal_emit(obj, "elm,state,hold", "elm");
77 sd->scrolled = EINA_FALSE;
84 if (sd->orient == ELM_PANEL_ORIENT_TOP ||
85 sd->orient == ELM_PANEL_ORIENT_LEFT)
87 if (anim) sd->s_iface->region_bring_in(obj, 0, 0, w, h);
90 sd->s_iface->content_region_show(obj, 0, 0, w, h);
93 sd->s_iface->hold_set(obj, EINA_FALSE);
94 sd->hold = EINA_FALSE;
95 elm_layout_signal_emit(sd->ly, "elm,state,content,visible", "elm");
96 elm_object_signal_emit(obj, "elm,state,unhold", "elm");
102 if (anim) sd->s_iface->region_bring_in(obj, sd->panel_w, 0, w, h);
105 sd->s_iface->content_region_show(obj, sd->panel_w, 0, w, h);
108 sd->s_iface->hold_set(obj, EINA_FALSE);
109 sd->hold = EINA_FALSE;
110 elm_layout_signal_emit(sd->ly, "elm,state,content,visible", "elm");
111 elm_object_signal_emit(obj, "elm,state,unhold", "elm");
119 _elm_panel_smart_sizing_eval(Evas_Object *obj)
121 Evas_Coord mw = -1, mh = -1;
123 ELM_PANEL_DATA_GET(obj, sd);
125 if (sd->on_deletion) return;
127 evas_object_smart_calculate(sd->bx);
128 edje_object_size_min_calc(ELM_WIDGET_DATA(sd)->resize_obj, &mw, &mh);
129 evas_object_size_hint_min_set(obj, mw, mh);
130 evas_object_size_hint_max_set(obj, -1, -1);
134 _access_state_cb(void *data, Evas_Object *obj __UNUSED__)
136 ELM_PANEL_DATA_GET(data, sd);
138 if (!sd->hidden) return strdup(E_("state: opened"));
139 else return strdup(E_("state: closed"));
145 _orient_set_do_internal(Evas_Object *obj)
147 ELM_PANEL_DATA_GET(obj, sd);
149 if (!sd->scrollable) return;
153 case ELM_PANEL_ORIENT_TOP:
154 elm_layout_theme_set(sd->ly, "panel", "top/internal",
155 elm_widget_style_get(obj));
157 case ELM_PANEL_ORIENT_BOTTOM:
158 elm_layout_theme_set(sd->ly, "panel", "bottom/internal",
159 elm_widget_style_get(obj));
161 case ELM_PANEL_ORIENT_LEFT:
162 if (!elm_widget_mirrored_get(obj))
164 elm_layout_theme_set(sd->ly, "panel", "left/internal",
165 elm_widget_style_get(obj));
169 elm_layout_theme_set(sd->ly, "panel", "right/internal",
170 elm_widget_style_get(obj));
173 case ELM_PANEL_ORIENT_RIGHT:
174 if (!elm_widget_mirrored_get(obj))
176 elm_layout_theme_set(sd->ly, "panel", "right/internal",
177 elm_widget_style_get(obj));
181 elm_layout_theme_set(sd->ly, "panel", "left/internal",
182 elm_widget_style_get(obj));
186 const char *panel_w = edje_object_data_get(elm_layout_edje_get(sd->ly),
188 const char *panel_h = edje_object_data_get(elm_layout_edje_get(sd->ly),
190 sd->panel_w = (int) (elm_object_scale_get(obj) * (double) atoi(panel_w));
191 sd->panel_h = (int) (elm_object_scale_get(obj) * (double) atoi(panel_h));
195 _access_object_get(const Evas_Object *obj, const char *part)
197 Evas_Object *po, *ao;
198 ELM_PANEL_DATA_GET(obj, sd);
200 po = (Evas_Object *)edje_object_part_object_get
201 (elm_layout_edje_get(sd->ly), part);
202 ao = evas_object_data_get(po, "_part_access_obj");
208 _access_activate_cb(void *data,
209 Evas_Object *part_obj __UNUSED__,
210 Elm_Object_Item *item __UNUSED__)
212 elm_panel_hidden_set(data, EINA_TRUE);
216 _access_obj_process(Evas_Object *obj, Eina_Bool is_access)
219 ELM_PANEL_DATA_GET(obj, sd);
223 ao = _elm_access_edje_object_part_object_register
224 (obj, elm_layout_edje_get(sd->ly), ACCESS_OUTLINE_PART);
225 _elm_access_text_set(_elm_access_object_get(ao),
226 ELM_ACCESS_TYPE, E_("A drawer is open, double tap to close it"));
227 _elm_access_activate_callback_set
228 (_elm_access_object_get(ao), _access_activate_cb, obj);
232 _elm_access_edje_object_part_object_unregister
233 (obj, elm_layout_edje_get(sd->ly), ACCESS_OUTLINE_PART);
238 _orient_set_do(Evas_Object *obj)
240 Evas_Coord handler_w = 0, handler_h = 0;
242 ELM_PANEL_DATA_GET(obj, sd);
243 ELM_WIDGET_DATA_GET(obj, wsd);
247 case ELM_PANEL_ORIENT_TOP:
248 elm_layout_theme_set(obj, "panel", "top", elm_widget_style_get(obj));
250 case ELM_PANEL_ORIENT_BOTTOM:
252 (obj, "panel", "bottom", elm_widget_style_get(obj));
254 case ELM_PANEL_ORIENT_LEFT:
255 if (!elm_widget_mirrored_get(obj))
258 (obj, "panel", "left", elm_widget_style_get(obj));
263 (obj, "panel", "right", elm_widget_style_get(obj));
266 case ELM_PANEL_ORIENT_RIGHT:
267 if (!elm_widget_mirrored_get(obj))
270 (obj, "panel", "right", elm_widget_style_get(obj));
275 (obj, "panel", "left", elm_widget_style_get(obj));
279 edje_object_part_geometry_get(wsd->resize_obj, "handler", NULL, NULL, &handler_w, &handler_h);
280 sd->handler_w = (int) (elm_object_scale_get(obj) * (double) (int)(handler_w));
281 sd->handler_h = (int) (elm_object_scale_get(obj) * (double) (int)(handler_h));
283 _orient_set_do_internal(obj);
288 if (_elm_config->access_mode) _access_obj_process(obj, EINA_TRUE);
294 if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
297 ao = _elm_access_edje_object_part_object_register
298 (obj, ELM_WIDGET_DATA(sd)->resize_obj, "btn_icon");
299 _elm_access_text_set(_elm_access_object_get(ao),
300 ELM_ACCESS_TYPE, E_("panel button"));
301 _elm_access_callback_set
302 (_elm_access_object_get(ao), ELM_ACCESS_STATE, _access_state_cb, obj);
307 _elm_panel_smart_theme(Evas_Object *obj)
311 ELM_PANEL_DATA_GET(obj, sd);
313 if (!ELM_WIDGET_CLASS(_elm_panel_parent_sc)->theme(obj))
316 _mirrored_set(obj, elm_widget_mirrored_get(obj));
318 str = edje_object_data_get
319 (ELM_WIDGET_DATA(sd)->resize_obj, "focus_highlight");
320 if ((str) && (!strcmp(str, "on")))
321 elm_widget_highlight_in_theme_set(obj, EINA_TRUE);
323 elm_widget_highlight_in_theme_set(obj, EINA_FALSE);
327 elm_layout_sizing_eval(obj);
333 _elm_panel_smart_focus_next(const Evas_Object *obj,
334 Elm_Focus_Direction dir,
338 Eina_List *items = NULL;
339 Eina_Bool ret = EINA_FALSE;
341 ELM_PANEL_DATA_GET(obj, sd);
348 if (_elm_config->access_mode)
350 Evas_Object *ao = _access_object_get(obj, ACCESS_OUTLINE_PART);
351 if (ao) items = eina_list_append(items, ao);
354 items = eina_list_append(items, sd->ly);
356 if (_elm_config->access_mode)
358 ret = elm_widget_focus_list_next_get
359 (obj, items, eina_list_data_get, dir, next);
360 eina_list_free(items);
365 return elm_widget_focus_next_get(sd->ly, dir, next);
373 /* Try to Focus cycle in subitem */
375 return elm_widget_focus_next_get(cur, dir, next);
378 if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
380 Evas_Object *ao, *po;
381 po = (Evas_Object *)edje_object_part_object_get
382 (ELM_WIDGET_DATA(sd)->resize_obj, "btn_icon");
383 ao = evas_object_data_get(po, "_part_access_obj");
384 _elm_access_highlight_set(ao, EINA_FALSE);
388 *next = (Evas_Object *)obj;
389 return !elm_widget_focus_get(obj);
393 _box_layout_cb(Evas_Object *o,
394 Evas_Object_Box_Data *priv,
395 void *data __UNUSED__)
397 _els_box_layout(o, priv, EINA_TRUE, EINA_FALSE, EINA_FALSE);
401 _panel_toggle(void *data __UNUSED__,
403 const char *emission __UNUSED__,
404 const char *source __UNUSED__)
407 ELM_PANEL_DATA_GET(obj, sd);
409 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
411 sd->hidden = !sd->hidden;
416 elm_object_signal_emit(obj, "elm,state,inactive", "elm");
419 elm_layout_signal_emit(obj, "elm,action,hide", "elm");
421 if (elm_widget_focus_get(sd->content))
423 elm_widget_focused_object_clear(obj);
424 elm_widget_focus_steal(obj);
434 sd->s_iface->hold_set(obj, EINA_FALSE);
435 sd->hold = EINA_FALSE;
436 elm_layout_signal_emit(sd->ly, "elm,state,content,visible", "elm");
437 elm_object_signal_emit(obj, "elm,state,unhold", "elm");
440 elm_object_signal_emit(obj, "elm,state,active", "elm");
443 elm_layout_signal_emit(obj, "elm,action,show", "elm");
446 _hidden_content_region_set(obj, w, h, EINA_TRUE);
448 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
452 _elm_panel_smart_event(Evas_Object *obj,
454 Evas_Callback_Type type,
457 // TIZEN ONLY (2013.11.27): when panel is scrollable, ignore smart event
458 ELM_PANEL_DATA_GET(obj, sd);
459 if (sd->scrollable) return EINA_FALSE;
462 Evas_Event_Key_Down *ev = event_info;
464 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
465 if ((src != obj) || (type != EVAS_CALLBACK_KEY_DOWN)) return EINA_FALSE;
466 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
468 if ((strcmp(ev->keyname, "Return")) &&
469 (strcmp(ev->keyname, "KP_Enter")))
472 _panel_toggle(NULL, obj, NULL, NULL);
474 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
479 _elm_panel_smart_content_set(Evas_Object *obj,
481 Evas_Object *content)
485 ELM_PANEL_DATA_GET(obj, sd);
487 if (part && strcmp(part, "default"))
488 return ELM_CONTAINER_CLASS(_elm_panel_parent_sc)->content_set
489 (obj, part, content);
491 if (sd->content == content) return EINA_TRUE;
493 if (!sd->scrollable && sd->content)
494 evas_object_box_remove_all(sd->bx, EINA_TRUE);
496 sd->content = content;
502 elm_layout_content_set(sd->ly, "elm.swallow.content", sd->content);
503 sd->s_iface->content_set(obj, sd->bx);
504 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
505 _hidden_content_region_set(obj, w, h, EINA_FALSE);
509 evas_object_box_append(sd->bx, sd->content);
510 evas_object_show(sd->content);
514 elm_layout_sizing_eval(obj);
520 _elm_panel_smart_content_get(const Evas_Object *obj,
523 ELM_PANEL_DATA_GET(obj, sd);
525 if (part && strcmp(part, "default"))
526 return ELM_CONTAINER_CLASS(_elm_panel_parent_sc)->content_get(obj, part);
532 _elm_panel_smart_content_unset(Evas_Object *obj,
535 Evas_Object *content;
537 ELM_PANEL_DATA_GET(obj, sd);
539 if (part && strcmp(part, "default"))
540 return ELM_CONTAINER_CLASS
541 (_elm_panel_parent_sc)->content_unset(obj, part);
543 if (!sd->content) return NULL;
544 content = sd->content;
548 if (sd->scrollable) elm_layout_content_unset(sd->ly, "elm.swallow.content");
549 else evas_object_box_remove_all(sd->bx, EINA_FALSE);
555 _hidden_state_change(Evas_Object *obj, Eina_Bool handler_bring_in)
559 ELM_PANEL_DATA_GET(obj, sd);
561 if (!sd->scrollable) return;
562 if (sd->hold) return;
564 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
565 sd->s_iface->content_pos_get(obj, &x, NULL);
567 if (sd->orient == ELM_PANEL_ORIENT_TOP ||
568 sd->orient == ELM_PANEL_ORIENT_LEFT)
571 if (x == (sd->panel_w - sd->handler_w))
573 if (!handler_bring_in) //_anim_stop_cb function
578 else if (sd->scroll_dir == 0) //_on_mouse_up function -> handler close
580 sd->s_iface->region_bring_in(obj, sd->panel_w, 0, w, h);
589 elm_object_signal_emit(obj, "elm,state,active", "elm");
590 sd->hidden = EINA_FALSE;
594 // drawer focus & access
595 elm_object_tree_focus_allow_set(obj, EINA_TRUE);
596 if (_elm_config->access_mode)
598 ao = _access_object_get(obj, ACCESS_OUTLINE_PART);
599 evas_object_show(ao);
601 elm_object_focus_set(obj, EINA_TRUE);
606 else if (x == sd->panel_w)
608 sd->s_iface->hold_set(obj, EINA_TRUE);
609 sd->hold = EINA_TRUE;
610 elm_layout_signal_emit(sd->ly, "elm,state,content,hidden", "elm");
611 elm_object_signal_emit(obj, "elm,state,hold", "elm");
612 sd->scrolled = EINA_FALSE;
616 elm_object_signal_emit(obj, "elm,state,inactive", "elm");
617 sd->hidden = EINA_TRUE;
621 // drawer focus & access
622 elm_object_tree_focus_allow_set(obj, EINA_FALSE);
623 if (_elm_config->access_mode)
625 ao = _access_object_get(obj, ACCESS_OUTLINE_PART);
626 evas_object_hide(ao);
635 if (x == sd->handler_w)
637 if (!handler_bring_in) //_anim_stop_cb function
642 else if (sd->scroll_dir == 0) //_on_mouse_up function -> handler close
644 sd->s_iface->region_bring_in(obj, 0, 0, w, h);
649 else if (x == sd->panel_w)
653 elm_object_signal_emit(obj, "elm,state,active", "elm");
654 sd->hidden = EINA_FALSE;
658 // drawer focus & access
659 elm_object_tree_focus_allow_set(obj, EINA_TRUE);
660 if (_elm_config->access_mode)
662 ao = _access_object_get(obj, ACCESS_OUTLINE_PART);
663 evas_object_show(ao);
665 elm_object_focus_set(obj, EINA_TRUE);
672 sd->s_iface->hold_set(obj, EINA_TRUE);
673 sd->hold = EINA_TRUE;
674 elm_layout_signal_emit(sd->ly, "elm,state,content,hidden", "elm");
675 elm_object_signal_emit(obj, "elm,state,hold", "elm");
676 sd->scrolled = EINA_FALSE;
680 elm_object_signal_emit(obj, "elm,state,inactive", "elm");
681 sd->hidden = EINA_TRUE;
685 // drawer focus & access
686 elm_object_tree_focus_allow_set(obj, EINA_FALSE);
687 if (_elm_config->access_mode)
689 ao = _access_object_get(obj, ACCESS_OUTLINE_PART);
690 evas_object_hide(ao);
697 if (sd->scroll_dir == 1)
698 sd->s_iface->region_bring_in(obj, 0, 0, w, h);
699 else if (sd->scroll_dir == 2)
700 sd->s_iface->region_bring_in(obj, sd->panel_w, 0, w, h);
704 _on_mouse_up(void *data __UNUSED__,
707 void *event_info __UNUSED__)
709 _hidden_state_change(obj, EINA_TRUE);
713 _on_spacer_mouse_down(void *data,
715 Evas_Object *obj __UNUSED__,
718 ELM_PANEL_DATA_GET(data, sd);
719 Evas_Event_Mouse_Down *ev = event_info;
721 sd->down_x = ev->output.x;
722 sd->down_y = ev->output.y;
726 _on_spacer_mouse_up(void *data,
728 Evas_Object *obj __UNUSED__,
731 ELM_PANEL_DATA_GET(data, sd);
732 Evas_Event_Mouse_Up *ev = event_info;
733 Evas_Coord up_x, up_y, minw = 0, minh = 0;
738 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
740 if ((abs(up_x - sd->down_x) < minw) && (abs(up_y - sd->down_y) < minh))
741 elm_panel_hidden_set(data, EINA_TRUE);
748 _scroll_left_cb(Evas_Object *obj, void *data __UNUSED__)
750 ELM_PANEL_DATA_GET(obj, sd);
753 sd->s_iface->content_pos_get(obj, &x, NULL);
755 if (!(sd->scroll_dir == 2 && ((sd->content_pos - x) < THRESHOLD)))
762 _scroll_right_cb(Evas_Object *obj, void *data __UNUSED__)
764 ELM_PANEL_DATA_GET(obj, sd);
767 sd->s_iface->content_pos_get(obj, &x, NULL);
769 if (!(sd->scroll_dir == 1 && ((x - sd->content_pos) < THRESHOLD)))
776 _scroll_cb(Evas_Object *obj, void *data __UNUSED__)
779 Elm_Panel_Scroll_Info event;
781 ELM_PANEL_DATA_GET(obj, sd);
783 // if drag really fast and mouse up, scroll happens after the mouse up.
784 // scroller is set to hold on mouse up, so have to unhold here
787 sd->s_iface->hold_set(obj, EINA_FALSE);
788 sd->hold = EINA_FALSE;
789 elm_layout_signal_emit(sd->ly, "elm,state,content,visible", "elm");
790 elm_object_signal_emit(obj, "elm,state,unhold", "elm");
792 // signal emit at the first scrolling
795 sd->scrolled = EINA_TRUE;
796 elm_layout_signal_emit(sd->ly, "elm,state,scroll,start", "elm");
799 sd->s_iface->content_pos_get(obj, &x, &y);
801 if (sd->orient == ELM_PANEL_ORIENT_TOP)
805 // event.rel_y = 1 - ((double) y / (double) sd->panel_h);
807 else if (sd->orient == ELM_PANEL_ORIENT_LEFT)
809 event.rel_x = 1 - ((double) x / (double) sd->panel_w);
812 else if (sd->orient == ELM_PANEL_ORIENT_RIGHT)
814 event.rel_x = (double) x / (double) sd->panel_w;
821 // event.rel_y = 1 - ((double) y / (double) sd->panel_h);
823 evas_object_smart_callback_call(obj, SIG_SCROLL, (void *) &event);
827 _active_cb(void *data __UNUSED__,
829 const char *emission __UNUSED__,
830 const char *source __UNUSED__)
832 ELM_PANEL_DATA_GET(obj, sd);
834 if (!sd->scrollable) return;
835 if (!sd->hold) return;
837 sd->s_iface->hold_set(obj, EINA_FALSE);
838 sd->hold = EINA_FALSE;
839 elm_layout_signal_emit(sd->ly, "elm,state,content,visible", "elm");
840 elm_object_signal_emit(obj, "elm,state,unhold", "elm");
844 _handler_open_cb(void *data __UNUSED__,
846 const char *emission __UNUSED__,
847 const char *source __UNUSED__)
850 ELM_PANEL_DATA_GET(obj, sd);
852 if (!sd->scrollable) return;
854 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
855 evas_pointer_output_xy_get(evas_object_evas_get(obj), &x, NULL);
857 if (sd->orient == ELM_PANEL_ORIENT_TOP ||
858 sd->orient == ELM_PANEL_ORIENT_LEFT)
860 if ((x > 0) && (x < sd->handler_w))
861 sd->s_iface->region_bring_in
862 (obj, (sd->panel_w - sd->handler_w), 0, w, h);
866 if ((x > (sd->panel_w - sd->handler_w)) && (x < sd->panel_w))
867 sd->s_iface->region_bring_in
868 (obj, sd->handler_w, 0, w, h);
873 _anim_start_cb(Evas_Object *obj, void *data __UNUSED__)
875 ELM_PANEL_DATA_GET(obj, sd);
876 sd->animating = EINA_TRUE;
880 _anim_stop_cb(Evas_Object *obj, void *data __UNUSED__)
882 ELM_PANEL_DATA_GET(obj, sd);
883 sd->animating = EINA_FALSE;
884 _hidden_state_change(obj, EINA_FALSE);
888 _elm_panel_smart_add(Evas_Object *obj)
890 EVAS_SMART_DATA_ALLOC(obj, Elm_Panel_Smart_Data);
892 ELM_WIDGET_CLASS(_elm_panel_parent_sc)->base.add(obj);
896 _elm_panel_smart_del(Evas_Object *obj)
901 ELM_PANEL_DATA_GET(obj, sd);
903 sd->on_deletion = EINA_TRUE;
905 /* let's make our box object the *last* to be processed, since it
906 * may (smart) parent other sub objects here */
907 EINA_LIST_FOREACH(ELM_WIDGET_DATA(sd)->subobjs, l, child)
911 ELM_WIDGET_DATA(sd)->subobjs =
912 eina_list_demote_list(ELM_WIDGET_DATA(sd)->subobjs, l);
917 ELM_WIDGET_CLASS(_elm_panel_parent_sc)->base.del(obj);
921 _elm_panel_smart_access(Evas_Object *obj, Eina_Bool is_access)
923 ELM_PANEL_CHECK(obj);
924 ELM_PANEL_DATA_GET(obj, sd);
929 _access_obj_process(obj, is_access);
935 _elm_access_edje_object_part_object_register
936 (obj, ELM_WIDGET_DATA(sd)->resize_obj, "btn_icon");
938 _elm_access_edje_object_part_object_unregister
939 (obj, ELM_WIDGET_DATA(sd)->resize_obj, "btn_icon");
943 _elm_panel_smart_resize(Evas_Object *obj,
947 Evas_Coord handler_w = 0, handler_h = 0;
949 ELM_PANEL_DATA_GET(obj, sd);
950 ELM_WIDGET_DATA_GET(obj, wsd);
952 ELM_WIDGET_CLASS(_elm_panel_parent_sc)->base.resize(obj, w, h);
954 evas_object_resize(sd->hit_rect, w, h);
955 if ((sd->content) && (!sd->animating))
956 _hidden_content_region_set(obj, w, h, EINA_FALSE);
959 if (wsd->orient_mode == 90 || wsd->orient_mode == 270)
961 evas_object_size_hint_min_set(sd->spacer, 1860, h);
962 evas_object_resize(sd->bx, 1860, 0);
966 evas_object_size_hint_min_set(sd->spacer, 1300, h);
967 evas_object_resize(sd->bx, 1300, 0);
969 edje_object_part_geometry_get(wsd->resize_obj, "handler", NULL, NULL, &handler_w, &handler_h);
970 sd->handler_w = (int) (elm_object_scale_get(obj) * (double) (int)(handler_w));
971 sd->handler_h = (int) (elm_object_scale_get(obj) * (double) (int)(handler_h));
976 _elm_panel_smart_disable(Evas_Object *obj)
978 ELM_PANEL_DATA_GET(obj, sd);
981 if (elm_widget_disabled_get(obj))
983 evas_object_pass_events_set(sd->hit_rect, EINA_TRUE);
984 elm_layout_signal_emit(obj, "elm,state,disabled", "elm");
988 evas_object_pass_events_set(sd->hit_rect, EINA_FALSE);
989 elm_layout_signal_emit(obj, "elm,state,enabled", "elm");
996 _elm_panel_smart_set_user(Elm_Panel_Smart_Class *sc)
998 ELM_WIDGET_CLASS(sc)->base.add = _elm_panel_smart_add;
999 ELM_WIDGET_CLASS(sc)->base.del = _elm_panel_smart_del;
1001 ELM_WIDGET_CLASS(sc)->base.resize = _elm_panel_smart_resize;
1003 ELM_WIDGET_CLASS(sc)->focus_next = _elm_panel_smart_focus_next;
1004 ELM_WIDGET_CLASS(sc)->theme = _elm_panel_smart_theme;
1005 ELM_WIDGET_CLASS(sc)->event = _elm_panel_smart_event;
1006 ELM_WIDGET_CLASS(sc)->access = _elm_panel_smart_access;
1007 ELM_WIDGET_CLASS(sc)->disable = _elm_panel_smart_disable;
1009 ELM_CONTAINER_CLASS(sc)->content_set = _elm_panel_smart_content_set;
1010 ELM_CONTAINER_CLASS(sc)->content_get = _elm_panel_smart_content_get;
1011 ELM_CONTAINER_CLASS(sc)->content_unset = _elm_panel_smart_content_unset;
1013 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_panel_smart_sizing_eval;
1016 EAPI const Elm_Panel_Smart_Class *
1017 elm_panel_smart_class_get(void)
1019 static Elm_Panel_Smart_Class _sc =
1020 ELM_PANEL_SMART_CLASS_INIT_NAME_VERSION(ELM_PANEL_SMART_NAME);
1021 static const Elm_Panel_Smart_Class *class = NULL;
1023 if (class) return class;
1025 _elm_panel_smart_set(&_sc);
1032 elm_panel_add(Evas_Object *parent)
1036 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1038 obj = elm_widget_add(_elm_panel_smart_class_new(), parent);
1039 if (!obj) return NULL;
1041 if (!elm_widget_sub_object_add(parent, obj))
1042 ERR("could not add %p as sub object of %p", obj, parent);
1044 ELM_PANEL_DATA_GET(obj, sd);
1046 elm_widget_can_focus_set(obj, EINA_TRUE);
1048 _orient_set_do(obj);
1051 sd->bx = evas_object_box_add(evas_object_evas_get(obj));
1052 evas_object_size_hint_align_set(sd->bx, 0.5, 0.5);
1053 evas_object_size_hint_weight_set(sd->bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1054 evas_object_box_layout_set(sd->bx, _box_layout_cb, sd, NULL);
1055 elm_layout_content_set(obj, "elm.swallow.content", sd->bx);
1056 evas_object_show(sd->bx);
1058 elm_layout_signal_callback_add
1059 (obj, "elm,action,panel,toggle", "*", _panel_toggle, obj);
1060 elm_layout_signal_callback_add(obj, "elm,state,event,active", "elm", _active_cb,
1062 elm_layout_signal_callback_add(obj, "elm,state,handler,open", "elm", _handler_open_cb,
1064 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_UP, _on_mouse_up,
1067 elm_layout_sizing_eval(obj);
1069 /* scrollable interface */
1070 sd->s_iface = evas_object_smart_interface_get
1071 (obj, ELM_SCROLLABLE_IFACE_NAME);
1074 sd->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
1075 evas_object_smart_member_add(sd->hit_rect, obj);
1076 elm_widget_sub_object_add(obj, sd->hit_rect);
1077 evas_object_color_set(sd->hit_rect, 0, 0, 0, 0);
1078 evas_object_pass_events_set(sd->hit_rect, EINA_TRUE);
1079 evas_object_show(sd->hit_rect);
1081 sd->s_iface->objects_set
1082 (obj, ELM_WIDGET_DATA(sd)->resize_obj, sd->hit_rect);
1084 sd->s_iface->single_direction_set(obj, ELM_SCROLLER_SINGLE_DIRECTION_HARD);
1085 sd->s_iface->scroll_left_cb_set(obj, _scroll_left_cb);
1086 sd->s_iface->scroll_right_cb_set(obj, _scroll_right_cb);
1087 sd->s_iface->scroll_cb_set(obj, _scroll_cb);
1088 sd->s_iface->animate_start_cb_set(obj, _anim_start_cb);
1089 sd->s_iface->animate_stop_cb_set(obj, _anim_stop_cb);
1091 sd->s_iface->hold_set(obj, EINA_TRUE);
1092 sd->hold = EINA_TRUE;
1094 //Tizen Only: This should be removed when eo is applied.
1095 ELM_WIDGET_DATA_GET(obj, wsd);
1096 wsd->on_create = EINA_FALSE;
1097 wsd->highlight_root = EINA_TRUE;
1103 elm_panel_orient_set(Evas_Object *obj,
1104 Elm_Panel_Orient orient)
1106 ELM_PANEL_CHECK(obj);
1107 ELM_PANEL_DATA_GET(obj, sd);
1109 if (sd->orient == orient) return;
1110 sd->orient = orient;
1112 _orient_set_do(obj);
1114 elm_layout_sizing_eval(obj);
1117 EAPI Elm_Panel_Orient
1118 elm_panel_orient_get(const Evas_Object *obj)
1120 ELM_PANEL_CHECK(obj) ELM_PANEL_ORIENT_LEFT;
1121 ELM_PANEL_DATA_GET(obj, sd);
1127 elm_panel_hidden_set(Evas_Object *obj,
1130 ELM_PANEL_CHECK(obj);
1131 ELM_PANEL_DATA_GET(obj, sd);
1133 if (sd->hidden == hidden)
1135 if (sd->hidden && !sd->hold)
1138 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
1139 _hidden_content_region_set(obj, w, h, EINA_TRUE);
1146 _panel_toggle(NULL, obj, NULL, NULL);
1150 elm_panel_hidden_get(const Evas_Object *obj)
1152 ELM_PANEL_CHECK(obj) EINA_FALSE;
1153 ELM_PANEL_DATA_GET(obj, sd);
1159 elm_panel_toggle(Evas_Object *obj)
1161 ELM_PANEL_CHECK(obj);
1163 _panel_toggle(NULL, obj, NULL, NULL);
1167 elm_panel_scrollable_set(Evas_Object *obj, Eina_Bool scrollable)
1169 ELM_PANEL_CHECK(obj);
1170 ELM_PANEL_DATA_GET(obj, sd);
1171 ELM_WIDGET_DATA_GET(obj, wsd);
1175 Evas_Object *content;
1177 scrollable = !!scrollable;
1179 if (sd->scrollable == scrollable) return;
1180 sd->scrollable = scrollable;
1182 //TODO: scrollable set
1185 /* internal layout */
1186 sd->ly = elm_layout_add(obj);
1187 evas_object_smart_member_add(sd->ly, obj);
1188 elm_widget_sub_object_add(obj, sd->ly);
1189 _orient_set_do_internal(obj);
1190 evas_object_show(sd->ly);
1192 content = sd->content;
1193 evas_object_box_remove_all(sd->bx, EINA_FALSE);
1194 evas_object_box_append(sd->bx, sd->ly);
1195 elm_layout_content_unset(obj, "elm.swallow.content");
1198 elm_layout_content_set(obj, "elm.swallow.content", content);
1200 sd->spacer = evas_object_rectangle_add(evas_object_evas_get(obj));
1201 evas_object_color_set(sd->spacer, 0, 0, 0, 0);
1202 evas_object_event_callback_add(sd->spacer, EVAS_CALLBACK_MOUSE_DOWN,
1203 _on_spacer_mouse_down, obj);
1204 evas_object_event_callback_add(sd->spacer, EVAS_CALLBACK_MOUSE_UP,
1205 _on_spacer_mouse_up, obj);
1207 evas_object_geometry_get(obj, NULL, NULL, NULL, &h);
1208 if (wsd->orient_mode == 90 || wsd->orient_mode == 270)
1209 evas_object_size_hint_min_set(sd->spacer, 1860, h);
1211 evas_object_size_hint_min_set(sd->spacer, 1300, h);
1213 elm_layout_content_set(sd->ly, "elm.swallow.spacer", sd->spacer);
1216 elm_layout_signal_emit(sd->ly, "elm,state,content,hidden", "elm");
1218 elm_layout_signal_emit(sd->ly, "elm,state,content,visible", "elm");
1220 evas_object_pass_events_set(sd->hit_rect, EINA_FALSE);
1224 elm_layout_content_unset(sd->ly, "elm.swallow.content");
1225 evas_object_box_append(sd->bx, sd->content);
1226 elm_layout_content_set(obj, "elm.swallow.content", sd->bx);
1227 evas_object_pass_events_set(sd->hit_rect, EINA_TRUE);
1228 evas_object_del(sd->spacer);
1229 evas_object_del(sd->ly);
1236 elm_panel_scrollable_get(const Evas_Object *obj)
1238 ELM_PANEL_CHECK(obj) EINA_FALSE;
1239 ELM_PANEL_DATA_GET(obj, sd);
1240 return sd->scrollable;