2017-12-18 04:08:25 -08:00
# ifdef HAVE_CONFIG_H
# include "elementary_config.h"
# endif
# include <Elementary.h>
# include "elm_priv.h"
# include "efl_ui_widget_pan.h"
# define MY_CLASS EFL_UI_PAN_CLASS
# define MY_CLASS_NAME "Efl_Ui_Pan"
# define EFL_UI_PAN_DATA_GET(o, sd) \
Efl_Ui_Pan_Data * sd = efl_data_scope_safe_get ( o , MY_CLASS )
# define EFL_UI_PAN_DATA_GET_OR_RETURN(o, ptr, ...) \
EFL_UI_PAN_DATA_GET ( o , ptr ) ; \
if ( EINA_UNLIKELY ( ! ptr ) ) \
{ \
2018-01-31 19:16:28 -08:00
ERR ( " No widget data for object %p (%s) " , \
2017-12-18 04:08:25 -08:00
o , evas_object_type_get ( o ) ) ; \
return __VA_ARGS__ ; \
}
EOLIAN static void
2018-04-05 01:47:26 -07:00
_efl_ui_pan_efl_gfx_entity_position_set ( Eo * obj , Efl_Ui_Pan_Data * psd , Eina_Position2D pos )
2017-12-18 04:08:25 -08:00
{
if ( _evas_object_intercept_call ( obj , EVAS_OBJECT_INTERCEPT_CB_MOVE , 0 , pos . x , pos . y ) )
return ;
2018-04-05 01:47:26 -07:00
efl_gfx_entity_position_set ( efl_super ( obj , MY_CLASS ) , pos ) ;
2017-12-18 04:08:25 -08:00
psd - > x = pos . x ;
psd - > y = pos . y ;
evas_object_smart_changed ( obj ) ;
}
EOLIAN static void
2018-04-05 01:47:26 -07:00
_efl_ui_pan_efl_gfx_entity_size_set ( Eo * obj , Efl_Ui_Pan_Data * psd , Eina_Size2D sz )
2017-12-18 04:08:25 -08:00
{
if ( _evas_object_intercept_call ( obj , EVAS_OBJECT_INTERCEPT_CB_RESIZE , 0 , sz . w , sz . h ) )
return ;
2018-04-05 01:47:26 -07:00
efl_gfx_entity_size_set ( efl_super ( obj , MY_CLASS ) , sz ) ;
2017-12-18 04:08:25 -08:00
psd - > w = sz . w ;
psd - > h = sz . h ;
evas_object_smart_changed ( obj ) ;
}
EOLIAN static void
2018-04-05 01:47:26 -07:00
_efl_ui_pan_efl_gfx_entity_visible_set ( Eo * obj , Efl_Ui_Pan_Data * psd , Eina_Bool vis )
2017-12-18 04:08:25 -08:00
{
if ( _evas_object_intercept_call ( obj , EVAS_OBJECT_INTERCEPT_CB_VISIBLE , 0 , vis ) )
return ;
2018-04-05 01:47:26 -07:00
efl_gfx_entity_visible_set ( efl_super ( obj , MY_CLASS ) , vis ) ;
if ( psd - > content ) efl_gfx_entity_visible_set ( psd - > content , vis ) ;
2017-12-18 04:08:25 -08:00
}
EOLIAN static void
_efl_ui_pan_pan_position_set ( Eo * obj EINA_UNUSED , Efl_Ui_Pan_Data * psd , Eina_Position2D pos )
{
if ( ( pos . x = = psd - > px ) & & ( pos . y = = psd - > py ) ) return ;
psd - > px = pos . x ;
psd - > py = pos . y ;
evas_object_smart_changed ( obj ) ;
2019-08-30 11:48:04 -07:00
efl_event_callback_call ( obj , EFL_UI_PAN_EVENT_PAN_CONTENT_POSITION_CHANGED , & pos ) ;
2017-12-18 04:08:25 -08:00
}
EOLIAN static Eina_Position2D
2018-04-17 11:09:44 -07:00
_efl_ui_pan_pan_position_get ( const Eo * obj EINA_UNUSED , Efl_Ui_Pan_Data * psd )
2017-12-18 04:08:25 -08:00
{
return EINA_POSITION2D ( psd - > px , psd - > py ) ;
}
EOLIAN static Eina_Position2D
2018-04-17 11:09:44 -07:00
_efl_ui_pan_pan_position_max_get ( const Eo * obj EINA_UNUSED , Efl_Ui_Pan_Data * psd )
2017-12-18 04:08:25 -08:00
{
Eina_Position2D pos = { 0 , 0 } ;
if ( psd - > w < psd - > content_w ) pos . x = psd - > content_w - psd - > w ;
if ( psd - > h < psd - > content_h ) pos . y = psd - > content_h - psd - > h ;
return pos ;
}
EOLIAN static Eina_Position2D
2018-04-17 11:09:44 -07:00
_efl_ui_pan_pan_position_min_get ( const Eo * obj EINA_UNUSED , Efl_Ui_Pan_Data * _pd EINA_UNUSED )
2017-12-18 04:08:25 -08:00
{
return EINA_POSITION2D ( 0 , 0 ) ;
}
EOLIAN static Eina_Size2D
2018-04-17 11:09:44 -07:00
_efl_ui_pan_content_size_get ( const Eo * obj EINA_UNUSED , Efl_Ui_Pan_Data * psd )
2017-12-18 04:08:25 -08:00
{
return EINA_SIZE2D ( psd - > content_w , psd - > content_h ) ;
}
EOLIAN static Eo *
_efl_ui_pan_efl_object_constructor ( Eo * obj , Efl_Ui_Pan_Data * _pd EINA_UNUSED )
{
efl_canvas_group_clipped_set ( obj , EINA_TRUE ) ;
obj = efl_constructor ( efl_super ( obj , MY_CLASS ) ) ;
return obj ;
}
EOLIAN static void
_efl_ui_pan_efl_object_destructor ( Eo * obj , Efl_Ui_Pan_Data * sd EINA_UNUSED )
{
2019-12-09 09:27:37 -08:00
/* our implementation is a little bit incomplete, efl_content_set(obj, NULL) does not delete the content, However, if we do that, list grid and scroller would fail, because the assume ownership of the content */
Eo * content = efl_content_unset ( obj ) ;
efl_del ( content ) ;
2017-12-18 04:08:25 -08:00
efl_destructor ( efl_super ( obj , MY_CLASS ) ) ;
}
static void
_efl_ui_pan_content_del_cb ( void * data ,
Evas * e EINA_UNUSED ,
Evas_Object * obj EINA_UNUSED ,
void * event_info EINA_UNUSED )
{
2019-08-30 11:47:46 -07:00
efl_content_unset ( data ) ;
2017-12-18 04:08:25 -08:00
}
static void
_efl_ui_pan_content_resize_cb ( void * data ,
Evas * e EINA_UNUSED ,
Evas_Object * obj EINA_UNUSED ,
void * event_info EINA_UNUSED )
{
Evas_Object * pobj = data ;
EFL_UI_PAN_DATA_GET_OR_RETURN ( pobj , psd ) ;
2018-04-05 01:47:26 -07:00
Eina_Size2D sz = efl_gfx_entity_size_get ( psd - > content ) ;
2017-12-18 04:08:25 -08:00
if ( ( sz . w ! = psd - > content_w ) | | ( sz . h ! = psd - > content_h ) )
{
psd - > content_w = sz . w ;
psd - > content_h = sz . h ;
evas_object_smart_changed ( pobj ) ;
}
2019-08-30 11:47:58 -07:00
efl_event_callback_call ( pobj , EFL_UI_PAN_EVENT_PAN_CONTENT_SIZE_CHANGED , & sz ) ;
2017-12-18 04:08:25 -08:00
}
EOLIAN static Eina_Bool
_efl_ui_pan_efl_content_content_set ( Evas_Object * obj , Efl_Ui_Pan_Data * psd , Evas_Object * content )
{
Eina_Size2D sz ;
if ( content = = psd - > content ) return EINA_TRUE ;
if ( psd - > content )
{
2019-01-24 05:09:42 -08:00
efl_content_unset ( obj ) ;
2017-12-18 04:08:25 -08:00
}
2019-08-30 11:47:46 -07:00
if ( ! content ) return EINA_TRUE ;
2017-12-18 04:08:25 -08:00
psd - > content = content ;
efl_canvas_group_member_add ( obj , content ) ;
2018-04-05 01:47:26 -07:00
sz = efl_gfx_entity_size_get ( psd - > content ) ;
2017-12-18 04:08:25 -08:00
psd - > content_w = sz . w ;
psd - > content_h = sz . h ;
evas_object_event_callback_add
( content , EVAS_CALLBACK_DEL , _efl_ui_pan_content_del_cb , obj ) ;
evas_object_event_callback_add
( content , EVAS_CALLBACK_RESIZE , _efl_ui_pan_content_resize_cb , obj ) ;
if ( evas_object_visible_get ( obj ) )
evas_object_show ( psd - > content ) ;
else
evas_object_hide ( psd - > content ) ;
evas_object_smart_changed ( obj ) ;
2019-02-25 04:45:43 -08:00
efl_event_callback_call ( obj , EFL_CONTENT_EVENT_CONTENT_CHANGED , content ) ;
2017-12-18 04:08:25 -08:00
return EINA_TRUE ;
}
2019-01-24 05:09:42 -08:00
EOLIAN static Efl_Gfx_Entity *
_efl_ui_pan_efl_content_content_get ( const Eo * obj EINA_UNUSED , Efl_Ui_Pan_Data * pd )
{
return pd - > content ;
}
EOLIAN static Efl_Gfx_Entity *
_efl_ui_pan_efl_content_content_unset ( Eo * obj EINA_UNUSED , Efl_Ui_Pan_Data * pd )
{
Efl_Gfx_Stack * old_content = pd - > content ;
2019-02-27 10:17:28 -08:00
efl_canvas_group_member_remove ( obj , pd - > content ) ;
2019-01-24 05:09:42 -08:00
evas_object_event_callback_del_full
( pd - > content , EVAS_CALLBACK_DEL , _efl_ui_pan_content_del_cb , obj ) ;
evas_object_event_callback_del_full
( pd - > content , EVAS_CALLBACK_RESIZE , _efl_ui_pan_content_resize_cb ,
obj ) ;
pd - > content = NULL ;
pd - > content_w = pd - > content_h = pd - > px = pd - > py = 0 ;
2019-02-25 04:45:43 -08:00
efl_event_callback_call ( obj , EFL_CONTENT_EVENT_CONTENT_CHANGED , NULL ) ;
2019-01-24 05:09:42 -08:00
return old_content ;
}
2017-12-18 04:08:25 -08:00
EOLIAN static void
_efl_ui_pan_efl_canvas_group_group_calculate ( Eo * obj EINA_UNUSED , Efl_Ui_Pan_Data * psd )
{
2019-07-30 10:11:48 -07:00
efl_canvas_group_need_recalculate_set ( obj , EINA_FALSE ) ;
2018-04-05 01:47:26 -07:00
efl_gfx_entity_position_set ( psd - > content , EINA_POSITION2D ( psd - > x - psd - > px , psd - > y - psd - > py ) ) ;
2017-12-18 04:08:25 -08:00
}
# include "efl_ui_pan.eo.c"