2013-04-25 22:13:00 -07:00
# ifdef HAVE_CONFIG_H
# include "elementary_config.h"
# endif
2012-03-05 15:51:56 -08:00
# include <Elementary.h>
# include "elm_priv.h"
2012-08-30 09:46:34 -07:00
# include "elm_widget_popup.h"
2012-03-05 15:51:56 -08:00
2012-11-25 22:32:53 -08:00
EAPI Eo_Op ELM_OBJ_POPUP_BASE_ID = EO_NOOP ;
# define MY_CLASS ELM_OBJ_POPUP_CLASS
2012-03-05 15:51:56 -08:00
2013-11-07 03:44:22 -08:00
# define MY_CLASS_NAME "Elm_Popup"
# define MY_CLASS_NAME_LEGACY "elm_popup"
2012-11-25 22:32:53 -08:00
# define ELM_POPUP_ACTION_BUTTON_MAX 3
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
static void _button_remove ( Evas_Object * , int , Eina_Bool ) ;
2012-03-05 15:51:56 -08:00
2013-01-28 20:41:50 -08:00
static const char ACCESS_TITLE_PART [ ] = " access.title " ;
static const char ACCESS_BODY_PART [ ] = " access.body " ;
2013-02-21 03:44:49 -08:00
static const char CONTENT_PART [ ] = " elm.swallow.content " ;
2013-01-28 20:41:50 -08:00
2012-03-05 15:51:56 -08:00
static const char SIG_BLOCK_CLICKED [ ] = " block,clicked " ;
static const char SIG_TIMEOUT [ ] = " timeout " ;
2013-08-19 01:10:01 -07:00
static const char SIG_LANG_CHANGED [ ] = " language,changed " ;
2013-06-09 02:54:43 -07:00
2012-08-30 09:46:34 -07:00
static const Evas_Smart_Cb_Description _smart_callbacks [ ] = {
{ SIG_BLOCK_CLICKED , " " } ,
{ SIG_TIMEOUT , " " } ,
2013-08-19 05:40:33 -07:00
{ SIG_LANG_CHANGED , " " } ,
elm: do not declare SIG_FUCSED/SIG_UNFOCUSED if the const char is not used more than once.
ctxpopup, fileselector_button, naviframe, player, popup, bubble, button, calendar, check, clock, colorselector, datetime, diskselector, flipselector, gengrid.
2013-06-09 22:05:33 -07:00
{ " focused " , " " } , /**< handled by elm_widget */
{ " unfocused " , " " } , /**< handled by elm_widget */
2012-08-30 09:46:34 -07:00
{ NULL , NULL }
2012-03-05 15:51:56 -08:00
} ;
2012-11-25 22:10:53 -08:00
static void _on_content_del ( void * data , Evas * e , Evas_Object * obj , void * event_info ) ;
2013-04-23 04:30:15 -07:00
static void
_elm_popup_smart_translate ( Eo * obj EINA_UNUSED , void * _pd EINA_UNUSED , va_list * list )
{
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
Elm_Popup_Smart_Data * sd = _pd ;
Elm_Popup_Item * it ;
Eina_List * l ;
EINA_LIST_FOREACH ( sd - > items , l , it )
elm_widget_item_translate ( it ) ;
2013-08-19 01:10:01 -07:00
evas_object_smart_callback_call ( obj , SIG_LANG_CHANGED , NULL ) ;
2013-04-23 04:30:15 -07:00
if ( ret ) * ret = EINA_TRUE ;
}
2012-03-05 15:51:56 -08:00
static void
2012-08-30 09:46:34 -07:00
_visuals_set ( Evas_Object * obj )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
if ( ! sd - > title_text & & ! sd - > title_icon )
elm_layout_signal_emit ( obj , " elm,state,title_area,hidden " , " elm " ) ;
2012-03-05 15:51:56 -08:00
else
2012-08-30 09:46:34 -07:00
elm_layout_signal_emit ( obj , " elm,state,title_area,visible " , " elm " ) ;
2013-04-26 13:54:42 -07:00
if ( sd - > action_area )
2012-08-30 09:46:34 -07:00
elm_layout_signal_emit ( obj , " elm,state,action_area,visible " , " elm " ) ;
2012-03-05 15:51:56 -08:00
else
2012-08-30 09:46:34 -07:00
elm_layout_signal_emit ( obj , " elm,state,action_area,hidden " , " elm " ) ;
}
static void
_block_clicked_cb ( void * data ,
Evas_Object * obj __UNUSED__ ,
void * event_info __UNUSED__ )
{
evas_object_smart_callback_call ( data , SIG_BLOCK_CLICKED , NULL ) ;
}
static void
_timeout_cb ( void * data ,
Evas_Object * obj __UNUSED__ ,
void * event_info __UNUSED__ )
{
evas_object_hide ( data ) ;
evas_object_smart_callback_call ( data , SIG_TIMEOUT , NULL ) ;
}
2013-01-28 20:41:50 -08:00
static Evas_Object *
2013-01-28 21:49:34 -08:00
_access_object_get ( const Evas_Object * obj , const char * part )
2013-01-28 20:41:50 -08:00
{
Evas_Object * po , * ao ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd , NULL ) ;
2013-01-28 20:41:50 -08:00
po = ( Evas_Object * ) edje_object_part_object_get ( wd - > resize_obj , part ) ;
ao = evas_object_data_get ( po , " _part_access_obj " ) ;
return ao ;
}
2012-08-30 09:46:34 -07:00
static void
_on_show ( void * data __UNUSED__ ,
Evas * e __UNUSED__ ,
Evas_Object * obj ,
void * event_info __UNUSED__ )
{
ELM_POPUP_DATA_GET ( obj , sd ) ;
2013-08-10 02:52:35 -07:00
/* yeah, ugly, but again, this widget needs a rewrite */
if ( elm_widget_parent_get ( sd - > notify ) = = obj )
elm_widget_sub_object_del ( obj , sd - > notify ) ;
2012-08-30 09:46:34 -07:00
2013-02-16 00:52:10 -08:00
/* FIXME: Should be rewritten popup. This code is for arranging child-parent relation well. Without this code, Popup't top parent will be notify. And there will be no parent for notify. Terrible! */
elm_widget_sub_object_add ( elm_widget_parent_get ( obj ) , sd - > notify ) ;
2013-08-10 02:52:35 -07:00
2012-08-30 09:46:34 -07:00
elm_object_content_set ( sd - > notify , obj ) ;
2013-08-10 02:52:35 -07:00
evas_object_show ( sd - > notify ) ;
2013-02-15 02:39:00 -08:00
elm_object_focus_set ( obj , EINA_TRUE ) ;
2012-08-30 09:46:34 -07:00
}
static void
_on_hide ( void * data __UNUSED__ ,
Evas * e __UNUSED__ ,
Evas_Object * obj ,
void * event_info __UNUSED__ )
{
ELM_POPUP_DATA_GET ( obj , sd ) ;
2013-08-10 02:52:35 -07:00
//Revert the obj-tree again.
2012-08-30 09:46:34 -07:00
elm_object_content_unset ( sd - > notify ) ;
2013-08-10 02:52:35 -07:00
elm_widget_sub_object_add ( elm_widget_parent_get ( sd - > notify ) , obj ) ;
elm_widget_sub_object_add ( obj , sd - > notify ) ;
evas_object_hide ( sd - > notify ) ;
2013-02-18 22:51:19 -08:00
/* FIXME:elm_object_content_unset(notify) deletes callback to revert focus status. */
elm_object_focus_set ( obj , EINA_FALSE ) ;
2012-08-30 09:46:34 -07:00
}
static void
_scroller_size_calc ( Evas_Object * obj )
{
Evas_Coord h ;
Evas_Coord h_title = 0 ;
Evas_Coord h_action_area = 0 ;
const char * action_area_height ;
ELM_POPUP_DATA_GET ( obj , sd ) ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd ) ;
2012-08-30 09:46:34 -07:00
if ( ! sd - > items ) return ;
sd - > scr_size_recalc = EINA_FALSE ;
sd - > max_sc_h = - 1 ;
sd - > max_sc_w = - 1 ;
evas_object_geometry_get ( sd - > notify , NULL , NULL , NULL , & h ) ;
if ( sd - > title_text | | sd - > title_icon )
2012-11-25 22:32:53 -08:00
edje_object_part_geometry_get ( wd - > resize_obj ,
2012-08-30 09:46:34 -07:00
" elm.bg.title " , NULL , NULL , NULL , & h_title ) ;
2013-04-26 13:54:42 -07:00
if ( sd - > action_area )
2012-08-30 09:46:34 -07:00
{
action_area_height = edje_object_data_get (
elm_layout_edje_get ( sd - > action_area ) , " action_area_height " ) ;
if ( action_area_height )
h_action_area =
( int ) ( atoi ( action_area_height )
* elm_config_scale_get ( ) * elm_object_scale_get ( obj ) ) ;
}
2013-08-11 06:35:10 -07:00
sd - > max_sc_h = h - ( h_title + h_action_area ) ;
2012-08-30 09:46:34 -07:00
}
static void
_size_hints_changed_cb ( void * data ,
Evas * e __UNUSED__ ,
Evas_Object * obj __UNUSED__ ,
void * event_info __UNUSED__ )
{
elm_layout_sizing_eval ( data ) ;
2012-03-05 15:51:56 -08:00
}
static void
2012-08-30 09:46:34 -07:00
_list_del ( Elm_Popup_Smart_Data * sd )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
if ( ! sd - > scr ) return ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
evas_object_event_callback_del
( sd - > scr , EVAS_CALLBACK_CHANGED_SIZE_HINTS , _size_hints_changed_cb ) ;
evas_object_del ( sd - > tbl ) ;
sd - > scr = NULL ;
sd - > box = NULL ;
sd - > spacer = NULL ;
sd - > tbl = NULL ;
}
static void
_items_remove ( Elm_Popup_Smart_Data * sd )
{
2013-09-02 16:52:09 -07:00
Elm_Popup_Item * it ;
2012-08-30 09:46:34 -07:00
if ( ! sd - > items ) return ;
2013-09-02 16:52:09 -07:00
EINA_LIST_FREE ( sd - > items , it )
elm_widget_item_del ( it ) ;
2012-08-30 09:46:34 -07:00
sd - > items = NULL ;
2012-03-05 15:51:56 -08:00
}
static void
2012-11-25 22:32:53 -08:00
_elm_popup_smart_del ( Eo * obj , void * _pd , va_list * list EINA_UNUSED )
2012-03-05 15:51:56 -08:00
{
unsigned int i ;
2012-08-30 09:46:34 -07:00
2012-11-25 22:32:53 -08:00
Elm_Popup_Smart_Data * sd = _pd ;
2012-08-30 09:46:34 -07:00
evas_object_smart_callback_del
( sd - > notify , " block,clicked " , _block_clicked_cb ) ;
evas_object_smart_callback_del ( sd - > notify , " timeout " , _timeout_cb ) ;
2012-11-25 23:09:53 -08:00
evas_object_event_callback_del
( sd - > content , EVAS_CALLBACK_DEL , _on_content_del ) ;
2012-08-30 09:46:34 -07:00
evas_object_event_callback_del ( obj , EVAS_CALLBACK_SHOW , _on_show ) ;
2013-02-15 02:39:00 -08:00
2013-10-13 08:57:42 -07:00
sd - > last_button_number = 0 ;
2012-08-30 09:46:34 -07:00
2012-03-05 15:51:56 -08:00
for ( i = 0 ; i < ELM_POPUP_ACTION_BUTTON_MAX ; i + + )
{
2012-08-30 09:46:34 -07:00
if ( sd - > buttons [ i ] )
{
evas_object_del ( sd - > buttons [ i ] - > btn ) ;
free ( sd - > buttons [ i ] ) ;
sd - > buttons [ i ] = NULL ;
}
}
if ( sd - > items )
{
_items_remove ( sd ) ;
_list_del ( sd ) ;
2012-03-05 15:51:56 -08:00
}
2012-08-30 09:46:34 -07:00
2013-08-09 01:48:31 -07:00
// XXX? delete other objects? just to be sure.
ELM_SAFE_FREE ( sd - > notify , evas_object_del ) ;
ELM_SAFE_FREE ( sd - > title_icon , evas_object_del ) ;
ELM_SAFE_FREE ( sd - > content_area , evas_object_del ) ;
ELM_SAFE_FREE ( sd - > text_content_obj , evas_object_del ) ;
ELM_SAFE_FREE ( sd - > action_area , evas_object_del ) ;
ELM_SAFE_FREE ( sd - > box , evas_object_del ) ;
ELM_SAFE_FREE ( sd - > tbl , evas_object_del ) ;
ELM_SAFE_FREE ( sd - > spacer , evas_object_del ) ;
ELM_SAFE_FREE ( sd - > scr , evas_object_del ) ;
ELM_SAFE_FREE ( sd - > content , evas_object_del ) ;
ELM_SAFE_FREE ( sd - > title_text , eina_stringshare_del ) ;
2013-03-18 09:07:38 -07:00
eo_do_super ( obj , MY_CLASS , evas_obj_smart_del ( ) ) ;
2012-03-05 15:51:56 -08:00
}
static void
2012-08-30 09:46:34 -07:00
_mirrored_set ( Evas_Object * obj ,
Eina_Bool rtl )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
elm_object_mirrored_set ( sd - > notify , rtl ) ;
}
2013-02-27 04:03:13 -08:00
static void
_access_obj_process ( Eo * obj , Eina_Bool is_access )
{
Evas_Object * ao ;
ELM_POPUP_DATA_GET ( obj , sd ) ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd ) ;
2013-02-27 04:03:13 -08:00
if ( is_access )
{
if ( sd - > title_text )
{
ao = _elm_access_edje_object_part_object_register
( obj , wd - > resize_obj , ACCESS_TITLE_PART ) ;
2013-07-30 20:53:04 -07:00
_elm_access_text_set ( _elm_access_info_get ( ao ) ,
2013-02-27 04:03:13 -08:00
ELM_ACCESS_TYPE , E_ ( " Popup Title " ) ) ;
2013-07-30 20:53:04 -07:00
_elm_access_text_set ( _elm_access_info_get ( ao ) ,
2013-02-27 04:03:13 -08:00
ELM_ACCESS_INFO , sd - > title_text ) ;
}
if ( sd - > text_content_obj )
{
ao = _elm_access_edje_object_part_object_register
( obj , wd - > resize_obj , ACCESS_BODY_PART ) ;
2013-07-30 20:53:04 -07:00
_elm_access_text_set ( _elm_access_info_get ( ao ) ,
2013-02-27 04:03:13 -08:00
ELM_ACCESS_TYPE , E_ ( " Popup Body Text " ) ) ;
2013-07-30 20:53:04 -07:00
_elm_access_text_set ( _elm_access_info_get ( ao ) ,
2013-02-27 04:03:13 -08:00
ELM_ACCESS_INFO , elm_object_text_get ( sd - > text_content_obj ) ) ;
}
}
else
{
if ( sd - > title_text )
{
_elm_access_edje_object_part_object_unregister
( obj , wd - > resize_obj , ACCESS_TITLE_PART ) ;
}
if ( sd - > text_content_obj )
{
_elm_access_edje_object_part_object_unregister
( obj , wd - > resize_obj , ACCESS_BODY_PART ) ;
}
}
}
2012-11-25 22:32:53 -08:00
static void
_elm_popup_smart_theme ( Eo * obj , void * _pd , va_list * list )
2012-08-30 09:46:34 -07:00
{
2013-09-02 16:52:09 -07:00
Elm_Popup_Item * it ;
2012-03-05 15:51:56 -08:00
unsigned int i = 0 ;
2012-08-30 09:46:34 -07:00
Eina_List * elist ;
2013-10-04 06:39:30 -07:00
char buf [ 1024 ] , style [ 1024 ] ;
2012-08-30 09:46:34 -07:00
2012-11-25 22:32:53 -08:00
Eina_Bool int_ret ;
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
if ( ret ) * ret = EINA_FALSE ;
2012-08-30 09:46:34 -07:00
2012-11-25 22:32:53 -08:00
Elm_Popup_Smart_Data * sd = _pd ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd ) ;
2012-11-25 22:32:53 -08:00
2013-03-18 09:07:38 -07:00
eo_do_super ( obj , MY_CLASS , elm_wdg_theme ( & int_ret ) ) ;
2012-11-25 22:32:53 -08:00
if ( ! int_ret ) return ;
2012-03-05 15:51:56 -08:00
_mirrored_set ( obj , elm_widget_mirrored_get ( obj ) ) ;
2012-08-30 09:46:34 -07:00
2013-08-10 02:52:35 -07:00
//FIXME: theme set seems corrupted.
//if (elm_widget_parent_get(sd->notify) != obj)
2013-10-04 06:39:30 -07:00
snprintf ( style , sizeof ( style ) , " popup/%s " , elm_widget_style_get ( obj ) ) ;
elm_widget_style_set ( sd - > notify , style ) ;
2013-08-10 00:41:25 -07:00
2013-04-26 13:54:42 -07:00
if ( sd - > action_area )
2012-03-05 15:51:56 -08:00
{
2013-10-13 08:57:42 -07:00
snprintf ( buf , sizeof ( buf ) , " buttons%i " , sd - > last_button_number ) ;
2013-10-04 06:39:30 -07:00
if ( ! elm_layout_theme_set ( sd - > action_area , " popup " , buf , style ) )
2013-03-01 18:04:31 -08:00
CRITICAL ( " Failed to set layout! " ) ;
2012-03-05 15:51:56 -08:00
for ( i = 0 ; i < ELM_POPUP_ACTION_BUTTON_MAX ; i + + )
{
2012-08-30 09:46:34 -07:00
if ( ! sd - > buttons [ i ] ) continue ;
2013-10-04 06:39:30 -07:00
elm_object_style_set ( sd - > buttons [ i ] - > btn , style ) ;
2012-03-05 15:51:56 -08:00
}
}
2013-10-04 06:39:30 -07:00
if ( ! elm_layout_theme_set ( sd - > content_area , " popup " , " content " , style ) )
2013-03-01 18:04:31 -08:00
CRITICAL ( " Failed to set layout! " ) ;
2012-08-30 09:46:34 -07:00
if ( sd - > text_content_obj )
2013-10-04 06:39:30 -07:00
elm_object_style_set ( sd - > text_content_obj , style ) ;
2012-08-30 09:46:34 -07:00
else if ( sd - > items )
2012-03-05 15:51:56 -08:00
{
2013-09-02 16:52:09 -07:00
EINA_LIST_FOREACH ( sd - > items , elist , it )
2012-03-05 15:51:56 -08:00
{
2013-10-04 06:39:30 -07:00
if ( ! elm_layout_theme_set ( VIEW ( it ) , " popup " , " item " , style ) )
2013-09-09 03:15:26 -07:00
CRITICAL ( " Failed to set layout! " ) ;
else
2012-03-05 15:51:56 -08:00
{
2013-09-09 03:15:26 -07:00
if ( it - > label )
{
elm_layout_text_set ( VIEW ( it ) , " elm.text " , it - > label ) ;
elm_layout_signal_emit ( VIEW ( it ) ,
" elm,state,item,text,visible " ,
" elm " ) ;
}
if ( it - > icon )
elm_layout_signal_emit ( VIEW ( it ) ,
" elm,state,item,icon,visible " ,
" elm " ) ;
if ( it - > disabled )
elm_layout_signal_emit ( VIEW ( it ) ,
" elm,state,item,disabled " , " elm " ) ;
evas_object_show ( VIEW ( it ) ) ;
edje_object_message_signal_process (
elm_layout_edje_get ( VIEW ( it ) ) ) ;
2012-03-05 15:51:56 -08:00
}
}
_scroller_size_calc ( obj ) ;
}
2012-08-30 09:46:34 -07:00
if ( sd - > title_text )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
elm_layout_text_set ( obj , " elm.text.title " , sd - > title_text ) ;
elm_layout_signal_emit ( obj , " elm,state,title,text,visible " , " elm " ) ;
2012-03-05 15:51:56 -08:00
}
2012-08-30 09:46:34 -07:00
if ( sd - > title_icon )
elm_layout_signal_emit ( obj , " elm,state,title,icon,visible " , " elm " ) ;
_visuals_set ( obj ) ;
2012-11-25 22:32:53 -08:00
edje_object_message_signal_process ( wd - > resize_obj ) ;
2012-08-30 09:46:34 -07:00
elm_layout_sizing_eval ( obj ) ;
2013-02-27 04:03:13 -08:00
/* access */
if ( _elm_config - > access_mode ) _access_obj_process ( obj , EINA_TRUE ) ;
2012-11-25 22:32:53 -08:00
if ( ret ) * ret = EINA_TRUE ;
2012-03-05 15:51:56 -08:00
}
static void
2013-09-02 16:52:09 -07:00
_item_sizing_eval ( Elm_Popup_Item * it )
2012-03-05 15:51:56 -08:00
{
Evas_Coord min_w = - 1 , min_h = - 1 , max_w = - 1 , max_h = - 1 ;
2013-09-02 19:08:41 -07:00
Evas_Object * edje = elm_layout_edje_get ( VIEW ( it ) ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
edje_object_size_min_restricted_calc
2013-09-02 19:08:41 -07:00
( edje , & min_w , & min_h , min_w , min_h ) ;
evas_object_size_hint_min_set ( edje , min_w , min_h ) ;
evas_object_size_hint_max_set ( edje , max_w , max_h ) ;
2012-03-05 15:51:56 -08:00
}
static void
2012-11-25 22:32:53 -08:00
_elm_popup_smart_sizing_eval ( Eo * obj , void * _pd , va_list * list EINA_UNUSED )
2012-03-05 15:51:56 -08:00
{
Eina_List * elist ;
2013-09-02 16:52:09 -07:00
Elm_Popup_Item * it ;
2012-07-23 05:35:48 -07:00
Evas_Coord h_box = 0 , minh_box = 0 ;
2013-10-16 22:18:22 -07:00
Evas_Coord minw = - 1 , minh = - 1 ;
2012-03-05 15:51:56 -08:00
2012-11-25 22:32:53 -08:00
Elm_Popup_Smart_Data * sd = _pd ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd ) ;
2012-08-30 09:46:34 -07:00
if ( sd - > items )
2012-03-05 15:51:56 -08:00
{
2013-09-02 16:52:09 -07:00
EINA_LIST_FOREACH ( sd - > items , elist , it )
2012-03-05 15:51:56 -08:00
{
2013-09-02 16:52:09 -07:00
_item_sizing_eval ( it ) ;
2013-09-02 19:08:41 -07:00
evas_object_size_hint_min_get ( elm_layout_edje_get ( VIEW ( it ) ) ,
NULL , & minh_box ) ;
2012-07-23 05:35:48 -07:00
if ( minh_box ! = - 1 ) h_box + = minh_box ;
2012-03-05 15:51:56 -08:00
}
2012-08-30 09:46:34 -07:00
evas_object_size_hint_min_set ( sd - > spacer , 0 , MIN ( h_box , sd - > max_sc_h ) ) ;
evas_object_size_hint_max_set ( sd - > spacer , - 1 , sd - > max_sc_h ) ;
evas_object_size_hint_min_get ( sd - > scr , & minw , & minh ) ;
evas_object_size_hint_max_get ( sd - > scr , & minw , & minh ) ;
2012-03-05 15:51:56 -08:00
}
2012-08-30 09:46:34 -07:00
2012-11-25 22:32:53 -08:00
edje_object_size_min_calc ( wd - > resize_obj , & minw , & minh ) ;
2012-08-30 09:46:34 -07:00
2012-03-05 15:51:56 -08:00
evas_object_size_hint_min_set ( obj , minw , minh ) ;
2013-10-16 22:18:22 -07:00
evas_object_size_hint_max_set ( obj , - 1 , - 1 ) ;
2012-08-30 09:46:34 -07:00
}
From: Kim Shinwoo <kimcinoo.efl@gmail.com>
Subject: [E-devel] [patch][elementary] popup - getting proper geometry value]
current popup does not give proper geometry value,
evas_object_geometry_get(popup, &x, &y, &w, &h) gives 0, 0, 0, 0.
the patch resolves it, but it would be not a good way to get geometry
value. which is the best way to set obj->cur.geometry.x(y,w,h)?
please enlighten me. thanks.
SVN revision: 74409
2012-07-25 20:57:25 -07:00
2012-11-25 22:32:53 -08:00
static void
_elm_popup_smart_sub_object_del ( Eo * obj , void * _pd , va_list * list )
2012-08-30 09:46:34 -07:00
{
2013-09-02 16:52:09 -07:00
Elm_Popup_Item * it ;
2012-08-30 09:46:34 -07:00
2012-11-25 22:32:53 -08:00
Evas_Object * sobj = va_arg ( * list , Evas_Object * ) ;
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
if ( ret ) * ret = EINA_FALSE ;
Eina_Bool int_ret ;
Elm_Popup_Smart_Data * sd = _pd ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd ) ;
2012-08-30 09:46:34 -07:00
2013-03-18 09:07:38 -07:00
eo_do_super ( obj , MY_CLASS , elm_wdg_sub_object_del ( sobj , & int_ret ) ) ;
2012-11-25 22:32:53 -08:00
if ( ! int_ret ) return ;
2012-08-30 09:46:34 -07:00
if ( sobj = = sd - > title_icon )
{
elm_layout_signal_emit ( obj , " elm,state,title,icon,hidden " , " elm " ) ;
2012-11-25 22:32:53 -08:00
edje_object_message_signal_process ( wd - > resize_obj ) ;
2012-08-30 09:46:34 -07:00
sd - > title_icon = NULL ;
}
2013-09-02 16:52:09 -07:00
else if ( ( it =
2012-08-30 09:46:34 -07:00
evas_object_data_get ( sobj , " _popup_icon_parent_item " ) ) ! = NULL )
{
2013-09-02 16:52:09 -07:00
if ( sobj = = it - > icon )
2012-08-30 09:46:34 -07:00
{
2013-09-02 19:08:41 -07:00
elm_layout_content_unset ( VIEW ( it ) , CONTENT_PART ) ;
elm_layout_signal_emit ( VIEW ( it ) ,
" elm,state,item,icon,hidden " , " elm " ) ;
2013-09-02 16:52:09 -07:00
it - > icon = NULL ;
2012-08-30 09:46:34 -07:00
}
}
2012-11-25 22:32:53 -08:00
if ( ret ) * ret = EINA_TRUE ;
2012-03-05 15:51:56 -08:00
}
static void
2012-08-30 09:46:34 -07:00
_on_content_del ( void * data ,
Evas * e __UNUSED__ ,
Evas_Object * obj __UNUSED__ ,
void * event_info __UNUSED__ )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( data , sd ) ;
sd - > content = NULL ;
elm_layout_sizing_eval ( data ) ;
2012-03-05 15:51:56 -08:00
}
static void
2012-08-30 09:46:34 -07:00
_on_text_content_del ( void * data ,
Evas * e __UNUSED__ ,
Evas_Object * obj __UNUSED__ ,
void * event_info __UNUSED__ )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( data , sd ) ;
sd - > text_content_obj = NULL ;
elm_layout_sizing_eval ( data ) ;
}
static void
_on_table_del ( void * data ,
Evas * e __UNUSED__ ,
Evas_Object * obj __UNUSED__ ,
void * event_info __UNUSED__ )
{
ELM_POPUP_DATA_GET ( data , sd ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
sd - > tbl = NULL ;
sd - > spacer = NULL ;
sd - > scr = NULL ;
sd - > box = NULL ;
elm_layout_sizing_eval ( data ) ;
}
static void
_on_button_del ( void * data ,
Evas * e __UNUSED__ ,
Evas_Object * obj ,
void * event_info __UNUSED__ )
{
int i ;
ELM_POPUP_DATA_GET ( data , sd ) ;
for ( i = 0 ; i < ELM_POPUP_ACTION_BUTTON_MAX ; i + + )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
if ( sd - > buttons [ i ] & & obj = = sd - > buttons [ i ] - > btn & &
sd - > buttons [ i ] - > delete_me = = EINA_TRUE )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
_button_remove ( data , i , EINA_FALSE ) ;
break ;
2012-03-05 15:51:56 -08:00
}
}
2012-08-30 09:46:34 -07:00
}
static void
_button_remove ( Evas_Object * obj ,
int pos ,
Eina_Bool delete )
{
int i = 0 ;
char buf [ 128 ] ;
ELM_POPUP_DATA_GET ( obj , sd ) ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd ) ;
2012-08-30 09:46:34 -07:00
2013-10-13 08:57:42 -07:00
if ( ! sd - > last_button_number ) return ;
2012-08-30 09:46:34 -07:00
if ( ! sd - > buttons [ pos ] ) return ;
2013-10-13 08:57:42 -07:00
if ( delete )
{
evas_object_del ( sd - > buttons [ pos ] - > btn ) ;
}
else
{
evas_object_event_callback_del
( sd - > buttons [ pos ] - > btn , EVAS_CALLBACK_DEL , _on_button_del ) ;
snprintf ( buf , sizeof ( buf ) , " elm.swallow.content.button%i " , pos + 1 ) ;
elm_object_part_content_unset ( sd - > action_area , buf ) ;
}
2012-08-30 09:46:34 -07:00
2013-05-29 04:15:12 -07:00
ELM_SAFE_FREE ( sd - > buttons [ pos ] , free ) ;
2012-08-30 09:46:34 -07:00
2013-10-13 08:57:42 -07:00
for ( i = ELM_POPUP_ACTION_BUTTON_MAX - 1 ; i > = 0 ; i - - )
2012-03-05 15:51:56 -08:00
{
2013-10-13 08:57:42 -07:00
if ( sd - > buttons [ i ] )
2012-03-05 15:51:56 -08:00
{
2013-10-13 08:57:42 -07:00
sd - > last_button_number = i + 1 ;
break ;
2012-03-05 15:51:56 -08:00
}
}
2012-08-30 09:46:34 -07:00
2013-10-13 08:57:42 -07:00
if ( ! sd - > last_button_number )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
_visuals_set ( obj ) ;
2013-04-26 13:54:42 -07:00
evas_object_del ( sd - > action_area ) ;
sd - > action_area = NULL ;
2012-11-25 22:32:53 -08:00
edje_object_message_signal_process ( wd - > resize_obj ) ;
2012-03-05 15:51:56 -08:00
}
2012-08-30 09:46:34 -07:00
else
2012-03-05 15:51:56 -08:00
{
2013-10-04 06:39:30 -07:00
char style [ 1024 ] ;
2013-12-02 02:43:46 -08:00
2013-10-04 06:39:30 -07:00
snprintf ( style , sizeof ( style ) , " popup/%s " , elm_widget_style_get ( obj ) ) ;
2013-10-13 08:57:42 -07:00
snprintf ( buf , sizeof ( buf ) , " buttons%i " , sd - > last_button_number ) ;
2013-10-04 06:39:30 -07:00
if ( ! elm_layout_theme_set ( sd - > action_area , " popup " , buf , style ) )
2013-03-01 18:04:31 -08:00
CRITICAL ( " Failed to set layout! " ) ;
2012-03-05 15:51:56 -08:00
}
}
static void
2012-08-30 09:46:34 -07:00
_layout_change_cb ( void * data ,
Evas_Object * obj __UNUSED__ ,
const char * emission __UNUSED__ ,
const char * source __UNUSED__ )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
elm_layout_sizing_eval ( data ) ;
2012-03-05 15:51:56 -08:00
}
static void
2012-08-30 09:46:34 -07:00
_restack_cb ( void * data __UNUSED__ ,
Evas * e __UNUSED__ ,
Evas_Object * obj ,
void * event_info __UNUSED__ )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
evas_object_layer_set ( sd - > notify , evas_object_layer_get ( obj ) ) ;
2012-03-05 15:51:56 -08:00
}
static void
2012-08-30 09:46:34 -07:00
_list_add ( Evas_Object * obj )
2012-03-05 15:51:56 -08:00
{
2013-10-04 06:39:30 -07:00
char style [ 1024 ] ;
2013-12-02 02:43:46 -08:00
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd ) ;
2012-03-05 15:51:56 -08:00
2013-08-21 10:02:30 -07:00
//Table
2012-08-30 09:46:34 -07:00
sd - > tbl = elm_table_add ( obj ) ;
2013-08-21 10:02:30 -07:00
evas_object_event_callback_add ( sd - > tbl , EVAS_CALLBACK_DEL ,
_on_table_del , obj ) ;
edje_object_part_swallow ( wd - > resize_obj , CONTENT_PART , sd - > tbl ) ;
2012-08-30 09:46:34 -07:00
evas_object_show ( sd - > tbl ) ;
2013-08-21 10:02:30 -07:00
//Spacer
2012-08-30 09:46:34 -07:00
sd - > spacer = evas_object_rectangle_add ( evas_object_evas_get ( obj ) ) ;
evas_object_color_set ( sd - > spacer , 0 , 0 , 0 , 0 ) ;
elm_table_pack ( sd - > tbl , sd - > spacer , 0 , 0 , 1 , 1 ) ;
//Scroller
2013-10-04 06:39:30 -07:00
snprintf ( style , sizeof ( style ) , " popup/%s " , elm_widget_style_get ( obj ) ) ;
2012-08-30 09:46:34 -07:00
sd - > scr = elm_scroller_add ( obj ) ;
2013-10-04 06:39:30 -07:00
elm_widget_style_set ( sd - > scr , style ) ;
2012-08-30 09:46:34 -07:00
elm_scroller_content_min_limit ( sd - > scr , EINA_TRUE , EINA_FALSE ) ;
elm_scroller_bounce_set ( sd - > scr , EINA_FALSE , EINA_TRUE ) ;
2013-08-21 10:02:30 -07:00
evas_object_size_hint_weight_set ( sd - > scr ,
EVAS_HINT_EXPAND , EVAS_HINT_EXPAND ) ;
2012-08-30 09:46:34 -07:00
evas_object_size_hint_align_set ( sd - > scr , EVAS_HINT_FILL , EVAS_HINT_FILL ) ;
2013-08-21 10:02:30 -07:00
evas_object_event_callback_add ( sd - > scr , EVAS_CALLBACK_CHANGED_SIZE_HINTS ,
_size_hints_changed_cb , obj ) ;
2012-08-30 09:46:34 -07:00
elm_table_pack ( sd - > tbl , sd - > scr , 0 , 0 , 1 , 1 ) ;
evas_object_show ( sd - > scr ) ;
//Box
sd - > box = elm_box_add ( obj ) ;
evas_object_size_hint_weight_set ( sd - > box , EVAS_HINT_EXPAND , 0.0 ) ;
evas_object_size_hint_align_set ( sd - > box , EVAS_HINT_FILL , 0.0 ) ;
elm_object_content_set ( sd - > scr , sd - > box ) ;
evas_object_show ( sd - > box ) ;
2012-03-05 15:51:56 -08:00
}
static void
2012-08-30 09:46:34 -07:00
_item_select_cb ( void * data ,
Evas_Object * obj __UNUSED__ ,
const char * emission __UNUSED__ ,
const char * source __UNUSED__ )
2012-03-05 15:51:56 -08:00
{
2013-09-02 16:52:09 -07:00
Elm_Popup_Item * it = data ;
2012-03-05 15:51:56 -08:00
2013-09-02 16:52:09 -07:00
if ( ! it | | it - > disabled ) return ;
if ( it - > func )
it - > func ( ( void * ) it - > base . data , WIDGET ( it ) , data ) ;
2012-03-05 15:51:56 -08:00
}
static void
2013-09-02 16:52:09 -07:00
_item_text_set ( Elm_Popup_Item * it ,
2012-08-30 09:46:34 -07:00
const char * label )
2012-03-05 15:51:56 -08:00
{
2013-09-02 16:52:09 -07:00
if ( ! eina_stringshare_replace ( & it - > label , label ) ) return ;
2012-08-30 09:46:34 -07:00
2013-09-02 19:08:41 -07:00
elm_layout_text_set ( VIEW ( it ) , " elm.text " , label ) ;
2012-03-05 15:51:56 -08:00
2013-09-02 16:52:09 -07:00
if ( it - > label )
2013-09-02 19:08:41 -07:00
elm_layout_signal_emit ( VIEW ( it ) ,
" elm,state,item,text,visible " , " elm " ) ;
2012-08-30 09:46:34 -07:00
else
2013-09-02 19:08:41 -07:00
elm_layout_signal_emit ( VIEW ( it ) ,
" elm,state,item,text,hidden " , " elm " ) ;
2012-08-30 09:46:34 -07:00
2013-09-02 19:08:41 -07:00
edje_object_message_signal_process ( elm_layout_edje_get ( VIEW ( it ) ) ) ;
2012-03-05 15:51:56 -08:00
}
static void
2013-09-02 16:52:09 -07:00
_item_text_set_hook ( Elm_Object_Item * item ,
2012-08-30 09:46:34 -07:00
const char * part ,
const char * label )
{
2013-09-02 16:52:09 -07:00
Elm_Popup_Item * it = ( Elm_Popup_Item * ) item ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
ELM_POPUP_ITEM_CHECK_OR_RETURN ( it ) ;
if ( ( ! part ) | | ( ! strcmp ( part , " default " ) ) )
{
2013-09-02 16:52:09 -07:00
_item_text_set ( it , label ) ;
2012-08-30 09:46:34 -07:00
return ;
}
2013-09-02 16:52:09 -07:00
WRN ( " The part name is invalid! : popup=%p " , WIDGET ( it ) ) ;
2012-03-05 15:51:56 -08:00
}
2012-08-30 09:46:34 -07:00
static const char *
2013-09-02 16:52:09 -07:00
_item_text_get_hook ( const Elm_Object_Item * item ,
2012-08-30 09:46:34 -07:00
const char * part )
2012-03-05 15:51:56 -08:00
{
2013-09-02 16:52:09 -07:00
Elm_Popup_Item * it = ( Elm_Popup_Item * ) item ;
2012-08-30 09:46:34 -07:00
ELM_POPUP_ITEM_CHECK_OR_RETURN ( it , NULL ) ;
if ( ( ! part ) | | ( ! strcmp ( part , " default " ) ) )
2013-09-02 16:52:09 -07:00
return it - > label ;
2012-08-30 09:46:34 -07:00
2013-09-02 16:52:09 -07:00
WRN ( " The part name is invalid! : popup=%p " , WIDGET ( it ) ) ;
2012-08-30 09:46:34 -07:00
return NULL ;
2012-03-05 15:51:56 -08:00
}
static void
2013-09-02 16:52:09 -07:00
_item_icon_set ( Elm_Popup_Item * it ,
2012-08-30 09:46:34 -07:00
Evas_Object * icon )
2012-03-05 15:51:56 -08:00
{
2013-09-02 16:52:09 -07:00
if ( it - > icon = = icon ) return ;
2012-08-30 09:46:34 -07:00
2013-09-02 16:52:09 -07:00
if ( it - > icon )
evas_object_del ( it - > icon ) ;
2012-08-30 09:46:34 -07:00
2013-09-02 16:52:09 -07:00
it - > icon = icon ;
if ( it - > icon )
2012-03-05 15:51:56 -08:00
{
2013-09-02 16:52:09 -07:00
elm_widget_sub_object_add ( WIDGET ( it ) , it - > icon ) ;
evas_object_data_set ( it - > icon , " _popup_icon_parent_item " , it ) ;
2013-09-02 19:08:41 -07:00
elm_layout_content_set ( VIEW ( it ) , CONTENT_PART , it - > icon ) ;
elm_layout_signal_emit ( VIEW ( it ) , " elm,state,item,icon,visible " , " elm " ) ;
2012-03-05 15:51:56 -08:00
}
2012-08-30 09:46:34 -07:00
else
2013-09-02 19:08:41 -07:00
elm_layout_signal_emit ( VIEW ( it ) , " elm,state,item,icon,hidden " , " elm " ) ;
2012-08-30 09:46:34 -07:00
2013-09-02 19:08:41 -07:00
edje_object_message_signal_process ( elm_layout_edje_get ( VIEW ( it ) ) ) ;
2012-03-05 15:51:56 -08:00
}
static void
2013-09-02 16:52:09 -07:00
_item_content_set_hook ( Elm_Object_Item * item ,
2012-08-30 09:46:34 -07:00
const char * part ,
Evas_Object * content )
2012-03-05 15:51:56 -08:00
{
2013-09-02 16:52:09 -07:00
Elm_Popup_Item * it = ( Elm_Popup_Item * ) item ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
ELM_POPUP_ITEM_CHECK_OR_RETURN ( it ) ;
if ( ( ! ( part ) ) | | ( ! strcmp ( part , " default " ) ) )
2013-09-02 16:52:09 -07:00
_item_icon_set ( it , content ) ;
2012-08-30 09:46:34 -07:00
else
2013-09-02 16:52:09 -07:00
WRN ( " The part name is invalid! : popup=%p " , WIDGET ( it ) ) ;
2012-08-30 09:46:34 -07:00
}
static Evas_Object *
2013-09-02 16:52:09 -07:00
_item_content_get_hook ( const Elm_Object_Item * item ,
2012-08-30 09:46:34 -07:00
const char * part )
{
2013-09-02 16:52:09 -07:00
Elm_Popup_Item * it = ( Elm_Popup_Item * ) item ;
2012-08-30 09:46:34 -07:00
ELM_POPUP_ITEM_CHECK_OR_RETURN ( it , NULL ) ;
if ( ( ! ( part ) ) | | ( ! strcmp ( part , " default " ) ) )
2013-09-02 16:52:09 -07:00
return it - > icon ;
2012-08-30 09:46:34 -07:00
2013-09-02 16:52:09 -07:00
WRN ( " The part name is invalid! : popup=%p " , WIDGET ( it ) ) ;
2012-08-30 09:46:34 -07:00
return NULL ;
}
static Evas_Object *
2013-09-02 16:52:09 -07:00
_item_icon_unset ( Elm_Popup_Item * it )
2012-08-30 09:46:34 -07:00
{
2013-09-02 16:52:09 -07:00
Evas_Object * icon = it - > icon ;
2012-08-30 09:46:34 -07:00
2013-09-02 16:52:09 -07:00
if ( ! it - > icon ) return NULL ;
elm_widget_sub_object_del ( WIDGET ( it ) , icon ) ;
2012-08-30 09:46:34 -07:00
evas_object_data_del ( icon , " _popup_icon_parent_item " ) ;
2013-09-02 19:08:41 -07:00
elm_layout_content_unset ( VIEW ( it ) , CONTENT_PART ) ;
elm_layout_signal_emit ( VIEW ( it ) , " elm,state,item,icon,hidden " , " elm " ) ;
2013-09-02 16:52:09 -07:00
it - > icon = NULL ;
2012-08-30 09:46:34 -07:00
return icon ;
}
static Evas_Object *
2013-09-02 16:52:09 -07:00
_item_content_unset_hook ( const Elm_Object_Item * item ,
2012-08-30 09:46:34 -07:00
const char * part )
{
Evas_Object * content = NULL ;
2013-09-02 16:52:09 -07:00
Elm_Popup_Item * it = ( Elm_Popup_Item * ) item ;
2012-08-30 09:46:34 -07:00
ELM_POPUP_ITEM_CHECK_OR_RETURN ( it , NULL ) ;
if ( ( ! ( part ) ) | | ( ! strcmp ( part , " default " ) ) )
2013-09-02 16:52:09 -07:00
content = _item_icon_unset ( it ) ;
2012-08-30 09:46:34 -07:00
else
2013-09-02 16:52:09 -07:00
WRN ( " The part name is invalid! : popup=%p " , WIDGET ( it ) ) ;
2012-08-30 09:46:34 -07:00
return content ;
2012-03-05 15:51:56 -08:00
}
static void
2013-09-02 16:52:09 -07:00
_item_disable_hook ( Elm_Object_Item * item )
2012-03-05 15:51:56 -08:00
{
2013-09-02 16:52:09 -07:00
Elm_Popup_Item * it = ( Elm_Popup_Item * ) item ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
ELM_POPUP_ITEM_CHECK_OR_RETURN ( it ) ;
if ( elm_widget_item_disabled_get ( it ) )
2013-09-02 19:08:41 -07:00
elm_layout_signal_emit ( VIEW ( it ) , " elm,state,item,disabled " , " elm " ) ;
2012-08-30 09:46:34 -07:00
else
2013-09-02 19:08:41 -07:00
elm_layout_signal_emit ( VIEW ( it ) , " elm,state,item,enabled " , " elm " ) ;
2012-03-05 15:51:56 -08:00
}
static void
2013-09-02 16:52:09 -07:00
_item_del_pre_hook ( Elm_Object_Item * item )
2012-03-05 15:51:56 -08:00
{
2013-09-02 16:52:09 -07:00
Elm_Popup_Item * it = ( Elm_Popup_Item * ) item ;
2012-08-30 09:46:34 -07:00
ELM_POPUP_ITEM_CHECK_OR_RETURN ( it ) ;
2013-09-02 16:52:09 -07:00
ELM_POPUP_DATA_GET ( WIDGET ( it ) , sd ) ;
2012-08-30 09:46:34 -07:00
2013-09-02 16:52:09 -07:00
if ( it - > icon )
evas_object_del ( it - > icon ) ;
2012-03-05 15:51:56 -08:00
2013-09-02 16:52:09 -07:00
eina_stringshare_del ( it - > label ) ;
sd - > items = eina_list_remove ( sd - > items , it ) ;
2012-08-30 09:46:34 -07:00
if ( ! eina_list_count ( sd - > items ) )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
sd - > items = NULL ;
_list_del ( sd ) ;
2012-03-05 15:51:56 -08:00
}
}
static void
2012-08-30 09:46:34 -07:00
_item_signal_emit_hook ( Elm_Object_Item * it ,
const char * emission ,
const char * source )
2012-03-05 15:51:56 -08:00
{
2013-09-02 19:08:41 -07:00
elm_layout_signal_emit ( VIEW ( it ) , emission , source ) ;
2012-03-05 15:51:56 -08:00
}
static void
2013-09-02 16:52:09 -07:00
_item_new ( Elm_Popup_Item * it )
{
2013-10-04 06:39:30 -07:00
char style [ 1024 ] ;
2013-12-02 02:43:46 -08:00
2013-09-02 16:52:09 -07:00
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_content_set_hook_set ( it , _item_content_set_hook ) ;
elm_widget_item_content_get_hook_set ( it , _item_content_get_hook ) ;
elm_widget_item_content_unset_hook_set ( it , _item_content_unset_hook ) ;
elm_widget_item_disable_hook_set ( it , _item_disable_hook ) ;
elm_widget_item_del_pre_hook_set ( it , _item_del_pre_hook ) ;
elm_widget_item_signal_emit_hook_set ( it , _item_signal_emit_hook ) ;
2013-09-02 19:08:41 -07:00
VIEW ( it ) = elm_layout_add ( WIDGET ( it ) ) ;
2013-12-02 02:43:46 -08:00
2013-10-04 06:39:30 -07:00
snprintf ( style , sizeof ( style ) , " popup/%s " , elm_widget_style_get ( WIDGET ( it ) ) ) ;
if ( ! elm_layout_theme_set ( VIEW ( it ) , " popup " , " item " , style ) )
2013-09-09 03:15:26 -07:00
CRITICAL ( " Failed to set layout! " ) ;
else
{
2013-10-11 22:10:16 -07:00
elm_layout_signal_callback_add ( VIEW ( it ) , " elm,action,click " , " * " ,
2013-09-09 03:15:26 -07:00
_item_select_cb , it ) ;
evas_object_size_hint_align_set ( VIEW ( it ) , EVAS_HINT_FILL , EVAS_HINT_FILL ) ;
evas_object_show ( VIEW ( it ) ) ;
}
2012-08-30 09:46:34 -07:00
}
static Eina_Bool
_title_text_set ( Evas_Object * obj ,
const char * text )
2012-03-05 15:51:56 -08:00
{
2013-01-28 20:41:50 -08:00
Evas_Object * ao ;
2012-03-05 15:51:56 -08:00
Eina_Bool title_visibility_old , title_visibility_current ;
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd , EINA_FALSE ) ;
2012-08-30 09:46:34 -07:00
if ( sd - > title_text = = text ) return EINA_TRUE ;
title_visibility_old = ( sd - > title_text ) | | ( sd - > title_icon ) ;
eina_stringshare_replace ( & sd - > title_text , text ) ;
//bare edje here because we're inside the hook, already
edje_object_part_text_escaped_set
2012-11-25 22:32:53 -08:00
( wd - > resize_obj , " elm.text.title " , text ) ;
2012-07-26 19:27:16 -07:00
2013-01-28 20:41:50 -08:00
/* access */
if ( _elm_config - > access_mode )
2012-08-30 09:46:34 -07:00
{
2013-01-28 20:41:50 -08:00
ao = _access_object_get ( obj , ACCESS_TITLE_PART ) ;
2013-01-28 21:49:34 -08:00
if ( ! ao )
{
ao = _elm_access_edje_object_part_object_register
( obj , wd - > resize_obj , ACCESS_TITLE_PART ) ;
2013-07-30 20:53:04 -07:00
_elm_access_text_set ( _elm_access_info_get ( ao ) ,
2013-01-28 21:49:34 -08:00
ELM_ACCESS_TYPE , E_ ( " Popup Title " ) ) ;
}
2013-07-30 20:53:04 -07:00
_elm_access_text_set ( _elm_access_info_get ( ao ) , ELM_ACCESS_INFO , text ) ;
2012-08-30 09:46:34 -07:00
}
2012-07-26 19:27:16 -07:00
2012-08-30 09:46:34 -07:00
if ( sd - > title_text )
elm_layout_signal_emit ( obj , " elm,state,title,text,visible " , " elm " ) ;
2012-03-05 15:51:56 -08:00
else
2012-08-30 09:46:34 -07:00
elm_layout_signal_emit ( obj , " elm,state,title,text,hidden " , " elm " ) ;
title_visibility_current = ( sd - > title_text ) | | ( sd - > title_icon ) ;
2012-03-05 15:51:56 -08:00
if ( title_visibility_old ! = title_visibility_current )
2012-08-30 09:46:34 -07:00
_visuals_set ( obj ) ;
2012-11-25 22:32:53 -08:00
edje_object_message_signal_process ( wd - > resize_obj ) ;
2012-08-30 09:46:34 -07:00
elm_layout_sizing_eval ( obj ) ;
return EINA_TRUE ;
2012-03-05 15:51:56 -08:00
}
2012-08-30 09:46:34 -07:00
static Eina_Bool
_content_text_set ( Evas_Object * obj ,
const char * text )
2012-03-05 15:51:56 -08:00
{
2013-02-15 04:55:43 -08:00
Evas_Object * ao ;
2013-10-04 06:39:30 -07:00
char style [ 1024 ] ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd , EINA_FALSE ) ;
2012-08-30 09:46:34 -07:00
if ( sd - > items )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
_items_remove ( sd ) ;
_list_del ( sd ) ;
2012-03-05 15:51:56 -08:00
}
2013-02-21 03:44:49 -08:00
else edje_object_part_swallow ( wd - > resize_obj , CONTENT_PART ,
2013-02-15 04:55:43 -08:00
sd - > content_area ) ;
2012-08-30 09:46:34 -07:00
if ( ! text ) goto end ;
sd - > text_content_obj = elm_label_add ( obj ) ;
2013-10-04 06:39:30 -07:00
snprintf ( style , sizeof ( style ) , " popup/%s " , elm_widget_style_get ( obj ) ) ;
elm_object_style_set ( sd - > text_content_obj , style ) ;
2012-08-30 09:46:34 -07:00
evas_object_event_callback_add
( sd - > text_content_obj , EVAS_CALLBACK_DEL , _on_text_content_del , obj ) ;
elm_label_line_wrap_set ( sd - > text_content_obj , sd - > content_text_wrap_type ) ;
elm_object_text_set ( sd - > text_content_obj , text ) ;
evas_object_size_hint_weight_set
( sd - > text_content_obj , EVAS_HINT_EXPAND , 0.0 ) ;
evas_object_size_hint_align_set
( sd - > text_content_obj , EVAS_HINT_FILL , EVAS_HINT_FILL ) ;
elm_layout_content_set
2013-02-21 03:44:49 -08:00
( sd - > content_area , CONTENT_PART , sd - > text_content_obj ) ;
2012-08-30 09:46:34 -07:00
2013-01-28 20:41:50 -08:00
/* access */
if ( _elm_config - > access_mode )
{
2013-02-15 02:39:00 -08:00
/* unregister label, ACCESS_BODY_PART will register */
elm_access_object_unregister ( sd - > text_content_obj ) ;
2013-01-28 20:41:50 -08:00
ao = _access_object_get ( obj , ACCESS_BODY_PART ) ;
2013-01-28 21:49:34 -08:00
if ( ! ao )
{
ao = _elm_access_edje_object_part_object_register
( obj , wd - > resize_obj , ACCESS_BODY_PART ) ;
2013-07-30 20:53:04 -07:00
_elm_access_text_set ( _elm_access_info_get ( ao ) ,
2013-01-28 21:49:34 -08:00
ELM_ACCESS_TYPE , E_ ( " Popup Body Text " ) ) ;
}
2013-07-30 20:53:04 -07:00
_elm_access_text_set ( _elm_access_info_get ( ao ) , ELM_ACCESS_INFO , text ) ;
2013-01-28 20:41:50 -08:00
}
2012-08-30 09:46:34 -07:00
end :
elm_layout_sizing_eval ( obj ) ;
return EINA_TRUE ;
2012-03-05 15:51:56 -08:00
}
2012-11-25 22:32:53 -08:00
static void
_elm_popup_smart_text_set ( Eo * obj , void * _pd EINA_UNUSED , va_list * list )
2012-03-05 15:51:56 -08:00
{
2012-11-25 22:32:53 -08:00
const char * part = va_arg ( * list , const char * ) ;
const char * label = va_arg ( * list , const char * ) ;
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
Eina_Bool int_ret ;
2012-03-05 15:51:56 -08:00
if ( ! part | | ! strcmp ( part , " default " ) )
2012-11-25 22:32:53 -08:00
int_ret = _content_text_set ( obj , label ) ;
2012-03-05 15:51:56 -08:00
else if ( ! strcmp ( part , " title,text " ) )
2012-11-25 22:32:53 -08:00
int_ret = _title_text_set ( obj , label ) ;
2012-03-05 15:51:56 -08:00
else
2013-03-18 09:07:38 -07:00
eo_do_super ( obj , MY_CLASS , elm_obj_layout_text_set ( part , label , & int_ret ) ) ;
2013-07-22 14:05:16 -07:00
2012-11-25 22:32:53 -08:00
if ( ret ) * ret = int_ret ;
2012-03-05 15:51:56 -08:00
}
2012-08-30 09:46:34 -07:00
static const char *
2012-03-05 15:51:56 -08:00
_title_text_get ( const Evas_Object * obj )
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
return sd - > title_text ;
2012-03-05 15:51:56 -08:00
}
2012-08-30 09:46:34 -07:00
static const char *
2012-03-05 15:51:56 -08:00
_content_text_get ( const Evas_Object * obj )
{
const char * str = NULL ;
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
if ( sd - > text_content_obj )
str = elm_object_text_get ( sd - > text_content_obj ) ;
2012-03-05 15:51:56 -08:00
return str ;
}
2012-11-25 22:32:53 -08:00
static void
_elm_popup_smart_text_get ( Eo * obj , void * _pd EINA_UNUSED , va_list * list )
2012-03-05 15:51:56 -08:00
{
2012-11-25 22:32:53 -08:00
const char * part = va_arg ( * list , const char * ) ;
const char * * text = va_arg ( * list , const char * * ) ;
2012-03-05 15:51:56 -08:00
if ( ! part | | ! strcmp ( part , " default " ) )
2012-11-25 22:32:53 -08:00
* text = _content_text_get ( obj ) ;
2012-03-05 15:51:56 -08:00
else if ( ! strcmp ( part , " title,text " ) )
2012-11-25 22:32:53 -08:00
* text = _title_text_get ( obj ) ;
2012-03-05 15:51:56 -08:00
else
2013-03-18 09:07:38 -07:00
eo_do_super ( obj , MY_CLASS , elm_obj_layout_text_get ( part , text ) ) ;
2012-03-05 15:51:56 -08:00
}
2012-08-30 09:46:34 -07:00
static Eina_Bool
_title_icon_set ( Evas_Object * obj ,
Evas_Object * icon )
2012-03-05 15:51:56 -08:00
{
Eina_Bool title_visibility_old , title_visibility_current ;
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd , EINA_FALSE ) ;
2012-08-30 09:46:34 -07:00
if ( sd - > title_icon = = icon ) return EINA_TRUE ;
title_visibility_old = ( sd - > title_text ) | | ( sd - > title_icon ) ;
if ( sd - > title_icon ) evas_object_del ( sd - > title_icon ) ;
sd - > title_icon = icon ;
title_visibility_current = ( sd - > title_text ) | | ( sd - > title_icon ) ;
//bare edje here because we're already in content_set virtual
edje_object_part_swallow
2012-11-25 22:32:53 -08:00
( wd - > resize_obj , " elm.swallow.title.icon " ,
2012-08-30 09:46:34 -07:00
sd - > title_icon ) ;
if ( sd - > title_icon )
elm_layout_signal_emit ( obj , " elm,state,title,icon,visible " , " elm " ) ;
if ( title_visibility_old ! = title_visibility_current ) _visuals_set ( obj ) ;
2012-11-25 22:32:53 -08:00
edje_object_message_signal_process ( wd - > resize_obj ) ;
2012-08-30 09:46:34 -07:00
elm_layout_sizing_eval ( obj ) ;
2012-03-29 04:09:40 -07:00
2012-08-30 09:46:34 -07:00
return EINA_TRUE ;
2012-03-05 15:51:56 -08:00
}
2012-08-30 09:46:34 -07:00
static Eina_Bool
_content_set ( Evas_Object * obj ,
Evas_Object * content )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd , EINA_FALSE ) ;
2012-08-30 09:46:34 -07:00
if ( sd - > content & & sd - > content = = content ) return EINA_TRUE ;
if ( sd - > items )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
_items_remove ( sd ) ;
_list_del ( sd ) ;
2012-03-05 15:51:56 -08:00
}
2012-08-30 09:46:34 -07:00
sd - > content = content ;
2012-03-05 15:51:56 -08:00
if ( content )
{
2012-08-30 09:46:34 -07:00
//bare edje as to avoid loop
edje_object_part_swallow
2013-02-21 03:44:49 -08:00
( wd - > resize_obj , CONTENT_PART ,
2012-08-30 09:46:34 -07:00
sd - > content_area ) ;
elm_layout_content_set
2013-02-21 03:44:49 -08:00
( sd - > content_area , CONTENT_PART , content ) ;
2012-04-06 00:14:10 -07:00
evas_object_show ( content ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
evas_object_event_callback_add
( content , EVAS_CALLBACK_DEL , _on_content_del , obj ) ;
}
elm_layout_sizing_eval ( obj ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
return EINA_TRUE ;
2012-03-05 15:51:56 -08:00
}
static void
2012-08-30 09:46:34 -07:00
_action_button_set ( Evas_Object * obj ,
Evas_Object * btn ,
unsigned int idx )
2012-03-05 15:51:56 -08:00
{
2013-10-04 06:39:30 -07:00
char buf [ 128 ] , style [ 1024 ] ;
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd ) ;
2012-08-30 09:46:34 -07:00
if ( idx > = ELM_POPUP_ACTION_BUTTON_MAX ) return ;
if ( ! btn )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
_button_remove ( obj , idx , EINA_TRUE ) ;
return ;
}
2013-10-13 08:57:42 -07:00
if ( sd - > buttons [ idx ] )
2012-08-30 09:46:34 -07:00
{
evas_object_del ( sd - > buttons [ idx ] - > btn ) ;
2013-10-13 08:57:42 -07:00
free ( sd - > buttons [ idx ] ) ;
}
sd - > buttons [ idx ] = ELM_NEW ( Action_Area_Data ) ;
sd - > buttons [ idx ] - > obj = obj ;
sd - > buttons [ idx ] - > btn = btn ;
evas_object_event_callback_add
( btn , EVAS_CALLBACK_DEL , _on_button_del , obj ) ;
for ( unsigned int i = ELM_POPUP_ACTION_BUTTON_MAX - 1 ; i > = idx ; i - - )
{
if ( sd - > buttons [ i ] )
{
sd - > last_button_number = i + 1 ;
break ;
}
2012-03-05 15:51:56 -08:00
}
2012-08-30 09:46:34 -07:00
2013-10-13 08:57:42 -07:00
snprintf ( buf , sizeof ( buf ) , " buttons%i " , sd - > last_button_number ) ;
2013-04-26 13:54:42 -07:00
if ( ! sd - > action_area )
{
sd - > action_area = elm_layout_add ( obj ) ;
evas_object_event_callback_add
( sd - > action_area , EVAS_CALLBACK_CHANGED_SIZE_HINTS ,
_size_hints_changed_cb , obj ) ;
edje_object_part_swallow
( wd - > resize_obj , " elm.swallow.action_area " , sd - > action_area ) ;
2013-10-13 08:57:42 -07:00
_visuals_set ( obj ) ;
2013-04-26 13:54:42 -07:00
}
2013-10-04 06:39:30 -07:00
snprintf ( style , sizeof ( style ) , " popup/%s " , elm_widget_style_get ( obj ) ) ;
if ( ! elm_layout_theme_set ( sd - > action_area , " popup " , buf , style ) )
2013-03-01 18:04:31 -08:00
CRITICAL ( " Failed to set layout! " ) ;
2012-08-30 09:46:34 -07:00
2013-10-04 06:39:30 -07:00
snprintf ( buf , sizeof ( buf ) , " elm.swallow.content.button%i " , idx + 1 ) ;
2012-08-30 09:46:34 -07:00
elm_object_part_content_set
( sd - > action_area , buf , sd - > buttons [ idx ] - > btn ) ;
2012-11-25 22:32:53 -08:00
edje_object_message_signal_process ( wd - > resize_obj ) ;
2012-08-30 09:46:34 -07:00
if ( sd - > items ) _scroller_size_calc ( obj ) ;
elm_layout_sizing_eval ( obj ) ;
2012-03-05 15:51:56 -08:00
}
2012-11-25 22:32:53 -08:00
static void
_elm_popup_smart_content_set ( Eo * obj , void * _pd EINA_UNUSED , va_list * list )
2012-03-05 15:51:56 -08:00
{
2012-11-25 22:32:53 -08:00
const char * part = va_arg ( * list , const char * ) ;
Evas_Object * content = va_arg ( * list , Evas_Object * ) ;
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
Eina_Bool int_ret ;
2012-03-05 15:51:56 -08:00
unsigned int i ;
if ( ! part | | ! strcmp ( part , " default " ) )
2013-08-30 02:00:33 -07:00
int_ret = _content_set ( obj , content ) ;
2012-03-05 15:51:56 -08:00
else if ( ! strcmp ( part , " title,icon " ) )
2013-08-30 02:00:33 -07:00
int_ret = _title_icon_set ( obj , content ) ;
2012-03-05 15:51:56 -08:00
else if ( ! strncmp ( part , " button " , 6 ) )
{
2012-08-30 09:46:34 -07:00
i = atoi ( part + 6 ) - 1 ;
if ( i > = ELM_POPUP_ACTION_BUTTON_MAX )
2013-08-30 02:00:33 -07:00
{
ERR ( " The part name is invalid! : popup=%p " , obj ) ;
int_ret = EINA_FALSE ;
return ;
}
2012-08-30 09:46:34 -07:00
_action_button_set ( obj , content , i ) ;
2012-11-25 22:32:53 -08:00
int_ret = EINA_TRUE ;
2013-08-30 02:00:33 -07:00
}
else
{
eo_do_super ( obj , MY_CLASS ,
elm_obj_container_content_set ( part , content , & int_ret ) ) ;
2012-08-30 09:46:34 -07:00
}
2012-11-25 22:32:53 -08:00
if ( ret ) * ret = int_ret ;
2013-08-30 02:00:33 -07:00
return ;
2012-03-05 15:51:56 -08:00
}
static Evas_Object *
2012-08-30 09:46:34 -07:00
_title_icon_get ( const Evas_Object * obj )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
return sd - > title_icon ;
2012-03-05 15:51:56 -08:00
}
static Evas_Object *
2012-08-30 09:46:34 -07:00
_content_get ( const Evas_Object * obj )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
return sd - > content ;
2012-03-05 15:51:56 -08:00
}
static Evas_Object *
2012-08-30 09:46:34 -07:00
_action_button_get ( const Evas_Object * obj ,
unsigned int idx )
2012-03-05 15:51:56 -08:00
{
Evas_Object * button = NULL ;
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
2013-04-26 13:54:42 -07:00
if ( ! sd - > action_area ) return NULL ;
2012-08-30 09:46:34 -07:00
2012-12-17 02:50:12 -08:00
if ( sd - > buttons [ idx ] )
button = sd - > buttons [ idx ] - > btn ;
2012-08-30 09:46:34 -07:00
2012-03-05 15:51:56 -08:00
return button ;
}
2012-11-25 22:32:53 -08:00
static void
_elm_popup_smart_content_get ( Eo * obj , void * _pd EINA_UNUSED , va_list * list )
2012-03-05 15:51:56 -08:00
{
Evas_Object * content = NULL ;
unsigned int i ;
2012-11-25 22:32:53 -08:00
const char * part = va_arg ( * list , const char * ) ;
Evas_Object * * ret = va_arg ( * list , Evas_Object * * ) ;
2012-03-05 15:51:56 -08:00
if ( ! part | | ! strcmp ( part , " default " ) )
content = _content_get ( obj ) ;
else if ( ! strcmp ( part , " title,text " ) )
content = _title_icon_get ( obj ) ;
else if ( ! strncmp ( part , " button " , 6 ) )
{
2012-08-30 09:46:34 -07:00
i = atoi ( part + 6 ) - 1 ;
if ( i > = ELM_POPUP_ACTION_BUTTON_MAX )
goto err ;
content = _action_button_get ( obj , i ) ;
}
2012-03-05 15:51:56 -08:00
else
2012-08-30 09:46:34 -07:00
goto err ;
2012-11-25 22:32:53 -08:00
* ret = content ;
return ;
2012-08-30 09:46:34 -07:00
err :
WRN ( " The part name is invalid! : popup=%p " , obj ) ;
2012-11-25 22:32:53 -08:00
* ret = content ;
2012-03-05 15:51:56 -08:00
}
static Evas_Object *
_content_unset ( Evas_Object * obj )
{
Evas_Object * content ;
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
if ( ! sd - > content ) return NULL ;
evas_object_event_callback_del
( sd - > content , EVAS_CALLBACK_DEL , _on_content_del ) ;
2013-02-21 03:44:49 -08:00
content = elm_layout_content_unset ( sd - > content_area , CONTENT_PART ) ;
2012-08-30 09:46:34 -07:00
sd - > content = NULL ;
elm_layout_sizing_eval ( obj ) ;
2012-03-05 15:51:56 -08:00
return content ;
}
static Evas_Object *
_title_icon_unset ( Evas_Object * obj )
{
Evas_Object * icon ;
2012-08-30 09:46:34 -07:00
ELM_POPUP_DATA_GET ( obj , sd ) ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd , NULL ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
if ( ! sd - > title_icon ) return NULL ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
icon = sd - > title_icon ;
2012-11-25 22:32:53 -08:00
edje_object_part_unswallow ( wd - > resize_obj , sd - > title_icon ) ;
2012-08-30 09:46:34 -07:00
sd - > title_icon = NULL ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
return icon ;
2012-03-05 15:51:56 -08:00
}
2012-11-25 22:32:53 -08:00
static void
_elm_popup_smart_content_unset ( Eo * obj , void * _pd EINA_UNUSED , va_list * list )
2012-03-05 15:51:56 -08:00
{
Evas_Object * content = NULL ;
unsigned int i ;
2012-11-25 22:32:53 -08:00
const char * part = va_arg ( * list , const char * ) ;
Evas_Object * * ret = va_arg ( * list , Evas_Object * * ) ;
2012-03-05 15:51:56 -08:00
if ( ! part | | ! strcmp ( part , " default " ) )
content = _content_unset ( obj ) ;
else if ( ! strcmp ( part , " title,icon " ) )
content = _title_icon_unset ( obj ) ;
else if ( ! strncmp ( part , " button " , 6 ) )
{
2012-08-30 09:46:34 -07:00
i = atoi ( part + 6 ) - 1 ;
if ( i > = ELM_POPUP_ACTION_BUTTON_MAX )
goto err ;
_button_remove ( obj , i , EINA_FALSE ) ;
}
2012-03-05 15:51:56 -08:00
else
2012-08-30 09:46:34 -07:00
goto err ;
2012-11-25 22:32:53 -08:00
* ret = content ;
return ;
2012-08-30 09:46:34 -07:00
err :
ERR ( " The part name is invalid! : popup=%p " , obj ) ;
2012-11-25 22:32:53 -08:00
* ret = content ;
2012-03-05 15:51:56 -08:00
}
2012-11-25 22:32:53 -08:00
static void
_elm_popup_smart_focus_next_manager_is ( Eo * obj EINA_UNUSED , void * _pd EINA_UNUSED , va_list * list )
2012-03-05 15:51:56 -08:00
{
2012-11-25 22:32:53 -08:00
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
* ret = EINA_TRUE ;
}
static void
_elm_popup_smart_focus_next ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
2013-02-15 02:39:00 -08:00
Evas_Object * ao ;
Eina_List * items = NULL ;
2012-11-25 22:32:53 -08:00
Elm_Popup_Smart_Data * sd = _pd ;
Elm_Focus_Direction dir = va_arg ( * list , Elm_Focus_Direction ) ;
Evas_Object * * next = va_arg ( * list , Evas_Object * * ) ;
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
if ( ret ) * ret = EINA_TRUE ;
2012-07-26 19:27:16 -07:00
2013-02-15 02:39:00 -08:00
/* access */
if ( _elm_config - > access_mode )
2012-07-26 19:27:16 -07:00
{
2013-02-15 02:39:00 -08:00
if ( sd - > title_text )
2012-11-25 22:32:53 -08:00
{
2013-02-15 02:39:00 -08:00
ao = _access_object_get ( obj , ACCESS_TITLE_PART ) ;
items = eina_list_append ( items , ao ) ;
2012-11-25 22:32:53 -08:00
}
2013-02-15 02:39:00 -08:00
ao = _access_object_get ( obj , ACCESS_BODY_PART ) ;
if ( ao ) items = eina_list_append ( items , ao ) ;
2012-07-26 19:27:16 -07:00
}
2013-02-15 02:39:00 -08:00
/* content area */
if ( sd - > content ) items = eina_list_append ( items , sd - > content_area ) ;
/* action area */
2013-04-26 13:54:42 -07:00
if ( sd - > action_area ) items = eina_list_append ( items , sd - > action_area ) ;
2013-02-15 02:39:00 -08:00
2013-05-31 00:22:28 -07:00
if ( ! elm_widget_focus_list_next_get ( obj , items , eina_list_data_get , dir , next ) )
* next = obj ;
2013-02-15 02:39:00 -08:00
return ;
2012-11-25 22:32:53 -08:00
}
2012-07-26 19:27:16 -07:00
2012-11-25 22:32:53 -08:00
static void
_elm_popup_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_TRUE ;
2012-03-05 15:51:56 -08:00
}
2012-04-06 00:14:10 -07:00
2012-11-25 22:32:53 -08:00
static void
_elm_popup_smart_focus_direction ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
2012-07-25 03:28:51 -07:00
{
2013-02-18 22:51:19 -08:00
Evas_Object * ao ;
Eina_List * items = NULL ;
2012-11-25 22:32:53 -08:00
Elm_Popup_Smart_Data * sd = _pd ;
2012-07-25 03:28:51 -07:00
2012-11-25 22:32:53 -08:00
Evas_Object * base = va_arg ( * list , Evas_Object * ) ;
double degree = va_arg ( * list , double ) ;
Evas_Object * * direction = va_arg ( * list , Evas_Object * * ) ;
double * weight = va_arg ( * list , double * ) ;
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
2013-02-18 22:51:19 -08:00
if ( ret ) * ret = EINA_TRUE ;
2012-11-25 22:32:53 -08:00
2013-02-18 22:51:19 -08:00
/* access */
if ( _elm_config - > access_mode )
{
if ( sd - > title_text )
{
ao = _access_object_get ( obj , ACCESS_TITLE_PART ) ;
items = eina_list_append ( items , ao ) ;
}
ao = _access_object_get ( obj , ACCESS_BODY_PART ) ;
if ( ao ) items = eina_list_append ( items , ao ) ;
}
/* content area */
if ( sd - > content ) items = eina_list_append ( items , sd - > content_area ) ;
/* action area */
2013-04-26 13:54:42 -07:00
if ( sd - > action_area ) items = eina_list_append ( items , sd - > action_area ) ;
2013-02-18 22:51:19 -08:00
elm_widget_focus_list_direction_get
( obj , base , items , eina_list_data_get , degree , direction , weight ) ;
return ;
2012-07-25 03:28:51 -07:00
}
2013-02-15 02:39:00 -08:00
static void
_elm_popup_smart_event ( Eo * obj , void * _pd EINA_UNUSED , va_list * list )
{
Evas_Object * src = va_arg ( * list , Evas_Object * ) ;
Evas_Callback_Type type = va_arg ( * list , Evas_Callback_Type ) ;
2013-10-28 07:06:14 -07:00
Evas_Event_Key_Down * ev = va_arg ( * list , void * ) ;
2013-02-15 02:39:00 -08:00
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
2013-10-28 07:06:14 -07:00
if ( ret ) * ret = EINA_FALSE ;
( void ) src ;
2013-02-15 02:39:00 -08:00
if ( elm_widget_disabled_get ( obj ) ) return ;
if ( type ! = EVAS_CALLBACK_KEY_DOWN ) return ;
if ( ev - > event_flags & EVAS_EVENT_FLAG_ON_HOLD ) return ;
2013-07-30 23:14:09 -07:00
if ( ! strcmp ( ev - > key , " Tab " ) )
2013-02-15 02:39:00 -08:00
{
if ( evas_key_modifier_is_set ( ev - > modifiers , " Shift " ) )
elm_widget_focus_cycle ( obj , ELM_FOCUS_PREVIOUS ) ;
else
elm_widget_focus_cycle ( obj , ELM_FOCUS_NEXT ) ;
2013-02-18 22:51:19 -08:00
goto success ;
}
2013-07-30 23:14:09 -07:00
else if ( ( ! strcmp ( ev - > key , " Left " ) ) | |
( ( ! strcmp ( ev - > key , " KP_Left " ) ) & & ( ! ev - > string ) ) )
2013-02-18 22:51:19 -08:00
{
elm_widget_focus_direction_go ( obj , 270.0 ) ;
goto success ;
2013-02-15 02:39:00 -08:00
}
2013-07-30 23:14:09 -07:00
else if ( ( ! strcmp ( ev - > key , " Right " ) ) | |
( ( ! strcmp ( ev - > key , " KP_Right " ) ) & & ( ! ev - > string ) ) )
2013-02-18 22:51:19 -08:00
{
elm_widget_focus_direction_go ( obj , 90.0 ) ;
goto success ;
}
2013-07-30 23:14:09 -07:00
else if ( ( ! strcmp ( ev - > key , " Up " ) ) | |
( ( ! strcmp ( ev - > key , " KP_Up " ) ) & & ( ! ev - > string ) ) )
2013-02-18 22:51:19 -08:00
{
elm_widget_focus_direction_go ( obj , 0.0 ) ;
goto success ;
}
2013-07-30 23:14:09 -07:00
else if ( ( ! strcmp ( ev - > key , " Down " ) ) | |
( ( ! strcmp ( ev - > key , " KP_Down " ) ) & & ( ! ev - > string ) ) )
2013-02-18 22:51:19 -08:00
{
elm_widget_focus_direction_go ( obj , 180.0 ) ;
goto success ;
}
return ;
success :
ev - > event_flags | = EVAS_EVENT_FLAG_ON_HOLD ;
if ( ret ) * ret = EINA_TRUE ;
2013-02-15 02:39:00 -08:00
}
2012-03-05 15:51:56 -08:00
static void
2012-11-25 22:32:53 -08:00
_elm_popup_smart_add ( Eo * obj , void * _pd , va_list * list EINA_UNUSED )
2012-03-05 15:51:56 -08:00
{
2012-11-25 22:32:53 -08:00
Elm_Popup_Smart_Data * priv = _pd ;
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd ) ;
2013-10-04 06:39:30 -07:00
char style [ 1024 ] ;
2013-12-02 02:43:46 -08:00
2013-03-18 09:07:38 -07:00
eo_do_super ( obj , MY_CLASS , evas_obj_smart_add ( ) ) ;
2013-09-24 21:33:39 -07:00
elm_widget_sub_object_parent_add ( obj ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
evas_object_size_hint_weight_set
2012-11-25 22:32:53 -08:00
( wd - > resize_obj , EVAS_HINT_EXPAND , EVAS_HINT_EXPAND ) ;
2012-08-30 09:46:34 -07:00
evas_object_size_hint_align_set
2012-11-25 22:32:53 -08:00
( wd - > resize_obj , EVAS_HINT_FILL , EVAS_HINT_FILL ) ;
2013-02-16 03:11:25 -08:00
2013-10-04 06:39:30 -07:00
snprintf ( style , sizeof ( style ) , " %s " , " default " ) ;
if ( ! elm_layout_theme_set ( obj , " popup " , " base " , style ) )
2013-03-01 18:04:31 -08:00
CRITICAL ( " Failed to set layout! " ) ;
2013-12-02 02:43:46 -08:00
2013-10-04 06:39:30 -07:00
snprintf ( style , sizeof ( style ) , " popup/%s " , " default " ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
priv - > notify = elm_notify_add ( obj ) ;
2013-10-04 06:39:30 -07:00
elm_object_style_set ( priv - > notify , style ) ;
2012-11-06 11:54:16 -08:00
elm_notify_align_set ( priv - > notify , 0.5 , 0.5 ) ;
2012-08-30 09:46:34 -07:00
elm_notify_allow_events_set ( priv - > notify , EINA_FALSE ) ;
evas_object_size_hint_weight_set
( priv - > notify , EVAS_HINT_EXPAND , EVAS_HINT_EXPAND ) ;
evas_object_size_hint_align_set
( priv - > notify , EVAS_HINT_FILL , EVAS_HINT_FILL ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
evas_object_event_callback_add ( obj , EVAS_CALLBACK_SHOW , _on_show , NULL ) ;
evas_object_event_callback_add ( obj , EVAS_CALLBACK_HIDE , _on_hide , NULL ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
evas_object_event_callback_add
( obj , EVAS_CALLBACK_RESTACK , _restack_cb , NULL ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
elm_layout_signal_callback_add
( obj , " elm,state,title_area,visible " , " elm " , _layout_change_cb , obj ) ;
elm_layout_signal_callback_add
( obj , " elm,state,title_area,hidden " , " elm " , _layout_change_cb , obj ) ;
elm_layout_signal_callback_add
( obj , " elm,state,action_area,visible " , " elm " , _layout_change_cb , obj ) ;
elm_layout_signal_callback_add
( obj , " elm,state,action_area,hidden " , " elm " , _layout_change_cb , obj ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
priv - > content_area = elm_layout_add ( obj ) ;
2013-10-04 06:39:30 -07:00
if ( ! elm_layout_theme_set ( priv - > content_area , " popup " , " content " , style ) )
2013-03-01 18:04:31 -08:00
CRITICAL ( " Failed to set layout! " ) ;
2013-09-09 03:15:26 -07:00
else
evas_object_event_callback_add
( priv - > content_area , EVAS_CALLBACK_CHANGED_SIZE_HINTS ,
_size_hints_changed_cb , obj ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
priv - > content_text_wrap_type = ELM_WRAP_MIXED ;
evas_object_smart_callback_add
( priv - > notify , " block,clicked " , _block_clicked_cb , obj ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
evas_object_smart_callback_add ( priv - > notify , " timeout " , _timeout_cb , obj ) ;
2012-03-05 15:51:56 -08:00
2013-02-15 02:39:00 -08:00
elm_widget_can_focus_set ( obj , EINA_TRUE ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
_visuals_set ( obj ) ;
2012-11-28 06:52:34 -08:00
edje_object_message_signal_process ( wd - > resize_obj ) ;
2012-03-05 15:51:56 -08:00
}
static void
2012-11-25 22:32:53 -08:00
_elm_popup_smart_parent_set ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
2012-03-05 15:51:56 -08:00
{
2012-11-25 22:32:53 -08:00
Elm_Popup_Smart_Data * sd = _pd ;
Evas_Object * parent = va_arg ( * list , Evas_Object * ) ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
elm_notify_parent_set ( sd - > notify , parent ) ;
2012-03-05 15:51:56 -08:00
}
2013-01-28 20:41:50 -08:00
static void
_elm_popup_smart_access ( Eo * obj , void * _pd EINA_UNUSED , va_list * list )
{
Eina_Bool is_access = va_arg ( * list , int ) ;
_access_obj_process ( obj , is_access ) ;
}
2012-03-05 15:51:56 -08:00
EAPI Evas_Object *
elm_popup_add ( Evas_Object * parent )
{
2012-08-30 09:46:34 -07:00
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 ) ;
2013-02-14 01:20:54 -08:00
2013-10-05 01:13:14 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd , NULL ) ;
2013-02-14 01:20:54 -08:00
wd - > highlight_root = EINA_TRUE ;
2012-11-25 22:32:53 -08:00
return obj ;
}
2012-08-30 09:46:34 -07:00
2012-11-25 22:32:53 -08:00
static void
_constructor ( Eo * obj , void * _pd EINA_UNUSED , va_list * list EINA_UNUSED )
{
2013-03-18 09:07:38 -07:00
eo_do_super ( obj , MY_CLASS , eo_constructor ( ) ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj ,
2013-11-07 03:44:22 -08:00
evas_obj_type_set ( MY_CLASS_NAME_LEGACY ) ,
2012-11-25 22:32:53 -08:00
evas_obj_smart_callbacks_descriptions_set ( _smart_callbacks , NULL ) ) ;
2012-03-05 15:51:56 -08:00
}
EAPI void
2012-08-30 09:46:34 -07:00
elm_popup_content_text_wrap_type_set ( Evas_Object * obj ,
Elm_Wrap_Type wrap )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_CHECK ( obj ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_obj_popup_content_text_wrap_type_set ( wrap ) ) ;
}
static void
_content_text_wrap_type_set ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Elm_Wrap_Type wrap = va_arg ( * list , Elm_Wrap_Type ) ;
Elm_Popup_Smart_Data * sd = _pd ;
2012-03-05 15:51:56 -08:00
//Need to wrap the content text, so not allowing ELM_WRAP_NONE
2012-08-30 09:46:34 -07:00
if ( sd - > content_text_wrap_type = = ELM_WRAP_NONE ) return ;
sd - > content_text_wrap_type = wrap ;
if ( sd - > text_content_obj )
elm_label_line_wrap_set ( sd - > text_content_obj , wrap ) ;
2012-03-05 15:51:56 -08:00
}
EAPI Elm_Wrap_Type
2012-03-07 07:56:05 -08:00
elm_popup_content_text_wrap_type_get ( const Evas_Object * obj )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_CHECK ( obj ) ELM_WRAP_LAST ;
2012-11-25 22:32:53 -08:00
Elm_Wrap_Type ret = ELM_WRAP_LAST ;
eo_do ( ( Eo * ) obj , elm_obj_popup_content_text_wrap_type_get ( & ret ) ) ;
return ret ;
}
static void
_content_text_wrap_type_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Elm_Wrap_Type * ret = va_arg ( * list , Elm_Wrap_Type * ) ;
Elm_Popup_Smart_Data * sd = _pd ;
2012-03-05 15:51:56 -08:00
2012-11-25 22:32:53 -08:00
* ret = sd - > content_text_wrap_type ;
2012-03-05 15:51:56 -08:00
}
2012-11-06 11:54:16 -08:00
/* keeping old externals orient api for notify, but taking away the
* introduced deprecation warning by copying the deprecated code
* here */
static Elm_Notify_Orient
_elm_notify_orient_get ( const Evas_Object * obj )
{
Elm_Notify_Orient orient ;
double horizontal , vertical ;
elm_notify_align_get ( obj , & horizontal , & vertical ) ;
if ( ( horizontal = = 0.5 ) & & ( vertical = = 0.0 ) )
orient = ELM_NOTIFY_ORIENT_TOP ;
else if ( ( horizontal = = 0.5 ) & & ( vertical = = 0.5 ) )
orient = ELM_NOTIFY_ORIENT_CENTER ;
else if ( ( horizontal = = 0.5 ) & & ( vertical = = 1.0 ) )
orient = ELM_NOTIFY_ORIENT_BOTTOM ;
else if ( ( horizontal = = 0.0 ) & & ( vertical = = 0.5 ) )
orient = ELM_NOTIFY_ORIENT_LEFT ;
else if ( ( horizontal = = 1.0 ) & & ( vertical = = 0.5 ) )
orient = ELM_NOTIFY_ORIENT_RIGHT ;
else if ( ( horizontal = = 0.0 ) & & ( vertical = = 0.0 ) )
orient = ELM_NOTIFY_ORIENT_TOP_LEFT ;
else if ( ( horizontal = = 1.0 ) & & ( vertical = = 0.0 ) )
orient = ELM_NOTIFY_ORIENT_TOP_RIGHT ;
else if ( ( horizontal = = 0.0 ) & & ( vertical = = 1.0 ) )
orient = ELM_NOTIFY_ORIENT_BOTTOM_LEFT ;
else if ( ( horizontal = = 1.0 ) & & ( vertical = = 1.0 ) )
orient = ELM_NOTIFY_ORIENT_BOTTOM_RIGHT ;
else
orient = ELM_NOTIFY_ORIENT_TOP ;
return orient ;
}
static void
_elm_notify_orient_set ( Evas_Object * obj ,
Elm_Notify_Orient orient )
{
double horizontal = 0 , vertical = 0 ;
switch ( orient )
{
case ELM_NOTIFY_ORIENT_TOP :
horizontal = 0.5 ; vertical = 0.0 ;
break ;
case ELM_NOTIFY_ORIENT_CENTER :
horizontal = 0.5 ; vertical = 0.5 ;
break ;
case ELM_NOTIFY_ORIENT_BOTTOM :
horizontal = 0.5 ; vertical = 1.0 ;
break ;
case ELM_NOTIFY_ORIENT_LEFT :
horizontal = 0.0 ; vertical = 0.5 ;
break ;
case ELM_NOTIFY_ORIENT_RIGHT :
horizontal = 1.0 ; vertical = 0.5 ;
break ;
case ELM_NOTIFY_ORIENT_TOP_LEFT :
horizontal = 0.0 ; vertical = 0.0 ;
break ;
case ELM_NOTIFY_ORIENT_TOP_RIGHT :
horizontal = 1.0 ; vertical = 0.0 ;
break ;
case ELM_NOTIFY_ORIENT_BOTTOM_LEFT :
horizontal = 0.0 ; vertical = 1.0 ;
break ;
case ELM_NOTIFY_ORIENT_BOTTOM_RIGHT :
horizontal = 1.0 ; vertical = 1.0 ;
break ;
case ELM_NOTIFY_ORIENT_LAST :
break ;
}
elm_notify_align_set ( obj , horizontal , vertical ) ;
}
2012-03-05 15:51:56 -08:00
EAPI void
2012-08-30 09:46:34 -07:00
elm_popup_orient_set ( Evas_Object * obj ,
Elm_Popup_Orient orient )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_CHECK ( obj ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_obj_popup_orient_set ( orient ) ) ;
}
static void
_orient_set ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Elm_Popup_Orient orient = va_arg ( * list , Elm_Popup_Orient ) ;
Elm_Popup_Smart_Data * sd = _pd ;
2012-03-05 15:51:56 -08:00
if ( orient > = ELM_POPUP_ORIENT_LAST ) return ;
2012-11-06 11:54:16 -08:00
_elm_notify_orient_set ( sd - > notify , ( Elm_Notify_Orient ) orient ) ;
2012-03-05 15:51:56 -08:00
}
EAPI Elm_Popup_Orient
2012-03-07 07:55:53 -08:00
elm_popup_orient_get ( const Evas_Object * obj )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_CHECK ( obj ) - 1 ;
2012-11-25 22:32:53 -08:00
Elm_Popup_Orient ret = - 1 ;
eo_do ( ( Eo * ) obj , elm_obj_popup_orient_get ( & ret ) ) ;
return ret ;
}
2012-03-05 15:51:56 -08:00
2012-11-25 22:32:53 -08:00
static void
_orient_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Elm_Popup_Orient * ret = va_arg ( * list , Elm_Popup_Orient * ) ;
Elm_Popup_Smart_Data * sd = _pd ;
* ret = ( Elm_Popup_Orient ) _elm_notify_orient_get ( sd - > notify ) ;
2012-03-05 15:51:56 -08:00
}
2013-12-01 23:10:53 -08:00
EAPI void
elm_popup_align_set ( Evas_Object * obj , double horizontal , double vertical )
{
ELM_POPUP_CHECK ( obj ) ;
eo_do ( obj , elm_obj_popup_align_set ( horizontal , vertical ) ) ;
}
static void
2013-12-02 02:38:35 -08:00
_align_set ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
2013-12-01 23:10:53 -08:00
{
double horizontal = va_arg ( * list , double ) ;
double vertical = va_arg ( * list , double ) ;
Elm_Popup_Smart_Data * sd = _pd ;
elm_notify_align_set ( sd - > notify , horizontal , vertical ) ;
}
EAPI void
elm_popup_align_get ( const Evas_Object * obj , double * horizontal , double * vertical )
{
ELM_POPUP_CHECK ( obj ) ;
eo_do ( ( Eo * ) obj , elm_obj_popup_align_get ( horizontal , vertical ) ) ;
}
static void
_align_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
double * horizontal = va_arg ( * list , double * ) ;
double * vertical = va_arg ( * list , double * ) ;
Elm_Popup_Smart_Data * sd = _pd ;
elm_notify_align_get ( sd - > notify , horizontal , vertical ) ;
}
2012-03-05 15:51:56 -08:00
EAPI void
2012-08-30 09:46:34 -07:00
elm_popup_timeout_set ( Evas_Object * obj ,
double timeout )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_CHECK ( obj ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_obj_popup_timeout_set ( timeout ) ) ;
}
static void
_timeout_set ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
double timeout = va_arg ( * list , double ) ;
Elm_Popup_Smart_Data * sd = _pd ;
2012-03-05 15:51:56 -08:00
2012-08-30 09:46:34 -07:00
elm_notify_timeout_set ( sd - > notify , timeout ) ;
2012-03-05 15:51:56 -08:00
}
EAPI double
2012-03-07 07:55:53 -08:00
elm_popup_timeout_get ( const Evas_Object * obj )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_CHECK ( obj ) 0.0 ;
2012-11-25 22:32:53 -08:00
double ret = 0.0 ;
eo_do ( ( Eo * ) obj , elm_obj_popup_timeout_get ( & ret ) ) ;
return ret ;
}
2012-03-05 15:51:56 -08:00
2012-11-25 22:32:53 -08:00
static void
_timeout_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
double * ret = va_arg ( * list , double * ) ;
Elm_Popup_Smart_Data * sd = _pd ;
* ret = elm_notify_timeout_get ( sd - > notify ) ;
2012-03-05 15:51:56 -08:00
}
EAPI void
2012-08-30 09:46:34 -07:00
elm_popup_allow_events_set ( Evas_Object * obj ,
Eina_Bool allow )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_CHECK ( obj ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_obj_popup_allow_events_set ( allow ) ) ;
}
static void
_allow_events_set ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Eina_Bool allow = va_arg ( * list , int ) ;
Eina_Bool allow_events = ! ! allow ;
Elm_Popup_Smart_Data * sd = _pd ;
2012-08-30 09:46:34 -07:00
elm_notify_allow_events_set ( sd - > notify , allow_events ) ;
2012-03-05 15:51:56 -08:00
}
EAPI Eina_Bool
2012-03-07 07:55:53 -08:00
elm_popup_allow_events_get ( const Evas_Object * obj )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
ELM_POPUP_CHECK ( obj ) EINA_FALSE ;
2012-11-25 22:32:53 -08:00
Eina_Bool ret = EINA_FALSE ;
eo_do ( ( Eo * ) obj , elm_obj_popup_allow_events_get ( & ret ) ) ;
return ret ;
}
2012-03-05 15:51:56 -08:00
2012-11-25 22:32:53 -08:00
static void
_allow_events_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
Elm_Popup_Smart_Data * sd = _pd ;
* ret = elm_notify_allow_events_get ( sd - > notify ) ;
2012-03-05 15:51:56 -08:00
}
EAPI Elm_Object_Item *
2012-08-30 09:46:34 -07:00
elm_popup_item_append ( Evas_Object * obj ,
const char * label ,
Evas_Object * icon ,
Evas_Smart_Cb func ,
const void * data )
2012-03-05 15:51:56 -08:00
{
2012-11-25 22:32:53 -08:00
ELM_POPUP_CHECK ( obj ) NULL ;
Elm_Object_Item * ret = NULL ;
eo_do ( obj , elm_obj_popup_item_append ( label , icon , func , data , & ret ) ) ;
return ret ;
}
static void
_item_append ( Eo * obj , void * _pd , va_list * list )
{
const char * label = va_arg ( * list , const char * ) ;
Evas_Object * icon = va_arg ( * list , Evas_Object * ) ;
Evas_Smart_Cb func = va_arg ( * list , Evas_Smart_Cb ) ;
const void * data = va_arg ( * list , const void * ) ;
Elm_Object_Item * * ret = va_arg ( * list , Elm_Object_Item * * ) ;
if ( ret ) * ret = NULL ;
2012-03-05 15:51:56 -08:00
Evas_Object * prev_content ;
2013-09-02 16:52:09 -07:00
Elm_Popup_Item * it ;
2012-08-30 09:46:34 -07:00
2012-11-25 22:32:53 -08:00
Elm_Popup_Smart_Data * sd = _pd ;
2012-03-05 15:51:56 -08:00
2013-09-02 16:52:09 -07:00
it = elm_widget_item_new ( obj , Elm_Popup_Item ) ;
if ( ! it ) return ;
2012-08-30 09:46:34 -07:00
if ( sd - > content | | sd - > text_content_obj )
2012-03-05 15:51:56 -08:00
{
2012-08-30 09:46:34 -07:00
prev_content = elm_layout_content_get
2013-02-21 03:44:49 -08:00
( sd - > content_area , CONTENT_PART ) ;
2012-03-05 15:51:56 -08:00
if ( prev_content )
evas_object_del ( prev_content ) ;
}
//The first item is appended.
2012-08-30 09:46:34 -07:00
if ( ! sd - > items )
_list_add ( obj ) ;
2012-03-05 15:51:56 -08:00
2013-09-02 16:52:09 -07:00
it - > func = func ;
it - > base . data = data ;
2012-03-05 15:51:56 -08:00
2013-09-02 16:52:09 -07:00
_item_new ( it ) ;
_item_icon_set ( it , icon ) ;
_item_text_set ( it , label ) ;
2012-08-30 09:46:34 -07:00
2013-09-02 16:52:09 -07:00
elm_box_pack_end ( sd - > box , VIEW ( it ) ) ;
sd - > items = eina_list_append ( sd - > items , it ) ;
2012-03-05 15:51:56 -08:00
_scroller_size_calc ( obj ) ;
2012-08-30 09:46:34 -07:00
elm_layout_sizing_eval ( obj ) ;
2013-09-02 16:52:09 -07:00
if ( ret ) * ret = ( Elm_Object_Item * ) it ;
2012-03-05 15:51:56 -08:00
}
2012-11-25 22:32:53 -08:00
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_popup_smart_add ) ,
EO_OP_FUNC ( EVAS_OBJ_SMART_ID ( EVAS_OBJ_SMART_SUB_ID_DEL ) , _elm_popup_smart_del ) ,
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_PARENT_SET ) , _elm_popup_smart_parent_set ) ,
2013-02-15 02:39:00 -08:00
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_EVENT ) , _elm_popup_smart_event ) ,
2012-11-25 22:32:53 -08:00
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_THEME ) , _elm_popup_smart_theme ) ,
2013-04-23 04:30:15 -07:00
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_TRANSLATE ) , _elm_popup_smart_translate ) ,
2012-11-25 22:32:53 -08:00
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_FOCUS_NEXT_MANAGER_IS ) , _elm_popup_smart_focus_next_manager_is ) ,
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_FOCUS_NEXT ) , _elm_popup_smart_focus_next ) ,
2013-01-28 20:41:50 -08:00
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_ACCESS ) , _elm_popup_smart_access ) ,
2012-11-25 22:32:53 -08:00
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_FOCUS_DIRECTION_MANAGER_IS ) , _elm_popup_smart_focus_direction_manager_is ) ,
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_FOCUS_DIRECTION ) , _elm_popup_smart_focus_direction ) ,
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_SUB_OBJECT_DEL ) , _elm_popup_smart_sub_object_del ) ,
EO_OP_FUNC ( ELM_OBJ_CONTAINER_ID ( ELM_OBJ_CONTAINER_SUB_ID_CONTENT_SET ) , _elm_popup_smart_content_set ) ,
EO_OP_FUNC ( ELM_OBJ_CONTAINER_ID ( ELM_OBJ_CONTAINER_SUB_ID_CONTENT_GET ) , _elm_popup_smart_content_get ) ,
EO_OP_FUNC ( ELM_OBJ_CONTAINER_ID ( ELM_OBJ_CONTAINER_SUB_ID_CONTENT_UNSET ) , _elm_popup_smart_content_unset ) ,
EO_OP_FUNC ( ELM_OBJ_LAYOUT_ID ( ELM_OBJ_LAYOUT_SUB_ID_TEXT_SET ) , _elm_popup_smart_text_set ) ,
EO_OP_FUNC ( ELM_OBJ_LAYOUT_ID ( ELM_OBJ_LAYOUT_SUB_ID_TEXT_GET ) , _elm_popup_smart_text_get ) ,
EO_OP_FUNC ( ELM_OBJ_LAYOUT_ID ( ELM_OBJ_LAYOUT_SUB_ID_SIZING_EVAL ) , _elm_popup_smart_sizing_eval ) ,
EO_OP_FUNC ( ELM_OBJ_POPUP_ID ( ELM_OBJ_POPUP_SUB_ID_CONTENT_TEXT_WRAP_TYPE_SET ) , _content_text_wrap_type_set ) ,
EO_OP_FUNC ( ELM_OBJ_POPUP_ID ( ELM_OBJ_POPUP_SUB_ID_CONTENT_TEXT_WRAP_TYPE_GET ) , _content_text_wrap_type_get ) ,
EO_OP_FUNC ( ELM_OBJ_POPUP_ID ( ELM_OBJ_POPUP_SUB_ID_ORIENT_SET ) , _orient_set ) ,
EO_OP_FUNC ( ELM_OBJ_POPUP_ID ( ELM_OBJ_POPUP_SUB_ID_ORIENT_GET ) , _orient_get ) ,
EO_OP_FUNC ( ELM_OBJ_POPUP_ID ( ELM_OBJ_POPUP_SUB_ID_TIMEOUT_SET ) , _timeout_set ) ,
EO_OP_FUNC ( ELM_OBJ_POPUP_ID ( ELM_OBJ_POPUP_SUB_ID_TIMEOUT_GET ) , _timeout_get ) ,
EO_OP_FUNC ( ELM_OBJ_POPUP_ID ( ELM_OBJ_POPUP_SUB_ID_ALLOW_EVENTS_SET ) , _allow_events_set ) ,
EO_OP_FUNC ( ELM_OBJ_POPUP_ID ( ELM_OBJ_POPUP_SUB_ID_ALLOW_EVENTS_GET ) , _allow_events_get ) ,
EO_OP_FUNC ( ELM_OBJ_POPUP_ID ( ELM_OBJ_POPUP_SUB_ID_ITEM_APPEND ) , _item_append ) ,
2013-12-01 23:10:53 -08:00
EO_OP_FUNC ( ELM_OBJ_POPUP_ID ( ELM_OBJ_POPUP_SUB_ID_ALIGN_SET ) , _align_set ) ,
EO_OP_FUNC ( ELM_OBJ_POPUP_ID ( ELM_OBJ_POPUP_SUB_ID_ALIGN_GET ) , _align_get ) ,
2012-11-25 22:32:53 -08:00
EO_OP_FUNC_SENTINEL
} ;
eo_class_funcs_set ( klass , func_desc ) ;
2013-02-09 23:52:31 -08:00
2013-11-07 03:44:22 -08:00
evas_smart_legacy_type_register ( MY_CLASS_NAME_LEGACY , klass ) ;
2012-11-25 22:32:53 -08:00
}
static const Eo_Op_Description op_desc [ ] = {
EO_OP_DESCRIPTION ( ELM_OBJ_POPUP_SUB_ID_CONTENT_TEXT_WRAP_TYPE_SET , " Sets the wrapping type of content text packed in content. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_POPUP_SUB_ID_CONTENT_TEXT_WRAP_TYPE_GET , " Returns the wrapping type of content text packed in content area of. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_POPUP_SUB_ID_ORIENT_SET , " Sets the orientation of the popup in the parent region. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_POPUP_SUB_ID_ORIENT_GET , " Returns the orientation of Popup. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_POPUP_SUB_ID_TIMEOUT_SET , " Sets a timeout to hide popup automatically. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_POPUP_SUB_ID_TIMEOUT_GET , " Returns the timeout value set to the popup (in seconds). " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_POPUP_SUB_ID_ALLOW_EVENTS_SET , " Sets whether events should be passed to by a click outside. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_POPUP_SUB_ID_ALLOW_EVENTS_GET , " Returns value indicating whether allow event is enabled or not. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_POPUP_SUB_ID_ITEM_APPEND , " Add a new item to a Popup object. " ) ,
2013-12-01 23:10:53 -08:00
EO_OP_DESCRIPTION ( ELM_OBJ_POPUP_SUB_ID_ALIGN_SET , " Set the popup alignment relative to its parent. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_POPUP_SUB_ID_ALIGN_GET , " Return the popup alignment relative to its parent. " ) ,
2012-11-25 22:32:53 -08:00
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_POPUP_BASE_ID , op_desc , ELM_OBJ_POPUP_SUB_ID_LAST ) ,
NULL ,
sizeof ( Elm_Popup_Smart_Data ) ,
_class_constructor ,
NULL
} ;
EO_DEFINE_CLASS ( elm_obj_popup_class_get , & class_desc , ELM_OBJ_LAYOUT_CLASS , NULL ) ;