From: Lee siwoo Date: Wed, 9 Jun 2010 07:24:14 +0000 (+0900) Subject: merge quickcontactbadge X-Git-Tag: beat-winset-test_0.1.1-40~271^2~23 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=61cb3c2e67505d17dc532d10c36fd1527b9e25c9;p=framework%2Fuifw%2Felementary.git merge quickcontactbadge --- diff --git a/src/lib/Elementary.h.in b/src/lib/Elementary.h.in index d9a7dd3..1bb6a2d 100755 --- a/src/lib/Elementary.h.in +++ b/src/lib/Elementary.h.in @@ -1785,7 +1785,16 @@ extern "C" { EAPI Evas_Object* elm_ctxpopup_item_icon_get( Elm_Ctxpopup_Item* item ); EAPI void elm_ctxpopup_scroller_disabled_set(Evas_Object* obj, Eina_Bool disabled ); - + /* QuickContactBadge */ + typedef struct _Quickcontactbadge_Item Elm_Quickcontactbadge_Item; + + EAPI Evas_Object* elm_quickcontactbadge_add(Evas_Object* parent); + EAPI void elm_quickcontactbadge_item_icon_set(Elm_Quickcontactbadge_Item* item, Evas_Object* icon); + EAPI Elm_Quickcontactbadge_Item* elm_quickcontactbadge_icon_add( Evas_Object* obj, Evas_Object* icon, void (*func ) (void* data, Evas_Object* obj, void* event_info ), const void* data ); + EAPI void elm_quickcontactbadge_item_del(Elm_Quickcontactbadge_Item* item); + EAPI void elm_quickcontactbadge_clear(Evas_Object* obj); + EAPI void elm_quickcontactbadge_horizontal_set( Evas_Object* obj, Eina_Bool horizontal ); + EAPI Evas_Object* elm_quickcontactbadge_item_icon_get( Elm_Quickcontactbadge_Item* item ); /* Tab */ typedef enum _Elm_Tab_Move_Type diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 1617664..78ee466 100755 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -97,6 +97,7 @@ elm_editfield.c \ elm_colorpicker.c \ elm_colorpalette.c \ elm_ctxpopup.c \ +elm_quickcontactbadge.c \ elm_actionsheet.c \ elm_gridbox.c \ elm_softkey.c \ diff --git a/src/lib/elm_quickcontactbadge.c b/src/lib/elm_quickcontactbadge.c new file mode 100755 index 0000000..bb5d29a --- /dev/null +++ b/src/lib/elm_quickcontactbadge.c @@ -0,0 +1,936 @@ +/* + * SLP + * Copyright (c) 2009 Samsung Electronics, Inc. + * All rights reserved. + * + * This software is a confidential and proprietary information + * of Samsung Electronics, Inc. ("Confidential Information"). You + * shall not disclose such Confidential Information and shall use + * it only in accordance with the terms of the license agreement + * you entered into with Samsung Electronics. + */ + +/** + * + * @addtogroup QuickContactBadge + * + * This is an quickcontactbadge. + */ +#include +#include +#include +#include "elm_priv.h" + +#define QUICKCONTACTBADGE_EXPAND_COUNT 4 +#define QUICKCONTACTBADGE_ICON_LEFT_MARGIN 10 +#define QUICKCONTACTBADGE_BG_TOP_MARGIN 18 +#define QUICKCONTATBADGE_ICON_TOP_MARGIN 31 +#define WORLD_PARENT_W (parent_x + parent_w) + +typedef struct _Widget_Data Widget_Data; +typedef struct _Geometry_Rect Geometry_Rect; +typedef enum { Bottom_Arrow, Right_Arrow, Left_Arrow, Top_Arrow } Arrow_Direction; + +struct _Geometry_Rect +{ + Evas_Coord x, y, w, h; +}; + +struct _Quickcontactbadge_Item +{ + Evas_Object* obj; + Evas_Object* quickcontactbadge; + Evas_Object* content; + Eina_Bool disabled; + Eina_Bool separator; + void (*func) (void* data, Evas_Object* obj, void* event_info); + const void* data; +}; + +struct _Widget_Data +{ + Evas_Object* parent; + Evas_Object* location; + Evas_Object* hover; + Evas_Object* box; + Evas_Object* arrow; + Evas_Object* layout; + Eina_List* items; + Evas_Coord x, y; + Eina_Bool horizontal; +}; + +static void _sizing_eval( Evas_Object *obj ); +static void _del_pre_hook( Evas_Object* obj ); +static void _del_hook( Evas_Object* obj ); +static void _theme_hook( Evas_Object* obj ); +static void _hover_clicked_cb( void* data, Evas_Object* obj, void* event_info ); +static void _parent_resize( void* data, Evas* evas, Evas_Object* obj, void* event_info ); +static void _quickcontactbadge_show( void* data, Evas* evas, Evas_Object* obj, void* event_info ); +static void _quickcontactbadge_hide( void* data, Evas* evas, Evas_Object* obj, void* event_info ); +static void _quickcontactbadge_move( void* data, Evas* evas, Evas_Object* obj, void* event_info ); +static void _item_obj_create( Elm_Quickcontactbadge_Item* item ); +static void _item_sizing_eval( Elm_Quickcontactbadge_Item* item ); +static void _quickcontactbadge_item_select( + void* data, + Evas_Object* obj, + const char* emission, + const char* source ); +static void _separator_obj_add( Evas_Object* quickcontactbadge ); +static void _separator_obj_del( Widget_Data* wd, Elm_Quickcontactbadge_Item* remove_item ); +static void _changed_size_hints( void* data, Evas* evas, Evas_Object* obj, void* event_info ); +static void _arrow_obj_add( Evas_Object* quickcontactbadge ); +static void _scale_shrinked_set( Elm_Quickcontactbadge_Item* item ); +static void _item_scale_shrinked_set( Widget_Data* wd, Elm_Quickcontactbadge_Item* add_item ); +static void _item_scale_normal_set( Widget_Data* wd ); +static void _get_obj_size( Evas_Object* quickcontactbadge, double scale ); + +static Evas_Coord _quickcontactbadge_arrow_size = 1; +static Evas_Coord _quickcontactbadge_arrow_max_size = 1; +static Evas_Coord _quickcontactbadge_width_max = 1; +static Evas_Coord _quickcontactbadge_height_max = 1; +static Evas_Coord _quickcontactbadge_touch_range = 1; +static Evas_Coord _quickcontactbadge_indicator_height = 1; +static float _size_rate = 1; +static int _item_cnt = 0; + +/** + * @ingroup Quickcontactbadge + * + * Get the icon object for the given item. + * + * @param item Quickcontactbadge item + * @return Icon object or NULL if the item does not have icon + */ +EAPI Evas_Object* elm_quickcontactbadge_item_icon_get( Elm_Quickcontactbadge_Item* item ) +{ + if( item == NULL ) { + return NULL; + } + + return item->content; +} + + +/** + * @ingroup Quickcontactbadge + * + * Add a new Quickcontactbadge object to the parent. + * + * @param parent Parent object + * @return New object or NULL if it cannot be created + */ +EAPI Evas_Object* elm_quickcontactbadge_add( Evas_Object* parent ) +{ + Evas_Object* obj; + Widget_Data* wd; + Evas* evas; + + evas = evas_object_evas_get( parent ); + + + if( evas == NULL ) { + return NULL; + } + + obj = (Evas_Object*) elm_widget_add( evas ); + + if( obj == NULL ) { + return NULL; + } + + elm_widget_type_set( obj, "ctx-popup" ); + elm_widget_sub_object_add( parent, obj ); + + wd = calloc( 1, sizeof( Widget_Data ) ); + + if( wd == NULL ) { + return NULL; + } + + elm_widget_data_set( obj, wd ); + elm_widget_del_pre_hook_set( obj, _del_pre_hook ); + elm_widget_del_hook_set( obj, _del_hook ); + elm_widget_theme_hook_set( obj, _theme_hook ); + + wd->location = elm_icon_add( obj ); + wd->parent = parent; + + wd->layout = elm_layout_add( obj ); + elm_layout_theme_set(wd->layout, "quickcontactbadge", "background", "default"); + + //Box + wd->box = elm_box_add( obj ); + evas_object_size_hint_weight_set( wd->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND ); + evas_object_size_hint_align_set( wd->box, EVAS_HINT_FILL, EVAS_HINT_FILL ); + + evas_object_show( wd->box ); + + //Hoversel + wd->hover = elm_hover_add( obj ); + elm_hover_parent_set( wd->hover, parent ); + elm_hover_target_set( wd->hover, wd->location ); + elm_object_style_set( wd->hover, "quickcontactbadge"); + evas_object_size_hint_weight_set( wd->hover, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND ); + evas_object_size_hint_align_set( wd->hover, EVAS_HINT_FILL, EVAS_HINT_FILL ); + + evas_object_smart_callback_add( wd->hover, "clicked", _hover_clicked_cb, obj ); + + elm_hover_content_set( + wd->hover, + elm_hover_best_content_location_get( wd->hover, ELM_HOVER_AXIS_VERTICAL ), + wd->box ); + + evas_object_event_callback_add( parent, EVAS_CALLBACK_RESIZE, _parent_resize, obj ); + evas_object_event_callback_add( obj, EVAS_CALLBACK_SHOW, _quickcontactbadge_show, wd ); + evas_object_event_callback_add( obj, EVAS_CALLBACK_HIDE, _quickcontactbadge_hide, wd ); + evas_object_event_callback_add( obj, EVAS_CALLBACK_MOVE, _quickcontactbadge_move, wd ); + + _arrow_obj_add( obj ); + _get_obj_size( obj, edje_scale_get() ); + _sizing_eval( obj ); + + return obj; +} + + +/** + * @ingroup Quickcontactbadge + * + * Clear all items in given Quickcontactbadge object. + * + * @param obj Quickcontactbadge object + */ +EAPI void elm_quickcontactbadge_clear( Evas_Object* obj ) +{ + Eina_List* elist; + Elm_Quickcontactbadge_Item* item; + Widget_Data* wd = (Widget_Data*) elm_widget_data_get( obj ); + + if( wd == NULL ) { + return ; + } + + EINA_LIST_FOREACH( wd->items, elist, item ) { + + if( item->content ) { + evas_object_del( item->content ); + } + + evas_object_del( item->obj ); + + wd->items = eina_list_remove( wd->items, item ); + + free( item ); + + } + evas_object_hide( wd->arrow ); + evas_object_hide( wd->hover ); + evas_object_hide( wd->layout ); +} + +EAPI void elm_quickcontactbadge_horizontal_set( Evas_Object* obj, Eina_Bool horizontal ) +{ + Widget_Data* wd = (Widget_Data*) elm_widget_data_get( obj ); + + if( wd == NULL ) { + return ; + } + + if( wd->horizontal == horizontal ) { + return ; + } + + wd->horizontal = horizontal; + + if( horizontal == EINA_FALSE ) { + elm_box_horizontal_set( wd->box, EINA_FALSE ); + + }else { + elm_box_horizontal_set( wd->box, EINA_TRUE ); + } + +} + + +/** + * @ingroup Quickcontactbadge + * + * reset the icon on the given item. This function is only for icon item. + * + * @param obj Quickcontactbadge item + * @param icon Icon object to be set + */ +EAPI void elm_quickcontactbadge_item_icon_set( Elm_Quickcontactbadge_Item* item, Evas_Object* icon ) +{ + Widget_Data* wd; + + if( item == NULL || icon == NULL ) { + return ; + } + + wd = (Widget_Data*) elm_widget_data_get( item->quickcontactbadge ); + + if( wd == NULL ) { + return; + } + + if( item->content == icon ) { + return ; + } + + if( item->content ) { + elm_widget_sub_object_del( item->quickcontactbadge, item->content ); + } + + + item->content = icon; + elm_icon_scale_set( icon, EINA_TRUE, EINA_TRUE ); + elm_widget_sub_object_add( item->quickcontactbadge, icon ); + edje_object_part_swallow( item->obj, "elm.swallow.content", item->content ); + edje_object_signal_emit( item->obj, "elm,state,enable_icon", "elm" ); + + evas_object_event_callback_add( icon, + EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, + item->quickcontactbadge ); + + edje_object_message_signal_process( item->obj ); + + _sizing_eval( item->quickcontactbadge ); + +} + + + +/** + * @ingroup Quickcontactbadge + * + * Add a new item as an icon in given Quickcontactbadge object. + * + * @param obj Quickcontactbadge object + * @param icon Icon to be set + * @param func Callback function to call when this item click is clicked + * @param data User data for callback function + * @return Added Quickcontactbadge item + */ +EAPI Elm_Quickcontactbadge_Item* elm_quickcontactbadge_icon_add( + Evas_Object* obj, + Evas_Object* icon, + void (*func ) (void* data, Evas_Object* obj, void* event_info ), + const void* data + ) +{ + Elm_Quickcontactbadge_Item* item; + Widget_Data* wd = (Widget_Data*) elm_widget_data_get( obj ); + _item_cnt++; + + if( wd == NULL ) { + return NULL; + } + + _separator_obj_add( obj ); + + item = calloc( 1, sizeof( Elm_Quickcontactbadge_Item ) ); + + if( item == NULL ) { + return NULL; + } + + item->func = func; + item->data = data; + item->quickcontactbadge = obj; + item->separator = EINA_FALSE; + + _item_obj_create( item ); + + wd->items = eina_list_append( wd->items, item ); + + elm_quickcontactbadge_item_icon_set( item, icon ); + _item_scale_shrinked_set( wd, item ); + + elm_box_pack_end( wd->box, item->obj ); + + _sizing_eval( obj ); + + return item; + +} + + + +/** + * @ingroup Quickcontactbadge + * + * Delete the given item in Quickcontactbadge object. + * + * @param item Quickcontactbadge item to be deleted + */ +EAPI void elm_quickcontactbadge_item_del( Elm_Quickcontactbadge_Item* item ) +{ + Widget_Data* wd; + + if( item == NULL ) { + return ; + } + + if( item->content ) { + evas_object_del( item->content ); + } + + if( item->obj ) { + evas_object_del( item->obj ); + } + + wd = (Widget_Data*) elm_widget_data_get( item->quickcontactbadge ); + + if( wd ) { + _separator_obj_del( wd, item ); + wd->items = eina_list_remove( wd->items, item ); + } + + free( item ); + + _item_scale_normal_set( wd ); + + if( eina_list_count( wd->items ) < 1 ) { + evas_object_hide( wd->arrow ); + evas_object_hide( wd->hover ); + evas_object_hide( wd->layout ); + } +} + + +static void _changed_size_hints( void* data, Evas* evas, Evas_Object* obj, void* event_info ) +{ + _sizing_eval( data ); +} + +static void _separator_obj_del( Widget_Data* wd, Elm_Quickcontactbadge_Item* remove_item ) +{ + Eina_List* elist; + Elm_Quickcontactbadge_Item* separator; + + if( remove_item == NULL || wd == NULL ) { + return ; + } + + elist = wd->items; + + Eina_List* cur_list = eina_list_data_find_list( elist, remove_item ); + + if( cur_list == NULL ) { + return ; + } + + Eina_List* prev_list = eina_list_prev( cur_list ); + + if( prev_list ) { + + separator = (Elm_Quickcontactbadge_Item*) eina_list_data_get( prev_list ); + + if( separator == NULL ) { + return ; + } + + wd->items = eina_list_remove( wd->items, separator ); + evas_object_del( separator->obj ); + free( separator ); + } + +} + + +static void _separator_obj_add( Evas_Object* quickcontactbadge ) +{ + Elm_Quickcontactbadge_Item* item; + Widget_Data* wd = (Widget_Data*) elm_widget_data_get( quickcontactbadge ); + + if( wd == NULL ) { + return ; + } + + if( eina_list_count( wd->items ) == 0 ) { + return ; + } + + item = calloc( 1, sizeof( Elm_Quickcontactbadge_Item ) ); + + if( item == NULL ) { + return ; + } + + item->obj = edje_object_add( evas_object_evas_get( wd->location ) ); + + if( item->obj == NULL ) { + free( item ); + return ; + } + + evas_object_size_hint_weight_set( item->obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND ) ; + evas_object_size_hint_fill_set( item->obj, EVAS_HINT_FILL, EVAS_HINT_FILL ); + _elm_theme_object_set(quickcontactbadge, item->obj, "quickcontactbadge", "separator", elm_widget_style_get( quickcontactbadge ) ) ; + + + if( wd->horizontal == EINA_TRUE ) { + edje_object_signal_emit( item->obj, "elm,state,horizontal", "elm" ); + }else { + edje_object_signal_emit( item->obj, "elm,state,vertical", "elm" ); + } + + + evas_object_show( item->obj ); + + item->separator = EINA_TRUE; + + elm_box_pack_end( wd->box, item->obj ); + wd->items = eina_list_append( wd->items, item ); + +} + + +static void _scale_shrinked_set( Elm_Quickcontactbadge_Item* item ) +{ + if( item == NULL ) { + return ; + } + + if( item->disabled == EINA_FALSE ) { + edje_object_signal_emit( item->obj, "elm,state,shrinked", "elm" ); + }else { + edje_object_signal_emit( item->obj, "elm,state,shrinked_disabled", "elm" ); + } +} + + +static void _item_scale_normal_set( Widget_Data* wd ) +{ + int item_count; + Eina_List* elist; + Elm_Quickcontactbadge_Item* item; + + if( wd == NULL ) { + return ; + } + + item_count = eina_list_count( wd->items ); + item_count -= item_count >> 1; + + if( item_count == QUICKCONTACTBADGE_EXPAND_COUNT ) { + + EINA_LIST_FOREACH( wd->items, elist, item ) { + + if( item->disabled == EINA_FALSE ) { + edje_object_signal_emit( item->obj, "elm,state,enabled", "elm" ); + }else { + edje_object_signal_emit( item->obj, "elm,state,disabled", "elm" ); + } + + } + + } + +} + + +static void _item_scale_shrinked_set( Widget_Data* wd, Elm_Quickcontactbadge_Item* add_item ) +{ + int item_count; + Eina_List* elist; + Elm_Quickcontactbadge_Item* item; + + if( wd == NULL ) { + return ; + } + + if( wd->horizontal == EINA_TRUE ) { + return; + } + + item_count = eina_list_count( wd->items ); + item_count -= item_count >> 1; + + if( item_count > QUICKCONTACTBADGE_EXPAND_COUNT + 1 ) { + + _scale_shrinked_set( add_item ); + + }else if( item_count == QUICKCONTACTBADGE_EXPAND_COUNT+1 ) { + + EINA_LIST_FOREACH( wd->items, elist, item ) { + + _scale_shrinked_set( item ); + } + } +} + + +static void _item_sizing_eval( Elm_Quickcontactbadge_Item* item ) +{ + Evas_Coord min_w = -1; + Evas_Coord min_h = -1; + Evas_Coord max_w = -1; + Evas_Coord max_h = -1; + + if( item == NULL ) { + return ; + } + + if( item->separator == EINA_FALSE ) { + elm_coords_finger_size_adjust( 1, &min_w, 1, &min_h ); + } + + edje_object_size_min_restricted_calc( item->obj, &min_w, &min_h, min_w, min_h ); + + if( item->separator == EINA_FALSE ) { + elm_coords_finger_size_adjust( 1, &min_w, 1, &min_h ); + } + + evas_object_size_hint_min_set( item->obj, min_w, min_h ); + evas_object_size_hint_max_set( item->obj, max_w, max_h ); + +} + + +static void _update_arrow_obj( Widget_Data* wd, Arrow_Direction arrow_dir, Geometry_Rect* rect ) +{ + Evas_Coord arrow_x, arrow_y; + + if( wd == NULL ) { + return ; + } + + arrow_x = wd->x; + arrow_y = wd->y; + + switch( arrow_dir ) { + case Top_Arrow: + { + edje_object_signal_emit( wd->arrow, "elm,top_arrow,show", "elm" ); + arrow_x = QUICKCONTACTBADGE_ICON_LEFT_MARGIN*5; + arrow_y += _quickcontactbadge_touch_range; + break; + } + case Bottom_Arrow: + { + edje_object_signal_emit( wd->arrow, "elm,bottom_arrow,show", "elm" ); + arrow_x = QUICKCONTACTBADGE_ICON_LEFT_MARGIN*5; + arrow_y -= _quickcontactbadge_touch_range; + break; + } + default: + fprintf( stderr, "There is something error in arrow direction!!\n" ); + } + + evas_object_move( wd->arrow, arrow_x, arrow_y ); + rect->y = arrow_y+QUICKCONTATBADGE_ICON_TOP_MARGIN; + rect->x = QUICKCONTACTBADGE_ICON_LEFT_MARGIN; +} + + +static void _get_obj_size( Evas_Object* quickcontactbadge, double scale ) +{ + + Widget_Data* wd = (Widget_Data*) elm_widget_data_get( quickcontactbadge ); + + if( wd == NULL ) { + return ; + } + + Evas_Object* data_info = edje_object_add( evas_object_evas_get( wd->location ) ); + _elm_theme_object_set(quickcontactbadge, data_info, "quickcontactbadge", "data_info", elm_widget_style_get( quickcontactbadge ) ); + + //Arrow + _quickcontactbadge_arrow_max_size = (Evas_Coord) ( atoi( edje_object_data_get( data_info, "arrow_max_size" ) ) * scale ); + _quickcontactbadge_arrow_size = (Evas_Coord) ( atoi( edje_object_data_get( data_info, "arrow_min_size" ) ) * scale ); + + Evas_Coord prev_width = _quickcontactbadge_width_max; + + //Hover + _quickcontactbadge_width_max = (Evas_Coord) ( atoi( edje_object_data_get( data_info, "hover_width_max_size" ) ) * scale ); + _quickcontactbadge_height_max = (Evas_Coord) ( atoi( edje_object_data_get( data_info, "hover_height_max_size" ) ) * scale ); + + //Indicator + _quickcontactbadge_indicator_height = (Evas_Coord) ( atoi( edje_object_data_get( data_info, "indicator_height_size" ) ) * scale ); + + //touch_range + _quickcontactbadge_touch_range = (Evas_Coord) ( atoi( edje_object_data_get( data_info, "touch_range" ) ) * scale ); + + evas_object_del( data_info ); + + _size_rate = (float)_quickcontactbadge_width_max / (float) prev_width; + +} + + +static void _sizing_eval( Evas_Object* obj ) +{ + Widget_Data* wd; + Eina_List* elist; + Elm_Quickcontactbadge_Item* item; + Geometry_Rect rect; + + wd = (Widget_Data*) elm_widget_data_get( obj ); + + if( wd == NULL || wd->parent == NULL ) { + return ; + } + + EINA_LIST_FOREACH( wd->items, elist, item ) { + _item_sizing_eval( item ); + } + + _update_arrow_obj( wd, Top_Arrow, &rect ); + evas_object_move( wd->location, rect.x, rect.y ); + evas_object_resize( wd->location, rect.w, rect.h ); + evas_object_move( wd->hover, rect.x, rect.y ); + evas_object_resize( wd->hover, rect.w, rect.h ); + evas_object_move( wd->layout, 0, rect.y-QUICKCONTACTBADGE_BG_TOP_MARGIN ); +} + + +static void _del_pre_hook( Evas_Object* obj ) +{ + Widget_Data* wd = (Widget_Data*) elm_widget_data_get( obj ); + + if( wd == NULL ) { + return ; + } + + evas_object_event_callback_del_full( + wd->parent, + EVAS_CALLBACK_RESIZE, + _parent_resize, + obj ); + +} + + +static void _del_hook( Evas_Object* obj ) +{ + Widget_Data* wd = (Widget_Data*) elm_widget_data_get( obj ); + + if( wd == NULL ) { + return ; + } + + elm_quickcontactbadge_clear( obj ); + + if( wd->arrow ) { + evas_object_del( wd->arrow ); + } + + if( wd->hover ) { + evas_object_del( wd->hover ); + } + + if( wd->box ) { + evas_object_del( wd->box ); + } + + if( wd->location ) { + evas_object_del( wd->location ); + } + + if (wd->layout) { + evas_object_del (wd->layout); + } + _item_cnt = 0; + free( wd ); + +} + + +static void _theme_hook( Evas_Object* obj ) +{ + Eina_List* elist; + Eina_List* elist_child; + Eina_List* elist_temp; + Elm_Quickcontactbadge_Item* item; + int item_count; + + Widget_Data* wd = (Widget_Data*) elm_widget_data_get( obj ); + + if( wd == NULL ) { + return ; + } + + item_count = eina_list_count( wd->items ); + item_count -= item_count >> 1; + + elist = eina_list_append( elist, wd->items ); + + EINA_LIST_FOREACH( elist, elist, elist_child ) { + EINA_LIST_FOREACH( elist_child, elist_temp, item ) { + if( item->separator == EINA_TRUE ) { + _elm_theme_object_set(obj, item->obj, + "quickcontactbadge", + "separator", + elm_widget_style_get( obj ) ); + if( wd->horizontal == EINA_TRUE ) { + edje_object_signal_emit( item->obj, "elm,state,horizontal", "elm" ); + } else { + edje_object_signal_emit( item->obj, "elm,state,vertical", "elm" ); + } + }else { + _elm_theme_object_set(obj, item->obj, + "quickcontactbadge", + "item", + elm_widget_style_get( obj ) ); + + if( item->disabled == EINA_TRUE ) { + if( item_count > QUICKCONTACTBADGE_EXPAND_COUNT ) { + edje_object_signal_emit( item->obj, "elm,state,shrinked_disabled", "elm" ); + }else { + edje_object_signal_emit( item->obj, "elm,state,disabled","elm" ); + } + }else { + if( item_count > QUICKCONTACTBADGE_EXPAND_COUNT ) { + edje_object_signal_emit( item->obj, "elm,state,shrinked", "elm" ); + }else { + edje_object_signal_emit( item->obj, "elm,state,enabled", "elm" ); + } + } + } + edje_object_message_signal_process( item->obj ); + } + } + + elm_object_style_set( wd->hover, "quickcontactbadge"); + _elm_theme_object_set(obj, wd->arrow, "quickcontactbadge", "arrow", elm_widget_style_get( obj ) ); + _get_obj_size( obj, edje_scale_get() ); + + _sizing_eval( obj ); + +} + + +static void _hover_clicked_cb( void* data, Evas_Object* obj, void* event_info ) +{ + evas_object_hide( data ); + evas_object_smart_callback_call( data, "ctxpopup,hide", NULL ); + +} + + +static void _parent_resize( void* data, Evas* evas, Evas_Object* obj, void* event_info ) +{ + _sizing_eval( data ); +} + + +static void _quickcontactbadge_show( void* data, Evas* evas, Evas_Object* obj, void* event_info ) +{ + Widget_Data* wd = (Widget_Data*) data; + + if( wd == NULL ) { + return ; + } + + if( eina_list_count( wd->items ) < 1 ) { + return ; + } + + evas_object_show( wd->arrow ); + evas_object_show( wd->hover ); + evas_object_show( wd->layout ); +} + + +static void _quickcontactbadge_hide( void* data, Evas* evas, Evas_Object* obj, void* event_info ) +{ + Widget_Data* wd = (Widget_Data*) data; + + if( wd == NULL ) { + return ; + } + evas_object_hide( wd->arrow ); + evas_object_hide( wd->hover ); + evas_object_hide( wd->layout ); +} + + +static void _quickcontactbadge_move( void* data, Evas* evas, Evas_Object* obj, void* event_info ) +{ + Evas_Coord x, y, w, h; + Widget_Data* wd = (Widget_Data*) data; + + if( wd == NULL ) { + return ; + } + + evas_object_geometry_get( obj, &x, &y, &w, &h ); + + wd->x = x; + wd->y = y; + + _sizing_eval( obj ); + +} + + +static void _quickcontactbadge_item_select( + void* data, + Evas_Object* obj, + const char* emission, + const char* source ) +{ + Elm_Quickcontactbadge_Item* item = (Elm_Quickcontactbadge_Item*) data; + + if( item == NULL ) { + return ; + } + + if( item->disabled == EINA_TRUE ) { + return ; + } + + if( item->func ) { + item->func( (void*) (item->data), item->quickcontactbadge, item ); + } + +} + + +static void _arrow_obj_add( Evas_Object* quickcontactbadge ) +{ + Widget_Data* wd = (Widget_Data*) elm_widget_data_get( quickcontactbadge ); + + if( wd == NULL ) { + return ; + } + + wd->arrow = edje_object_add( evas_object_evas_get( wd->location) ); + + evas_object_size_hint_weight_set( wd->arrow, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND ); + _elm_theme_object_set(quickcontactbadge, wd->arrow, "quickcontactbadge", "arrow", elm_widget_style_get( quickcontactbadge ) ); + edje_object_signal_emit( wd->arrow, "elm,bottom_arrow,show", "elm" ); + + +} + + +static void _item_obj_create( Elm_Quickcontactbadge_Item* item ) +{ + Widget_Data* wd = (Widget_Data*) elm_widget_data_get( item->quickcontactbadge ); + + if( wd == NULL ) { + return ; + } + + item->obj = edje_object_add( evas_object_evas_get( wd->location ) ); + + evas_object_size_hint_weight_set( item->obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND ); + evas_object_size_hint_fill_set( item->obj, EVAS_HINT_FILL, EVAS_HINT_FILL ); + _elm_theme_object_set(item->quickcontactbadge, item->obj, "quickcontactbadge", "item", elm_widget_style_get( item->quickcontactbadge ) ); + + edje_object_signal_callback_add( + item->obj, + "elm,action,click", + "", + _quickcontactbadge_item_select, + item ); + + evas_object_show( item->obj ); + +} +