[SLP Merge] Thu Jul 7 13:20:56 2011 +0900
[framework/uifw/elementary.git] / src / edje_externals / elm_icon.c
1 #include <assert.h>
2 #include "private.h"
3
4 typedef struct _Elm_Params_Icon
5 {
6    const char *file;
7    Eina_Bool scale_up_exists;
8    Eina_Bool scale_up : 1;
9    Eina_Bool scale_down_exists;
10    Eina_Bool scale_down : 1;
11    Eina_Bool smooth_exists;
12    Eina_Bool smooth : 1;
13    Eina_Bool fill_outside_exists;
14    Eina_Bool fill_outside : 1;
15    Eina_Bool no_scale_exists;
16    Eina_Bool no_scale : 1;
17    Eina_Bool prescale_size_exists;
18    int prescale_size;
19    Elm_Params base;
20    const char *icon;
21 } Elm_Params_Icon;
22
23 static Elm_Params_Icon *param_icon;
24
25 static void
26 external_icon_state_set(void *data __UNUSED__, Evas_Object *obj, const void *from_params, const void *to_params, float pos __UNUSED__)
27 {
28    const Elm_Params_Icon *p;
29    Evas_Object *edje;
30    const char *file;
31
32    if (to_params) p = to_params;
33    else if (from_params) p = from_params;
34    else return;
35
36    if (p->file)
37      {
38         elm_icon_file_set(obj, p->file, NULL);
39         param_icon->file = p->file;
40      }
41    if (p->smooth_exists)
42     {
43         elm_icon_smooth_set(obj, p->smooth);
44         param_icon->smooth = p->smooth;
45     }
46    if (p->no_scale_exists)
47     {
48         elm_icon_no_scale_set(obj, p->no_scale);
49         param_icon->no_scale = p->no_scale;
50     }
51    if (p->scale_up_exists && p->scale_down_exists)
52      {
53         elm_icon_scale_set(obj, p->scale_up, p->scale_down);
54         param_icon->scale_up = p->scale_up;
55         param_icon->scale_down = p->scale_down;
56      }
57    else if (p->scale_up_exists || p->scale_down_exists)
58      {
59         if (p->scale_up_exists)
60           {
61              elm_icon_scale_set(obj, p->scale_up, param_icon->scale_down);
62              param_icon->scale_up = p->scale_up;
63           }
64         else
65           {
66              elm_icon_scale_set(obj, param_icon->scale_up, p->scale_down);
67              param_icon->scale_down = p->scale_down;
68           }
69      }
70    if (p->fill_outside_exists)
71      {
72         elm_icon_fill_outside_set(obj, p->fill_outside);
73         param_icon->fill_outside = p->fill_outside;
74      }
75    if (p->prescale_size_exists)
76      {
77         elm_icon_prescale_set(obj, p->prescale_size);
78         param_icon->prescale_size = p->prescale_size;
79      }
80    if (p->icon)
81      {
82         edje = evas_object_smart_parent_get(obj);
83         edje_object_file_get(edje, &file, NULL);
84
85         if (!elm_icon_file_set(obj, file, p->icon))
86           elm_icon_standard_set(obj, p->icon);
87      }
88 }
89
90 static Eina_Bool
91 external_icon_param_set(void *data __UNUSED__, Evas_Object *obj, const Edje_External_Param *param)
92 {
93    Evas_Object *edje;
94    const char *file;
95
96    if (!strcmp(param->name, "file")
97                    && param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
98      {
99         Eina_Bool ret = elm_icon_file_set(obj, param->s, NULL);
100         if (ret)
101           param_icon->file = param->s;
102         return ret;
103      }
104    else if (!strcmp(param->name, "smooth")
105                    && param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
106      {
107         elm_icon_smooth_set(obj, param->i);
108         param_icon->smooth = param->i;
109         return EINA_TRUE;
110      }
111    else if (!strcmp(param->name, "no scale")
112                    && param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
113      {
114         elm_icon_no_scale_set(obj, param->i);
115         param_icon->no_scale = param->i;
116         return EINA_TRUE;
117      }
118    else if (!strcmp(param->name, "scale up")
119                    && param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
120      {
121         elm_icon_scale_set(obj, param->i, param_icon->scale_down);
122         param_icon->scale_up = param->i;
123         return EINA_TRUE;
124      }
125    else if (!strcmp(param->name, "scale down")
126                    && param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
127      {
128         elm_icon_scale_set(obj, param_icon->scale_up, param->i);
129         param_icon->scale_down = param->i;
130         return EINA_TRUE;
131      }
132    else if (!strcmp(param->name, "fill outside")
133                    && param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
134      {
135         elm_icon_fill_outside_set(obj, param->i);
136         param_icon->fill_outside = param->i;
137         return EINA_TRUE;
138      }
139    else if (!strcmp(param->name, "prescale")
140                    && param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
141      {
142         elm_icon_prescale_set(obj, param->i);
143         param_icon->prescale_size = param->i;
144         return EINA_TRUE;
145      }
146    else if (!strcmp(param->name, "icon"))
147      {
148         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
149           {
150              edje = evas_object_smart_parent_get(obj);
151              edje_object_file_get(edje, &file, NULL);
152
153              if (!elm_icon_file_set(obj, file, param->s))
154                elm_icon_standard_set(obj, param->s);
155              return EINA_TRUE;
156           }
157      }
158
159    ERR("unknown parameter '%s' of type '%s'",
160        param->name, edje_external_param_type_str(param->type));
161
162    return EINA_FALSE;
163 }
164
165 static Eina_Bool
166 external_icon_param_get(void *data __UNUSED__, const Evas_Object *obj, Edje_External_Param *param)
167 {
168    if (!strcmp(param->name, "file")
169                    && param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
170      {
171         param->s = param_icon->file;
172         return EINA_TRUE;
173      }
174    else if (!strcmp(param->name, "smooth")
175                    && param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
176      {
177         param->i = param_icon->smooth;
178         return EINA_TRUE;
179      }
180    else if (!strcmp(param->name, "no scale")
181                    && param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
182      {
183         param->i = param_icon->no_scale;
184         return EINA_TRUE;
185      }
186    else if (!strcmp(param->name, "scale up")
187                    && param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
188      {
189         param->i = param_icon->scale_up;
190         return EINA_TRUE;
191      }
192    else if (!strcmp(param->name, "scale down")
193                    && param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
194      {
195         param->i = param_icon->scale_down;
196         return EINA_TRUE;
197      }
198    else if (!strcmp(param->name, "fill outside")
199                    && param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
200      {
201         param->i = param_icon->fill_outside;
202         return EINA_TRUE;
203      }
204    else if (!strcmp(param->name, "prescale")
205                    && param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
206      {
207         param->i = param_icon->prescale_size;
208         return EINA_TRUE;
209      }
210    else if (!strcmp(param->name, "icon"))
211      {
212         /* not easy to get icon name back from live object */
213         return EINA_FALSE;
214      }
215
216    ERR("unknown parameter '%s' of type '%s'",
217        param->name, edje_external_param_type_str(param->type));
218
219    return EINA_FALSE;
220 }
221
222 static void *
223 external_icon_params_parse(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const Eina_List *params)
224 {
225    Elm_Params_Icon *mem;
226    Edje_External_Param *param;
227    const Eina_List *l;
228    param_icon = calloc(1, sizeof(Elm_Params_Icon));
229    mem = ELM_NEW(Elm_Params_Icon);
230    if (!mem)
231      return NULL;
232
233    EINA_LIST_FOREACH(params, l, param)
234      {
235         if (!strcmp(param->name, "file"))
236           mem->file = eina_stringshare_add(param->s);
237         else if (!strcmp(param->name, "smooth"))
238           {
239              mem->smooth = param->i;
240              mem->smooth_exists = EINA_TRUE;
241           }
242         else if (!strcmp(param->name, "no scale"))
243           {
244              mem->no_scale = param->i;
245              mem->no_scale_exists = EINA_TRUE;
246           }
247         else if (!strcmp(param->name, "scale up"))
248           {
249              mem->scale_up = param->i;
250              mem->scale_up_exists = EINA_TRUE;
251           }
252         else if (!strcmp(param->name, "scale down"))
253           {
254              mem->scale_down = param->i;
255              mem->scale_down_exists = EINA_TRUE;
256           }
257         else if (!strcmp(param->name, "fill outside"))
258           {
259              mem->fill_outside = param->i;
260              mem->fill_outside_exists = EINA_TRUE;
261           }
262         else if (!strcmp(param->name, "prescale"))
263           {
264              mem->prescale_size = param->i;
265              mem->prescale_size_exists = EINA_TRUE;
266           }
267         else if (!strcmp(param->name, "icon"))
268           {
269              mem->icon = eina_stringshare_add(param->s);
270           }
271      }
272
273    return mem;
274 }
275
276 static Evas_Object *external_icon_content_get(void *data __UNUSED__,
277                                               const Evas_Object *obj __UNUSED__, const char *content __UNUSED__)
278 {
279    ERR("no content");
280    return NULL;
281 }
282
283 static void
284 external_icon_params_free(void *params)
285 {
286    Elm_Params_Icon *mem = params;
287
288    if (mem->file)
289      eina_stringshare_del(mem->file);
290    free(mem);
291
292    if (param_icon->file)
293      eina_stringshare_del(param_icon->file);
294    free(param_icon);
295
296    if (mem->icon)
297      eina_stringshare_del(mem->icon);
298    external_common_params_free(params);
299 }
300
301 static Edje_External_Param_Info external_icon_params[] = {
302    DEFINE_EXTERNAL_COMMON_PARAMS,
303    EDJE_EXTERNAL_PARAM_INFO_STRING("icon"),
304    EDJE_EXTERNAL_PARAM_INFO_STRING("file"),
305    EDJE_EXTERNAL_PARAM_INFO_BOOL("smooth"),
306    EDJE_EXTERNAL_PARAM_INFO_BOOL("no scale"),
307    EDJE_EXTERNAL_PARAM_INFO_BOOL("scale up"),
308    EDJE_EXTERNAL_PARAM_INFO_BOOL("scale down"),
309    EDJE_EXTERNAL_PARAM_INFO_BOOL("fill outside"),
310    EDJE_EXTERNAL_PARAM_INFO_INT("prescale"),
311    EDJE_EXTERNAL_PARAM_INFO_SENTINEL
312 };
313
314 DEFINE_EXTERNAL_ICON_ADD(icon, "icon");
315 DEFINE_EXTERNAL_TYPE_SIMPLE(icon, "Icon");