svn update: 48945 (latest:48959)
[framework/uifw/elementary.git] / src / edje_externals / elm_toggle.c
1 #include <string.h>
2
3 #include "private.h"
4
5 typedef struct _Elm_Params_Toggle
6 {
7    Elm_Params base;
8    Evas_Object *icon;
9    const char *on, *off;
10    Eina_Bool state:1;
11    Eina_Bool state_exists:1;
12 } Elm_Params_Toggle;
13
14 static void
15 external_toggle_state_set(void *data __UNUSED__, Evas_Object *obj, const void *from_params, const void *to_params, float pos __UNUSED__)
16 {
17    const Elm_Params_Toggle *p;
18
19    if (to_params) p = to_params;
20    else if (from_params) p = from_params;
21    else return;
22
23    if (p->base.label)
24      elm_toggle_label_set(obj, p->base.label);
25    if (p->icon)
26      elm_toggle_icon_set(obj, p->icon);
27
28    if ((p->on) && (p->off))
29      elm_toggle_states_labels_set(obj, p->on, p->off);
30    else if ((p->on) || (p->off))
31      {
32         const char *on, *off;
33         elm_toggle_states_labels_get(obj, &on, &off);
34         if (p->on)
35           elm_toggle_states_labels_set(obj, p->on, off);
36         else
37           elm_toggle_states_labels_set(obj, on, p->off);
38      }
39
40    if (p->state_exists)
41      elm_toggle_state_set(obj, p->state);
42 }
43
44 static Eina_Bool
45 external_toggle_param_set(void *data __UNUSED__, Evas_Object *obj, const Edje_External_Param *param)
46 {
47    if (!strcmp(param->name, "label"))
48      {
49         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
50           {
51              elm_toggle_label_set(obj, param->s);
52              return EINA_TRUE;
53           }
54      }
55    else if (!strcmp(param->name, "icon"))
56      {
57         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
58           {
59              Evas_Object *icon = external_common_param_icon_get(obj, param);
60              if (icon)
61                {
62                   elm_toggle_icon_set(obj, icon);
63                   return EINA_TRUE;
64                }
65           }
66      }
67    else if (!strcmp(param->name, "label on"))
68      {
69         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
70           {
71              const char *on, *off;
72              elm_toggle_states_labels_get(obj, &on, &off);
73              elm_toggle_states_labels_set(obj, param->s, off);
74              return EINA_TRUE;
75           }
76      }
77    else if (!strcmp(param->name, "label off"))
78      {
79         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
80           {
81              const char *on, *off;
82              elm_toggle_states_labels_get(obj, &on, &off);
83              elm_toggle_states_labels_set(obj, on, param->s);
84              return EINA_TRUE;
85           }
86      }
87    else if (!strcmp(param->name, "state"))
88      {
89         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
90           {
91              elm_toggle_state_set(obj, param->i);
92              return EINA_TRUE;
93           }
94      }
95
96    ERR("unknown parameter '%s' of type '%s'",
97        param->name, edje_external_param_type_str(param->type));
98
99    return EINA_FALSE;
100 }
101
102 static Eina_Bool
103 external_toggle_param_get(void *data __UNUSED__, const Evas_Object *obj, Edje_External_Param *param)
104 {
105    if (!strcmp(param->name, "label"))
106      {
107         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
108           {
109              param->s = elm_toggle_label_get(obj);
110              return EINA_TRUE;
111           }
112      }
113    else if (!strcmp(param->name, "icon"))
114      {
115         /* not easy to get icon name back from live object */
116         return EINA_FALSE;
117      }
118    else if (!strcmp(param->name, "label on"))
119      {
120         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
121           {
122              const char *on, *off;
123              elm_toggle_states_labels_get(obj, &on, &off);
124              param->s = on;
125              return EINA_TRUE;
126           }
127      }
128    else if (!strcmp(param->name, "label off"))
129      {
130         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
131           {
132              const char *on, *off;
133              elm_toggle_states_labels_get(obj, &on, &off);
134              param->s = off;
135              return EINA_TRUE;
136           }
137      }
138    else if (!strcmp(param->name, "state"))
139      {
140         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
141           {
142              param->i = elm_toggle_state_get(obj);
143              return EINA_TRUE;
144           }
145      }
146
147    ERR("unknown parameter '%s' of type '%s'",
148        param->name, edje_external_param_type_str(param->type));
149
150    return EINA_FALSE;
151 }
152
153 static void *
154 external_toggle_params_parse(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const Eina_List *params)
155 {
156    Elm_Params_Toggle *mem;
157    Edje_External_Param *param;
158    const Eina_List *l;
159
160    mem = external_common_params_parse(Elm_Params_Toggle, data, obj, params);
161    if (!mem)
162      return NULL;
163
164    external_common_icon_param_parse(&mem->icon, obj, params);
165
166    EINA_LIST_FOREACH(params, l, param)
167      {
168         if (!strcmp(param->name, "state")) {
169            mem->state = param->i;
170            mem->state_exists = EINA_TRUE;
171           }
172         else if (!strcmp(param->name, "label on"))
173           mem->on = eina_stringshare_add(param->s);
174         else if (!strcmp(param->name, "label off"))
175           mem->off = eina_stringshare_add(param->s);
176      }
177
178    return mem;
179 }
180
181 static void
182 external_toggle_params_free(void *params)
183 {
184    Elm_Params_Toggle *mem = params;
185
186    if (mem->icon)
187      evas_object_del(mem->icon);
188    if (mem->on)
189      eina_stringshare_del(mem->on);
190    if (mem->off)
191      eina_stringshare_del(mem->off);
192    external_common_params_free(params);
193 }
194
195 static Edje_External_Param_Info external_toggle_params[] = {
196    DEFINE_EXTERNAL_COMMON_PARAMS,
197    EDJE_EXTERNAL_PARAM_INFO_STRING("icon"),
198    EDJE_EXTERNAL_PARAM_INFO_STRING_DEFAULT("label on", "ON"),
199    EDJE_EXTERNAL_PARAM_INFO_STRING_DEFAULT("label off", "OFF"),
200    EDJE_EXTERNAL_PARAM_INFO_BOOL("state"),
201    EDJE_EXTERNAL_PARAM_INFO_SENTINEL
202 };
203
204 DEFINE_EXTERNAL_ICON_ADD(toggle, "toggle")
205 DEFINE_EXTERNAL_TYPE_SIMPLE(toggle, "Toggle")