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