2010-10-06 11:40:04 -07:00
# include <Elementary.h>
# include "elm_priv.h"
2012-08-01 14:03:21 -07:00
# include "elm_widget_flipselector.h"
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
EAPI Eo_Op ELM_OBJ_FLIPSELECTOR_BASE_ID = EO_NOOP ;
# define MY_CLASS ELM_OBJ_FLIPSELECTOR_CLASS
# define MY_CLASS_NAME "elm_flipselector"
2010-10-06 11:40:04 -07:00
/* TODO: ideally, the default theme would use map{} blocks on the TEXT
parts to implement their fading in / out propertly ( as in the clock
widget ) */
/* TODO: if one ever wants to extend it to receiving generic widgets
as items , be my guest . in this case , remember to implement the
items tooltip infra . */
/* TODO: fix default theme image borders for looong strings as item
labels . */
/* TODO: set text elipsis on labels if one enforces mininum size on
* the overall widget less the required for displaying it . */
/* TODO: find a way to, in the default theme, to detect we are
* bootstrapping ( receiving the 1 st message ) and populate the downmost
* TEXT parts with the same text as the upmost , where appropriate . */
# define FLIP_FIRST_INTERVAL (0.85)
2012-05-03 15:44:06 -07:00
# define FLIP_MIN_INTERVAL (0.1)
# define MSG_FLIP_DOWN (1)
# define MSG_FLIP_UP (2)
# define MAX_LEN_DEFAULT (50)
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
# define DATA_GET eina_list_data_get
2010-10-06 11:40:04 -07:00
static const char SIG_SELECTED [ ] = " selected " ;
static const char SIG_UNDERFLOWED [ ] = " underflowed " ;
static const char SIG_OVERFLOWED [ ] = " overflowed " ;
2012-05-03 15:44:06 -07:00
static const Evas_Smart_Cb_Description _smart_callbacks [ ] = {
{ SIG_SELECTED , " " } ,
{ SIG_UNDERFLOWED , " " } ,
{ SIG_OVERFLOWED , " " } ,
{ NULL , NULL }
2010-10-06 11:40:04 -07:00
} ;
2012-05-03 15:44:06 -07:00
static void
2012-11-25 22:32:53 -08:00
_elm_flipselector_smart_sizing_eval ( Eo * obj , void * _pd , va_list * list EINA_UNUSED )
2012-05-03 15:44:06 -07:00
{
char * tmp = NULL ;
Evas_Coord minw = - 1 , minh = - 1 , w , h ;
2012-11-25 22:32:53 -08:00
Elm_Flipselector_Smart_Data * sd = _pd ;
Elm_Widget_Smart_Data * wd = eo_data_get ( obj , ELM_OBJ_WIDGET_CLASS ) ;
2012-05-03 15:44:06 -07:00
2012-06-26 07:28:59 -07:00
if ( sd - > evaluating ) return ;
2012-05-03 15:44:06 -07:00
elm_coords_finger_size_adjust ( 1 , & minw , 2 , & minh ) ;
2012-06-26 07:28:59 -07:00
sd - > evaluating = EINA_TRUE ;
if ( sd - > sentinel )
2012-05-03 15:44:06 -07:00
{
2012-06-26 07:28:59 -07:00
const char * label = elm_object_item_text_get ( DATA_GET ( sd - > sentinel ) ) ;
tmp = strdup ( elm_layout_text_get ( obj , " elm.top " ) ) ;
elm_layout_text_set ( obj , " elm.top " , label ) ;
2012-05-03 15:44:06 -07:00
}
2012-06-26 07:28:59 -07:00
edje_object_size_min_restricted_calc
2012-11-25 22:32:53 -08:00
( wd - > resize_obj , & minw , & minh , minw , minh ) ;
2012-06-26 07:28:59 -07:00
elm_coords_finger_size_adjust ( 1 , & minw , 2 , & minh ) ;
evas_object_size_hint_min_get ( obj , & w , & h ) ;
if ( sd - > sentinel )
{
elm_layout_text_set ( obj , " elm.top " , tmp ) ;
free ( tmp ) ;
}
if ( w > minw ) minw = w ;
if ( h > minh ) minh = h ;
sd - > evaluating = EINA_FALSE ;
2012-05-03 15:44:06 -07:00
evas_object_size_hint_min_set ( obj , minw , minh ) ;
}
static void
_update_view ( Evas_Object * obj )
{
const char * label ;
Elm_Flipselector_Item * item ;
ELM_FLIPSELECTOR_DATA_GET ( obj , sd ) ;
2012-11-25 22:32:53 -08:00
Elm_Widget_Smart_Data * wd = eo_data_get ( obj , ELM_OBJ_WIDGET_CLASS ) ;
2012-05-03 15:44:06 -07:00
label = NULL ;
item = DATA_GET ( sd - > current ) ;
if ( item ) label = item - > label ;
elm_layout_text_set ( obj , " elm.top " , label ? label : " " ) ;
elm_layout_text_set ( obj , " elm.bottom " , label ? label : " " ) ;
2012-11-25 22:32:53 -08:00
edje_object_message_signal_process ( wd - > resize_obj ) ;
2012-05-03 15:44:06 -07:00
}
2011-11-15 17:39:39 -08:00
static void
_item_text_set_hook ( Elm_Object_Item * it ,
2011-11-16 18:16:38 -08:00
const char * part ,
2011-11-15 17:39:39 -08:00
const char * label )
{
Eina_List * l ;
Elm_Flipselector_Item * item ;
if ( ! label ) return ;
2012-05-03 15:44:06 -07:00
if ( part & & strcmp ( part , " default " ) ) return ;
2011-11-16 18:16:38 -08:00
2012-03-06 03:51:42 -08:00
item = ( Elm_Flipselector_Item * ) it ;
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_DATA_GET ( WIDGET ( item ) , sd ) ;
if ( ! sd - > items ) return ;
2011-11-15 17:39:39 -08:00
2012-05-03 15:44:06 -07:00
l = eina_list_data_find_list ( sd - > items , item ) ;
2011-11-15 17:39:39 -08:00
if ( ! l ) return ;
eina_stringshare_del ( item - > label ) ;
2012-05-03 15:44:06 -07:00
item - > label = eina_stringshare_add_length ( label , sd - > max_len ) ;
2011-11-15 17:39:39 -08:00
2012-05-03 15:44:06 -07:00
if ( strlen ( label ) > strlen ( elm_object_item_text_get ( DATA_GET ( sd - > sentinel ) ) ) )
sd - > sentinel = l ;
2011-11-15 17:39:39 -08:00
2012-05-03 15:44:06 -07:00
if ( sd - > current = = l )
2011-11-15 17:39:39 -08:00
{
_update_view ( WIDGET ( item ) ) ;
2012-05-03 15:44:06 -07:00
elm_layout_sizing_eval ( WIDGET ( item ) ) ;
2011-11-15 17:39:39 -08:00
}
}
static const char *
2012-05-03 15:44:06 -07:00
_item_text_get_hook ( const Elm_Object_Item * it ,
const char * part )
2011-11-15 17:39:39 -08:00
{
2012-05-03 15:44:06 -07:00
if ( part & & strcmp ( part , " default " ) ) return NULL ;
2011-11-16 18:16:38 -08:00
2012-03-06 03:51:42 -08:00
return ( ( Elm_Flipselector_Item * ) it ) - > label ;
2011-11-15 17:39:39 -08:00
}
static void
_item_signal_emit_hook ( Elm_Object_Item * it ,
const char * emission ,
const char * source )
{
2012-03-06 03:51:42 -08:00
Elm_Flipselector_Item * item = ( Elm_Flipselector_Item * ) it ;
2012-05-02 18:19:05 -07:00
2012-05-03 15:44:06 -07:00
edje_object_signal_emit ( VIEW ( item ) , emission , source ) ;
2012-05-02 18:19:05 -07:00
}
2010-10-06 11:40:04 -07:00
static inline void
2012-05-03 15:44:06 -07:00
_flipselector_walk ( Elm_Flipselector_Smart_Data * sd )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
if ( sd - > walking < 0 )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
ERR ( " walking was negative. fixed! \n " ) ;
sd - > walking = 0 ;
2010-10-06 11:40:04 -07:00
}
2012-05-03 15:44:06 -07:00
sd - > walking + + ;
2010-10-06 11:40:04 -07:00
}
static void
2012-05-03 15:44:06 -07:00
_sentinel_eval ( Elm_Flipselector_Smart_Data * sd )
2010-10-06 11:40:04 -07:00
{
2010-11-10 05:43:34 -08:00
Elm_Flipselector_Item * it ;
2010-10-06 11:40:04 -07:00
Eina_List * l ;
2012-05-03 15:44:06 -07:00
if ( ! sd - > items )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
sd - > sentinel = NULL ;
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
return ;
2010-10-06 11:40:04 -07:00
}
2012-05-03 15:44:06 -07:00
sd - > sentinel = sd - > items ;
2010-10-06 11:40:04 -07:00
2012-10-01 00:36:27 -07:00
EINA_LIST_FOREACH ( sd - > items , l , it )
2010-10-06 11:40:04 -07:00
{
2012-03-06 03:51:42 -08:00
if ( strlen ( elm_object_item_text_get ( ( Elm_Object_Item * ) it ) ) >
2012-05-03 15:44:06 -07:00
strlen ( elm_object_item_text_get ( DATA_GET ( sd - > sentinel ) ) ) )
sd - > sentinel = l ;
2010-10-06 11:40:04 -07:00
}
}
/* TODO: create a flag to avoid looping here all times */
static void
2012-05-03 15:44:06 -07:00
_flipselector_process_deletions ( Elm_Flipselector_Smart_Data * sd )
2010-10-06 11:40:04 -07:00
{
2012-05-02 18:19:05 -07:00
Eina_List * l ;
2012-05-03 15:44:06 -07:00
Elm_Flipselector_Item * it ;
2010-10-06 11:40:04 -07:00
Eina_Bool skip = EINA_TRUE ;
Eina_Bool sentinel_eval = EINA_FALSE ;
2012-05-03 15:44:06 -07:00
sd - > walking + + ; /* avoid nested deletions */
2010-10-06 11:40:04 -07:00
2012-10-01 00:36:27 -07:00
EINA_LIST_FOREACH ( sd - > items , l , it )
2010-10-06 11:40:04 -07:00
{
2011-11-15 17:39:39 -08:00
if ( ! it - > deleted ) continue ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( sd - > current = = l )
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
{
2012-05-03 15:44:06 -07:00
if ( sd - > current = = sd - > sentinel ) sentinel_eval = EINA_TRUE ;
sd - > current = eina_list_prev ( sd - > current ) ;
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
}
2012-05-03 15:44:06 -07:00
sd - > items = eina_list_remove ( sd - > items , it ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( ! sd - > current ) sd - > current = sd - > items ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
elm_widget_item_del ( it ) ;
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
skip = EINA_FALSE ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( eina_list_count ( sd - > items ) < = 1 )
elm_layout_signal_emit
2012-11-25 22:32:53 -08:00
( sd - > obj , " elm,state,button,hidden " , " elm " ) ;
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
else
2012-05-03 15:44:06 -07:00
elm_layout_signal_emit
2012-11-25 22:32:53 -08:00
( sd - > obj , " elm,state,button,visible " , " elm " ) ;
2010-10-06 11:40:04 -07:00
}
2012-11-25 22:32:53 -08:00
if ( ! skip ) _update_view ( sd - > obj ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( sentinel_eval ) _sentinel_eval ( sd ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
sd - > walking - - ;
2010-10-06 11:40:04 -07:00
}
static inline void
2012-05-03 15:44:06 -07:00
_flipselector_unwalk ( Elm_Flipselector_Smart_Data * sd )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
sd - > walking - - ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( sd - > walking < 0 )
2010-10-06 11:40:04 -07:00
{
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
ERR ( " walking became negative. fixed! \n " ) ;
2012-05-03 15:44:06 -07:00
sd - > walking = 0 ;
2010-10-06 11:40:04 -07:00
}
2012-05-03 15:44:06 -07:00
if ( sd - > walking ) return ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
_flipselector_process_deletions ( sd ) ;
2010-10-06 11:40:04 -07:00
}
2012-05-03 15:44:06 -07:00
static void
_on_item_changed ( Elm_Flipselector_Smart_Data * sd )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
Elm_Flipselector_Item * item ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
item = DATA_GET ( sd - > current ) ;
if ( ! item ) return ;
2012-08-06 20:59:02 -07:00
if ( sd - > deleting ) return ;
2012-05-03 15:44:06 -07:00
if ( item - > func )
item - > func ( ( void * ) item - > base . data , WIDGET ( item ) , item ) ;
if ( ! item - > deleted )
evas_object_smart_callback_call
2012-11-25 22:32:53 -08:00
( sd - > obj , SIG_SELECTED , item ) ;
2012-05-03 15:44:06 -07:00
}
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
static void
_send_msg ( Elm_Flipselector_Smart_Data * sd ,
int flipside ,
char * label )
{
Edje_Message_String msg ;
2012-11-25 22:32:53 -08:00
Elm_Widget_Smart_Data * wd = eo_data_get ( sd - > obj , ELM_OBJ_WIDGET_CLASS ) ;
2012-05-02 18:19:05 -07:00
2012-05-03 15:44:06 -07:00
msg . str = label ;
edje_object_message_send
2012-11-25 22:32:53 -08:00
( wd - > resize_obj , EDJE_MESSAGE_STRING , flipside , & msg ) ;
edje_object_message_signal_process ( wd - > resize_obj ) ;
2012-05-02 18:19:05 -07:00
2012-05-03 15:44:06 -07:00
_on_item_changed ( sd ) ;
2010-10-06 11:40:04 -07:00
}
2012-05-03 15:44:06 -07:00
static Eina_Bool
_item_del_pre_hook ( Elm_Object_Item * it )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
Elm_Flipselector_Item * item , * item2 ;
Eina_List * l ;
item = ( Elm_Flipselector_Item * ) it ;
ELM_FLIPSELECTOR_DATA_GET ( WIDGET ( item ) , sd ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( sd - > walking > 0 )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
item - > deleted = EINA_TRUE ;
return EINA_FALSE ;
2010-10-06 11:40:04 -07:00
}
2012-05-03 15:44:06 -07:00
_flipselector_walk ( sd ) ;
2012-10-01 00:36:27 -07:00
EINA_LIST_FOREACH ( sd - > items , l , item2 )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
if ( item2 = = item )
{
if ( sd - > current = = l )
{
sd - > current = l - > prev ;
if ( ! sd - > current ) sd - > current = l - > next ;
if ( sd - > current )
{
item2 = sd - > current - > data ;
_send_msg ( sd , MSG_FLIP_DOWN , ( char * ) item2 - > label ) ;
}
else _send_msg ( sd , MSG_FLIP_DOWN , " " ) ;
}
2012-08-06 20:59:02 -07:00
sd - > items = eina_list_remove_list ( sd - > items , l ) ;
2012-05-03 15:44:06 -07:00
break ;
}
2010-10-06 11:40:04 -07:00
}
2012-05-03 15:44:06 -07:00
eina_stringshare_del ( item - > label ) ;
_sentinel_eval ( sd ) ;
_flipselector_unwalk ( sd ) ;
return EINA_TRUE ;
2010-10-06 11:40:04 -07:00
}
2012-05-03 15:44:06 -07:00
static Elm_Flipselector_Item *
_item_new ( Evas_Object * obj ,
const char * label ,
Evas_Smart_Cb func ,
const void * data )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
unsigned int len ;
Elm_Flipselector_Item * it ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_DATA_GET ( obj , sd ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
it = elm_widget_item_new ( obj , Elm_Flipselector_Item ) ;
if ( ! it ) return NULL ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
elm_widget_item_del_pre_hook_set ( it , _item_del_pre_hook ) ;
elm_widget_item_text_set_hook_set ( it , _item_text_set_hook ) ;
elm_widget_item_text_get_hook_set ( it , _item_text_get_hook ) ;
elm_widget_item_signal_emit_hook_set ( it , _item_signal_emit_hook ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
len = strlen ( label ) ;
if ( len > sd - > max_len ) len = sd - > max_len ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
it - > label = eina_stringshare_add_length ( label , len ) ;
it - > func = func ;
it - > base . data = data ;
2012-05-02 18:19:05 -07:00
2012-05-03 15:44:06 -07:00
/* TODO: no view here, but if one desires general contents in the
* future . . . */
return it ;
2010-10-06 11:40:04 -07:00
}
2012-11-25 22:32:53 -08:00
static void
_elm_flipselector_smart_theme ( Eo * obj , void * _pd , va_list * list )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
const char * max_len ;
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
Eina_Bool int_ret = EINA_FALSE ;
if ( ret ) * ret = EINA_FALSE ;
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
Elm_Flipselector_Smart_Data * sd = _pd ;
Elm_Widget_Smart_Data * wd = eo_data_get ( obj , ELM_OBJ_WIDGET_CLASS ) ;
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
eo_do_super ( obj , elm_wdg_theme ( & int_ret ) ) ;
if ( ! int_ret ) return ;
max_len = edje_object_data_get ( wd - > resize_obj , " max_len " ) ;
2012-05-03 15:44:06 -07:00
if ( ! max_len ) sd - > max_len = MAX_LEN_DEFAULT ;
else
{
sd - > max_len = atoi ( max_len ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( ! sd - > max_len ) sd - > max_len = MAX_LEN_DEFAULT ;
}
2010-11-09 12:26:22 -08:00
2012-05-03 15:44:06 -07:00
_update_view ( obj ) ;
elm_layout_sizing_eval ( obj ) ;
2010-11-09 12:26:22 -08:00
2012-11-25 22:32:53 -08:00
if ( ret ) * ret = EINA_TRUE ;
2012-05-02 18:19:05 -07:00
}
2012-05-02 10:01:25 -07:00
2012-05-02 18:19:05 -07:00
static void
2012-05-03 15:44:06 -07:00
_flip_up ( Elm_Flipselector_Smart_Data * sd )
2012-05-02 18:19:05 -07:00
{
2012-05-03 15:44:06 -07:00
Elm_Flipselector_Item * item ;
2012-05-02 10:01:25 -07:00
2012-05-03 15:44:06 -07:00
if ( ! sd - > current ) return ;
2012-05-02 18:19:05 -07:00
2012-08-06 20:59:02 -07:00
if ( sd - > deleting ) return ;
2012-05-03 15:44:06 -07:00
if ( sd - > current = = sd - > items )
{
sd - > current = eina_list_last ( sd - > items ) ;
evas_object_smart_callback_call
2012-11-25 22:32:53 -08:00
( sd - > obj , SIG_UNDERFLOWED , NULL ) ;
2012-05-03 15:44:06 -07:00
}
else
sd - > current = eina_list_prev ( sd - > current ) ;
item = DATA_GET ( sd - > current ) ;
if ( ! item ) return ;
_send_msg ( sd , MSG_FLIP_UP , ( char * ) item - > label ) ;
2010-11-09 12:26:22 -08:00
}
static void
2012-05-03 15:44:06 -07:00
_flip_down ( Elm_Flipselector_Smart_Data * sd )
2010-11-09 12:26:22 -08:00
{
2010-11-10 05:43:34 -08:00
Elm_Flipselector_Item * item ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( ! sd - > current ) return ;
2010-10-06 11:40:04 -07:00
2012-08-06 20:59:02 -07:00
if ( sd - > deleting ) return ;
2012-05-03 15:44:06 -07:00
sd - > current = eina_list_next ( sd - > current ) ;
if ( ! sd - > current )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
sd - > current = sd - > items ;
evas_object_smart_callback_call
2012-11-25 22:32:53 -08:00
( sd - > obj , SIG_OVERFLOWED , NULL ) ;
2010-10-06 11:40:04 -07:00
}
2012-05-03 15:44:06 -07:00
item = DATA_GET ( sd - > current ) ;
2011-11-15 17:39:39 -08:00
if ( ! item ) return ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
_send_msg ( sd , MSG_FLIP_DOWN , ( char * ) item - > label ) ;
2010-10-06 11:40:04 -07:00
}
2012-11-25 22:32:53 -08:00
static void
_elm_flipselector_smart_event ( Eo * obj , void * _pd , va_list * list )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
Evas_Event_Key_Down * ev ;
Eina_Bool is_up = EINA_TRUE ;
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
Evas_Object * src = va_arg ( * list , Evas_Object * ) ;
( void ) src ;
Evas_Callback_Type type = va_arg ( * list , Evas_Callback_Type ) ;
void * event_info = va_arg ( * list , void * ) ;
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
if ( ret ) * ret = EINA_FALSE ;
Elm_Flipselector_Smart_Data * sd = _pd ;
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
if ( elm_widget_disabled_get ( obj ) ) return ;
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
if ( type ! = EVAS_CALLBACK_KEY_DOWN ) return ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
ev = event_info ;
2012-11-25 22:32:53 -08:00
if ( ev - > event_flags & EVAS_EVENT_FLAG_ON_HOLD ) return ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( ( ! strcmp ( ev - > keyname , " Down " ) ) | | ( ! strcmp ( ev - > keyname , " KP_Down " ) ) )
is_up = EINA_FALSE ;
else if ( ( strcmp ( ev - > keyname , " Up " ) ) & & ( strcmp ( ev - > keyname , " KP_Up " ) ) )
2012-11-25 22:32:53 -08:00
return ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( sd - > spin ) ecore_timer_del ( sd - > spin ) ;
sd - > spin = NULL ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
/* TODO: if direction setting via API is not coming in, replace
these calls by flip_ { next , prev } */
_flipselector_walk ( sd ) ;
if ( is_up ) _flip_up ( sd ) ;
else _flip_down ( sd ) ;
_flipselector_unwalk ( sd ) ;
ev - > event_flags | = EVAS_EVENT_FLAG_ON_HOLD ;
2012-05-02 10:01:25 -07:00
2012-11-25 22:32:53 -08:00
if ( ret ) * ret = EINA_TRUE ;
2010-10-06 11:40:04 -07:00
}
2012-05-03 15:44:06 -07:00
static Eina_Bool
_signal_val_up ( void * data )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_DATA_GET ( data , sd ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
_flipselector_walk ( sd ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( sd - > interval > FLIP_MIN_INTERVAL ) sd - > interval = sd - > interval / 1.05 ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
ecore_timer_interval_set ( sd - > spin , sd - > interval ) ;
_flip_up ( sd ) ;
_flipselector_unwalk ( sd ) ;
return ECORE_CALLBACK_RENEW ;
2010-10-06 11:40:04 -07:00
}
static void
2012-05-03 15:44:06 -07:00
_signal_val_up_start ( void * data ,
Evas_Object * obj __UNUSED__ ,
const char * emission __UNUSED__ ,
const char * source __UNUSED__ )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_DATA_GET ( data , sd ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
sd - > interval = sd - > first_interval ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( sd - > spin ) ecore_timer_del ( sd - > spin ) ;
sd - > spin = ecore_timer_add ( sd - > interval , _signal_val_up , data ) ;
2012-05-02 18:19:05 -07:00
2012-05-03 15:44:06 -07:00
_signal_val_up ( data ) ;
2010-10-06 11:40:04 -07:00
}
static Eina_Bool
_signal_val_down ( void * data )
{
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_DATA_GET ( data , sd ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
_flipselector_walk ( sd ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( sd - > interval > FLIP_MIN_INTERVAL ) sd - > interval = sd - > interval / 1.05 ;
ecore_timer_interval_set ( sd - > spin , sd - > interval ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
_flip_down ( sd ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
_flipselector_unwalk ( sd ) ;
2010-10-06 11:40:04 -07:00
return ECORE_CALLBACK_RENEW ;
}
static void
2012-05-03 15:44:06 -07:00
_signal_val_down_start ( void * data ,
Evas_Object * obj __UNUSED__ ,
const char * emission __UNUSED__ ,
const char * source __UNUSED__ )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_DATA_GET ( data , sd ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
sd - > interval = sd - > first_interval ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( sd - > spin ) ecore_timer_del ( sd - > spin ) ;
sd - > spin = ecore_timer_add ( sd - > interval , _signal_val_down , data ) ;
2010-10-06 11:40:04 -07:00
_signal_val_down ( data ) ;
}
static void
2012-05-03 15:44:06 -07:00
_signal_val_change_stop ( void * data ,
Evas_Object * obj __UNUSED__ ,
const char * emission __UNUSED__ ,
const char * source __UNUSED__ )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_DATA_GET ( data , sd ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( sd - > spin ) ecore_timer_del ( sd - > spin ) ;
sd - > spin = NULL ;
2010-10-06 11:40:04 -07:00
}
static void
2012-11-25 22:32:53 -08:00
_elm_flipselector_smart_add ( Eo * obj , void * _pd , va_list * list EINA_UNUSED )
2010-10-06 11:40:04 -07:00
{
2012-11-25 22:32:53 -08:00
Elm_Flipselector_Smart_Data * priv = _pd ;
2012-05-03 15:44:06 -07:00
2012-11-25 22:32:53 -08:00
eo_do_super ( obj , evas_obj_smart_add ( ) ) ;
2012-05-03 15:44:06 -07:00
elm_layout_theme_set
( obj , " flipselector " , " base " , elm_widget_style_get ( obj ) ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
elm_layout_signal_callback_add
( obj , " elm,action,up,start " , " " , _signal_val_up_start , obj ) ;
elm_layout_signal_callback_add
( obj , " elm,action,up,stop " , " " , _signal_val_change_stop , obj ) ;
elm_layout_signal_callback_add
( obj , " elm,action,down,start " , " " , _signal_val_down_start , obj ) ;
elm_layout_signal_callback_add
( obj , " elm,action,down,stop " , " " , _signal_val_change_stop , obj ) ;
priv - > first_interval = FLIP_FIRST_INTERVAL ;
elm_widget_can_focus_set ( obj , EINA_TRUE ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_wdg_theme ( NULL ) ) ;
2010-10-06 11:40:04 -07:00
}
2012-05-03 15:44:06 -07:00
static void
2012-11-25 22:32:53 -08:00
_elm_flipselector_smart_del ( Eo * obj , void * _pd , va_list * list EINA_UNUSED )
elementary/menu, ctxpopup, index, segment_control, diskselector, multibuttonentry, toolbar, naviframe, slideshow, hoversel, filpselector - deprecated xxxx_item_del() APIs.
But instead, made to use the elm_object_item_del() APIs
for this, elm_widget_item needed to provide elm_widget_item_del_pre_hook.
SVN revision: 67010
2012-01-09 21:02:11 -08:00
{
2012-11-25 22:32:53 -08:00
Elm_Flipselector_Smart_Data * sd = _pd ;
elementary/menu, ctxpopup, index, segment_control, diskselector, multibuttonentry, toolbar, naviframe, slideshow, hoversel, filpselector - deprecated xxxx_item_del() APIs.
But instead, made to use the elm_object_item_del() APIs
for this, elm_widget_item needed to provide elm_widget_item_del_pre_hook.
SVN revision: 67010
2012-01-09 21:02:11 -08:00
2012-08-06 20:59:02 -07:00
sd - > deleting = EINA_TRUE ;
2012-05-03 15:44:06 -07:00
if ( sd - > walking ) ERR ( " flipselector deleted while walking. \n " ) ;
elementary/menu, ctxpopup, index, segment_control, diskselector, multibuttonentry, toolbar, naviframe, slideshow, hoversel, filpselector - deprecated xxxx_item_del() APIs.
But instead, made to use the elm_object_item_del() APIs
for this, elm_widget_item needed to provide elm_widget_item_del_pre_hook.
SVN revision: 67010
2012-01-09 21:02:11 -08:00
2012-05-03 15:44:06 -07:00
while ( sd - > items )
elm_widget_item_del ( DATA_GET ( sd - > items ) ) ;
2012-05-02 10:01:25 -07:00
2012-05-03 15:44:06 -07:00
if ( sd - > spin ) ecore_timer_del ( sd - > spin ) ;
2012-05-02 10:01:25 -07:00
2012-11-25 22:32:53 -08:00
eo_do_super ( obj , evas_obj_smart_del ( ) ) ;
2012-05-03 15:44:06 -07:00
}
2012-05-02 18:19:05 -07:00
2012-05-03 15:44:06 -07:00
EAPI Evas_Object *
elm_flipselector_add ( Evas_Object * parent )
{
EINA_SAFETY_ON_NULL_RETURN_VAL ( parent , NULL ) ;
2012-11-25 22:32:53 -08:00
Evas_Object * obj = eo_add ( MY_CLASS , parent ) ;
eo_unref ( obj ) ;
return obj ;
}
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
static void
_constructor ( Eo * obj , void * _pd , va_list * list EINA_UNUSED )
{
Elm_Flipselector_Smart_Data * sd = _pd ;
sd - > obj = obj ;
eo_do_super ( obj , eo_constructor ( ) ) ;
eo_do ( obj ,
evas_obj_type_set ( MY_CLASS_NAME ) ,
evas_obj_smart_callbacks_descriptions_set ( _smart_callbacks , NULL ) ) ;
Evas_Object * parent = eo_parent_get ( obj ) ;
2012-05-03 15:44:06 -07:00
if ( ! elm_widget_sub_object_add ( parent , obj ) )
ERR ( " could not add %p as sub object of %p " , obj , parent ) ;
2010-10-06 11:40:04 -07:00
}
EAPI void
2010-11-10 05:43:34 -08:00
elm_flipselector_flip_next ( Evas_Object * obj )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_CHECK ( obj ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_obj_flipselector_flip_next ( ) ) ;
}
static void
_flip_next ( Eo * obj EINA_UNUSED , void * _pd , va_list * list EINA_UNUSED )
{
Elm_Flipselector_Smart_Data * sd = _pd ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( sd - > spin ) ecore_timer_del ( sd - > spin ) ;
sd - > spin = NULL ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
_flipselector_walk ( sd ) ;
_flip_down ( sd ) ;
_flipselector_unwalk ( sd ) ;
2010-10-06 11:40:04 -07:00
}
EAPI void
2010-11-10 05:43:34 -08:00
elm_flipselector_flip_prev ( Evas_Object * obj )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_CHECK ( obj ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_obj_flipselector_flip_prev ( ) ) ;
}
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
static void
_flip_prev ( Eo * obj EINA_UNUSED , void * _pd , va_list * list EINA_UNUSED )
{
Elm_Flipselector_Smart_Data * sd = _pd ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( sd - > spin ) ecore_timer_del ( sd - > spin ) ;
sd - > spin = NULL ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
_flipselector_walk ( sd ) ;
_flip_up ( sd ) ;
_flipselector_unwalk ( sd ) ;
2010-10-06 11:40:04 -07:00
}
2011-11-15 17:39:39 -08:00
EAPI Elm_Object_Item *
2012-05-03 15:44:06 -07:00
elm_flipselector_item_append ( Evas_Object * obj ,
const char * label ,
void ( * func ) ( void * , Evas_Object * , void * ) ,
2013-01-17 16:48:27 -08:00
const void * data )
2010-10-06 11:40:04 -07:00
{
2012-11-25 22:32:53 -08:00
Elm_Flipselector_Item * ret = NULL ;
ELM_FLIPSELECTOR_CHECK ( obj ) NULL ;
eo_do ( ( Eo * ) obj , elm_obj_flipselector_item_append ( label , func , data , & ret ) ) ;
return ( Elm_Object_Item * ) ret ;
}
static void
_item_append ( Eo * obj , void * _pd , va_list * list )
{
const char * label = va_arg ( * list , const char * ) ;
flipselector_func_type func = va_arg ( * list , flipselector_func_type ) ;
void * data = va_arg ( * list , void * ) ;
Elm_Flipselector_Item * * ret = va_arg ( * list , Elm_Flipselector_Item * * ) ;
* ret = NULL ;
2010-11-10 05:43:34 -08:00
Elm_Flipselector_Item * item ;
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
Elm_Flipselector_Smart_Data * sd = _pd ;
2010-10-06 11:40:04 -07:00
item = _item_new ( obj , label , func , data ) ;
2012-11-25 22:32:53 -08:00
if ( ! item ) return ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
sd - > items = eina_list_append ( sd - > items , item ) ;
if ( ! sd - > current )
2011-11-15 17:39:39 -08:00
{
2012-05-03 15:44:06 -07:00
sd - > current = sd - > items ;
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
_update_view ( obj ) ;
2011-11-15 17:39:39 -08:00
}
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( ! sd - > sentinel | |
2012-03-06 03:51:42 -08:00
( strlen ( elm_object_item_text_get ( ( Elm_Object_Item * ) item ) ) >
2012-05-03 15:44:06 -07:00
strlen ( elm_object_item_text_get ( DATA_GET ( sd - > sentinel ) ) ) ) )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
sd - > sentinel = eina_list_last ( sd - > items ) ;
elm_layout_sizing_eval ( obj ) ;
2010-10-06 11:40:04 -07:00
}
2012-06-26 07:28:59 -07:00
if ( eina_list_count ( sd - > items ) > 1 )
2012-05-03 15:44:06 -07:00
elm_layout_signal_emit ( obj , " elm,state,button,visible " , " elm " ) ;
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
* ret = item ;
2010-10-06 11:40:04 -07:00
}
2011-11-15 17:39:39 -08:00
EAPI Elm_Object_Item *
2012-05-03 15:44:06 -07:00
elm_flipselector_item_prepend ( Evas_Object * obj ,
const char * label ,
void ( * func ) ( void * , Evas_Object * , void * ) ,
void * data )
2010-10-06 11:40:04 -07:00
{
2012-11-25 22:32:53 -08:00
Elm_Flipselector_Item * ret = NULL ;
ELM_FLIPSELECTOR_CHECK ( obj ) NULL ;
eo_do ( ( Eo * ) obj , elm_obj_flipselector_item_prepend ( label , func , data , & ret ) ) ;
return ( Elm_Object_Item * ) ret ;
}
static void
_item_prepend ( Eo * obj , void * _pd , va_list * list )
{
const char * label = va_arg ( * list , const char * ) ;
flipselector_func_type func = va_arg ( * list , flipselector_func_type ) ;
void * data = va_arg ( * list , void * ) ;
Elm_Flipselector_Item * * ret = va_arg ( * list , Elm_Flipselector_Item * * ) ;
* ret = NULL ;
2010-11-10 05:43:34 -08:00
Elm_Flipselector_Item * item ;
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
Elm_Flipselector_Smart_Data * sd = _pd ;
2010-10-06 11:40:04 -07:00
item = _item_new ( obj , label , func , data ) ;
2012-11-25 22:32:53 -08:00
if ( ! item ) return ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
sd - > items = eina_list_prepend ( sd - > items , item ) ;
if ( ! sd - > current )
2011-11-15 17:39:39 -08:00
{
2012-05-03 15:44:06 -07:00
sd - > current = sd - > items ;
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
_update_view ( obj ) ;
2011-11-15 17:39:39 -08:00
}
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( ! sd - > sentinel | |
2012-03-06 03:51:42 -08:00
( strlen ( elm_object_item_text_get ( ( Elm_Object_Item * ) item ) ) >
2012-05-03 15:44:06 -07:00
strlen ( elm_object_item_text_get ( DATA_GET ( sd - > sentinel ) ) ) ) )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
sd - > sentinel = sd - > items ;
elm_layout_sizing_eval ( obj ) ;
2010-10-06 11:40:04 -07:00
}
2012-05-03 15:44:06 -07:00
if ( eina_list_count ( sd - > items ) > = 2 )
elm_layout_signal_emit ( obj , " elm,state,button,visible " , " elm " ) ;
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
* ret = item ;
2010-10-06 11:40:04 -07:00
}
EAPI const Eina_List *
2010-11-10 05:43:34 -08:00
elm_flipselector_items_get ( const Evas_Object * obj )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_CHECK ( obj ) NULL ;
2012-11-25 22:32:53 -08:00
const Eina_List * ret = NULL ;
eo_do ( ( Eo * ) obj , elm_obj_flipselector_items_get ( & ret ) ) ;
return ret ;
}
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
static void
_items_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
const Eina_List * * ret = va_arg ( * list , const Eina_List * * ) ;
Elm_Flipselector_Smart_Data * sd = _pd ;
* ret = sd - > items ;
2010-10-06 11:40:04 -07:00
}
2011-11-15 17:39:39 -08:00
EAPI Elm_Object_Item *
2010-11-10 05:43:34 -08:00
elm_flipselector_first_item_get ( const Evas_Object * obj )
2010-10-06 11:40:04 -07:00
{
2012-11-25 22:32:53 -08:00
ELM_FLIPSELECTOR_CHECK ( obj ) NULL ;
Elm_Object_Item * ret = NULL ;
eo_do ( ( Eo * ) obj , elm_obj_flipselector_first_item_get ( & ret ) ) ;
return ret ;
}
static void
_first_item_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Elm_Object_Item * * ret = va_arg ( * list , Elm_Object_Item * * ) ;
* ret = NULL ;
2010-11-10 05:43:34 -08:00
Elm_Flipselector_Item * it ;
2010-10-06 11:40:04 -07:00
Eina_List * l ;
2012-11-25 22:32:53 -08:00
Elm_Flipselector_Smart_Data * sd = _pd ;
2012-05-03 15:44:06 -07:00
2012-11-25 22:32:53 -08:00
if ( ! sd - > items ) return ;
2010-10-06 11:40:04 -07:00
2012-10-01 00:36:27 -07:00
EINA_LIST_FOREACH ( sd - > items , l , it )
2010-10-06 11:40:04 -07:00
{
2011-11-15 17:39:39 -08:00
if ( it - > deleted ) continue ;
2012-11-25 22:32:53 -08:00
* ret = ( Elm_Object_Item * ) it ;
return ;
2010-10-06 11:40:04 -07:00
}
}
2011-11-15 17:39:39 -08:00
EAPI Elm_Object_Item *
2010-11-10 05:43:34 -08:00
elm_flipselector_last_item_get ( const Evas_Object * obj )
2010-10-06 11:40:04 -07:00
{
2012-11-25 22:32:53 -08:00
ELM_FLIPSELECTOR_CHECK ( obj ) NULL ;
Elm_Object_Item * ret = NULL ;
eo_do ( ( Eo * ) obj , elm_obj_flipselector_last_item_get ( & ret ) ) ;
return ret ;
}
static void
_last_item_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Elm_Object_Item * * ret = va_arg ( * list , Elm_Object_Item * * ) ;
* ret = NULL ;
2010-11-10 05:43:34 -08:00
Elm_Flipselector_Item * it ;
2010-10-06 11:40:04 -07:00
Eina_List * l ;
2012-11-25 22:32:53 -08:00
Elm_Flipselector_Smart_Data * sd = _pd ;
2012-05-03 15:44:06 -07:00
2012-11-25 22:32:53 -08:00
if ( ! sd - > items ) return ;
2010-10-06 11:40:04 -07:00
2012-10-01 00:36:27 -07:00
EINA_LIST_REVERSE_FOREACH ( sd - > items , l , it )
2010-10-06 11:40:04 -07:00
{
2011-11-15 17:39:39 -08:00
if ( it - > deleted ) continue ;
2012-11-25 22:32:53 -08:00
* ret = ( Elm_Object_Item * ) it ;
return ;
2010-10-06 11:40:04 -07:00
}
}
2011-11-15 17:39:39 -08:00
EAPI Elm_Object_Item *
2010-11-10 05:43:34 -08:00
elm_flipselector_selected_item_get ( const Evas_Object * obj )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_CHECK ( obj ) NULL ;
2012-11-25 22:32:53 -08:00
Elm_Object_Item * ret = NULL ;
eo_do ( ( Eo * ) obj , elm_obj_flipselector_selected_item_get ( & ret ) ) ;
return ret ;
}
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
static void
_selected_item_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Elm_Object_Item * * ret = va_arg ( * list , Elm_Object_Item * * ) ;
Elm_Flipselector_Smart_Data * sd = _pd ;
* ret = DATA_GET ( sd - > current ) ;
2010-10-06 11:40:04 -07:00
}
EAPI void
2012-05-03 15:44:06 -07:00
elm_flipselector_item_selected_set ( Elm_Object_Item * it ,
Eina_Bool selected )
2010-10-06 11:40:04 -07:00
{
2011-11-15 17:39:39 -08:00
Elm_Flipselector_Item * item , * _item , * cur ;
2010-11-09 12:26:22 -08:00
int flipside = MSG_FLIP_UP ;
2010-10-06 11:40:04 -07:00
Eina_List * l ;
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_ITEM_CHECK_OR_RETURN ( it ) ;
2012-03-06 03:51:42 -08:00
item = ( Elm_Flipselector_Item * ) it ;
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_DATA_GET ( WIDGET ( item ) , sd ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
cur = DATA_GET ( sd - > current ) ;
2011-11-15 17:39:39 -08:00
if ( ( selected ) & & ( cur = = item ) ) return ;
2010-11-09 12:26:22 -08:00
2012-05-03 15:44:06 -07:00
_flipselector_walk ( sd ) ;
2010-10-06 11:40:04 -07:00
2010-11-09 12:26:47 -08:00
if ( ( ! selected ) & & ( cur = = item ) )
{
2012-10-01 00:36:27 -07:00
EINA_LIST_FOREACH ( sd - > items , l , _item )
2010-11-09 12:26:47 -08:00
{
if ( ! _item - > deleted )
{
2012-05-03 15:44:06 -07:00
sd - > current = l ;
_send_msg ( sd , MSG_FLIP_UP , ( char * ) _item - > label ) ;
2010-11-09 12:26:47 -08:00
break ;
}
}
2012-05-03 15:44:06 -07:00
_flipselector_unwalk ( sd ) ;
2010-11-09 12:26:47 -08:00
return ;
}
2012-10-01 00:36:27 -07:00
EINA_LIST_FOREACH ( sd - > items , l , _item )
2010-10-06 11:40:04 -07:00
{
2011-11-15 17:39:39 -08:00
if ( _item = = cur ) flipside = MSG_FLIP_DOWN ;
2010-11-09 12:26:22 -08:00
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
if ( _item = = item )
{
2012-05-03 15:44:06 -07:00
sd - > current = l ;
_send_msg ( sd , flipside , ( char * ) item - > label ) ;
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
break ;
}
2010-10-06 11:40:04 -07:00
}
2012-05-03 15:44:06 -07:00
_flipselector_unwalk ( sd ) ;
2010-11-09 12:26:47 -08:00
}
2010-10-06 11:40:04 -07:00
2010-11-09 12:26:47 -08:00
EAPI Eina_Bool
2011-11-15 17:39:39 -08:00
elm_flipselector_item_selected_get ( const Elm_Object_Item * it )
2010-11-09 12:26:47 -08:00
{
2011-11-15 17:39:39 -08:00
Elm_Flipselector_Item * item ;
2010-11-09 12:26:47 -08:00
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_ITEM_CHECK_OR_RETURN ( it , EINA_FALSE ) ;
2012-03-06 03:51:42 -08:00
item = ( Elm_Flipselector_Item * ) it ;
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_DATA_GET ( WIDGET ( item ) , sd ) ;
return eina_list_data_get ( sd - > current ) = = item ;
2010-10-06 11:40:04 -07:00
}
2011-11-15 17:39:39 -08:00
EAPI Elm_Object_Item *
2012-02-17 04:40:48 -08:00
elm_flipselector_item_prev_get ( const Elm_Object_Item * it )
2010-10-06 11:40:04 -07:00
{
2012-05-02 18:19:05 -07:00
Elm_Flipselector_Item * item = ( Elm_Flipselector_Item * ) it ;
2012-05-03 15:44:06 -07:00
Eina_List * l ;
ELM_FLIPSELECTOR_ITEM_CHECK_OR_RETURN ( it , NULL ) ;
ELM_FLIPSELECTOR_DATA_GET ( WIDGET ( item ) , sd ) ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
if ( ( ! sd - > items ) ) return NULL ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
l = eina_list_data_find_list ( sd - > items , it ) ;
2012-02-20 03:42:49 -08:00
if ( l & & l - > prev ) return DATA_GET ( l - > prev ) ;
2010-10-06 11:40:04 -07:00
return NULL ;
}
2011-11-15 17:39:39 -08:00
EAPI Elm_Object_Item *
2012-02-17 04:40:48 -08:00
elm_flipselector_item_next_get ( const Elm_Object_Item * it )
2010-10-06 11:40:04 -07:00
{
Eina_List * l ;
2012-03-06 03:51:42 -08:00
Elm_Flipselector_Item * item = ( Elm_Flipselector_Item * ) it ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_ITEM_CHECK_OR_RETURN ( it , NULL ) ;
ELM_FLIPSELECTOR_DATA_GET ( WIDGET ( item ) , sd ) ;
if ( ( ! sd - > items ) ) return NULL ;
2010-10-06 11:40:04 -07:00
2012-05-03 15:44:06 -07:00
l = eina_list_data_find_list ( sd - > items , it ) ;
2012-02-20 03:42:49 -08:00
if ( l & & l - > next ) return DATA_GET ( l - > next ) ;
2010-10-06 11:40:04 -07:00
return NULL ;
}
EAPI void
2012-05-03 15:44:06 -07:00
elm_flipselector_first_interval_set ( Evas_Object * obj ,
double interval )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_CHECK ( obj ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_obj_flipselector_first_interval_set ( interval ) ) ;
}
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
static void
_first_interval_set ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
double interval = va_arg ( * list , double ) ;
Elm_Flipselector_Smart_Data * sd = _pd ;
2012-05-03 15:44:06 -07:00
sd - > first_interval = interval ;
2010-10-06 11:40:04 -07:00
}
EAPI double
2012-03-05 16:27:33 -08:00
elm_flipselector_first_interval_get ( const Evas_Object * obj )
2010-10-06 11:40:04 -07:00
{
2012-05-03 15:44:06 -07:00
ELM_FLIPSELECTOR_CHECK ( obj ) 0 ;
2012-11-25 22:32:53 -08:00
double ret = 0 ;
eo_do ( ( Eo * ) obj , elm_obj_flipselector_first_interval_get ( & ret ) ) ;
return ret ;
}
static void
_first_interval_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
double * ret = va_arg ( * list , double * ) ;
Elm_Flipselector_Smart_Data * sd = _pd ;
* ret = sd - > first_interval ;
}
2010-10-06 11:40:04 -07:00
2012-11-25 22:32:53 -08:00
static void
_elm_flipselector_smart_focus_next_manager_is ( Eo * obj EINA_UNUSED , void * _pd EINA_UNUSED , va_list * list )
{
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
* ret = EINA_FALSE ;
2010-10-06 11:40:04 -07:00
}
2012-11-25 22:32:53 -08:00
static void
_elm_flipselector_smart_focus_direction_manager_is ( Eo * obj EINA_UNUSED , void * _pd EINA_UNUSED , va_list * list )
{
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
* ret = EINA_FALSE ;
}
static void
_class_constructor ( Eo_Class * klass )
{
const Eo_Op_Func_Description func_desc [ ] = {
EO_OP_FUNC ( EO_BASE_ID ( EO_BASE_SUB_ID_CONSTRUCTOR ) , _constructor ) ,
EO_OP_FUNC ( EVAS_OBJ_SMART_ID ( EVAS_OBJ_SMART_SUB_ID_ADD ) , _elm_flipselector_smart_add ) ,
EO_OP_FUNC ( EVAS_OBJ_SMART_ID ( EVAS_OBJ_SMART_SUB_ID_DEL ) , _elm_flipselector_smart_del ) ,
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_THEME ) , _elm_flipselector_smart_theme ) ,
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_EVENT ) , _elm_flipselector_smart_event ) ,
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_FOCUS_NEXT_MANAGER_IS ) , _elm_flipselector_smart_focus_next_manager_is ) ,
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_FOCUS_DIRECTION_MANAGER_IS ) , _elm_flipselector_smart_focus_direction_manager_is ) ,
EO_OP_FUNC ( ELM_OBJ_LAYOUT_ID ( ELM_OBJ_LAYOUT_SUB_ID_SIZING_EVAL ) , _elm_flipselector_smart_sizing_eval ) ,
EO_OP_FUNC ( ELM_OBJ_FLIPSELECTOR_ID ( ELM_OBJ_FLIPSELECTOR_SUB_ID_FLIP_NEXT ) , _flip_next ) ,
EO_OP_FUNC ( ELM_OBJ_FLIPSELECTOR_ID ( ELM_OBJ_FLIPSELECTOR_SUB_ID_FLIP_PREV ) , _flip_prev ) ,
EO_OP_FUNC ( ELM_OBJ_FLIPSELECTOR_ID ( ELM_OBJ_FLIPSELECTOR_SUB_ID_ITEM_APPEND ) , _item_append ) ,
EO_OP_FUNC ( ELM_OBJ_FLIPSELECTOR_ID ( ELM_OBJ_FLIPSELECTOR_SUB_ID_ITEM_PREPEND ) , _item_prepend ) ,
EO_OP_FUNC ( ELM_OBJ_FLIPSELECTOR_ID ( ELM_OBJ_FLIPSELECTOR_SUB_ID_ITEMS_GET ) , _items_get ) ,
EO_OP_FUNC ( ELM_OBJ_FLIPSELECTOR_ID ( ELM_OBJ_FLIPSELECTOR_SUB_ID_FIRST_ITEM_GET ) , _first_item_get ) ,
EO_OP_FUNC ( ELM_OBJ_FLIPSELECTOR_ID ( ELM_OBJ_FLIPSELECTOR_SUB_ID_LAST_ITEM_GET ) , _last_item_get ) ,
EO_OP_FUNC ( ELM_OBJ_FLIPSELECTOR_ID ( ELM_OBJ_FLIPSELECTOR_SUB_ID_SELECTED_ITEM_GET ) , _selected_item_get ) ,
EO_OP_FUNC ( ELM_OBJ_FLIPSELECTOR_ID ( ELM_OBJ_FLIPSELECTOR_SUB_ID_FIRST_INTERVAL_SET ) , _first_interval_set ) ,
EO_OP_FUNC ( ELM_OBJ_FLIPSELECTOR_ID ( ELM_OBJ_FLIPSELECTOR_SUB_ID_FIRST_INTERVAL_GET ) , _first_interval_get ) ,
EO_OP_FUNC_SENTINEL
} ;
eo_class_funcs_set ( klass , func_desc ) ;
}
static const Eo_Op_Description op_desc [ ] = {
EO_OP_DESCRIPTION ( ELM_OBJ_FLIPSELECTOR_SUB_ID_FLIP_NEXT , " Programmatically select the next item of a flip selector widget. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FLIPSELECTOR_SUB_ID_FLIP_PREV , " Programmatically select the previous item of a flip selector widget. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FLIPSELECTOR_SUB_ID_ITEM_APPEND , " Append a (text) item to a flip selector widget. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FLIPSELECTOR_SUB_ID_ITEM_PREPEND , " Prepend a (text) item to a flip selector widget. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FLIPSELECTOR_SUB_ID_ITEMS_GET , " Get the internal list of items in a given flip selector widget. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FLIPSELECTOR_SUB_ID_FIRST_ITEM_GET , " Get the first item in the given flip selector widget's list of items. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FLIPSELECTOR_SUB_ID_LAST_ITEM_GET , " Get the last item in the given flip selector widget's list of items. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FLIPSELECTOR_SUB_ID_SELECTED_ITEM_GET , " Get the currently selected item in a flip selector widget. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FLIPSELECTOR_SUB_ID_FIRST_INTERVAL_SET , " Set the interval on time updates for a user mouse button hold on a flip selector widget. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FLIPSELECTOR_SUB_ID_FIRST_INTERVAL_GET , " Get the interval on time updates for a user mouse button hold on a flip selector widget. " ) ,
EO_OP_DESCRIPTION_SENTINEL
} ;
static const Eo_Class_Description class_desc = {
EO_VERSION ,
MY_CLASS_NAME ,
EO_CLASS_TYPE_REGULAR ,
EO_CLASS_DESCRIPTION_OPS ( & ELM_OBJ_FLIPSELECTOR_BASE_ID , op_desc , ELM_OBJ_FLIPSELECTOR_SUB_ID_LAST ) ,
NULL ,
sizeof ( Elm_Flipselector_Smart_Data ) ,
_class_constructor ,
NULL
} ;
EO_DEFINE_CLASS ( elm_obj_flipselector_class_get , & class_desc , ELM_OBJ_LAYOUT_CLASS , NULL ) ;