From c36ebe86fd511916da253c1cfc84d297e4afaa79 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 23 Feb 2009 08:05:05 +0000 Subject: [PATCH] begin check widget work, and make elm_theme use a path like normal unix paths do with : - allow relative, absolute and ~/ files. otherwise as before. SVN revision: 39156 --- src/lib/Elementary.h.in | 9 ++- src/lib/Makefile.am | 1 + src/lib/elm_check.c | 210 ++++++++++++++++++++++++++++++++++++++++++++++++ src/lib/elm_theme.c | 37 ++++++++- 4 files changed, 253 insertions(+), 4 deletions(-) create mode 100644 src/lib/elm_check.c diff --git a/src/lib/Elementary.h.in b/src/lib/Elementary.h.in index bf58ac9..4386325 100644 --- a/src/lib/Elementary.h.in +++ b/src/lib/Elementary.h.in @@ -167,6 +167,8 @@ extern "C" { EAPI Evas_Object *elm_win_inwin_add(Evas_Object *obj); EAPI void elm_win_inwin_activate(Evas_Object *obj); EAPI void elm_win_inwin_style_set(Evas_Object *obj, const char *style); + EAPI void elm_win_inwin_activate(Evas_Object *obj); + EAPI void elm_win_inwin_content_set(Evas_Object *obj, Evas_Object *content); /* available styles: * default * minimal @@ -534,14 +536,19 @@ extern "C" { EAPI void elm_genlist_item_del(Elm_Genlist_Item *item); EAPI const void *elm_genlist_item_data_get(Elm_Genlist_Item *item); EAPI void elm_genlist_item_update(Elm_Genlist_Item *item); - /* smart callbacks called: * "clicked" - the user clicked the hoversel button and popped up the sel * "selected" - an item in the hoversel list is selected * "dismissed" - the hover is dismissed */ + EAPI Evas_Object *elm_check_add(Evas_Object *parent); + EAPI void elm_check_label_set(Evas_Object *obj, const char *label); + EAPI void elm_check_icon_set(Evas_Object *obj, Evas_Object *icon); + EAPI void elm_check_state_set(Evas_Object *obj, Evas_Bool state); + EAPI void elm_check_state_pointer_set(Evas_Object *obj, Evas_Bool *statep); /* smart callbacks called: + * "changed" - the user toggled the state */ #ifdef __cplusplus diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 8ed7ef7..611e50c 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -49,6 +49,7 @@ elm_list.c \ elm_carousel.c \ elm_slider.c \ elm_genlist.c \ +elm_check.c \ \ elc_notepad.c \ elc_anchorview.c \ diff --git a/src/lib/elm_check.c b/src/lib/elm_check.c new file mode 100644 index 0000000..f30ad61 --- /dev/null +++ b/src/lib/elm_check.c @@ -0,0 +1,210 @@ +#include +#include "elm_priv.h" + +typedef struct _Widget_Data Widget_Data; + +struct _Widget_Data +{ + Evas_Object *chk; + Evas_Object *icon; + Evas_Bool state; + Evas_Bool *statep; + const char *label; +}; + +static void _del_hook(Evas_Object *obj); +static void _theme_hook(Evas_Object *obj); +static void _sizing_eval(Evas_Object *obj); +static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _sub_del(void *data, Evas_Object *obj, void *event_info); +static void _signal_check_off(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _signal_check_on(void *data, Evas_Object *obj, const char *emission, const char *source); + +static void +_del_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (wd->label) eina_stringshare_del(wd->label); + free(wd); +} + +static void +_theme_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + _elm_theme_set(wd->chk, "check", "base", "default"); + if (wd->icon) + edje_object_signal_emit(wd->chk, "elm,state,icon,visible", "elm"); + else + edje_object_signal_emit(wd->chk, "elm,state,icon,hidden", "elm"); + if (wd->state) + edje_object_signal_emit(wd->chk, "elm,state,check,on", "elm"); + else + edje_object_signal_emit(wd->chk, "elm,state,check,off", "elm"); + if (wd->label) + edje_object_signal_emit(wd->chk, "elm,state,text,visible", "elm"); + else + edje_object_signal_emit(wd->chk, "elm,state,text,hidden", "elm"); + edje_object_part_text_set(wd->chk, "elm.text", wd->label); + edje_object_message_signal_process(wd->chk); + edje_object_scale_set(wd->chk, elm_widget_scale_get(obj) * _elm_config->scale); + _sizing_eval(obj); +} + +static void +_sizing_eval(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; + + elm_coords_finger_size_adjust(1, &minw, 1, &minh); + edje_object_size_min_restricted_calc(wd->chk, &minw, &minh, minw, minh); + elm_coords_finger_size_adjust(1, &minw, 1, &minh); + evas_object_size_hint_min_set(obj, minw, minh); + evas_object_size_hint_max_set(obj, maxw, maxh); +} + +static void +_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Widget_Data *wd = elm_widget_data_get(data); + if (obj != wd->icon) return; + edje_object_part_swallow(wd->chk, "elm.swallow.content", obj); + Evas_Coord mw, mh; + evas_object_size_hint_min_get(obj, &mw, &mh); + _sizing_eval(data); +} + +static void +_sub_del(void *data, Evas_Object *obj, void *event_info) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Object *sub = event_info; + if (sub == wd->icon) + { + edje_object_signal_emit(wd->chk, "elm,state,icon,hidden", "elm"); + evas_object_event_callback_del + (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints); + wd->icon = NULL; + _sizing_eval(obj); + } +} + +static void +_signal_check_off(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + Widget_Data *wd = elm_widget_data_get(data); + wd->state = 0; + if (wd->statep) *wd->statep = wd->state; + evas_object_smart_callback_call(data, "changed", NULL); +} + +static void +_signal_check_on(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + Widget_Data *wd = elm_widget_data_get(data); + wd->state = 1; + if (wd->statep) *wd->statep = wd->state; + evas_object_smart_callback_call(data, "changed", NULL); +} + +EAPI Evas_Object * +elm_check_add(Evas_Object *parent) +{ + Evas_Object *obj; + Evas *e; + Widget_Data *wd; + + wd = ELM_NEW(Widget_Data); + e = evas_object_evas_get(parent); + obj = elm_widget_add(e); + elm_widget_data_set(obj, wd); + elm_widget_del_hook_set(obj, _del_hook); + elm_widget_theme_hook_set(obj, _theme_hook); + + wd->chk = edje_object_add(e); + _elm_theme_set(wd->chk, "check", "base", "default"); + edje_object_signal_callback_add(wd->chk, "elm,action,check,on", "", _signal_check_on, obj); + edje_object_signal_callback_add(wd->chk, "elm,action,check,off", "", _signal_check_off, obj); + elm_widget_resize_object_set(obj, wd->chk); + + evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj); + + _sizing_eval(obj); + return obj; +} + +EAPI void +elm_check_label_set(Evas_Object *obj, const char *label) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Coord mw, mh; + + if (wd->label) eina_stringshare_del(wd->label); + if (label) + { + wd->label = eina_stringshare_add(label); + edje_object_signal_emit(wd->chk, "elm,state,text,visible", "elm"); + edje_object_message_signal_process(wd->chk); + } + else + { + wd->label = NULL; + edje_object_signal_emit(wd->chk, "elm,state,text,hidden", "elm"); + edje_object_message_signal_process(wd->chk); + } + edje_object_part_text_set(wd->chk, "elm.text", label); + _sizing_eval(obj); +} + +EAPI void +elm_check_icon_set(Evas_Object *obj, Evas_Object *icon) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if ((wd->icon != icon) && (wd->icon)) + elm_widget_sub_object_del(obj, wd->icon); + wd->icon = icon; + if (icon) + { + elm_widget_sub_object_add(obj, icon); + edje_object_part_swallow(wd->chk, "elm.swallow.content", icon); + edje_object_signal_emit(wd->chk, "elm,state,icon,visible", "elm"); + evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + _sizing_eval(obj); + } +} + +EAPI void +elm_check_state_set(Evas_Object *obj, Evas_Bool state) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (state != wd->state) + { + wd->state = state; + if (wd->statep) *wd->statep = wd->state; + if (wd->state) + edje_object_signal_emit(wd->chk, "elm,state,check,on", "elm"); + else + edje_object_signal_emit(wd->chk, "elm,state,check,off", "elm"); + } +} + +EAPI void +elm_check_state_pointer_set(Evas_Object *obj, Evas_Bool *statep) +{ + Widget_Data *wd = elm_widget_data_get(obj); + + if (statep) + { + wd->statep = statep; + if (*wd->statep != wd->state) + { + wd->state = *wd->statep; + if (wd->state) + edje_object_signal_emit(wd->chk, "elm,state,check,on", "elm"); + else + edje_object_signal_emit(wd->chk, "elm,state,check,off", "elm"); + } + } +} diff --git a/src/lib/elm_theme.c b/src/lib/elm_theme.c index 728480a..990ac26 100644 --- a/src/lib/elm_theme.c +++ b/src/lib/elm_theme.c @@ -20,7 +20,38 @@ _elm_theme_group_file_find(const char *group) } for (l = themes; l; l = l->next) { - snprintf(buf, sizeof(buf), "%s/.elementary/themes/%s.edj", home, l->data); + char *f = l->data; + + if ((f[0] == '/') || + ((f[0] == '.') && (f[1] == '/')) || + ((f[0] == '.') && (f[1] == '.') && (f[2] == '/'))) + { + if (edje_file_group_exists(f, group)) + { + file = eina_stringshare_add(f); + if (file) + { + eina_hash_add(cache, group, file); + return file; + } + } + return NULL; + } + else if (((f[0] == '~') && (f[1] == '/'))) + { + snprintf(buf, sizeof(buf), "%s/%s", home, f + 2); + if (edje_file_group_exists(f, group)) + { + file = eina_stringshare_add(f); + if (file) + { + eina_hash_add(cache, group, file); + return file; + } + } + return NULL; + } + snprintf(buf, sizeof(buf), "%s/.elementary/themes/%s.edj", home, f); if (edje_file_group_exists(buf, group)) { file = eina_stringshare_add(buf); @@ -30,7 +61,7 @@ _elm_theme_group_file_find(const char *group) return file; } } - snprintf(buf, sizeof(buf), "%s/themes/%s.edj", _elm_data_dir, l->data); + snprintf(buf, sizeof(buf), "%s/themes/%s.edj", _elm_data_dir, f); if (edje_file_group_exists(buf, group)) { file = eina_stringshare_add(buf); @@ -105,7 +136,7 @@ _elm_theme_parse(const char *theme) pe = p; for (;;) { - if ((*pe == '/') || (*pe == 0)) + if ((*pe == ':') || (*pe == 0)) { // p -> pe == 'name/' if (pe > p) { -- 2.7.4