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
# 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 " ;
2014-02-17 11:03:34 -08:00
static const char SIG_ITEM_FOCUSED [ ] = " item,focused " ;
static const char SIG_ITEM_UNFOCUSED [ ] = " item,unfocused " ;
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 , " " } ,
2014-02-17 11:03:34 -08:00
{ SIG_ITEM_FOCUSED , " " } ,
{ SIG_ITEM_UNFOCUSED , " " } ,
2014-01-23 02:30:34 -08:00
{ SIG_WIDGET_LANG_CHANGED , " " } , /**< handled by elm_widget */
2014-02-07 21:05:06 -08:00
{ SIG_WIDGET_ACCESS_CHANGED , " " } , /**< handled by elm_widget */
2014-02-05 23:18:57 -08:00
{ SIG_LAYOUT_FOCUSED , " " } , /**< handled by elm_layout */
{ SIG_LAYOUT_UNFOCUSED , " " } , /**< handled by elm_layout */
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 ) ;
2014-03-25 05:00:33 -07:00
EOLIAN static Eina_Bool
_elc_popup_elm_widget_translate ( Eo * obj EINA_UNUSED , Elc_Popup_Data * sd )
2013-04-23 04:30:15 -07:00
{
Elm_Popup_Item * it ;
Eina_List * l ;
EINA_LIST_FOREACH ( sd - > items , l , it )
elm_widget_item_translate ( it ) ;
2014-04-03 06:08:39 -07:00
eo_do_super ( obj , MY_CLASS , elm_obj_widget_translate ( ) ) ;
2014-01-23 03:20:43 -08:00
2014-03-25 05:00:33 -07:00
return EINA_TRUE ;
2013-04-23 04:30:15 -07:00
}
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 ,
2014-01-06 06:30:02 -08:00
Evas_Object * obj EINA_UNUSED ,
void * event_info EINA_UNUSED )
2012-08-30 09:46:34 -07:00
{
evas_object_smart_callback_call ( data , SIG_BLOCK_CLICKED , NULL ) ;
}
static void
_timeout_cb ( void * data ,
2014-01-06 06:30:02 -08:00
Evas_Object * obj EINA_UNUSED ,
void * event_info EINA_UNUSED )
2012-08-30 09:46:34 -07:00
{
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
2014-01-06 06:30:02 -08:00
_on_show ( void * data EINA_UNUSED ,
Evas * e EINA_UNUSED ,
2012-08-30 09:46:34 -07:00
Evas_Object * obj ,
2014-01-06 06:30:02 -08:00
void * event_info EINA_UNUSED )
2012-08-30 09:46:34 -07:00
{
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
2014-01-06 06:30:02 -08:00
_on_hide ( void * data EINA_UNUSED ,
Evas * e EINA_UNUSED ,
2012-08-30 09:46:34 -07:00
Evas_Object * obj ,
2014-01-06 06:30:02 -08:00
void * event_info EINA_UNUSED )
2012-08-30 09:46:34 -07:00
{
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 ,
2014-01-06 06:30:02 -08:00
Evas * e EINA_UNUSED ,
Evas_Object * obj EINA_UNUSED ,
void * event_info EINA_UNUSED )
2012-08-30 09:46:34 -07:00
{
elm_layout_sizing_eval ( data ) ;
2012-03-05 15:51:56 -08:00
}
static void
2014-03-25 05:00:33 -07:00
_list_del ( Elc_Popup_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 ) ;
2014-01-21 17:38:55 -08:00
ELM_SAFE_FREE ( sd - > tbl , evas_object_del ) ;
2012-08-30 09:46:34 -07:00
sd - > scr = NULL ;
sd - > box = NULL ;
sd - > spacer = NULL ;
}
static void
2014-03-25 05:00:33 -07:00
_items_remove ( Elc_Popup_Data * sd )
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
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
}
2014-03-25 05:00:33 -07:00
EOLIAN static void
_elc_popup_evas_smart_del ( Eo * obj , Elc_Popup_Data * sd )
2012-03-05 15:51:56 -08:00
{
unsigned int i ;
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 ) ;
2014-01-21 17:38:55 -08:00
ELM_SAFE_FREE ( sd - > buttons [ i ] , free ) ;
2012-08-30 09:46:34 -07:00
}
}
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 ) ;
}
}
}
2014-03-25 05:00:33 -07:00
EOLIAN static Eina_Bool
_elc_popup_elm_widget_theme_apply ( Eo * obj , Elc_Popup_Data * sd )
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 ] ;
2014-04-03 06:08:39 -07:00
Eina_Bool int_ret = EINA_FALSE ;
2012-08-30 09:46:34 -07:00
2014-03-25 05:00:33 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd , EINA_FALSE ) ;
2012-11-25 22:32:53 -08:00
2014-04-03 06:08:39 -07:00
eo_do_super ( obj , MY_CLASS , int_ret = elm_obj_widget_theme_apply ( ) ) ;
2014-03-25 05:00:33 -07:00
if ( ! int_ret ) return EINA_FALSE ;
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-12-25 20:03:55 -08:00
CRI ( " 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-12-25 20:03:55 -08:00
CRI ( " 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-12-25 20:03:55 -08:00
CRI ( " Failed to set layout! " ) ;
2013-09-09 03:15:26 -07:00
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 ) ;
2014-03-25 05:00:33 -07:00
return 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
}
2014-03-25 05:00:33 -07:00
EOLIAN static void
_elc_popup_elm_layout_sizing_eval ( Eo * obj , Elc_Popup_Data * sd )
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
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
2014-03-25 05:00:33 -07:00
EOLIAN static Eina_Bool
_elc_popup_elm_widget_sub_object_del ( Eo * obj , Elc_Popup_Data * sd , Evas_Object * sobj )
2012-08-30 09:46:34 -07:00
{
2013-09-02 16:52:09 -07:00
Elm_Popup_Item * it ;
2014-04-03 06:08:39 -07:00
Eina_Bool int_ret = EINA_FALSE ;
2012-11-25 22:32:53 -08:00
2014-03-25 05:00:33 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd , EINA_FALSE ) ;
2012-08-30 09:46:34 -07:00
2014-04-03 06:08:39 -07:00
eo_do_super ( obj , MY_CLASS , int_ret = elm_obj_widget_sub_object_del ( sobj ) ) ;
2014-03-25 05:00:33 -07:00
if ( ! int_ret ) return EINA_FALSE ;
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
}
}
2014-03-25 05:00:33 -07:00
return 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 ,
2014-01-06 06:30:02 -08:00
Evas * e EINA_UNUSED ,
Evas_Object * obj EINA_UNUSED ,
void * event_info EINA_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 ,
2014-01-06 06:30:02 -08:00
Evas * e EINA_UNUSED ,
Evas_Object * obj EINA_UNUSED ,
void * event_info EINA_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 ,
2014-01-06 06:30:02 -08:00
Evas * e EINA_UNUSED ,
Evas_Object * obj EINA_UNUSED ,
void * event_info EINA_UNUSED )
2012-08-30 09:46:34 -07:00
{
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 ,
2014-01-06 06:30:02 -08:00
Evas * e EINA_UNUSED ,
2012-08-30 09:46:34 -07:00
Evas_Object * obj ,
2014-01-06 06:30:02 -08:00
void * event_info EINA_UNUSED )
2012-08-30 09:46:34 -07:00
{
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 ) ;
2014-01-21 17:38:55 -08:00
ELM_SAFE_FREE ( sd - > action_area , evas_object_del ) ;
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-12-25 20:03:55 -08:00
CRI ( " 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 ,
2014-01-06 06:30:02 -08:00
Evas_Object * obj EINA_UNUSED ,
const char * emission EINA_UNUSED ,
const char * source EINA_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
2014-01-06 06:30:02 -08:00
_restack_cb ( void * data EINA_UNUSED ,
Evas * e EINA_UNUSED ,
2012-08-30 09:46:34 -07:00
Evas_Object * obj ,
2014-01-06 06:30:02 -08:00
void * event_info EINA_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 ,
2014-01-06 06:30:02 -08:00
Evas_Object * obj EINA_UNUSED ,
const char * emission EINA_UNUSED ,
const char * source EINA_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
2014-01-21 17:38:55 -08:00
evas_object_del ( it - > icon ) ;
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
2014-01-21 17:12:44 -08:00
evas_object_del ( it - > icon ) ;
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
}
2014-02-17 11:03:34 -08:00
static void
_item_focused_cb ( void * data ,
Evas_Object * obj EINA_UNUSED ,
void * event_info EINA_UNUSED )
{
Elm_Object_Item * it = data ;
evas_object_smart_callback_call ( WIDGET ( it ) , SIG_ITEM_FOCUSED , it ) ;
}
static void
_item_unfocused_cb ( void * data ,
Evas_Object * obj EINA_UNUSED ,
void * event_info EINA_UNUSED )
{
Elm_Object_Item * it = data ;
evas_object_smart_callback_call ( WIDGET ( it ) , SIG_ITEM_UNFOCUSED , it ) ;
}
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 ) ) ;
2014-02-17 11:03:34 -08:00
elm_object_focus_allow_set ( VIEW ( it ) , EINA_TRUE ) ;
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-12-25 20:03:55 -08:00
CRI ( " Failed to set layout! " ) ;
2013-09-09 03:15:26 -07:00
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 ) ;
2014-02-17 11:03:34 -08:00
evas_object_smart_callback_add ( VIEW ( it ) , SIG_LAYOUT_FOCUSED , _item_focused_cb , it ) ;
evas_object_smart_callback_add ( VIEW ( it ) , SIG_LAYOUT_UNFOCUSED , _item_unfocused_cb , it ) ;
2013-09-09 03:15:26 -07:00
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
}
2014-03-25 05:00:33 -07:00
EOLIAN static Eina_Bool
_elc_popup_elm_layout_text_set ( Eo * obj , Elc_Popup_Data * _pd EINA_UNUSED , const char * part , const char * label )
2012-03-05 15:51:56 -08:00
{
2014-04-03 06:08:39 -07:00
Eina_Bool int_ret = EINA_FALSE ;
2012-11-25 22:32:53 -08:00
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
2014-04-03 06:08:39 -07:00
eo_do_super ( obj , MY_CLASS , int_ret = elm_obj_layout_text_set ( part , label ) ) ;
2013-07-22 14:05:16 -07:00
2014-03-25 05:00:33 -07:00
return 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 ;
}
2014-03-25 05:00:33 -07:00
EOLIAN static const char *
_elc_popup_elm_layout_text_get ( Eo * obj , Elc_Popup_Data * _pd EINA_UNUSED , const char * part )
2012-03-05 15:51:56 -08:00
{
2014-04-03 06:08:39 -07:00
const char * text = NULL ;
2012-03-05 15:51:56 -08:00
if ( ! part | | ! strcmp ( part , " default " ) )
2014-03-25 05:00:33 -07:00
text = _content_text_get ( obj ) ;
2012-03-05 15:51:56 -08:00
else if ( ! strcmp ( part , " title,text " ) )
2014-03-25 05:00:33 -07:00
text = _title_text_get ( obj ) ;
2012-03-05 15:51:56 -08:00
else
2014-04-03 06:08:39 -07:00
eo_do_super ( obj , MY_CLASS , text = elm_obj_layout_text_get ( part ) ) ;
2014-03-25 05:00:33 -07:00
return 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 ) ;
2014-01-21 17:38:55 -08:00
evas_object_del ( sd - > title_icon ) ;
2012-08-30 09:46:34 -07:00
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-12-25 20:03:55 -08:00
CRI ( " 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
}
2014-03-25 05:00:33 -07:00
EOLIAN static Eina_Bool
_elc_popup_elm_container_content_set ( Eo * obj , Elc_Popup_Data * _pd EINA_UNUSED , const char * part , Evas_Object * content )
2012-03-05 15:51:56 -08:00
{
unsigned int i ;
if ( ! part | | ! strcmp ( part , " default " ) )
2014-03-25 05:00:33 -07:00
return _content_set ( obj , content ) ;
2012-03-05 15:51:56 -08:00
else if ( ! strcmp ( part , " title,icon " ) )
2014-03-25 05:00:33 -07:00
return _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 ) ;
2014-03-25 05:00:33 -07:00
return EINA_FALSE ;
2013-08-30 02:00:33 -07:00
}
2012-08-30 09:46:34 -07:00
_action_button_set ( obj , content , i ) ;
2013-08-30 02:00:33 -07:00
}
else
{
2014-04-03 06:08:39 -07:00
Eina_Bool int_ret = EINA_FALSE ;
2013-08-30 02:00:33 -07:00
eo_do_super ( obj , MY_CLASS ,
2014-04-03 06:08:39 -07:00
int_ret = elm_obj_container_content_set ( part , content ) ) ;
2014-03-25 05:00:33 -07:00
return int_ret ;
2012-08-30 09:46:34 -07:00
}
2014-03-25 05:00:33 -07:00
return EINA_TRUE ;
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 ;
}
2014-03-25 05:00:33 -07:00
EOLIAN static Evas_Object *
_elc_popup_elm_container_content_get ( Eo * obj , Elc_Popup_Data * _pd EINA_UNUSED , const char * part )
2012-03-05 15:51:56 -08:00
{
Evas_Object * content = NULL ;
unsigned int i ;
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
2013-12-28 00:33:10 -08:00
{
eo_do_super ( obj , MY_CLASS ,
2014-04-03 06:08:39 -07:00
content = elm_obj_container_content_get ( part ) ) ;
2013-12-28 00:33:10 -08:00
}
if ( ! content )
2012-08-30 09:46:34 -07:00
goto err ;
2014-03-25 05:00:33 -07:00
return content ;
2012-08-30 09:46:34 -07:00
err :
WRN ( " The part name is invalid! : popup=%p " , obj ) ;
2014-03-25 05:00:33 -07:00
return NULL ;
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
}
2014-03-25 05:00:33 -07:00
EOLIAN static Evas_Object *
_elc_popup_elm_container_content_unset ( Eo * obj , Elc_Popup_Data * _pd EINA_UNUSED , const char * part )
2012-03-05 15:51:56 -08:00
{
Evas_Object * content = NULL ;
unsigned int i ;
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 ;
2014-03-25 05:00:33 -07:00
return content ;
2012-08-30 09:46:34 -07:00
err :
ERR ( " The part name is invalid! : popup=%p " , obj ) ;
2014-03-25 05:00:33 -07:00
return NULL ;
2012-03-05 15:51:56 -08:00
}
2014-03-25 05:00:33 -07:00
EOLIAN static Eina_Bool
_elc_popup_elm_widget_focus_next_manager_is ( Eo * obj EINA_UNUSED , Elc_Popup_Data * _pd EINA_UNUSED )
2012-03-05 15:51:56 -08:00
{
2014-03-25 05:00:33 -07:00
return EINA_TRUE ;
2012-11-25 22:32:53 -08:00
}
2014-03-25 05:00:33 -07:00
EOLIAN static Eina_Bool
_elc_popup_elm_widget_focus_next ( Eo * obj EINA_UNUSED , Elc_Popup_Data * sd , Elm_Focus_Direction dir , Evas_Object * * next )
2012-11-25 22:32:53 -08:00
{
2013-02-15 02:39:00 -08:00
Evas_Object * ao ;
Eina_List * items = NULL ;
2013-12-28 00:33:10 -08:00
Eina_List * base_items = NULL ;
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 ) ;
2014-02-17 11:03:34 -08:00
/* items */
if ( sd - > box ) items = eina_list_append ( items , sd - > box ) ;
2013-02-15 02:39:00 -08:00
/* 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-12-28 00:33:10 -08:00
/* base */
2014-04-03 06:08:39 -07:00
eo_do_super ( obj , MY_CLASS , base_items = elm_obj_container_content_swallow_list_get ( ) ) ;
2013-12-28 00:33:10 -08:00
items = eina_list_merge ( items , base_items ) ;
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-12-28 00:33:10 -08:00
eina_list_free ( items ) ;
2013-02-15 02:39:00 -08:00
2014-03-25 05:00:33 -07:00
return EINA_TRUE ;
2012-11-25 22:32:53 -08:00
}
2012-07-26 19:27:16 -07:00
2014-03-25 05:00:33 -07:00
EOLIAN static Eina_Bool
_elc_popup_elm_widget_focus_direction_manager_is ( Eo * obj EINA_UNUSED , Elc_Popup_Data * _pd EINA_UNUSED )
2012-11-25 22:32:53 -08:00
{
2014-03-25 05:00:33 -07:00
return EINA_TRUE ;
2012-03-05 15:51:56 -08:00
}
2012-04-06 00:14:10 -07:00
2014-03-25 05:00:33 -07:00
EOLIAN static Eina_Bool
_elc_popup_elm_widget_focus_direction ( Eo * obj EINA_UNUSED , Elc_Popup_Data * sd , const Evas_Object * base , double degree , Evas_Object * * direction , double * weight )
2012-07-25 03:28:51 -07:00
{
2013-02-18 22:51:19 -08:00
Evas_Object * ao ;
Eina_List * items = NULL ;
2013-12-28 00:33:10 -08:00
Eina_List * base_items = NULL ;
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 ) ;
2014-02-17 11:03:34 -08:00
/* items */
if ( sd - > box ) items = eina_list_append ( items , sd - > box ) ;
2013-02-18 22:51:19 -08:00
/* 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
2013-12-28 00:33:10 -08:00
/* base*/
2014-04-03 06:08:39 -07:00
eo_do_super ( obj , MY_CLASS , base_items = elm_obj_container_content_swallow_list_get ( ) ) ;
2013-12-28 00:33:10 -08:00
items = eina_list_merge ( items , base_items ) ;
2013-02-18 22:51:19 -08:00
elm_widget_focus_list_direction_get
( obj , base , items , eina_list_data_get , degree , direction , weight ) ;
2013-12-28 00:33:10 -08:00
eina_list_free ( items ) ;
2013-02-18 22:51:19 -08:00
2014-03-25 05:00:33 -07:00
return EINA_TRUE ;
2012-07-25 03:28:51 -07:00
}
2014-03-25 05:00:33 -07:00
EOLIAN static Eina_Bool
_elc_popup_elm_widget_event ( Eo * obj , Elc_Popup_Data * _pd EINA_UNUSED , Evas_Object * src , Evas_Callback_Type type , void * event_info )
2013-02-15 02:39:00 -08:00
{
2013-10-28 07:06:14 -07:00
( void ) src ;
2014-03-25 05:00:33 -07:00
Evas_Event_Key_Down * ev = event_info ;
2013-02-15 02:39:00 -08:00
2014-03-25 05:00:33 -07:00
if ( elm_widget_disabled_get ( obj ) ) return EINA_FALSE ;
if ( type ! = EVAS_CALLBACK_KEY_DOWN ) return EINA_FALSE ;
if ( ev - > event_flags & EVAS_EVENT_FLAG_ON_HOLD ) return EINA_FALSE ;
2013-02-15 02:39:00 -08:00
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
{
2014-01-22 01:36:13 -08:00
elm_widget_focus_cycle ( obj , ELM_FOCUS_LEFT ) ;
2013-02-18 22:51:19 -08:00
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
{
2014-01-22 01:36:13 -08:00
elm_widget_focus_cycle ( obj , ELM_FOCUS_RIGHT ) ;
2013-02-18 22:51:19 -08:00
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
{
2014-01-22 01:36:13 -08:00
elm_widget_focus_cycle ( obj , ELM_FOCUS_UP ) ;
2013-02-18 22:51:19 -08:00
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
{
2014-01-22 01:36:13 -08:00
elm_widget_focus_cycle ( obj , ELM_FOCUS_DOWN ) ;
2013-02-18 22:51:19 -08:00
goto success ;
}
2014-03-25 05:00:33 -07:00
return EINA_FALSE ;
2013-02-18 22:51:19 -08:00
success :
ev - > event_flags | = EVAS_EVENT_FLAG_ON_HOLD ;
2014-03-25 05:00:33 -07:00
return EINA_TRUE ;
2013-02-15 02:39:00 -08:00
}
2014-03-25 05:00:33 -07:00
EOLIAN static void
_elc_popup_evas_smart_add ( Eo * obj , Elc_Popup_Data * priv )
2012-03-05 15:51:56 -08:00
{
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-12-25 20:03:55 -08:00
CRI ( " 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-12-25 20:03:55 -08:00
CRI ( " 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
}
2014-03-25 05:00:33 -07:00
EOLIAN static void
_elc_popup_elm_widget_parent_set ( Eo * obj EINA_UNUSED , Elc_Popup_Data * sd , Evas_Object * parent )
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
}
2014-03-25 05:00:33 -07:00
EOLIAN static void
_elc_popup_elm_widget_access ( Eo * obj , Elc_Popup_Data * _pd EINA_UNUSED , Eina_Bool is_access )
2013-01-28 20:41:50 -08:00
{
_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
2014-03-25 05:00:33 -07:00
EOLIAN static void
_elc_popup_eo_base_constructor ( Eo * obj , Elc_Popup_Data * _pd EINA_UNUSED )
2012-11-25 22:32:53 -08:00
{
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 ) ,
2014-04-03 06:08:39 -07:00
evas_obj_smart_callbacks_descriptions_set ( _smart_callbacks ) ) ;
2012-03-05 15:51:56 -08:00
}
2014-03-25 05:00:33 -07:00
EOLIAN static void
_elc_popup_content_text_wrap_type_set ( Eo * obj EINA_UNUSED , Elc_Popup_Data * sd , Elm_Wrap_Type wrap )
2012-11-25 22:32:53 -08:00
{
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
}
2014-03-25 05:00:33 -07:00
EOLIAN static Elm_Wrap_Type
_elc_popup_content_text_wrap_type_get ( Eo * obj EINA_UNUSED , Elc_Popup_Data * sd )
2012-03-05 15:51:56 -08:00
{
2014-03-25 05:00:33 -07:00
return 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 ) ;
}
2014-03-25 05:00:33 -07:00
EOLIAN static void
_elc_popup_orient_set ( Eo * obj EINA_UNUSED , Elc_Popup_Data * sd , Elm_Popup_Orient orient )
2012-11-25 22:32:53 -08:00
{
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
}
2014-03-25 05:00:33 -07:00
EOLIAN static Elm_Popup_Orient
_elc_popup_orient_get ( Eo * obj EINA_UNUSED , Elc_Popup_Data * sd )
2013-12-01 23:10:53 -08:00
{
2014-03-25 05:00:33 -07:00
return ( Elm_Popup_Orient ) _elm_notify_orient_get ( sd - > notify ) ;
2013-12-01 23:10:53 -08:00
}
2014-03-25 05:00:33 -07:00
EOLIAN static void
_elc_popup_align_set ( Eo * obj EINA_UNUSED , Elc_Popup_Data * sd , double horizontal , double vertical )
2013-12-01 23:10:53 -08:00
{
elm_notify_align_set ( sd - > notify , horizontal , vertical ) ;
}
2014-03-25 05:00:33 -07:00
EOLIAN static void
_elc_popup_align_get ( Eo * obj EINA_UNUSED , Elc_Popup_Data * sd , double * horizontal , double * vertical )
2013-12-01 23:10:53 -08:00
{
elm_notify_align_get ( sd - > notify , horizontal , vertical ) ;
}
2014-03-25 05:00:33 -07:00
EOLIAN static void
_elc_popup_timeout_set ( Eo * obj EINA_UNUSED , Elc_Popup_Data * sd , double timeout )
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
}
2014-03-25 05:00:33 -07:00
EOLIAN static double
_elc_popup_timeout_get ( Eo * obj EINA_UNUSED , Elc_Popup_Data * sd )
2012-03-05 15:51:56 -08:00
{
2014-03-25 05:00:33 -07:00
return elm_notify_timeout_get ( sd - > notify ) ;
2012-11-25 22:32:53 -08:00
}
2014-03-25 05:00:33 -07:00
EOLIAN static void
_elc_popup_allow_events_set ( Eo * obj EINA_UNUSED , Elc_Popup_Data * sd , Eina_Bool allow )
2012-11-25 22:32:53 -08:00
{
Eina_Bool allow_events = ! ! allow ;
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
}
2014-03-25 05:00:33 -07:00
EOLIAN static Eina_Bool
_elc_popup_allow_events_get ( Eo * obj EINA_UNUSED , Elc_Popup_Data * sd )
2012-03-05 15:51:56 -08:00
{
2014-03-25 05:00:33 -07:00
return elm_notify_allow_events_get ( sd - > notify ) ;
2012-11-25 22:32:53 -08:00
}
2012-03-05 15:51:56 -08:00
2014-03-25 05:00:33 -07:00
EOLIAN static Elm_Object_Item *
_elc_popup_item_append ( Eo * obj , Elc_Popup_Data * sd , const char * label , Evas_Object * icon , Evas_Smart_Cb func , const void * data )
2012-11-25 22:32:53 -08:00
{
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-03-05 15:51:56 -08:00
2013-09-02 16:52:09 -07:00
it = elm_widget_item_new ( obj , Elm_Popup_Item ) ;
2014-03-25 05:00:33 -07:00
if ( ! it ) return NULL ;
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 ) ;
2014-01-21 17:38:55 -08:00
evas_object_del ( prev_content ) ;
2012-03-05 15:51:56 -08:00
}
//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 ) ;
2014-03-25 05:00:33 -07:00
return ( Elm_Object_Item * ) it ;
2012-03-05 15:51:56 -08:00
}
2012-11-25 22:32:53 -08:00
static void
2014-03-25 05:00:33 -07:00
_elc_popup_class_constructor ( Eo_Class * klass )
{
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
}
2014-03-25 05:00:33 -07:00
# include "elc_popup.eo.c"