08108a58cb50a2b5b522cf8882109c13ce1dc8c6
[framework/uifw/elementary.git] / src / lib / elm_actionslider.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4 /*
5  * SLP
6  * Copyright (c) 2009 Samsung Electronics, Inc.
7  * All rights reserved.
8  *
9  * This software is a confidential and proprietary information
10  * of Samsung Electronics, Inc. ("Confidential Information").  You
11  * shall not disclose such Confidential Information and shall use
12  * it only in accordance with the terms of the license agreement
13  * you entered into with Samsung Electronics.
14  */
15
16 /**
17  *
18  * @defgroup Actionslider Actionslider
19  * @ingroup Elementary
20  *
21  * A magnet slider is a switcher for 3 labels with customizable
22  * magnet properties. When the position is set with magnet, the knob
23  * will be moved to it if it's nearest the magnetized position.
24  *
25  * Signals that you can add callbacks for are:
26  *
27  * "selected" - when user selects a position (the label is passed as
28  *              event info)".
29  * "pos_changed" - when a button reaches to the special position like
30  *                 "left", "right" and "center".
31  */
32
33 #include <Elementary.h>
34 #include <math.h>
35 #include "elm_priv.h"
36
37 /**
38  * internal data structure of actionslider object
39  */
40 typedef struct _Widget_Data Widget_Data;
41
42 struct _Widget_Data
43 {
44    Evas_Object  *as;            // actionslider
45    Evas_Object  *icon;          // an icon for a button or a bar
46    Evas_Object  *icon_fake;             // an icon for a button or a bar
47
48    // setting
49    Elm_Actionslider_Magnet_Pos  magnet_position, enabled_position;
50    const char *text_left, *text_right, *text_center, *text_button;
51
52    // status
53    Eina_Bool    mouse_down;
54    Eina_Bool    mouse_hold;
55
56    // icon animation
57    Ecore_Animator       *icon_animator;
58    double               final_position;
59 };
60
61 static void _del_hook(Evas_Object *obj);
62 static void _theme_hook(Evas_Object *obj);
63 static void _disable_hook(Evas_Object *obj);
64 static void _sizing_eval(Evas_Object *obj);
65 static void _sub_del(void *data, Evas_Object *obj, void *event_info);
66
67 /*
68  * callback functions
69  */
70 static void _icon_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__);
71 static void _icon_move_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__);
72 static void _icon_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__);
73
74 /*
75  * internal functions
76  */
77 static Eina_Bool _icon_animation(void *data);
78
79 static const char *widtype = NULL;
80
81 static const char SIG_CHANGED[] = "pos_changed";
82 static const char SIG_SELECTED[] = "selected";
83
84 static const Evas_Smart_Cb_Description _signals[] =
85 {
86      {SIG_CHANGED, ""},
87      {SIG_SELECTED, ""},
88      {NULL, NULL}
89 };
90
91
92 static void
93 _del_hook(Evas_Object *obj)
94 {
95    Widget_Data *wd = elm_widget_data_get(obj);
96    if (!wd) return;
97    if (wd->icon)
98      {
99         evas_object_del(wd->icon);
100         wd->icon = NULL;
101      }
102    if (wd->icon_fake)
103      {
104         evas_object_del(wd->icon_fake);
105         wd->icon_fake = NULL;
106      }
107    if (wd->text_left) eina_stringshare_del(wd->text_left);
108    if (wd->text_right) eina_stringshare_del(wd->text_right);
109    if (wd->text_center) eina_stringshare_del(wd->text_center);
110    if (wd->text_button) eina_stringshare_del(wd->text_button);
111    if (wd->as)
112      {
113         evas_object_smart_member_del(wd->as);
114         evas_object_del(wd->as);
115         wd->as = NULL;
116      }
117    free(wd);
118 }
119
120 static Elm_Actionslider_Indicator_Pos
121 _get_pos_by_orientation(const Evas_Object *obj, Elm_Actionslider_Indicator_Pos pos)
122 {
123    if (elm_widget_mirrored_get(obj))
124      {
125         switch (pos)
126           {
127            case ELM_ACTIONSLIDER_INDICATOR_LEFT:
128               pos = ELM_ACTIONSLIDER_INDICATOR_RIGHT;
129               break;
130            case ELM_ACTIONSLIDER_INDICATOR_RIGHT:
131               pos = ELM_ACTIONSLIDER_INDICATOR_LEFT;
132               break;
133            default:
134               break;
135           }
136      }
137    return pos;
138 }
139
140 static void
141 _mirrored_set(Evas_Object *obj, Eina_Bool rtl)
142 {
143    Widget_Data *wd = elm_widget_data_get(obj);
144    double pos;
145
146    if (!wd) return;
147    if (edje_object_mirrored_get(wd->as) == rtl)
148      return;
149
150    edje_object_mirrored_set(wd->as, rtl);
151    if (!elm_widget_mirrored_get(obj))
152      {
153         edje_object_part_text_set(wd->as, "elm.text.left", wd->text_left);
154         edje_object_part_text_set(wd->as, "elm.text.right", wd->text_right);
155      }
156    else
157      {
158         edje_object_part_text_set(wd->as, "elm.text.left", wd->text_right);
159         edje_object_part_text_set(wd->as, "elm.text.right", wd->text_left);
160      }
161    edje_object_part_drag_value_get(wd->as, "elm.swallow.icon", &pos, NULL);
162    edje_object_part_drag_value_set(wd->as, "elm.swallow.icon", 1.0 - pos, 0.5);
163 }
164
165 static void
166 _sizing_eval(Evas_Object *obj)
167 {
168    Widget_Data *wd = elm_widget_data_get(obj);
169    Evas_Coord minw = -1, minh = -1;
170
171    if (!wd) return;
172    elm_coords_finger_size_adjust(1, &minw, 1, &minh);
173    evas_object_size_hint_min_set(wd->icon, minw, minh);
174    evas_object_size_hint_max_set(wd->icon, -1, -1);
175
176    minw = -1;
177    minh = -1;
178    elm_coords_finger_size_adjust(3, &minw, 1, &minh);
179    edje_object_size_min_restricted_calc(wd->as, &minw, &minh, minw, minh);
180    evas_object_size_hint_min_set(obj, minw, minh);
181    evas_object_size_hint_max_set(obj, -1, -1);
182 }
183
184 static void
185 _theme_hook(Evas_Object *obj)
186 {
187    Widget_Data *wd = elm_widget_data_get(obj);
188    if (!wd) return;
189    _elm_widget_mirrored_reload(obj);
190    if (edje_object_part_swallow_get(wd->as, "elm.swallow.icon") == NULL)
191      edje_object_part_unswallow(wd->as, wd->icon);
192    if (edje_object_part_swallow_get(wd->as, "elm.swallow.space") == NULL)
193      edje_object_part_unswallow(wd->as, wd->icon_fake);
194
195    _elm_theme_object_set(obj, wd->as, "actionslider", "base", elm_widget_style_get(obj));
196    _elm_theme_object_set(obj, wd->icon, "actionslider", "icon", elm_widget_style_get(obj));
197    _elm_theme_object_set(obj, wd->icon_fake, "actionslider", "icon", elm_widget_style_get(obj));
198    edje_object_part_swallow(wd->as, "elm.swallow.icon", wd->icon);
199    edje_object_part_swallow(wd->as, "elm.swallow.space", wd->icon_fake);
200
201    _mirrored_set(obj, elm_widget_mirrored_get(obj));
202    edje_object_part_text_set(wd->as, "elm.text.center", wd->text_center);
203    edje_object_part_text_set(wd->icon, "elm.text.button", wd->text_button);
204    edje_object_message_signal_process(wd->as);
205    //edje_object_scale_set(wd->as, elm_widget_scale_get(obj) * _elm_config->scale);
206    _sizing_eval(obj);
207 }
208
209 static void
210 _disable_hook(Evas_Object *obj)
211 {
212    Widget_Data *wd = elm_widget_data_get(obj);
213
214    if (elm_widget_disabled_get(obj))
215      edje_object_signal_emit(wd->icon, "elm,state,disabled", "elm");
216    else
217      edje_object_signal_emit(wd->icon, "elm,state,enabled", "elm");
218
219 }
220
221 static void
222 _icon_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
223 {
224    Widget_Data *wd = elm_widget_data_get((Evas_Object *)data);
225    if (!wd) return;
226    wd->mouse_down = EINA_TRUE;
227 }
228
229 static void
230 _icon_move_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
231 {
232    Evas_Object *as = (Evas_Object *)data;
233    Widget_Data *wd = elm_widget_data_get(as);
234    double pos = 0.0;
235    if (!wd) return;
236    elm_actionslider_hold(as, EINA_FALSE);
237    if (wd->mouse_down == EINA_FALSE) return;
238
239    edje_object_part_drag_value_get(wd->as, "elm.swallow.icon", &pos, NULL);
240
241    if (pos == 0.0)
242      evas_object_smart_callback_call(as, SIG_CHANGED, (void *) ((!elm_widget_mirrored_get(as)) ? "left" : "right"));
243    else if (pos == 1.0)
244      evas_object_smart_callback_call(as, SIG_CHANGED, (void *) ((!elm_widget_mirrored_get(as)) ? "right" : "left"));
245    else if (pos >= 0.495 && pos <= 0.505)
246      evas_object_smart_callback_call(as, SIG_CHANGED, (void *)"center");
247
248 /*
249  * TODO
250 if (wd->type == ELM_ACTIONSLIDER_TYPE_BAR_GREEN ||
251 wd->type == ELM_ACTIONSLIDER_TYPE_BAR_RED ) {
252 if (pos == 1.0) {
253 //edje_object_signal_emit(wd->as, "elm,show,bar,text,center", "elm");
254 edje_object_signal_emit(wd->as, "elm,show,text,center", "elm");
255 } else {
256 //edje_object_signal_emit(wd->as, "elm,hide,bar,text,center", "elm");
257 edje_object_signal_emit(wd->as, "elm,hide,text,center", "elm");
258 }
259 }
260 */
261 }
262
263 static void
264 _icon_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
265 {
266    Evas_Object *as = (Evas_Object *)data;
267    Widget_Data *wd = elm_widget_data_get((Evas_Object *)data);
268    double position = 0.0;
269
270    wd->mouse_down = EINA_FALSE;
271
272    if (wd->mouse_hold == EINA_FALSE)
273      {
274         edje_object_part_drag_value_get(wd->as, "elm.swallow.icon", &position, NULL);
275
276         if ((wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_LEFT) && ((!elm_widget_mirrored_get(as) && position == 0.0) ||(elm_widget_mirrored_get(obj) && position == 1.0)))
277           {
278              wd->final_position = 0.0;
279              evas_object_smart_callback_call(data, SIG_SELECTED,(void *) wd->text_left);
280           }
281         else if (position >= 0.495 && position <= 0.505 && (wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_CENTER))
282           {
283              wd->final_position = 0.5;
284              evas_object_smart_callback_call(data, SIG_SELECTED,(void *)wd->text_center);
285           }
286         else if ((wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_RIGHT) && ((!elm_widget_mirrored_get(as) && position == 1.0) ||(elm_widget_mirrored_get(obj) && position == 0.0)))
287           {
288              wd->final_position = 1.0;
289              evas_object_smart_callback_call(data, SIG_SELECTED, (void *) wd->text_right);
290           }
291         if (wd->magnet_position == ELM_ACTIONSLIDER_MAGNET_NONE) return;
292
293         #define _FINAL_POS_BY_ORIENTATION(x) (x)
294         #define _POS_BY_ORIENTATION(x) ((!elm_widget_mirrored_get(as)) ? x : 1.0 - x)
295
296         position = _POS_BY_ORIENTATION(position);
297
298         if (position < 0.3)
299           {
300              if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_LEFT)
301                wd->final_position = _FINAL_POS_BY_ORIENTATION(0);
302              else if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_CENTER)
303                wd->final_position = 0.5;
304              else if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_RIGHT)
305                wd->final_position = _FINAL_POS_BY_ORIENTATION(1);
306           }
307         else if ((position >= 0.3) && (position <= 0.7))
308           {
309              if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_CENTER)
310                wd->final_position = 0.5;
311              else if (position < 0.5)
312                {
313                   if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_LEFT)
314                     wd->final_position = _FINAL_POS_BY_ORIENTATION(0);
315                   else
316                     wd->final_position = _FINAL_POS_BY_ORIENTATION(1);
317                }
318              else
319                {
320                   if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_RIGHT)
321                     wd->final_position = _FINAL_POS_BY_ORIENTATION(1);
322                   else
323                     wd->final_position = _FINAL_POS_BY_ORIENTATION(0);
324                }
325            }
326         else
327           {
328              if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_RIGHT)
329                wd->final_position = _FINAL_POS_BY_ORIENTATION(1);
330              else if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_CENTER)
331                wd->final_position = 0.5;
332              else
333                wd->final_position = _FINAL_POS_BY_ORIENTATION(0);
334           }
335         wd->icon_animator = ecore_animator_add(_icon_animation, as);
336
337         #undef _FINAL_POS_BY_ORIENTATION
338      }
339 }
340
341 static Eina_Bool
342 _icon_animation(void *data)
343 {
344    Widget_Data *wd = elm_widget_data_get(data);
345    double cur_position = 0.0, new_position = 0.0;
346    double move_amount = 0.05;
347    double adjusted_final;
348    Eina_Bool flag_finish_animation = EINA_FALSE;
349
350    if (!wd) return ECORE_CALLBACK_CANCEL;
351
352    edje_object_part_drag_value_get(wd->as, "elm.swallow.icon", &cur_position, NULL);
353    adjusted_final = (!elm_widget_mirrored_get(data)) ? wd->final_position : 1.0 - wd->final_position;
354
355    if ( (adjusted_final == 0.0) ||(adjusted_final == 0.5 && cur_position >= adjusted_final) )
356      {
357         new_position = cur_position - move_amount;
358         if (new_position <= adjusted_final)
359           {
360              new_position = adjusted_final;
361              flag_finish_animation = EINA_TRUE;
362           }
363      }
364    else if ((adjusted_final == 1.0) || (adjusted_final == 0.5 && cur_position < adjusted_final) )
365      {
366         new_position = cur_position + move_amount;
367         if (new_position >= adjusted_final)
368           {
369              new_position = adjusted_final;
370              flag_finish_animation = EINA_TRUE;
371              /*
372              // TODO
373              if (wd->type == ELM_ACTIONSLIDER_TYPE_BAR_GREEN ||
374                wd->type == ELM_ACTIONSLIDER_TYPE_BAR_RED ) {
375                edje_object_signal_emit(wd->as, "elm,show,bar,text,center", "elm");
376              }
377              */
378           }
379      }
380    edje_object_part_drag_value_set(wd->as, "elm.swallow.icon", new_position, 0.5);
381
382    if (flag_finish_animation)
383      {
384         if ((!wd->final_position) &&
385             (wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_LEFT))
386           evas_object_smart_callback_call(data, SIG_SELECTED,
387                                           (void *)wd->text_left);
388         else if ((wd->final_position == 0.5) &&
389                  (wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_CENTER))
390           evas_object_smart_callback_call(data, SIG_SELECTED,
391                                           (void *)wd->text_center);
392         else if ((wd->final_position == 1) &&
393                  (wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_RIGHT))
394           evas_object_smart_callback_call(data, SIG_SELECTED,
395                                           (void *)wd->text_right);
396         wd->icon_animator = NULL;
397         return ECORE_CALLBACK_CANCEL;
398      }
399    return ECORE_CALLBACK_RENEW;
400
401 }
402
403 static void
404 _elm_actionslider_label_set(Evas_Object *obj, const char *item, const char *label)
405 {
406    ELM_CHECK_WIDTYPE(obj, widtype);
407    Widget_Data *wd = elm_widget_data_get(obj);
408    if (!wd) return;
409
410    if (!item || !strcmp(item, "default"))
411      {
412         eina_stringshare_replace(&wd->text_button, label);
413         edje_object_part_text_set(wd->icon, "elm.text.button",
414               wd->text_button);
415      }
416    else if (!strcmp(item, "left"))
417      {
418         eina_stringshare_replace(&wd->text_left, label);
419         if (!elm_widget_mirrored_get(obj))
420           {
421              edje_object_part_text_set(wd->as, "elm.text.left", wd->text_left);
422           }
423         else
424           {
425              edje_object_part_text_set(wd->as, "elm.text.right", wd->text_left);
426           }
427      }
428    else if (!strcmp(item, "center"))
429      {
430         eina_stringshare_replace(&wd->text_center, label);
431         edje_object_part_text_set(wd->as, "elm.text.center", wd->text_center);
432      }
433    else if (!strcmp(item, "right"))
434      {
435         eina_stringshare_replace(&wd->text_right, label);
436         if (!elm_widget_mirrored_get(obj))
437           {
438              edje_object_part_text_set(wd->as, "elm.text.right", wd->text_right);
439           }
440         else
441           {
442              edje_object_part_text_set(wd->as, "elm.text.left", wd->text_right);
443           }
444      }
445 }
446
447 static const char *
448 _elm_actionslider_label_get(const Evas_Object *obj, const char *item)
449 {
450    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
451    Widget_Data *wd = elm_widget_data_get(obj);
452    if (!wd) return NULL;
453
454    if (!item || !strcmp(item, "default"))
455      {
456         return wd->text_button;
457      }
458    else if (!strcmp(item, "left"))
459      {
460         return wd->text_left;
461      }
462    else if (!strcmp(item, "center"))
463      {
464         return wd->text_center;
465      }
466    else if (!strcmp(item, "right"))
467      {
468         return wd->text_right;
469      }
470
471    return NULL;
472 }
473
474 /**
475  * Add a new actionslider to the parent.
476  *
477  * @param[in] parent The parent object
478  * @return The new actionslider object or NULL if it cannot be created
479  *
480  * @ingroup Actionslider
481  */
482 EAPI Evas_Object *
483 elm_actionslider_add(Evas_Object *parent)
484 {
485    Evas_Object *obj;
486    Evas *e;
487    Widget_Data *wd = NULL;
488
489    ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
490
491    ELM_SET_WIDTYPE(widtype, "actionslider");
492    elm_widget_type_set(obj, "actionslider");
493    elm_widget_sub_object_add(parent, obj);
494    elm_widget_data_set(obj, wd);
495
496    elm_widget_del_hook_set(obj, _del_hook);
497    elm_widget_theme_hook_set(obj, _theme_hook);
498    elm_widget_disable_hook_set(obj, _disable_hook);
499    elm_widget_text_set_hook_set(obj, _elm_actionslider_label_set);
500    elm_widget_text_get_hook_set(obj, _elm_actionslider_label_get);
501
502    wd->mouse_down = EINA_FALSE;
503    wd->mouse_hold = EINA_FALSE;
504    wd->enabled_position = ELM_ACTIONSLIDER_MAGNET_ALL;
505
506    // load background edj
507    wd->as = edje_object_add(e);
508    if(wd->as == NULL)
509      {
510         printf("Cannot load actionslider edj!\n");
511         return NULL;
512      }
513    _elm_theme_object_set(obj, wd->as, "actionslider", "base", elm_widget_style_get(obj));
514    elm_widget_resize_object_set(obj, wd->as);
515
516    // load icon
517    wd->icon = edje_object_add(e);
518    if (wd->icon == NULL)
519      {
520         printf("Cannot load acitionslider icon!\n");
521         return NULL;
522      }
523    evas_object_smart_member_add(wd->icon, obj);
524    _elm_theme_object_set(obj, wd->icon, "actionslider", "icon", elm_widget_style_get(obj));
525    edje_object_part_swallow(wd->as, "elm.swallow.icon", wd->icon);
526
527    wd->icon_fake = edje_object_add(e);
528    evas_object_smart_member_add(wd->icon_fake, obj);
529    _elm_theme_object_set(obj, wd->icon_fake, "actionslider", "icon", elm_widget_style_get(obj));
530    edje_object_part_swallow(wd->as, "elm.swallow.space", wd->icon_fake);
531
532    // event callbacks
533    evas_object_event_callback_add(wd->icon, EVAS_CALLBACK_MOUSE_DOWN, _icon_down_cb, obj);
534    evas_object_event_callback_add(wd->icon, EVAS_CALLBACK_MOUSE_MOVE, _icon_move_cb, obj);
535    evas_object_event_callback_add(wd->icon, EVAS_CALLBACK_MOUSE_UP, _icon_up_cb, obj);
536
537    _mirrored_set(obj, elm_widget_mirrored_get(obj));
538
539    return obj;
540 }
541
542 /*
543 EAPI Evas_Object *
544 elm_actionslider_add_with_set(Evas_Object *parent, Elm_Actionslider_Icon_Pos pos, Elm_Actionslider_Magnet_Pos magnet, const char* label_left, const char* label_center, const char* label_right)
545 {
546    Evas_Object *obj;
547
548    obj = elm_actionslider_add(parent);
549
550    elm_actionslider_icon_set(obj, pos);
551    elm_actionslider_magnet_set(obj, magnet);
552    if (label_left != NULL)
553      elm_actionslider_label_set(obj, ELM_ACTIONSLIDER_LABEL_LEFT, label_left);
554    if (label_center != NULL)
555      elm_actionslider_label_set(obj, ELM_ACTIONSLIDER_LABEL_CENTER, label_center);
556    if (label_right != NULL)
557      elm_actionslider_label_set(obj, ELM_ACTIONSLIDER_LABEL_RIGHT, label_right);
558
559    return obj;
560 }
561 */
562
563 /**
564  * Set actionslider indicator position.
565  *
566  * @param[in] obj The actionslider object.
567  * @param[in] pos The position of the indicator.
568  * (ELM_ACTIONSLIDER_INDICATOR_LEFT, ELM_ACTIONSLIDER_INDICATOR_RIGHT,
569  *  ELM_ACTIONSLIDER_INDICATOR_CENTER)
570  *
571  * @ingroup Actionslider
572  */
573 EAPI void
574 elm_actionslider_indicator_pos_set(Evas_Object *obj, Elm_Actionslider_Indicator_Pos pos)
575 {
576    ELM_CHECK_WIDTYPE(obj, widtype);
577
578    Widget_Data *wd = elm_widget_data_get(obj);
579    double position = 0.0;
580    if (!wd) return;
581
582    pos = _get_pos_by_orientation(obj, pos);
583    if (pos == ELM_ACTIONSLIDER_INDICATOR_LEFT) position = 0.0;
584    else if (pos == ELM_ACTIONSLIDER_INDICATOR_RIGHT) position = 1.0;
585    else if (pos == ELM_ACTIONSLIDER_INDICATOR_CENTER) position = 0.5;
586    else position = 0.0;
587
588    edje_object_part_drag_value_set(wd->as, "elm.swallow.icon", position, 0.5);
589 }
590
591 /**
592  * Get actionslider indicator position.
593  *
594  * @param obj The actionslider object.
595  * @return The position of the indicator.
596  *
597  * @ingroup Actionslider
598  */
599 EAPI Elm_Actionslider_Indicator_Pos
600 elm_actionslider_indicator_pos_get(const Evas_Object *obj)
601 {
602    ELM_CHECK_WIDTYPE(obj, widtype) ELM_ACTIONSLIDER_INDICATOR_NONE;
603    Widget_Data *wd = elm_widget_data_get(obj);
604    double position;
605    if (!wd) return ELM_ACTIONSLIDER_INDICATOR_NONE;
606
607    edje_object_part_drag_value_get(wd->as, "elm.swallow.icon", &position, NULL);
608    if (position < 0.3)
609      return _get_pos_by_orientation(obj, ELM_ACTIONSLIDER_INDICATOR_LEFT);
610    else if (position < 0.7)
611      return ELM_ACTIONSLIDER_INDICATOR_CENTER;
612    else
613      return _get_pos_by_orientation(obj, ELM_ACTIONSLIDER_INDICATOR_RIGHT);
614 }
615 /**
616  * Set actionslider magnet position.
617  *
618  * @param[in] obj The actionslider object.
619  * @param[in] pos The position of the magnet.
620  * (ELM_ACTIONSLIDER_MAGNET_LEFT, ELM_ACTIONSLIDER_MAGNET_RIGHT,
621  *  ELM_ACTIONSLIDER_MAGNET_BOTH, ELM_ACTIONSLIDER_MAGNET_CENTER)
622  *
623  * @ingroup Actionslider
624  */
625 EAPI void
626 elm_actionslider_magnet_pos_set(Evas_Object *obj, Elm_Actionslider_Magnet_Pos pos)
627 {
628    ELM_CHECK_WIDTYPE(obj, widtype);
629    Widget_Data *wd = elm_widget_data_get(obj);
630    if (!wd) return;
631    wd->magnet_position = pos;
632 }
633
634 /**
635  * Get actionslider magnet position.
636  *
637  * @param obj The actionslider object.
638  * @return The positions with magnet property.
639  *
640  * @ingroup Actionslider
641  */
642 EAPI Elm_Actionslider_Magnet_Pos
643 elm_actionslider_magnet_pos_get(const Evas_Object *obj)
644 {
645    ELM_CHECK_WIDTYPE(obj, widtype) ELM_ACTIONSLIDER_MAGNET_NONE;
646    Widget_Data *wd = elm_widget_data_get(obj);
647    if (!wd) return ELM_ACTIONSLIDER_MAGNET_NONE;
648    return wd->magnet_position;
649 }
650
651 /**
652  * Set actionslider enabled position.
653  *
654  * All the positions are enabled by default.
655  *
656  * @param obj The actionslider object.
657  * @param pos Bit mask indicating the enabled positions.
658  * Example: use (ELM_ACTIONSLIDER_MAGNET_LEFT | ELM_ACTIONSLIDER_MAGNET_RIGHT)
659  * to enable both positions, so the user can select it.
660  *
661  * @ingroup Actionslider
662  */
663 EAPI void
664 elm_actionslider_enabled_pos_set(Evas_Object *obj, Elm_Actionslider_Magnet_Pos pos)
665 {
666    ELM_CHECK_WIDTYPE(obj, widtype);
667    Widget_Data *wd = elm_widget_data_get(obj);
668    if (!wd) return;
669    wd->enabled_position = pos;
670 }
671
672 /**
673  * Get actionslider enabled position.
674  *
675  * All the positions are enabled by default.
676  *
677  * @param obj The actionslider object.
678  * @return The enabled positions.
679  *
680  * @ingroup Actionslider
681  */
682 EAPI Elm_Actionslider_Magnet_Pos
683 elm_actionslider_enabled_pos_get(const Evas_Object *obj)
684 {
685    ELM_CHECK_WIDTYPE(obj, widtype) ELM_ACTIONSLIDER_MAGNET_NONE;
686    Widget_Data *wd = elm_widget_data_get(obj);
687    if (!wd) return ELM_ACTIONSLIDER_MAGNET_NONE;
688    return wd->enabled_position;
689 }
690
691 /**
692  * Set actionslider label.
693  *
694  * @param[in] obj The actionslider object
695  * @param[in] pos The position of the label.
696  * (ELM_ACTIONSLIDER_LABEL_LEFT, ELM_ACTIONSLIDER_LABEL_RIGHT)
697  * @param label The label which is going to be set.
698  *
699  * @ingroup Actionslider
700  */
701 EAPI void
702 elm_actionslider_label_set(Evas_Object *obj, Elm_Actionslider_Label_Pos pos, const char *label)
703 {
704    ELM_CHECK_WIDTYPE(obj, widtype);
705    Widget_Data *wd = elm_widget_data_get(obj);
706    if (!wd) return;
707
708    if(label == NULL) label = "";
709
710    if (pos == ELM_ACTIONSLIDER_LABEL_RIGHT)
711      _elm_actionslider_label_set(obj, "right", label);
712    else if (pos == ELM_ACTIONSLIDER_LABEL_LEFT)
713      _elm_actionslider_label_set(obj, "left", label);
714    else if (pos == ELM_ACTIONSLIDER_LABEL_CENTER)
715      _elm_actionslider_label_set(obj, "center", label);
716    else if (pos == ELM_ACTIONSLIDER_LABEL_BUTTON)
717      {
718         _elm_actionslider_label_set(obj, NULL, label);
719
720         /* Resize button width */
721         Evas_Object *txt;
722         txt = (Evas_Object *)edje_object_part_object_get (wd->icon, "elm.text.button");
723         if (txt != NULL)
724           {
725              evas_object_text_text_set (txt, wd->text_button);
726
727              Evas_Coord x,y,w,h;
728              evas_object_geometry_get (txt, &x,&y,&w,&h);
729
730              char *data_left = NULL, *data_right = NULL;
731              int pad_left = 0, pad_right = 0;
732
733              data_left = (char *)edje_object_data_get (wd->icon, "left");
734              data_right = (char *)edje_object_data_get (wd->icon, "right");
735
736              if (data_left) pad_left = atoi(data_left);
737              if (data_right) pad_right = atoi(data_right);
738
739              evas_object_size_hint_min_set (wd->icon, w + pad_left + pad_right, 0);
740              evas_object_size_hint_min_set (wd->icon_fake, w + pad_left + pad_right, 0);
741           }
742      }
743 }
744
745 /**
746  * Get actionslider labels.
747  *
748  * @param obj The actionslider object
749  * @param left_label A char** to place the left_label of @p obj into
750  * @param center_label A char** to place the center_label of @p obj into
751  * @param right_label A char** to place the right_label of @p obj into
752  *
753  * @ingroup Actionslider
754  */
755 EAPI void
756 elm_actionslider_labels_get(const Evas_Object *obj, const char **left_label, const char **center_label, const char **right_label)
757 {
758    if (left_label) *left_label = _elm_actionslider_label_get(obj, "left");
759    if (center_label) *center_label = _elm_actionslider_label_get(obj, "center");
760    if (right_label) *right_label = _elm_actionslider_label_get(obj, "right");
761 }
762
763 /**
764  * Get actionslider selected label.
765  *
766  * @param obj The actionslider object
767  * @return The selected label
768  *
769  * @ingroup Actionslider
770  */
771 EAPI const char *
772 elm_actionslider_selected_label_get(const Evas_Object *obj)
773 {
774    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
775    Widget_Data *wd = elm_widget_data_get(obj);
776    if (!wd) return NULL;
777
778    if ((wd->final_position == 0.0) &&
779        (wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_LEFT))
780      return wd->text_left;
781
782    if ((wd->final_position == 0.5) &&
783        (wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_CENTER))
784      return wd->text_center;
785
786    if ((wd->final_position == 1.0) &&
787        (wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_RIGHT))
788      return wd->text_right;
789
790    return NULL;
791 }
792
793 /**
794  * Set the label used on the indicator object.
795  *
796  * @param obj The actionslider object
797  * @param label The label which is going to be set.
798  *
799  * @ingroup Actionslider
800  */
801 EAPI void
802 elm_actionslider_indicator_label_set(Evas_Object *obj, const char *label)
803 {
804    _elm_actionslider_label_set(obj, NULL, label);
805 }
806
807 /**
808  * Get the label used on the indicator object.
809  *
810  * @param obj The actionslider object
811  * @return The indicator label
812  *
813  * @ingroup Actionslider
814  */
815 EAPI const char *
816 elm_actionslider_indicator_label_get(Evas_Object *obj)
817 {
818    return _elm_actionslider_label_get(obj, NULL);
819 }
820
821 /**
822  * Hold actionslider object movement.
823  *
824  * @param[in] obj The actionslider object
825  * @param[in] flag Actionslider hold/release
826  * (EINA_TURE = hold/EIN_FALSE = release)
827  *
828  * @ingroup Actionslider
829  */
830 EAPI void
831 elm_actionslider_hold(Evas_Object *obj, Eina_Bool flag)
832 {
833    ELM_CHECK_WIDTYPE(obj, widtype);
834    Widget_Data *wd = elm_widget_data_get(obj);
835
836    wd->mouse_hold = flag;
837 }