fixed plugin image size problem
[framework/uifw/elementary.git] / src / edje_externals / elm_toolbar.c
1 #include <assert.h>
2
3 #include "private.h"
4
5 typedef struct _Elm_Params_Toolbar
6 {
7    Elm_Params base;
8    int icon_size;
9    Eina_Bool icon_size_exists:1;
10    double align;
11    const char *shrink_mode;
12    Eina_Bool align_exists:1;
13    Eina_Bool always_select:1;
14    Eina_Bool always_select_exists:1;
15    Eina_Bool no_select:1;
16    Eina_Bool no_select_exists:1;
17    Eina_Bool horizontal:1;
18    Eina_Bool horizontal_exists:1;
19    Eina_Bool homogeneous:1;
20    Eina_Bool homogeneous_exists:1;
21 } Elm_Params_Toolbar;
22
23 #define SHRINK_GET(CHOICES, STR)         \
24    unsigned int i;                       \
25    for (i = 0; i < (sizeof(CHOICES) / sizeof(CHOICES[0])); ++i) \
26      if (!strcmp(STR, CHOICES[i]))       \
27        return i;
28
29 static const char *_toolbar_shrink_modes[] = {"none", "hide",
30                                               "scroll", "menu", NULL};
31
32 static Elm_Toolbar_Shrink_Mode
33 _toolbar_shrink_choices_setting_get(const char *shrink_mode_str)
34 {
35    assert(sizeof(_toolbar_shrink_modes) /
36           sizeof(_toolbar_shrink_modes[0]) == ELM_TOOLBAR_SHRINK_LAST + 1);
37    SHRINK_GET(_toolbar_shrink_modes, shrink_mode_str);
38    return ELM_TOOLBAR_SHRINK_LAST;
39 }
40
41 static void
42 external_toolbar_state_set(void *data __UNUSED__, Evas_Object *obj, const void *from_params, const void *to_params, float pos __UNUSED__)
43 {
44    const Elm_Params_Toolbar *p;
45    Elm_Toolbar_Shrink_Mode shrink_mode;
46
47    if (to_params) p = to_params;
48    else if (from_params) p = from_params;
49    else return;
50
51    if (p->icon_size_exists)
52      elm_toolbar_icon_size_set(obj, p->icon_size);
53    if (p->align_exists)
54      elm_toolbar_align_set(obj, p->align);
55    if (p->no_select_exists)
56      {
57         if (p->no_select)
58           elm_toolbar_select_mode_set (obj, ELM_OBJECT_SELECT_MODE_NONE);
59         else
60           elm_toolbar_select_mode_set (obj, ELM_OBJECT_SELECT_MODE_DEFAULT);
61      }
62    if (p->always_select_exists)
63      {
64         if (p->always_select)
65           elm_toolbar_select_mode_set (obj, ELM_OBJECT_SELECT_MODE_ALWAYS);
66         else
67           elm_toolbar_select_mode_set (obj, ELM_OBJECT_SELECT_MODE_DEFAULT);
68      }
69    if (p->horizontal_exists)
70      elm_toolbar_horizontal_set(obj, p->horizontal);
71    if (p->homogeneous_exists)
72      elm_toolbar_homogeneous_set(obj, p->homogeneous);
73    if (p->shrink_mode)
74      {
75         shrink_mode = _toolbar_shrink_choices_setting_get(p->shrink_mode);
76         elm_toolbar_shrink_mode_set(obj, shrink_mode);
77      }
78 }
79
80 static Eina_Bool
81 external_toolbar_param_set(void *data __UNUSED__, Evas_Object *obj, const Edje_External_Param *param)
82 {
83    Elm_Toolbar_Shrink_Mode shrink_mode;
84
85    if (!strcmp(param->name, "icon size"))
86      {
87         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
88           {
89              elm_toolbar_icon_size_set(obj, param->i);
90              return EINA_TRUE;
91           }
92      }
93    else if (!strcmp(param->name, "align"))
94      {
95         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
96           {
97              elm_toolbar_align_set(obj, param->d);
98              return EINA_TRUE;
99           }
100      }
101    else if (!strcmp(param->name, "always select"))
102      {
103         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
104           {
105              if (param->i)
106                elm_toolbar_select_mode_set (obj, ELM_OBJECT_SELECT_MODE_ALWAYS);
107              else
108                elm_toolbar_select_mode_set (obj, ELM_OBJECT_SELECT_MODE_DEFAULT);
109              return EINA_TRUE;
110           }
111      }
112    else if (!strcmp(param->name, "no select"))
113      {
114         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
115           {
116              if (param->i)
117                elm_toolbar_select_mode_set (obj, ELM_OBJECT_SELECT_MODE_NONE);
118              else
119                elm_toolbar_select_mode_set (obj, ELM_OBJECT_SELECT_MODE_DEFAULT);
120              return EINA_TRUE;
121           }
122      }
123    else if (!strcmp(param->name, "horizontal"))
124      {
125         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
126           {
127              elm_toolbar_horizontal_set(obj, param->i);
128              return EINA_TRUE;
129           }
130      }
131    else if (!strcmp(param->name, "homogeneous"))
132      {
133         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
134           {
135              elm_toolbar_homogeneous_set(obj, param->i);
136              return EINA_TRUE;
137           }
138      }
139    else if (!strcmp(param->name, "shrink"))
140      {
141         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
142           {
143              shrink_mode = _toolbar_shrink_choices_setting_get(param->s);
144              elm_toolbar_shrink_mode_set(obj, shrink_mode);
145              return EINA_TRUE;
146           }
147      }
148
149    ERR("unknown parameter '%s' of type '%s'",
150        param->name, edje_external_param_type_str(param->type));
151
152    return EINA_FALSE;
153 }
154
155 static Eina_Bool
156 external_toolbar_param_get(void *data __UNUSED__, const Evas_Object *obj, Edje_External_Param *param)
157 {
158    if (!strcmp(param->name, "icon size"))
159      {
160         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
161           {
162              param->i = elm_toolbar_icon_size_get(obj);
163              return EINA_TRUE;
164           }
165      }
166    else if (!strcmp(param->name, "align"))
167      {
168         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
169           {
170              param->d = elm_toolbar_align_get(obj);
171              return EINA_TRUE;
172           }
173      }
174    else if (!strcmp(param->name, "always select"))
175      {
176         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
177           {
178              if (elm_toolbar_select_mode_get (obj) ==
179                  ELM_OBJECT_SELECT_MODE_ALWAYS)
180                param->d = EINA_TRUE;
181              else
182                param->d = EINA_FALSE;
183              return EINA_TRUE;
184           }
185      }
186    else if (!strcmp(param->name, "no select"))
187      {
188         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
189           {
190              if (elm_toolbar_select_mode_get (obj) ==
191                  ELM_OBJECT_SELECT_MODE_NONE)
192                param->i = EINA_TRUE;
193              else
194                param->i = EINA_FALSE;
195              return EINA_TRUE;
196           }
197      }
198    else if (!strcmp(param->name, "horizontal"))
199      {
200         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
201           {
202              param->i = elm_toolbar_horizontal_get(obj);
203              return EINA_TRUE;
204           }
205      }
206    else if (!strcmp(param->name, "homogeneous"))
207      {
208         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
209           {
210              param->i = elm_toolbar_homogeneous_get(obj);
211              return EINA_TRUE;
212           }
213      }
214    else if (!strcmp(param->name, "shrink"))
215      {
216         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
217           {
218              Elm_Toolbar_Shrink_Mode shrink_mode;
219              shrink_mode = elm_toolbar_shrink_mode_get(obj);
220              param->s = _toolbar_shrink_modes[shrink_mode];
221              return EINA_TRUE;
222           }
223      }
224
225    ERR("unknown parameter '%s' of type '%s'",
226        param->name, edje_external_param_type_str(param->type));
227
228    return EINA_FALSE;
229 }
230
231 static void *
232 external_toolbar_params_parse(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const Eina_List *params)
233 {
234    Elm_Params_Toolbar *mem;
235    Edje_External_Param *param;
236    const Eina_List *l;
237
238    mem = calloc(1, sizeof(Elm_Params_Toolbar));
239    if (!mem)
240      return NULL;
241
242    EINA_LIST_FOREACH(params, l, param)
243      {
244         if (!strcmp(param->name, "icon size"))
245           {
246              mem->icon_size = param->i;
247              mem->icon_size_exists = EINA_TRUE;
248           }
249         else if (!strcmp(param->name, "align"))
250           {
251              mem->align = param->d;
252              mem->align_exists = EINA_TRUE;
253           }
254         else if (!strcmp(param->name, "always select"))
255           {
256              mem->always_select = param->i;
257              mem->always_select_exists = param->i;
258           }
259         else if (!strcmp(param->name, "no select"))
260           {
261              mem->no_select = param->i;
262              mem->no_select_exists = EINA_TRUE;
263           }
264         else if (!strcmp(param->name, "horizontal"))
265           {
266              mem->horizontal = param->i;
267              mem->horizontal_exists = EINA_TRUE;
268           }
269         else if (!strcmp(param->name, "homogeneous"))
270           {
271              mem->homogeneous = param->i;
272              mem->homogeneous_exists = EINA_TRUE;
273           }
274         else if (!strcmp(param->name, "shrink"))
275           mem->shrink_mode = eina_stringshare_add(param->s);
276      }
277
278    return mem;
279 }
280
281 static Evas_Object *external_toolbar_content_get(void *data __UNUSED__,
282                 const Evas_Object *obj __UNUSED__, const char *content __UNUSED__)
283 {
284         ERR("No content.");
285         return NULL;
286 }
287
288 static void
289 external_toolbar_params_free(void *params)
290 {
291    Elm_Params_Toolbar *mem = params;
292    if (mem->shrink_mode)
293      eina_stringshare_del(mem->shrink_mode);
294    free(mem);
295 }
296
297 static Edje_External_Param_Info external_toolbar_params[] = {
298    DEFINE_EXTERNAL_COMMON_PARAMS,
299    EDJE_EXTERNAL_PARAM_INFO_STRING("shrink"),
300    EDJE_EXTERNAL_PARAM_INFO_INT("icon size"),
301    EDJE_EXTERNAL_PARAM_INFO_DOUBLE("align"),
302    EDJE_EXTERNAL_PARAM_INFO_BOOL("always select"),
303    EDJE_EXTERNAL_PARAM_INFO_BOOL("no select"),
304    EDJE_EXTERNAL_PARAM_INFO_BOOL("horizontal"),
305    EDJE_EXTERNAL_PARAM_INFO_BOOL("homogeneous"),
306
307    EDJE_EXTERNAL_PARAM_INFO_SENTINEL
308 };
309
310 DEFINE_EXTERNAL_ICON_ADD(toolbar, "toolbar");
311 DEFINE_EXTERNAL_TYPE_SIMPLE(toolbar, "Toolbar");