0701825c82eaadcbbe326fab84eb9528f2ba6ce8
[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); ++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->always_select_exists)
56      elm_toolbar_always_select_mode_set(obj, p->always_select);
57    if (p->no_select_exists)
58      elm_toolbar_no_select_mode_set(obj, p->no_select);
59    if (p->horizontal_exists)
60      elm_toolbar_horizontal_set(obj, p->horizontal);
61    if (p->homogeneous_exists)
62      elm_toolbar_homogeneous_set(obj, p->homogeneous);
63    if (p->shrink_mode)
64      {
65         shrink_mode = _toolbar_shrink_choices_setting_get(p->shrink_mode);
66         elm_toolbar_mode_shrink_set(obj, shrink_mode);
67      }
68 }
69
70 static Eina_Bool
71 external_toolbar_param_set(void *data __UNUSED__, Evas_Object *obj, const Edje_External_Param *param)
72 {
73    Elm_Toolbar_Shrink_Mode shrink_mode;
74
75    if (!strcmp(param->name, "icon_size"))
76      {
77         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
78           {
79              elm_toolbar_icon_size_set(obj, param->i);
80              return EINA_TRUE;
81           }
82      }
83    else if (!strcmp(param->name, "align"))
84      {
85         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
86           {
87              elm_toolbar_align_set(obj, param->d);
88              return EINA_TRUE;
89           }
90      }
91    else if (!strcmp(param->name, "always select"))
92      {
93         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
94           {
95              elm_toolbar_always_select_mode_set(obj, param->i);
96              return EINA_TRUE;
97           }
98      }
99    else if (!strcmp(param->name, "no select"))
100      {
101         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
102           {
103              elm_toolbar_no_select_mode_set(obj, param->i);
104              return EINA_TRUE;
105           }
106      }
107    else if (!strcmp(param->name, "horizontal"))
108      {
109         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
110           {
111              elm_toolbar_horizontal_set(obj, param->i);
112              return EINA_TRUE;
113           }
114      }
115    else if (!strcmp(param->name, "homogeneous"))
116      {
117         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
118           {
119              elm_toolbar_homogeneous_set(obj, param->i);
120              return EINA_TRUE;
121           }
122      }
123    else if (!strcmp(param->name, "shrink"))
124      {
125         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
126           {
127              shrink_mode = _toolbar_shrink_choices_setting_get(param->s);
128              elm_toolbar_mode_shrink_set(obj, shrink_mode);
129              return EINA_TRUE;
130           }
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_toolbar_param_get(void *data __UNUSED__, const Evas_Object *obj, Edje_External_Param *param)
141 {
142    if (!strcmp(param->name, "icon_size"))
143      {
144         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
145           {
146              param->i = elm_toolbar_icon_size_get(obj);
147              return EINA_TRUE;
148           }
149      }
150    else if (!strcmp(param->name, "align"))
151      {
152         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
153           {
154              param->d = elm_toolbar_align_get(obj);
155              return EINA_TRUE;
156           }
157      }
158    else if (!strcmp(param->name, "always select"))
159      {
160         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
161           {
162              param->d = elm_toolbar_always_select_mode_get(obj);
163              return EINA_TRUE;
164           }
165      }
166    else if (!strcmp(param->name, "no select"))
167      {
168         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
169           {
170              param->i = elm_toolbar_no_select_mode_get(obj);
171              return EINA_TRUE;
172           }
173      }
174    else if (!strcmp(param->name, "horizontal"))
175      {
176         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
177           {
178              param->i = elm_toolbar_horizontal_get(obj);
179              return EINA_TRUE;
180           }
181      }
182    else if (!strcmp(param->name, "homogeneous"))
183      {
184         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
185           {
186              param->i = elm_toolbar_homogeneous_get(obj);
187              return EINA_TRUE;
188           }
189      }
190    else if (!strcmp(param->name, "shrink"))
191      {
192         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
193           {
194              Elm_Toolbar_Shrink_Mode shrink_mode;
195              shrink_mode = elm_toolbar_mode_shrink_get(obj);
196              param->s = _toolbar_shrink_modes[shrink_mode];
197              return EINA_TRUE;
198           }
199      }
200
201    ERR("unknown parameter '%s' of type '%s'",
202        param->name, edje_external_param_type_str(param->type));
203
204    return EINA_FALSE;
205 }
206
207 static void *
208 external_toolbar_params_parse(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const Eina_List *params)
209 {
210    Elm_Params_Toolbar *mem;
211    Edje_External_Param *param;
212    const Eina_List *l;
213
214    mem = calloc(1, sizeof(Elm_Params_Toolbar));
215    if (!mem)
216      return NULL;
217
218    EINA_LIST_FOREACH(params, l, param)
219      {
220         if (!strcmp(param->name, "icon_size"))
221           {
222              mem->icon_size = param->i;
223              mem->icon_size_exists = EINA_TRUE;
224           }
225         else if (!strcmp(param->name, "align"))
226           {
227              mem->align = param->d;
228              mem->align_exists = EINA_TRUE;
229           }
230         else if (!strcmp(param->name, "always select"))
231           {
232              mem->always_select = param->i;
233              mem->always_select_exists = param->i;
234           }
235         else if (!strcmp(param->name, "no select"))
236           {
237              mem->no_select = param->i;
238              mem->no_select_exists = EINA_TRUE;
239           }
240         else if (!strcmp(param->name, "horizontal"))
241           {
242              mem->horizontal = param->i;
243              mem->horizontal_exists = EINA_TRUE;
244           }
245         else if (!strcmp(param->name, "homogeneous"))
246           {
247              mem->homogeneous = param->i;
248              mem->homogeneous_exists = EINA_TRUE;
249           }
250         else if (!strcmp(param->name, "shrink"))
251           mem->shrink_mode = eina_stringshare_add(param->s);
252      }
253
254    return mem;
255 }
256
257 static Evas_Object *external_toolbar_content_get(void *data __UNUSED__,
258                 const Evas_Object *obj __UNUSED__, const char *content __UNUSED__)
259 {
260         ERR("No content.");
261         return NULL;
262 }
263
264 static void
265 external_toolbar_params_free(void *params)
266 {
267    Elm_Params_Toolbar *mem = params;
268    if (mem->shrink_mode)
269      eina_stringshare_del(mem->shrink_mode);
270    free(mem);
271 }
272
273 static Edje_External_Param_Info external_toolbar_params[] = {
274    DEFINE_EXTERNAL_COMMON_PARAMS,
275    EDJE_EXTERNAL_PARAM_INFO_STRING("shrink"),
276    EDJE_EXTERNAL_PARAM_INFO_INT("icon_size"),
277    EDJE_EXTERNAL_PARAM_INFO_DOUBLE("align"),
278    EDJE_EXTERNAL_PARAM_INFO_BOOL("always select"),
279    EDJE_EXTERNAL_PARAM_INFO_BOOL("no select"),
280    EDJE_EXTERNAL_PARAM_INFO_BOOL("horizontal"),
281    EDJE_EXTERNAL_PARAM_INFO_BOOL("homogeneous"),
282
283    EDJE_EXTERNAL_PARAM_INFO_SENTINEL
284 };
285
286 DEFINE_EXTERNAL_ICON_ADD(toolbar, "toolbar");
287 DEFINE_EXTERNAL_TYPE_SIMPLE(toolbar, "Toolbar");