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