2017-12-18 04:08:25 -08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "elementary_config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define ELM_LAYOUT_PROTECTED
|
|
|
|
#define EFL_UI_SCROLL_MANAGER_PROTECTED
|
|
|
|
#define EFL_UI_SCROLLBAR_PROTECTED
|
|
|
|
|
|
|
|
#include <Elementary.h>
|
|
|
|
#include "elm_priv.h"
|
|
|
|
#include "efl_ui_widget_scroller.h"
|
|
|
|
#include "elm_widget_layout.h"
|
|
|
|
|
|
|
|
#define MY_CLASS EFL_UI_SCROLLER_CLASS
|
|
|
|
#define MY_CLASS_PFX efl_ui_scroller
|
|
|
|
|
|
|
|
#define MY_CLASS_NAME "Efl.Ui.Scroller"
|
|
|
|
|
|
|
|
#define EFL_UI_SCROLLER_DATA_GET(o, sd) \
|
|
|
|
Efl_Ui_Scroller_Data * sd = efl_data_scope_safe_get(o, EFL_UI_SCROLLER_CLASS)
|
|
|
|
|
|
|
|
#define EFL_UI_SCROLLER_DATA_GET_OR_RETURN(o, ptr, ...) \
|
|
|
|
EFL_UI_SCROLLER_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__; \
|
|
|
|
}
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_content_del_cb(void *data,
|
|
|
|
const Efl_Event *event EINA_UNUSED)
|
|
|
|
{
|
|
|
|
EFL_UI_SCROLLER_DATA_GET_OR_RETURN(data, sd);
|
|
|
|
|
|
|
|
sd->content = NULL;
|
|
|
|
if (!sd->smanager) return;
|
|
|
|
efl_ui_scrollbar_bar_visibility_update(sd->smanager);
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_efl_ui_scroller_efl_content_content_set(Eo *obj,
|
|
|
|
Efl_Ui_Scroller_Data *sd,
|
|
|
|
Evas_Object *content)
|
|
|
|
{
|
|
|
|
if (sd->content)
|
|
|
|
{
|
|
|
|
efl_content_set(sd->pan_obj, NULL);
|
|
|
|
efl_event_callback_del(sd->content, EFL_EVENT_DEL,
|
|
|
|
_efl_ui_scroller_content_del_cb, obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
sd->content = content;
|
|
|
|
if (!content) return EINA_TRUE;
|
|
|
|
|
|
|
|
efl_event_callback_add(sd->content, EFL_EVENT_DEL,
|
|
|
|
_efl_ui_scroller_content_del_cb, obj);
|
|
|
|
|
|
|
|
efl_content_set(sd->pan_obj, content);
|
|
|
|
|
|
|
|
elm_layout_sizing_eval(obj);
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
2019-01-24 04:19:50 -08:00
|
|
|
EOLIAN static Efl_Gfx_Entity*
|
|
|
|
_efl_ui_scroller_efl_content_content_get(const Eo *obj EINA_UNUSED, Efl_Ui_Scroller_Data *pd)
|
|
|
|
{
|
|
|
|
return pd->content;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Efl_Gfx_Entity*
|
|
|
|
_efl_ui_scroller_efl_content_content_unset(Eo *obj EINA_UNUSED, Efl_Ui_Scroller_Data *pd)
|
|
|
|
{
|
|
|
|
Efl_Gfx_Entity *old_content = pd->content;
|
|
|
|
|
|
|
|
pd->content = NULL;
|
|
|
|
if (pd->smanager)
|
|
|
|
{
|
|
|
|
efl_ui_scrollbar_bar_visibility_update(pd->smanager);
|
|
|
|
}
|
|
|
|
|
|
|
|
return old_content;
|
|
|
|
}
|
|
|
|
|
2017-12-18 04:08:25 -08:00
|
|
|
static void
|
|
|
|
_efl_ui_scroller_bar_read_and_update(Eo *obj)
|
|
|
|
{
|
|
|
|
EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd);
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
|
|
|
double vx, vy;
|
|
|
|
|
|
|
|
edje_object_part_drag_value_get
|
2018-04-26 03:27:43 -07:00
|
|
|
(wd->resize_obj, "efl.dragable.vbar", NULL, &vy);
|
2017-12-18 04:08:25 -08:00
|
|
|
edje_object_part_drag_value_get
|
2018-04-26 03:27:43 -07:00
|
|
|
(wd->resize_obj, "efl.dragable.hbar", &vx, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
|
|
|
|
efl_ui_scrollbar_bar_position_set(sd->smanager, vx, vy);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_reload_cb(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Eo *scroller = data;
|
|
|
|
EFL_UI_SCROLLER_DATA_GET_OR_RETURN(scroller, sd);
|
|
|
|
|
|
|
|
efl_ui_scrollbar_bar_visibility_update(sd->smanager);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_vbar_drag_cb(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
|
|
|
{
|
|
|
|
_efl_ui_scroller_bar_read_and_update(data);
|
|
|
|
|
|
|
|
Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL;
|
|
|
|
efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_DRAG, &type);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_vbar_press_cb(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL;
|
|
|
|
efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_PRESS, &type);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_vbar_unpress_cb(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL;
|
|
|
|
efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_UNPRESS, &type);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_edje_drag_start_cb(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Eo *scroller = data;
|
|
|
|
EFL_UI_SCROLLER_DATA_GET_OR_RETURN(scroller, sd);
|
|
|
|
|
|
|
|
_efl_ui_scroller_bar_read_and_update(scroller);
|
|
|
|
|
|
|
|
sd->freeze_want = efl_ui_scrollable_scroll_freeze_get(sd->smanager);
|
|
|
|
efl_ui_scrollable_scroll_freeze_set(sd->smanager, EINA_TRUE);
|
|
|
|
efl_event_callback_call(scroller, EFL_UI_EVENT_SCROLL_DRAG_START, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_edje_drag_stop_cb(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Eo *scroller = data;
|
|
|
|
EFL_UI_SCROLLER_DATA_GET_OR_RETURN(scroller, sd);
|
|
|
|
|
|
|
|
_efl_ui_scroller_bar_read_and_update(scroller);
|
|
|
|
|
|
|
|
efl_ui_scrollable_scroll_freeze_set(sd->smanager, sd->freeze_want);
|
|
|
|
efl_event_callback_call(scroller, EFL_UI_EVENT_SCROLL_DRAG_STOP, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_edje_drag_cb(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
|
|
|
{
|
|
|
|
_efl_ui_scroller_bar_read_and_update(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_hbar_drag_cb(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
|
|
|
{
|
|
|
|
_efl_ui_scroller_bar_read_and_update(data);
|
|
|
|
|
|
|
|
Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL;
|
|
|
|
efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_DRAG, &type);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_hbar_press_cb(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL;
|
|
|
|
efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_PRESS, &type);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_hbar_unpress_cb(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL;
|
|
|
|
efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_UNPRESS, &type);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_bar_size_changed_cb(void *data, const Efl_Event *event EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Eo *obj = data;
|
|
|
|
EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd);
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
|
|
|
|
|
|
|
double width = 0.0, height = 0.0;
|
|
|
|
|
|
|
|
edje_object_calc_force(wd->resize_obj);
|
|
|
|
efl_ui_scrollbar_bar_size_get(sd->smanager, &width, &height);
|
2018-04-26 03:27:43 -07:00
|
|
|
edje_object_part_drag_size_set(wd->resize_obj, "efl.dragable.hbar", width, 1.0);
|
|
|
|
edje_object_part_drag_size_set(wd->resize_obj, "efl.dragable.vbar", 1.0, height);
|
2017-12-18 04:08:25 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_bar_pos_changed_cb(void *data, const Efl_Event *event EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Eo *obj = data;
|
|
|
|
EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd);
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
|
|
|
|
|
|
|
double posx = 0.0, posy = 0.0;
|
|
|
|
|
|
|
|
efl_ui_scrollbar_bar_position_get(sd->smanager, &posx, &posy);
|
2018-04-26 03:27:43 -07:00
|
|
|
edje_object_part_drag_value_set(wd->resize_obj, "efl.dragable.hbar", posx, 0.0);
|
|
|
|
edje_object_part_drag_value_set(wd->resize_obj, "efl.dragable.vbar", 0.0, posy);
|
2018-10-15 07:32:11 -07:00
|
|
|
edje_object_signal_emit(wd->resize_obj, "efl,action,scroll", "efl");
|
2017-12-18 04:08:25 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_bar_show_cb(void *data, const Efl_Event *event)
|
|
|
|
{
|
|
|
|
Eo *obj = data;
|
|
|
|
EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd);
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
|
|
|
Efl_Ui_Scrollbar_Direction type = *(Efl_Ui_Scrollbar_Direction *)(event->info);
|
|
|
|
|
|
|
|
if (type == EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL)
|
2018-04-26 04:24:09 -07:00
|
|
|
edje_object_signal_emit(wd->resize_obj, "efl,action,show,hbar", "efl");
|
2017-12-18 04:08:25 -08:00
|
|
|
else if (type == EFL_UI_SCROLLBAR_DIRECTION_VERTICAL)
|
2018-04-26 04:24:09 -07:00
|
|
|
edje_object_signal_emit(wd->resize_obj, "efl,action,show,vbar", "efl");
|
2017-12-18 04:08:25 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_bar_hide_cb(void *data, const Efl_Event *event)
|
|
|
|
{
|
|
|
|
Eo *obj = data;
|
|
|
|
EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd);
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
|
|
|
Efl_Ui_Scrollbar_Direction type = *(Efl_Ui_Scrollbar_Direction *)(event->info);
|
|
|
|
|
|
|
|
if (type == EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL)
|
2018-04-26 04:24:09 -07:00
|
|
|
edje_object_signal_emit(wd->resize_obj, "efl,action,hide,hbar", "efl");
|
2017-12-18 04:08:25 -08:00
|
|
|
else if (type == EFL_UI_SCROLLBAR_DIRECTION_VERTICAL)
|
2018-04-26 04:24:09 -07:00
|
|
|
edje_object_signal_emit(wd->resize_obj, "efl,action,hide,vbar", "efl");
|
2017-12-18 04:08:25 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_scroll_edje_object_attach(Eo *obj)
|
|
|
|
{
|
|
|
|
EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd);
|
|
|
|
|
|
|
|
efl_layout_signal_callback_add
|
2019-02-06 10:48:43 -08:00
|
|
|
(obj, "reload", "efl",
|
|
|
|
obj, _efl_ui_scroller_reload_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2019-02-06 10:48:43 -08:00
|
|
|
(obj, "drag", "efl.dragable.vbar",
|
|
|
|
obj, _efl_ui_scroller_vbar_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,set", "efl.dragable.vbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,start", "efl.dragable.vbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_start_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,stop", "efl.dragable.vbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_stop_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,step", "efl.dragable.vbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,page", "efl.dragable.vbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2018-04-26 04:24:09 -07:00
|
|
|
(obj, "efl,vbar,press", "efl",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_vbar_press_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2018-04-26 04:24:09 -07:00
|
|
|
(obj, "efl,vbar,unpress", "efl",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_vbar_unpress_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2019-02-06 10:48:43 -08:00
|
|
|
(obj, "drag", "efl.dragable.hbar",
|
|
|
|
obj, _efl_ui_scroller_hbar_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,set", "efl.dragable.hbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,start", "efl.dragable.hbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_start_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,stop", "efl.dragable.hbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_stop_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,step", "efl.dragable.hbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,page", "efl.dragable.hbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2018-04-26 04:24:09 -07:00
|
|
|
(obj, "efl,hbar,press", "efl",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_hbar_press_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_add
|
2018-04-26 04:24:09 -07:00
|
|
|
(obj, "efl,hbar,unpress", "efl",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_hbar_unpress_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_scroll_edje_object_detach(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd);
|
|
|
|
|
|
|
|
efl_layout_signal_callback_del
|
2019-02-06 10:48:43 -08:00
|
|
|
(obj, "reload", "efl",
|
|
|
|
obj, _efl_ui_scroller_reload_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2019-02-06 10:48:43 -08:00
|
|
|
(obj, "drag", "efl.dragable.vbar",
|
|
|
|
obj, _efl_ui_scroller_vbar_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,set", "efl.dragable.vbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,start", "efl.dragable.vbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_start_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,stop", "efl.dragable.vbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_stop_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,step", "efl.dragable.vbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,page", "efl.dragable.vbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2018-04-26 04:24:09 -07:00
|
|
|
(obj, "efl,vbar,press", "efl",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_vbar_press_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2018-04-26 04:24:09 -07:00
|
|
|
(obj, "efl,vbar,unpress", "efl",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_vbar_unpress_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2019-02-06 10:48:43 -08:00
|
|
|
(obj, "drag", "efl.dragable.hbar",
|
|
|
|
obj, _efl_ui_scroller_hbar_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,set", "efl.dragable.hbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,start", "efl.dragable.hbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_start_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,stop", "efl.dragable.hbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_stop_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,step", "efl.dragable.hbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2018-04-26 03:27:43 -07:00
|
|
|
(obj, "drag,page", "efl.dragable.hbar",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_edje_drag_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2018-04-26 04:24:09 -07:00
|
|
|
(obj, "efl,hbar,press", "efl",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_hbar_press_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
efl_layout_signal_callback_del
|
2018-04-26 04:24:09 -07:00
|
|
|
(obj, "efl,hbar,unpress", "efl",
|
2019-02-06 10:48:43 -08:00
|
|
|
obj, _efl_ui_scroller_hbar_unpress_cb, NULL);
|
2017-12-18 04:08:25 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_pan_resized_cb(void *data, const Efl_Event *ev EINA_UNUSED)
|
|
|
|
{
|
|
|
|
elm_layout_sizing_eval(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_resized_cb(void *data, const Efl_Event *ev EINA_UNUSED)
|
|
|
|
{
|
|
|
|
elm_layout_sizing_eval(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_efl_ui_scroller_size_hint_changed_cb(void *data, const Efl_Event *ev EINA_UNUSED)
|
|
|
|
{
|
|
|
|
elm_layout_sizing_eval(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eo *
|
|
|
|
_efl_ui_scroller_efl_object_constructor(Eo *obj,
|
|
|
|
Efl_Ui_Scroller_Data *sd EINA_UNUSED)
|
|
|
|
{
|
|
|
|
obj = efl_constructor(efl_super(obj, MY_CLASS));
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eo *
|
|
|
|
_efl_ui_scroller_efl_object_finalize(Eo *obj,
|
|
|
|
Efl_Ui_Scroller_Data *sd EINA_UNUSED)
|
|
|
|
{
|
|
|
|
obj = efl_finalize(efl_super(obj, MY_CLASS));
|
|
|
|
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
|
|
|
|
|
2018-11-16 01:45:05 -08:00
|
|
|
efl_ui_layout_theme_set(obj, "scroller", "base", efl_ui_widget_style_get(obj));
|
2017-12-18 04:08:25 -08:00
|
|
|
|
|
|
|
sd->smanager = efl_add(EFL_UI_SCROLL_MANAGER_CLASS, obj);
|
|
|
|
efl_ui_mirrored_set(sd->smanager, efl_ui_mirrored_get(obj));
|
2018-11-27 21:32:39 -08:00
|
|
|
efl_composite_attach(obj, sd->smanager);
|
2017-12-18 04:08:25 -08:00
|
|
|
|
|
|
|
sd->pan_obj = efl_add(EFL_UI_PAN_CLASS, obj);
|
|
|
|
|
|
|
|
efl_ui_scroll_manager_pan_set(sd->smanager, sd->pan_obj);
|
2018-04-26 03:27:43 -07:00
|
|
|
edje_object_part_swallow(wd->resize_obj, "efl.content", sd->pan_obj);
|
2017-12-18 04:08:25 -08:00
|
|
|
|
|
|
|
_scroll_edje_object_attach(obj);
|
|
|
|
|
|
|
|
efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SIZE_CHANGED,
|
|
|
|
_efl_ui_scroller_bar_size_changed_cb, obj);
|
|
|
|
efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_POS_CHANGED,
|
|
|
|
_efl_ui_scroller_bar_pos_changed_cb, obj);
|
|
|
|
efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SHOW,
|
|
|
|
_efl_ui_scroller_bar_show_cb, obj);
|
|
|
|
efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_HIDE,
|
|
|
|
_efl_ui_scroller_bar_hide_cb, obj);
|
2018-04-05 01:47:26 -07:00
|
|
|
efl_event_callback_add(obj, EFL_GFX_ENTITY_EVENT_RESIZE,
|
2017-12-18 04:08:25 -08:00
|
|
|
_efl_ui_scroller_resized_cb, obj);
|
2018-04-05 01:47:26 -07:00
|
|
|
efl_event_callback_add(obj, EFL_GFX_ENTITY_EVENT_CHANGE_SIZE_HINTS,
|
2017-12-18 04:08:25 -08:00
|
|
|
_efl_ui_scroller_size_hint_changed_cb, obj);
|
2018-04-05 01:47:26 -07:00
|
|
|
efl_event_callback_add(sd->pan_obj, EFL_GFX_ENTITY_EVENT_RESIZE,
|
2017-12-18 04:08:25 -08:00
|
|
|
_efl_ui_scroller_pan_resized_cb, obj);
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
|
|
|
_efl_ui_scroller_efl_object_destructor(Eo *obj,
|
|
|
|
Efl_Ui_Scroller_Data *sd EINA_UNUSED)
|
|
|
|
{
|
|
|
|
_scroll_edje_object_detach(obj);
|
|
|
|
|
|
|
|
efl_event_callback_del(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SIZE_CHANGED,
|
|
|
|
_efl_ui_scroller_bar_size_changed_cb, obj);
|
|
|
|
efl_event_callback_del(obj, EFL_UI_SCROLLBAR_EVENT_BAR_POS_CHANGED,
|
|
|
|
_efl_ui_scroller_bar_pos_changed_cb, obj);
|
|
|
|
efl_event_callback_del(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SHOW,
|
|
|
|
_efl_ui_scroller_bar_show_cb, obj);
|
|
|
|
efl_event_callback_del(obj, EFL_UI_SCROLLBAR_EVENT_BAR_HIDE,
|
|
|
|
_efl_ui_scroller_bar_hide_cb, obj);
|
2018-04-05 01:47:26 -07:00
|
|
|
efl_event_callback_del(obj, EFL_GFX_ENTITY_EVENT_RESIZE,
|
2017-12-18 04:08:25 -08:00
|
|
|
_efl_ui_scroller_resized_cb, obj);
|
2018-04-05 01:47:26 -07:00
|
|
|
efl_event_callback_del(obj, EFL_GFX_ENTITY_EVENT_CHANGE_SIZE_HINTS,
|
2017-12-18 04:08:25 -08:00
|
|
|
_efl_ui_scroller_size_hint_changed_cb, obj);
|
2018-04-05 01:47:26 -07:00
|
|
|
efl_event_callback_del(sd->pan_obj, EFL_GFX_ENTITY_EVENT_RESIZE,
|
2017-12-18 04:08:25 -08:00
|
|
|
_efl_ui_scroller_pan_resized_cb, obj);
|
|
|
|
efl_del(sd->pan_obj);
|
|
|
|
sd->pan_obj = NULL;
|
|
|
|
sd->smanager = NULL;
|
|
|
|
|
|
|
|
efl_destructor(efl_super(obj, MY_CLASS));
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
|
|
|
_efl_ui_scroller_elm_layout_sizing_eval(Eo *obj, Efl_Ui_Scroller_Data *sd)
|
|
|
|
{
|
|
|
|
Eina_Size2D min = {0, 0}, max = {0, 0}, size = {-1, -1};
|
|
|
|
Eina_Rect view = {};
|
|
|
|
Evas_Coord vmw = 0, vmh = 0;
|
|
|
|
double xw = 0.0, yw = 0.0;
|
|
|
|
|
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
|
|
|
|
|
|
|
if (sd->content)
|
|
|
|
{
|
|
|
|
min = efl_gfx_size_hint_combined_min_get(sd->content);
|
|
|
|
max = efl_gfx_size_hint_max_get(sd->content);
|
|
|
|
efl_gfx_size_hint_weight_get(sd->content, &xw, &yw);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sd->smanager)
|
|
|
|
view = efl_ui_scrollable_viewport_geometry_get(sd->smanager);
|
|
|
|
|
|
|
|
if (xw > 0.0)
|
|
|
|
{
|
|
|
|
if ((min.w > 0) && (view.w < min.w))
|
|
|
|
view.w = min.w;
|
|
|
|
else if ((max.w > 0) && (view.w > max.w))
|
|
|
|
view.w = max.w;
|
|
|
|
}
|
|
|
|
else if (min.w > 0)
|
|
|
|
view.w = min.w;
|
|
|
|
|
|
|
|
if (yw > 0.0)
|
|
|
|
{
|
|
|
|
if ((min.h > 0) && (view.h < min.h))
|
|
|
|
view.h = min.h;
|
|
|
|
else if ((max.h > 0) && (view.h > max.h))
|
|
|
|
view.h = max.h;
|
|
|
|
}
|
|
|
|
else if (min.h > 0)
|
|
|
|
view.h = min.h;
|
|
|
|
|
2018-04-05 01:47:26 -07:00
|
|
|
if (sd->content) efl_gfx_entity_size_set(sd->content, EINA_SIZE2D(view.w, view.h));
|
2017-12-18 04:08:25 -08:00
|
|
|
|
|
|
|
edje_object_size_min_calc(wd->resize_obj, &vmw, &vmh);
|
|
|
|
|
|
|
|
if (sd->match_content_w) size.w = vmw + min.w;
|
|
|
|
if (sd->match_content_h) size.h = vmh + min.h;
|
|
|
|
|
|
|
|
max = efl_gfx_size_hint_max_get(obj);
|
|
|
|
if ((max.w > 0) && (size.w > max.w)) size.w = max.w;
|
|
|
|
if ((max.h > 0) && (size.h > max.h)) size.h = max.h;
|
|
|
|
|
|
|
|
efl_gfx_size_hint_min_set(obj, size);
|
|
|
|
}
|
|
|
|
|
2018-11-19 20:56:37 -08:00
|
|
|
EOLIAN static Efl_Ui_Theme_Apply_Result
|
2018-01-07 20:55:35 -08:00
|
|
|
_efl_ui_scroller_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Scroller_Data *sd)
|
2017-12-18 04:08:25 -08:00
|
|
|
{
|
2018-11-19 20:56:37 -08:00
|
|
|
Efl_Ui_Theme_Apply_Result int_ret = EFL_UI_THEME_APPLY_RESULT_FAIL;
|
2017-12-18 04:08:25 -08:00
|
|
|
int_ret = efl_ui_widget_theme_apply(efl_super(obj, MY_CLASS));
|
2018-11-19 20:56:37 -08:00
|
|
|
if (!int_ret) return EFL_UI_THEME_APPLY_RESULT_FAIL;
|
2017-12-18 04:08:25 -08:00
|
|
|
|
|
|
|
efl_ui_mirrored_set(sd->smanager, efl_ui_mirrored_get(obj));
|
|
|
|
|
|
|
|
elm_layout_sizing_eval(obj);
|
|
|
|
|
|
|
|
return int_ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
|
|
|
_efl_ui_scroller_efl_ui_scrollable_interactive_match_content_set(Eo *obj EINA_UNUSED,
|
|
|
|
Efl_Ui_Scroller_Data *sd,
|
|
|
|
Eina_Bool match_content_w,
|
|
|
|
Eina_Bool match_content_h)
|
|
|
|
{
|
|
|
|
sd->match_content_w = !!match_content_w;
|
|
|
|
sd->match_content_h = !!match_content_h;
|
|
|
|
|
|
|
|
efl_ui_scrollable_match_content_set(sd->smanager, match_content_w, match_content_h);
|
|
|
|
|
|
|
|
elm_layout_sizing_eval(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Internal EO APIs and hidden overrides */
|
|
|
|
|
|
|
|
#define EFL_UI_SCROLLER_EXTRA_OPS \
|
|
|
|
ELM_LAYOUT_SIZING_EVAL_OPS(efl_ui_scroller)
|
|
|
|
|
|
|
|
#include "efl_ui_scroller.eo.c"
|