From 07d91767cdabd1f3a9a8560f8b508568175bff0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Briano?= Date: Thu, 8 Apr 2010 20:53:01 +0000 Subject: [PATCH] Expose elm_list as external Patch by Thiago Masaki SVN revision: 47847 --- .../data/edje_externals/Makefile.am | 1 + .../data/edje_externals/ico_list.png | Bin 0 -> 2167 bytes .../elementary/data/edje_externals/icons.edc | 3 + .../elementary/src/edje_externals/Makefile.am | 1 + .../elementary/src/edje_externals/elm_list.c | 272 ++++++++++++++++++ .../elementary/src/edje_externals/modules.inc | 1 + legacy/elementary/src/lib/Elementary.h.in | 2 + legacy/elementary/src/lib/elm_list.c | 19 ++ 8 files changed, 299 insertions(+) create mode 100755 legacy/elementary/data/edje_externals/ico_list.png create mode 100644 legacy/elementary/src/edje_externals/elm_list.c diff --git a/legacy/elementary/data/edje_externals/Makefile.am b/legacy/elementary/data/edje_externals/Makefile.am index 6de0e28802..d278cbf6ef 100644 --- a/legacy/elementary/data/edje_externals/Makefile.am +++ b/legacy/elementary/data/edje_externals/Makefile.am @@ -19,6 +19,7 @@ ico_fileselector.png \ ico_fileselector_button.png \ ico_genlist.png \ ico_hoversel.png \ +ico_list.png \ ico_map.png \ ico_notepad.png \ ico_photocam.png \ diff --git a/legacy/elementary/data/edje_externals/ico_list.png b/legacy/elementary/data/edje_externals/ico_list.png new file mode 100755 index 0000000000000000000000000000000000000000..9a1dc647dbe62f7c4325d6ebe398973deabafc2a GIT binary patch literal 2167 zcmV--2#EKIP)^@RA_Z`_A_2&P1>(8G*M=dWelOzeo82=)Q zA`dtOE`;!)+Jp=Da%#a-^Dg1y%@z zg;K57T0gH=7r1d@5rB2yx7JQ+RT`~PN}-fuad8oVZnsOG=NudykYyQLTU(6BV~jEG z(Hf&&U2Eg(#%PSSew?)yW2<`Ewn4jmus~TaiVfOolIM)aV}9-bB2810B;ok@7_Bv% zo0}M8yq0g>x>cD2P6G%hM0+zag*GHYSg&y`*sxt0qkC;_z24BM0vM0S^!h#0H09vn zfH;on^?IzXuGZ|-7&C3V)*YZyKxHlli$Guzwp?6@u(snfx7-6Y)^c!gK(E*Hb~zr8 zTMv|fq(CB_ok~#wY1pIFUPFVY6u0nVtIB#YS6O4|cDrO*hP4)@6iJexjX@S#D8YH4 zR`_iUK{mZaXlqi+bD}MNtgX}ysNrykQVJmiQn-(eMx)9OXKA(h1TLrUEu>TGIlfW) z;kHGqj~_phrYTVr`9)18lk=_qe^}Js-X8sapWC-@bNTXRc6WFA^5qLVJ3AMRtya{* z!2x&g-bE>e)|#cIB}StWo12>#jm?)USFWJ4EMqd6u&}Ve>gp=n+uLMW#%MHRFc=_& zU@#bT=R3h6lNjCt$p>yAAsr3%hyuuVc+mVl;} zY-fsu0M-k4i}Jjpq=Y2^1QuIx4@VVC(Iu0r(Y%t>o}8Q@h4kcOdgT?JtHu9t`vjh( z7`Fny3nk!6bl6kTyE@ggSX;z;t+f}bjrM{7j4__D)V4X$V%xUX`D#Fz&%yVqT`JqQ z(&%_RW;`AvrK|~UBg)}ptDOvhTX!jvGBAmPTgpn4wn3vqGb%QzwlHOkAx%@#G^O9~ zBZQ#S>3HHCYP|kT(>D)RSfp{%YAn>&x7%-Zz&o2<)&teW;d|rkTngjt*0_IRi-T1hur^aruV24zHc*qgrbwlM|GRh~pS*Eyu^lBuT<> zIAm^a?i7HP8I+Dcgu|2rhawJ5?M!%(gb++76GqvHe$TNur_o%K=T57-(C*2}3Gd#$ zqtoe-rYR2|Jn($95*pa65QwHGnz^SkiPo^OW<;{qG8$z>QACzyl}5GJoSd8h?gpA9 z2|@_g*4Apkv^ItBB#DWz;l_&Ta6 zXR#@$h3YBhe(Ny20@;ppgye!q{kmLy4-pPMI5 zQ=hl`*I$46TV$C6s)+PyM8;8n+lXY%qO{fwheOgdMJa`~)*qDLA0X2jn0WXOR6znO_^;F2p z^PJ7iO`<4bWo3n{SFg4LoMQGt1acUfPQ1Rw6?34v&XfzXc-F79F=(9!#_OhNt+{sX znrHP+>(epV^|j}YtgS~GR}Wz|G+V5s>6!wddg|m!Ay{5s_U+~vf2}BZXidxIc1{Uw t&y + +#include "private.h" + +typedef struct _Elm_Params_List +{ + const char *policy_h; + const char *policy_v; + const char *horizontal_mode; + Eina_Bool multi : 1; + Eina_Bool multi_exists : 1; + Eina_Bool always_select : 1; + Eina_Bool always_select_exists : 1; +} Elm_Params_List; + +#define CHOICE_GET(CHOICES, STR) \ + unsigned int i; \ + for (i = 0; i < sizeof(CHOICES); i++) \ + if (strcmp(STR, CHOICES[i]) == 0) \ + return i + +static const char *scroller_policy_choices[] = {"auto", "on", "off", NULL}; +static const char *list_horizontal_mode_choices[] = {"compress", "scroll", + "limit", NULL}; + +static Elm_Scroller_Policy +_scroller_policy_choices_setting_get(const char *policy_str) +{ + assert(sizeof(scroller_policy_choices)/ + sizeof(scroller_policy_choices[0]) == ELM_SCROLLER_POLICY_LAST + 1); + CHOICE_GET(scroller_policy_choices, policy_str); + return ELM_SCROLLER_POLICY_LAST; +} + +static Elm_List_Mode +_list_horizontal_mode_setting_get(const char *horizontal_mode_str) +{ + assert(sizeof(list_horizontal_mode_choices)/ + sizeof(list_horizontal_mode_choices[0]) == ELM_LIST_LAST + 1); + CHOICE_GET(list_horizontal_mode_choices, horizontal_mode_str); + return ELM_LIST_LAST; +} + + +static void +external_list_state_set(void *data __UNUSED__, Evas_Object *obj, const void *from_params, const void *to_params, float pos __UNUSED__) +{ + const Elm_Params_List *p; + Elm_Scroller_Policy policy_h, policy_v; + + if (to_params) p = to_params; + else if (from_params) p = from_params; + else return; + + if (p->horizontal_mode) + { + Elm_List_Mode set = _list_horizontal_mode_setting_get(p->horizontal_mode + ); + if (set == ELM_LIST_LAST) return; + elm_list_horizontal_mode_set(obj, set); + } + + if ((p->policy_h) && (p->policy_v)) + { + policy_h = _scroller_policy_choices_setting_get(p->policy_h); + policy_v = _scroller_policy_choices_setting_get(p->policy_v); + elm_list_scroller_policy_set(obj, policy_h, policy_v); + } + else if ((p->policy_h) || (p->policy_v)) + { + elm_list_scroller_policy_get(obj, &policy_h, &policy_v); + if (p->policy_h) + { + policy_h = _scroller_policy_choices_setting_get(p->policy_h); + elm_list_scroller_policy_set(obj, policy_h, policy_v); + } + else + { + policy_v = _scroller_policy_choices_setting_get(p->policy_v); + elm_list_scroller_policy_set(obj, policy_h, policy_v); + } + } + + if (p->multi_exists) + elm_list_multi_select_set(obj, p->multi); + if (p->always_select_exists) + elm_list_always_select_mode_set(obj, p->always_select); +} + +static Eina_Bool +external_list_param_set(void *data __UNUSED__, Evas_Object *obj, const Edje_External_Param *param) +{ + if (!strcmp(param->name, "horizontal mode")) + { + if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING) + { + Elm_List_Mode set = _list_horizontal_mode_setting_get(param->s); + if (set == ELM_LIST_LAST) return EINA_FALSE; + elm_list_horizontal_mode_set(obj, set); + return EINA_TRUE; + } + } + else if (!strcmp(param->name, "scroll horizontal")) + { + if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING) + { + Elm_Scroller_Policy h, v; + elm_list_scroller_policy_get(obj, &h, &v); + h = _scroller_policy_choices_setting_get(param->s); + if (h == ELM_SCROLLER_POLICY_LAST) return EINA_FALSE; + elm_list_scroller_policy_set(obj, h, v); + return EINA_TRUE; + } + } + else if (!strcmp(param->name, "scroll vertical")) + { + if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING) + { + Elm_Scroller_Policy h, v; + elm_list_scroller_policy_get(obj, &h, &v); + v = _scroller_policy_choices_setting_get(param->s); + if (v == ELM_SCROLLER_POLICY_LAST) return EINA_FALSE; + elm_list_scroller_policy_set(obj, h, v); + return EINA_TRUE; + } + } + else if (!strcmp(param->name, "multi")) + { + if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL) + { + elm_list_multi_select_set(obj, param->i); + return EINA_TRUE; + } + } + else if (!strcmp(param->name, "always_select")) + { + if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL) + { + elm_list_always_select_mode_set(obj, param->i); + return EINA_TRUE; + } + } + + ERR("unknown parameter '%s' of type '%s'", + param->name, edje_external_param_type_str(param->type)); + + return EINA_FALSE; +} + +static Eina_Bool +external_list_param_get(void *data __UNUSED__, const Evas_Object *obj, Edje_External_Param *param) +{ + if (!strcmp(param->name, "multi")) + { + if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL) + { + param->i = elm_list_multi_select_get(obj); + return EINA_TRUE; + } + } + else if (!strcmp(param->name, "always_select")) + { + if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL) + { + param->i = elm_list_always_select_mode_get(obj); + return EINA_TRUE; + } + } + else if (!strcmp(param->name, "scroll horizontal")) + { + if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING) + { + Elm_Scroller_Policy h, v; + elm_list_scroller_policy_get(obj, &h, &v); + + param->s = scroller_policy_choices[h]; + return EINA_TRUE; + } + } + else if (!strcmp(param->name, "scroll vertical")) + { + if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING) + { + Elm_Scroller_Policy h, v; + elm_list_scroller_policy_get(obj, &h, &v); + + param->s = scroller_policy_choices[v]; + return EINA_TRUE; + } + } + else if (!strcmp(param->name, "horizontal mode")) + { + if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING) + { + Elm_List_Mode m = elm_list_horizontal_mode_get(obj); + + if (m == ELM_LIST_LAST) + return EINA_FALSE; + + param->s = list_horizontal_mode_choices[m]; + return EINA_TRUE; + } + } + + ERR("unknown parameter '%s' of type '%s'", + param->name, edje_external_param_type_str(param->type)); + + return EINA_FALSE; +} + +static void * +external_list_params_parse(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const Eina_List *params) +{ + Elm_Params_List *mem; + Edje_External_Param *param; + const Eina_List *l; + + mem = calloc(1, sizeof(Elm_Params_List)); + if (!mem) + return NULL; + + EINA_LIST_FOREACH(params, l, param) + { + if (!strcmp(param->name, "multi")) + { + mem->multi = param->i; + mem->multi_exists = EINA_TRUE; + } + else if (!strcmp(param->name, "always_select")) + { + mem->always_select = param->i; + mem->always_select_exists = EINA_TRUE; + } + else if (!strcmp(param->name, "scroll horizontal")) + mem->policy_h = eina_stringshare_add(param->s); + else if (!strcmp(param->name, "scroll vertical")) + mem->policy_v = eina_stringshare_add(param->s); + else if (!strcmp(param->name, "horizontal mode")) + mem->horizontal_mode = eina_stringshare_add(param->s); + } + return mem; +} + +static void +external_list_params_free(void *params) +{ + Elm_Params_List *mem = params; + + if (mem->horizontal_mode) + eina_stringshare_del(mem->horizontal_mode); + if (mem->policy_h) + eina_stringshare_del(mem->policy_h); + if (mem->policy_v) + eina_stringshare_del(mem->policy_v); + + free(mem); +} + +static Edje_External_Param_Info external_list_params[] = { + EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("horizontal mode", "scroll", + list_horizontal_mode_choices), + EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("scroll horizontal", "auto", + scroller_policy_choices), + EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("scroll vertical", "auto", + scroller_policy_choices), + EDJE_EXTERNAL_PARAM_INFO_BOOL("multi"), + EDJE_EXTERNAL_PARAM_INFO_BOOL("always_select"), + EDJE_EXTERNAL_PARAM_INFO_SENTINEL +}; + +DEFINE_EXTERNAL_ICON_ADD(list, "list") +DEFINE_EXTERNAL_TYPE_SIMPLE(list, "List"); diff --git a/legacy/elementary/src/edje_externals/modules.inc b/legacy/elementary/src/edje_externals/modules.inc index 8a54899a2b..ec29508397 100644 --- a/legacy/elementary/src/edje_externals/modules.inc +++ b/legacy/elementary/src/edje_externals/modules.inc @@ -8,6 +8,7 @@ DEFINE_TYPE(fileselector) DEFINE_TYPE(fileselector_button) DEFINE_TYPE(genlist) DEFINE_TYPE(hoversel) +DEFINE_TYPE(list) DEFINE_TYPE(map) DEFINE_TYPE(notepad) DEFINE_TYPE(photocam) diff --git a/legacy/elementary/src/lib/Elementary.h.in b/legacy/elementary/src/lib/Elementary.h.in index e238ac6099..a57e444303 100644 --- a/legacy/elementary/src/lib/Elementary.h.in +++ b/legacy/elementary/src/lib/Elementary.h.in @@ -861,6 +861,7 @@ extern "C" { EAPI void elm_list_horizontal_mode_set(Evas_Object *obj, Elm_List_Mode mode); EAPI Elm_List_Mode elm_list_horizontal_mode_get(const Evas_Object *obj); EAPI void elm_list_always_select_mode_set(Evas_Object *obj, Eina_Bool always_select); + EAPI Eina_Bool elm_list_always_select_mode_get(const Evas_Object *obj); EAPI const Eina_List *elm_list_items_get(const Evas_Object *obj); EAPI Elm_List_Item *elm_list_selected_item_get(const Evas_Object *obj); EAPI const Eina_List *elm_list_selected_items_get(const Evas_Object *obj); @@ -881,6 +882,7 @@ extern "C" { EAPI Elm_List_Item *elm_list_item_next(const Elm_List_Item *it); EAPI void elm_list_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce); EAPI void elm_list_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v); + EAPI void elm_list_scroller_policy_get(const Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v); /* smart callbacks called: * "clicked" - when the user double-clicked an item * "selected" - when the user selected an item diff --git a/legacy/elementary/src/lib/elm_list.c b/legacy/elementary/src/lib/elm_list.c index 1e168c1a04..1cfa895e20 100644 --- a/legacy/elementary/src/lib/elm_list.c +++ b/legacy/elementary/src/lib/elm_list.c @@ -900,6 +900,15 @@ elm_list_always_select_mode_set(Evas_Object *obj, Eina_Bool always_select) wd->always_select = always_select; } +EAPI Eina_Bool +elm_list_always_select_mode_get(const Evas_Object *obj) +{ + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return EINA_FALSE; + return wd->always_select; +} + EAPI const Eina_List * elm_list_items_get(const Evas_Object *obj) { @@ -1164,3 +1173,13 @@ elm_list_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm if (wd->scr) elm_scroller_policy_set(wd->scr, policy_h, policy_v); } + +EAPI void +elm_list_scroller_policy_get(const Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (wd->scr) + elm_scroller_policy_get(wd->scr, policy_h, policy_v); +}