efl
200 строк · 5.5 Кб
1#include <assert.h>2#include "private.h"3
4typedef struct _Elm_Params_Calendar5{
6Elm_Params base;7int year_min;8int year_max;9const char *select_mode;10
11} Elm_Params_Calendar;12
13#define SELECT_MODE_GET(CHOICES, STR) \14unsigned int i; \15for (i = 0; i < (sizeof(CHOICES) / sizeof(CHOICES[0])); ++i) \16if (!strcmp(STR, CHOICES[i])) \17return i;18
19static const char *_calendar_select_modes[] =20{
21"default", "always", "none", "ondemand", NULL22};23
24static Elm_Calendar_Select_Mode25_calendar_select_mode_get(const char *select_mode)26{
27assert(sizeof(_calendar_select_modes) /28sizeof(_calendar_select_modes[0])29== ELM_CALENDAR_SELECT_MODE_ONDEMAND + 2);30SELECT_MODE_GET(_calendar_select_modes, select_mode);31return -1;32}
33
34static void35external_calendar_state_set(void *data EINA_UNUSED, Evas_Object *obj,36const void *from_params, const void *to_params,37float pos EINA_UNUSED)38{
39const Elm_Params_Calendar *p;40Elm_Calendar_Select_Mode select_mode;41int min,max;42
43if (to_params) p = to_params;44else if (from_params) p = from_params;45else return;46
47if (p->year_min)48{49elm_calendar_min_max_year_get(obj, NULL, &max);50elm_calendar_min_max_year_set(obj, p->year_min, max);51}52if (p->year_max)53{54elm_calendar_min_max_year_get(obj, &min, NULL);55elm_calendar_min_max_year_set(obj, min, p->year_max);56}57if (p->select_mode)58{59select_mode = _calendar_select_mode_get(p->select_mode);60elm_calendar_select_mode_set(obj, select_mode);61}62}
63
64static Eina_Bool65external_calendar_param_set(void *data EINA_UNUSED, Evas_Object *obj,66const Edje_External_Param *param)67{
68int min,max;69
70if (!strcmp(param->name, "year_min"))71{72if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)73{74elm_calendar_min_max_year_get(obj, NULL, &max);75elm_calendar_min_max_year_set(obj, param->i, max);76return EINA_TRUE;77}78}79else if (!strcmp(param->name, "year_max"))80{81if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)82{83elm_calendar_min_max_year_get(obj, &min, NULL);84elm_calendar_min_max_year_set(obj, min,param->i);85return EINA_TRUE;86}87}88else if (!strcmp(param->name, "select_mode"))89{90if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)91{92Elm_Calendar_Select_Mode select_mode;93select_mode = _calendar_select_mode_get(param->s);94elm_calendar_select_mode_set(obj, select_mode);95return EINA_TRUE;96}97}98
99ERR("unknown parameter '%s' of type '%s'",100param->name, edje_external_param_type_str(param->type));101
102return EINA_FALSE;103}
104
105static Eina_Bool106external_calendar_param_get(void *data EINA_UNUSED, const Evas_Object *obj,107Edje_External_Param *param)108{
109int min, max;110
111if (!strcmp(param->name, "year_min"))112{113if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)114{115elm_calendar_min_max_year_get(obj, &(param->i) ,&max);116return EINA_TRUE;117}118}119else if (!strcmp(param->name, "year_max"))120{121if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)122{123elm_calendar_min_max_year_get(obj, &min,&(param->i));124return EINA_TRUE;125}126}127else if (!strcmp(param->name, "select_mode"))128{129if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)130{131Elm_Calendar_Select_Mode mode;132mode = elm_calendar_select_mode_get(obj);133param->s = _calendar_select_modes[mode];134return EINA_TRUE;135}136}137
138
139ERR("unknown parameter '%s' of type '%s'",140param->name, edje_external_param_type_str(param->type));141
142return EINA_FALSE;143}
144
145static void *146external_calendar_params_parse(void *data EINA_UNUSED,147Evas_Object *obj EINA_UNUSED,148const Eina_List *params)149{
150Elm_Params_Calendar *mem;151Edje_External_Param *param;152const Eina_List *l;153
154mem = calloc(1, sizeof(Elm_Params_Calendar));155if (!mem)156return NULL;157
158EINA_LIST_FOREACH(params, l, param)159{160if (!strcmp(param->name, "year_min"))161mem->year_min = param->i;162
163else if (!strcmp(param->name, "year_max"))164mem->year_max = param->i;165
166else if (!strcmp(param->name, "select_mode"))167mem->select_mode = eina_stringshare_add(param->s);168}169
170return mem;171}
172
173static Evas_Object *174external_calendar_content_get(void *data EINA_UNUSED,175const Evas_Object *obj EINA_UNUSED,176const char *content EINA_UNUSED)177{
178ERR("No content.");179return NULL;180}
181
182static void183external_calendar_params_free(void *params)184{
185Elm_Params_Calendar *mem = params;186if (mem->select_mode)187eina_stringshare_del(mem->select_mode);188free(params);189}
190
191static Edje_External_Param_Info external_calendar_params[] = {192DEFINE_EXTERNAL_COMMON_PARAMS,193EDJE_EXTERNAL_PARAM_INFO_INT("year_min"),194EDJE_EXTERNAL_PARAM_INFO_INT("year_max"),195EDJE_EXTERNAL_PARAM_INFO_STRING("select_mode"),196EDJE_EXTERNAL_PARAM_INFO_SENTINEL
197};198
199DEFINE_EXTERNAL_ICON_ADD(calendar, "calendar");200DEFINE_EXTERNAL_TYPE_SIMPLE(calendar, "Calendar");201