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