X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Flib%2Felm_panes.c;h=6e817fc6c263928fa23e2c62eedb7a5f5347ed11;hb=01d0d3d0698d197d1f8445a85b198e9ed20999c9;hp=937fa9bad681d433eb6bc7bb40d32328fa7d247d;hpb=d20b1b6e72e3ae7d3fe5483dc5dcf1d53ab95537;p=framework%2Fuifw%2Felementary.git diff --git a/src/lib/elm_panes.c b/src/lib/elm_panes.c index 937fa9b..6e817fc 100644 --- a/src/lib/elm_panes.c +++ b/src/lib/elm_panes.c @@ -2,8 +2,10 @@ #include "elm_priv.h" /** - * @defgroup Panes panes - * + * TODO + * Update the minimun height of the bar in the theme. + * No minimun should be set in the vertical theme + * Add events (move, start ...) */ typedef struct _Widget_Data Widget_Data; @@ -14,19 +16,20 @@ struct _Widget_Data struct { - Evas_Object *left; - Evas_Object *right; + Evas_Object *left; + Evas_Object *right; } contents; struct { - int x_diff; - int y_diff; - Eina_Bool move; + int x_diff; + int y_diff; + Eina_Bool move; } move; Eina_Bool clicked_double; Eina_Bool horizontal; + Eina_Bool fixed; }; static const char *widtype = NULL; @@ -36,6 +39,19 @@ 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 const char SIG_CLICKED[] = "clicked"; +static const char SIG_PRESS[] = "press"; +static const char SIG_UNPRESS[] = "unpress"; +static const char SIG_CLICKED_DOUBLE[] = "clicked,double"; + +static const Evas_Smart_Cb_Description _signals[] = { + {SIG_CLICKED, ""}, + {SIG_PRESS, ""}, + {SIG_UNPRESS, ""}, + {SIG_CLICKED_DOUBLE, ""}, + {NULL, NULL} +}; + static void _del_hook(Evas_Object *obj) { @@ -60,9 +76,10 @@ _theme_hook(Evas_Object *obj) double size; if (!wd) return; + _elm_widget_mirrored_reload(obj); _mirrored_set(obj, elm_widget_mirrored_get(obj)); size = elm_panes_content_left_size_get(obj); - + if (wd->horizontal) _elm_theme_object_set(obj, wd->panes, "panes", "horizontal", style); else @@ -72,6 +89,10 @@ _theme_hook(Evas_Object *obj) edje_object_part_swallow(wd->panes, "elm.swallow.left", wd->contents.left); if (wd->contents.right) edje_object_part_swallow(wd->panes, "elm.swallow.right", wd->contents.right); + if (wd->contents.left && wd->contents.right) + edje_object_signal_emit(wd->panes, "elm.panes.pair", "elm"); + if (wd->fixed) + edje_object_signal_emit(wd->panes, "elm.panes.fixed", "elm"); edje_object_scale_set(wd->panes, elm_widget_scale_get(obj) * _elm_config->scale); @@ -83,9 +104,7 @@ static Eina_Bool _elm_panes_focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_Object **next) { Widget_Data *wd = elm_widget_data_get(obj); - - if (!wd) - return EINA_FALSE; + if (!wd) return EINA_FALSE; double w, h; edje_object_part_drag_value_get(wd->panes, "elm.bar", &w, &h); @@ -147,24 +166,26 @@ _sub_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __ if (!wd) return; if (sub == wd->contents.left) { - evas_object_event_callback_del_full(sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + evas_object_event_callback_del_full(sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); - wd->contents.left = NULL; - _sizing_eval(obj); + edje_object_part_unswallow(wd->panes, sub); + wd->contents.left = NULL; + _sizing_eval(obj); } else if (sub == wd->contents.right) { - evas_object_event_callback_del_full(sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + evas_object_event_callback_del_full(sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); - wd->contents.right= NULL; - _sizing_eval(obj); + edje_object_part_unswallow(wd->panes, sub); + wd->contents.right= NULL; + _sizing_eval(obj); } } static void _clicked(void *data, Evas_Object *obj __UNUSED__ , const char *emission __UNUSED__, const char *source __UNUSED__) { - evas_object_smart_callback_call(data, "clicked", NULL); + evas_object_smart_callback_call(data, SIG_CLICKED, NULL); } static void @@ -178,30 +199,125 @@ _clicked_double(void *data, Evas_Object *obj __UNUSED__ , const char *emission _ static void _press(void *data, Evas_Object *obj __UNUSED__ , const char *emission __UNUSED__, const char *source __UNUSED__) { - evas_object_smart_callback_call(data, "press", NULL); + evas_object_smart_callback_call(data, SIG_PRESS, NULL); } static void _unpress(void *data, Evas_Object *obj __UNUSED__ , const char *emission __UNUSED__, const char *source __UNUSED__) { Widget_Data *wd = elm_widget_data_get(data); - evas_object_smart_callback_call(data, "unpress", NULL); + evas_object_smart_callback_call(data, SIG_UNPRESS, NULL); if (wd->clicked_double) { - evas_object_smart_callback_call(data, "clicked,double", NULL); - wd->clicked_double = EINA_FALSE; + evas_object_smart_callback_call(data, SIG_CLICKED_DOUBLE, NULL); + wd->clicked_double = EINA_FALSE; } } -/** - * Add a new panes to the parent - * - * @param parent The parent object - * @return The new object or NULL if it cannot be created - * - * @ingroup Panel - */ +static void +_content_left_set(Evas_Object *obj, Evas_Object *content) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (wd->contents.left == content) return; + if (wd->contents.left) + { + evas_object_del(wd->contents.left); + edje_object_signal_emit(wd->panes, "elm.panes.unpair", "elm"); + } + wd->contents.left = content; + if (content) + { + elm_widget_sub_object_add(obj, content); + edje_object_part_swallow(wd->panes, "elm.swallow.left", content); + if (wd->contents.right) + edje_object_signal_emit(wd->panes, "elm.panes.pair", "elm"); + } +} + +static void +_content_right_set(Evas_Object *obj, Evas_Object *content) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (wd->contents.right == content) return; + if (wd->contents.right) + { + evas_object_del(wd->contents.right); + edje_object_signal_emit(wd->panes, "elm.panes.unpair", "elm"); + } + wd->contents.right = content; + if (content) + { + elm_widget_sub_object_add(obj, content); + edje_object_part_swallow(wd->panes, "elm.swallow.right", content); + if (wd->contents.left) + edje_object_signal_emit(wd->panes, "elm.panes.pair", "elm"); + } +} + +static Evas_Object * +_content_left_unset(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd->contents.left) return NULL; + Evas_Object *content = wd->contents.left; + elm_widget_sub_object_del(obj, content); + edje_object_signal_emit(wd->panes, "elm.panes.unpair", "elm"); + return content; +} + +static Evas_Object * +_content_right_unset(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd->contents.right) return NULL; + Evas_Object *content = wd->contents.right; + elm_widget_sub_object_del(obj, content); + edje_object_signal_emit(wd->panes, "elm.panes.unpair", "elm"); + return content; +} + +static void +_content_set_hook(Evas_Object *obj, const char *part, Evas_Object *content) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (part && (!strncmp(part, "elm.swallow.", 12))) part += 12; + if (!part || !strcmp(part, "left")) + _content_left_set(obj, content); + else if (!strcmp(part, "right")) + _content_right_set(obj, content); +} + +static Evas_Object * +_content_get_hook(const Evas_Object *obj, const char *part) +{ + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return NULL; + if (part && (!strncmp(part, "elm.swallow.", 12))) part += 12; + if (!part || !strcmp(part, "left")) + return wd->contents.left; + else if (!strcmp(part, "right")) + return wd->contents.right; + return NULL; +} + +static Evas_Object * +_content_unset_hook(Evas_Object *obj, const char *part) +{ + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return NULL; + if (part && (!strncmp(part, "elm.swallow.", 12))) part += 12; + if (!part || !strcmp(part, "left")) + return _content_left_unset(obj); + else if (!strcmp(part, "right")) + return _content_right_unset(obj); + return NULL; +} + EAPI Evas_Object * elm_panes_add(Evas_Object *parent) { @@ -209,12 +325,8 @@ elm_panes_add(Evas_Object *parent) Evas *e; Widget_Data *wd; - EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL); + ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL); - wd = ELM_NEW(Widget_Data); - e = evas_object_evas_get(parent); - if (!e) return NULL; - obj = elm_widget_add(e); ELM_SET_WIDTYPE(widtype, "panes"); elm_widget_type_set(obj, "panes"); elm_widget_sub_object_add(parent, obj); @@ -222,6 +334,9 @@ elm_panes_add(Evas_Object *parent) elm_widget_del_hook_set(obj, _del_hook); elm_widget_theme_hook_set(obj, _theme_hook); elm_widget_focus_next_hook_set(obj, _elm_panes_focus_next_hook); + elm_widget_content_set_hook_set(obj, _content_set_hook); + elm_widget_content_get_hook_set(obj, _content_get_hook); + elm_widget_content_unset_hook_set(obj, _content_unset_hook); elm_widget_can_focus_set(obj, EINA_FALSE); wd->panes = edje_object_add(e); @@ -231,187 +346,81 @@ elm_panes_add(Evas_Object *parent) elm_panes_content_left_size_set(obj, 0.5); - edje_object_signal_callback_add(wd->panes, "elm,action,click", "", + edje_object_signal_callback_add(wd->panes, "elm,action,click", "", _clicked, obj); - edje_object_signal_callback_add(wd->panes, "elm,action,click,double", "", + edje_object_signal_callback_add(wd->panes, "elm,action,click,double", "", _clicked_double, obj); - edje_object_signal_callback_add(wd->panes, "elm,action,press", "", + edje_object_signal_callback_add(wd->panes, "elm,action,press", "", _press, obj); - edje_object_signal_callback_add(wd->panes, "elm,action,unpress", "", + edje_object_signal_callback_add(wd->panes, "elm,action,unpress", "", _unpress, obj); evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj); - evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); + evas_object_smart_callbacks_descriptions_set(obj, _signals); + _mirrored_set(obj, elm_widget_mirrored_get(obj)); _sizing_eval(obj); return obj; } - -/** - * Set the left content of the panes widget. - * - * Once the content object is set, a previously set one will be deleted. - * If you want to keep that old content object, use the - * elm_panes_content_left_unset() function. - * - * @param obj The panes object - * @param content The new left content object - * - * @ingroup Panes - */ -EAPI void +EINA_DEPRECATED EAPI void elm_panes_content_left_set(Evas_Object *obj, Evas_Object *content) { - ELM_CHECK_WIDTYPE(obj, widtype); - Widget_Data *wd = elm_widget_data_get(obj); - if (wd->contents.left) - { - evas_object_del(wd->contents.left); - wd->contents.left = NULL; - } - if (content) - { - wd->contents.left = content; - elm_widget_sub_object_add(obj, content); - edje_object_part_swallow(wd->panes, "elm.swallow.left", content); - } + _content_set_hook(obj, "left", content); } -/** - * Set the right content of the panes widget. - * - * Once the content object is set, a previously set one will be deleted. - * If you want to keep that old content object, use the - * elm_panes_content_right_unset() function. - * - * @param obj The panes object - * @param content The new right content object - * - * @ingroup Panes - */ -EAPI void +EINA_DEPRECATED EAPI void elm_panes_content_right_set(Evas_Object *obj, Evas_Object *content) { - ELM_CHECK_WIDTYPE(obj, widtype); - Widget_Data *wd = elm_widget_data_get(obj); - if (wd->contents.right) - { - evas_object_del(wd->contents.right); - wd->contents.right = NULL; - } - if (content) - { - wd->contents.right = content; - elm_widget_sub_object_add(obj, content); - edje_object_part_swallow(wd->panes, "elm.swallow.right", content); - } + _content_set_hook(obj, "right", content); } -/** - * Get the left content used for the panes - * - * Return the left content object which is set for this widget. - * - * @param obj The panes object - * @return The left content object that is being used - * - * @ingroup Panes - */ -EAPI Evas_Object * +EINA_DEPRECATED EAPI Evas_Object * elm_panes_content_left_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) NULL; - Widget_Data *wd = elm_widget_data_get(obj); - return wd->contents.left; + return _content_get_hook(obj, "left"); } -/** - * Get the right content used for the panes - * - * Return the right content object which is set for this widget. - * - * @param obj The panes object - * @return The right content object that is being used - * - * @ingroup Panes - */ -EAPI Evas_Object * +EINA_DEPRECATED EAPI Evas_Object * elm_panes_content_right_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) NULL; - Widget_Data *wd = elm_widget_data_get(obj); - return wd->contents.right; + return _content_get_hook(obj, "right"); } -/** - * Unset the left content used for the panes - * - * Unparent and return the left content object which was set for this widget. - * - * @param obj The panes object - * @return The left content object that was being used - * - * @ingroup Panes - */ -EAPI Evas_Object * +EINA_DEPRECATED EAPI Evas_Object * elm_panes_content_left_unset(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) NULL; - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return NULL; - if (!wd->contents.left) return NULL; - Evas_Object *content = wd->contents.left; - elm_widget_sub_object_del(obj, content); - edje_object_part_unswallow(wd->panes, content); - wd->contents.left = NULL; - return content; + return _content_unset_hook(obj, "left"); } -/** - * Unset the right content used for the panes - * - * Unparent and return the right content object which was set for this widget. - * - * @param obj The panes object - * @return The right content object that was being used - * - * @ingroup Panes - */ -EAPI Evas_Object * +EINA_DEPRECATED EAPI Evas_Object * elm_panes_content_right_unset(Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) NULL; - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return NULL; - if (!wd->contents.right) return NULL; - Evas_Object *content = wd->contents.right; - elm_widget_sub_object_del(obj, content); - edje_object_part_unswallow(wd->panes, content); - wd->contents.right = NULL; - return content; + return _content_unset_hook(obj, "right"); } -EAPI double +EAPI double elm_panes_content_left_size_get(const Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) 0.0; Widget_Data *wd = elm_widget_data_get(obj); double w, h; + if (!wd) return 0; edje_object_part_drag_value_get(wd->panes, "elm.bar", &w, &h); if (wd->horizontal) return h; else return w; } -EAPI void +EAPI void elm_panes_content_left_size_set(Evas_Object *obj, double size) { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); - + if (!wd) return; if (size < 0.0) size = 0.0; else if (size > 1.0) size = 1.0; if (wd->horizontal) @@ -420,21 +429,56 @@ elm_panes_content_left_size_set(Evas_Object *obj, double size) edje_object_part_drag_value_set(wd->panes, "elm.bar", size, 0.0); } -EAPI void +EAPI double +elm_panes_content_right_size_get(const Evas_Object *obj) +{ + return (1.0 - elm_panes_content_left_size_get(obj)); +} + +EAPI void +elm_panes_content_right_size_set(Evas_Object *obj, double size) +{ + elm_panes_content_left_size_set(obj, (1.0 - size)); +} + +EAPI void elm_panes_horizontal_set(Evas_Object *obj, Eina_Bool horizontal) { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); - + if (!wd) return; wd->horizontal = horizontal; _theme_hook(obj); elm_panes_content_left_size_set(obj, 0.5); } -EAPI Eina_Bool +EAPI Eina_Bool elm_panes_horizontal_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->horizontal; } + +EAPI void +elm_panes_fixed_set(Evas_Object *obj, Eina_Bool fixed) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + wd->fixed = !!fixed; + if (wd->fixed == EINA_TRUE) + edje_object_signal_emit(wd->panes, "elm.panes.fixed", "elm"); + else + edje_object_signal_emit(wd->panes, "elm.panes.unfixed", "elm"); +} + +EAPI Eina_Bool +elm_panes_fixed_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->fixed; +}