2 * @defgroup SlidingDrawer SlidingDrawer
5 * This is a slidingdrawer.
8 #include <Elementary.h>
11 typedef struct _Widget_Data Widget_Data;
18 Evas_Object *dragable_rect;
19 Elm_SlidingDrawer_Pos pos;
22 Elm_SlidingDrawer_Drag_Value value;
25 static const char *widtype = NULL;
27 static void _del_hook(Evas_Object *obj);
29 static void _theme_hook(Evas_Object *obj);
31 static void _sizing_eval(Evas_Object *obj);
33 static void _parent_resize(void *data, Evas * e, Evas_Object *obj, void *event_info);
34 static void _drag_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
35 static void _up_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
36 static void _down_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
39 _del_hook(Evas_Object *obj)
41 Widget_Data *wd = (Widget_Data *) elm_widget_data_get(obj);
43 evas_object_event_callback_del(wd->parent, EVAS_CALLBACK_RESIZE, _parent_resize);
48 _theme_hook(Evas_Object *obj)
50 Widget_Data *wd = (Widget_Data *) elm_widget_data_get(obj);
52 elm_slidingdrawer_pos_set(obj, wd->pos);
56 _parent_resize(void *data, Evas * e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
62 _drag_cb(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
64 Widget_Data *wd = elm_widget_data_get(data);
66 edje_object_part_drag_value_get(wd->base, "elm.dragable.handler", &wd->value.x, &wd->value.y);
67 evas_object_smart_callback_call(data, "mouse,move", (void *)&wd->value);
71 _up_cb(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
73 Widget_Data *wd = elm_widget_data_get(data);
75 edje_object_part_drag_value_get(wd->base, "elm.dragable.handler", &wd->value.x, &wd->value.y);
76 evas_object_smart_callback_call(data, "mouse,up", (void *)&wd->value);
80 _down_cb(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
82 Widget_Data *wd = elm_widget_data_get(data);
84 edje_object_part_drag_value_get(wd->base, "elm.dragable.handler", &wd->value.x, &wd->value.y);
85 evas_object_smart_callback_call(data, "mouse,down", (void *)&wd->value);
89 _sizing_eval(Evas_Object *obj)
93 Evas_Coord x, y, w, h;
95 const Evas_Object *part;
97 wd = elm_widget_data_get(obj);
99 evas_object_geometry_get(wd->parent, &x, &y, &w, &h);
100 evas_object_move(obj, x, y);
101 evas_object_resize(obj, w, h);
103 evas_object_size_hint_max_set(wd->dragable_rect, ((double)w) * wd->max_drag_w, ((double)h) * wd->max_drag_h);
105 part = edje_object_part_object_get(wd->base, "elm.dragable.handler");
107 if ((wd->pos == ELM_SLIDINGDRAWER_TOP)
108 || (wd->pos == ELM_SLIDINGDRAWER_BOTTOM))
109 edje_object_size_min_get(part, NULL, &h);
111 edje_object_size_min_get(part, &w, NULL);
113 evas_object_size_hint_min_set(wd->handler, w, h);
117 * Unswallow the user content
119 * @param[in] obj SlidingDrawer object
120 * @return The unswallowed contents
122 * @ingroup SlidingDrawer
125 elm_slidingdrawer_content_unset(Evas_Object *obj)
127 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
129 Evas_Object *content;
130 wd = elm_widget_data_get(obj);
131 content = edje_object_part_swallow_get(wd->base, "elm.swallow.content");
134 edje_object_part_unswallow(wd->base, content);
135 elm_widget_sub_object_del(obj, content);
140 * Swallow the user contents
142 * @param[in] obj SlidingDrawer object
143 * @param[in] content Content to be swallowed.
145 * @ingroup SlidingDrawer
148 elm_slidingdrawer_content_set(Evas_Object *obj, Evas_Object *content){
149 ELM_CHECK_WIDTYPE(obj, widtype);
151 Evas_Object *prev_content;
152 if (!content) return;
153 wd = elm_widget_data_get(obj);
154 elm_widget_sub_object_add(obj, content);
155 prev_content = edje_object_part_swallow_get(wd->base, "elm.swallow.content");
158 edje_object_part_unswallow(wd->base, prev_content);
159 elm_widget_sub_object_del(obj, prev_content);
160 evas_object_del(prev_content);
162 edje_object_part_swallow(wd->base, "elm.swallow.content", content);
166 * Set the position of SlidingDrawer
168 * @param[in] obj SlidingDrawer object
169 * @param[in] pos Position of drawer's handle
171 * @ingroup SlidingDrawer
174 elm_slidingdrawer_pos_set(Evas_Object *obj, Elm_SlidingDrawer_Pos pos)
176 ELM_CHECK_WIDTYPE(obj, widtype);
178 Widget_Data *wd = elm_widget_data_get(obj);
182 case ELM_SLIDINGDRAWER_BOTTOM:
183 _elm_theme_object_set(obj, wd->base, "slidingdrawer", "bottom", elm_widget_style_get(obj));
185 case ELM_SLIDINGDRAWER_LEFT:
186 _elm_theme_object_set(obj, wd->base, "slidingdrawer", "left", elm_widget_style_get(obj));
188 case ELM_SLIDINGDRAWER_RIGHT:
189 _elm_theme_object_set(obj, wd->base, "slidingdrawer", "right", elm_widget_style_get(obj));
191 case ELM_SLIDINGDRAWER_TOP:
192 _elm_theme_object_set(obj, wd->base, "slidingdrawer", "top", elm_widget_style_get(obj));
196 edje_object_part_drag_value_set(wd->base, "elm.dragable.handler", 0, 0);
202 * Set the current dragable value.
204 * @param[in] obj SlidingDrawer object
205 * @param[in] dx The x value (range: 0 ~ 1)
206 * @param[in] dy The y value (range: 0 ~ 1)
208 * @ingroup SlidingDrawer
211 elm_slidingdrawer_drag_value_set(Evas_Object *obj, double dx, double dy)
213 ELM_CHECK_WIDTYPE(obj, widtype);
216 wd = elm_widget_data_get(obj);
217 edje_object_part_drag_value_set(wd->base, "elm.dragable.handler", dx, dy);
221 * Set the dragable max value.
223 * @param[in] obj SlidingDrawer object
224 * @param[in] dw The maximum width value (range: 0 ~ 1)
225 * @param[in] dh The maximum height value (range: 0 ~ 1)
227 * @ingroup SlidingDrawer
230 elm_slidingdrawer_max_drag_value_set(Evas_Object *obj, double dw, double dh)
232 ELM_CHECK_WIDTYPE(obj, widtype);
235 wd = elm_widget_data_get(obj);
243 * Add a new slidingdrawer object to the parent.
245 * @param[in] parent Parent object
246 * @return New object or NULL if it cannot be created
248 * @ingroup SlidingDrawer
251 elm_slidingdrawer_add(Evas_Object *parent)
257 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
260 ELM_SET_WIDTYPE(widtype, "slidingdrawer");
261 elm_widget_type_set(obj, "slidingdrawer");
262 elm_widget_can_focus_set(obj, EINA_FALSE);
263 elm_widget_sub_object_add(parent, obj);
264 elm_widget_data_set(obj, wd);
265 elm_widget_del_hook_set(obj, _del_hook);
266 elm_widget_theme_hook_set(obj, _theme_hook);
269 wd->base = edje_object_add(e);
270 _elm_theme_object_set(obj, wd->base, "slidingdrawer", "bottom", "default");
271 edje_object_signal_callback_add(wd->base, "drag", "*", _drag_cb, obj);
272 edje_object_signal_callback_add(wd->base, "mouse,up,*", "*", _up_cb, obj);
273 edje_object_signal_callback_add(wd->base, "mouse,down,*", "*", _down_cb, obj);
274 elm_widget_sub_object_add(obj, wd->base);
275 elm_widget_resize_object_set(obj, wd->base);
278 wd->dragable_rect = evas_object_rectangle_add(e);
279 elm_widget_sub_object_add(obj, wd->dragable_rect);
280 edje_object_part_swallow(wd->base, "elm.swallow.dragable_rect", wd->dragable_rect);
285 wd->handler = evas_object_rectangle_add(e);
286 elm_widget_sub_object_add(obj, wd->handler);
287 evas_object_color_set(wd->handler, 0, 0, 0, 0);
288 edje_object_part_swallow(wd->base, "elm.dragable.handler", wd->handler);
290 evas_object_event_callback_add(parent, EVAS_CALLBACK_RESIZE, _parent_resize, obj);