forked from enlightenment/efl
elm: apply new scroll interface in efl_ui_list
Summary: Apply new scroll inteface in efl_ui_list. Test Plan: tested by examples Reviewers: jpeg, eagleeye Subscribers: cedric Differential Revision: https://phab.enlightenment.org/D5690
This commit is contained in:
parent
0d85525dc8
commit
0c579c82c3
|
@ -4,6 +4,12 @@
|
|||
#define ELM_ACCESS_PROTECTED
|
||||
#define ELM_ACCESS_WIDGET_ACTION_PROTECTED
|
||||
#define EFL_ACCESS_SELECTION_PROTECTED
|
||||
#define EFL_UI_SCROLL_MANAGER_PROTECTED
|
||||
#define EFL_UI_SCROLLBAR_PROTECTED
|
||||
#define EFL_UI_SCROLLBAR_BETA
|
||||
#define EFL_GFX_SIZE_HINT_PROTECTED
|
||||
#define EFL_UI_LIST_PROTECTED
|
||||
|
||||
|
||||
#include <Elementary.h>
|
||||
#include "efl_ui_list_private.h"
|
||||
|
@ -49,57 +55,54 @@ _efl_ui_list_pan_efl_canvas_group_group_calculate(Eo *obj EINA_UNUSED, Efl_Ui_Li
|
|||
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_pan_elm_pan_pos_set(Eo *obj EINA_UNUSED, Efl_Ui_List_Pan_Data *psd, Evas_Coord x, Evas_Coord y)
|
||||
_efl_ui_list_pan_efl_ui_pan_pan_position_set(Eo *obj EINA_UNUSED, Efl_Ui_List_Pan_Data *psd, Eina_Position2D pos)
|
||||
{
|
||||
if ((x == psd->x) && (y == psd->y)) return;
|
||||
if ((pos.x == psd->gmt.x) && (pos.y == psd->gmt.y)) return;
|
||||
|
||||
psd->x = x;
|
||||
psd->y = y;
|
||||
psd->gmt.x = pos.x;
|
||||
psd->gmt.y = pos.y;
|
||||
|
||||
efl_event_callback_call(obj, EFL_UI_PAN_EVENT_POSITION_CHANGED, NULL);
|
||||
evas_object_smart_changed(psd->wobj);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_pan_elm_pan_pos_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Pan_Data *psd, Evas_Coord *x, Evas_Coord *y)
|
||||
EOLIAN static Eina_Position2D
|
||||
_efl_ui_list_pan_efl_ui_pan_pan_position_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Pan_Data *psd)
|
||||
{
|
||||
if (x) *x = psd->x;
|
||||
if (y) *y = psd->y;
|
||||
return psd->gmt.pos;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_pan_elm_pan_pos_max_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Pan_Data *psd, Evas_Coord *x, Evas_Coord *y)
|
||||
EOLIAN static Eina_Position2D
|
||||
_efl_ui_list_pan_efl_ui_pan_pan_position_max_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Pan_Data *psd)
|
||||
{
|
||||
Evas_Coord ow, oh;
|
||||
Eina_Size2D min;
|
||||
EFL_UI_LIST_DATA_GET(psd->wobj, pd);
|
||||
Eina_Rect vgmt = {};
|
||||
Eina_Size2D min = {};
|
||||
|
||||
elm_interface_scrollable_content_viewport_geometry_get
|
||||
(psd->wobj, NULL, NULL, &ow, &oh);
|
||||
|
||||
min = efl_ui_list_model_min_size_get(psd->wobj);
|
||||
ow = min.w - ow;
|
||||
if (ow < 0) ow = 0;
|
||||
oh = min.h - oh;
|
||||
if (oh < 0) oh = 0;
|
||||
|
||||
if (x) *x = ow;
|
||||
if (y) *y = oh;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_pan_elm_pan_pos_min_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Pan_Data *psd EINA_UNUSED, Evas_Coord *x, Evas_Coord *y)
|
||||
{
|
||||
if (x) *x = 0;
|
||||
if (y) *y = 0;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_pan_elm_pan_content_size_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Pan_Data *psd, Evas_Coord *w, Evas_Coord *h)
|
||||
{
|
||||
Eina_Size2D min;
|
||||
vgmt = efl_ui_scrollable_viewport_geometry_get(pd->scrl_mgr);
|
||||
min = efl_ui_list_model_min_size_get(psd->wobj);
|
||||
|
||||
if (w) *w = min.w;
|
||||
if (h) *h = min.h;
|
||||
min.w = min.w - vgmt.w;
|
||||
if (min.w < 0) min.w = 0;
|
||||
min.h = min.h - vgmt.h;
|
||||
if (min.h < 0) min.h = 0;
|
||||
|
||||
return EINA_POSITION2D(min.w, min.h);
|
||||
}
|
||||
|
||||
EOLIAN static Eina_Position2D
|
||||
_efl_ui_list_pan_efl_ui_pan_pan_position_min_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Pan_Data *psd EINA_UNUSED)
|
||||
{
|
||||
return EINA_POSITION2D(0, 0);
|
||||
}
|
||||
|
||||
EOLIAN static Eina_Size2D
|
||||
_efl_ui_list_pan_efl_ui_pan_content_size_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Pan_Data *psd)
|
||||
{
|
||||
Eina_Size2D min = {};
|
||||
min = efl_ui_list_model_min_size_get(psd->wobj);
|
||||
|
||||
return min;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
|
@ -110,6 +113,33 @@ _efl_ui_list_pan_efl_object_destructor(Eo *obj, Efl_Ui_List_Pan_Data *psd EINA_U
|
|||
|
||||
#include "efl_ui_list_pan.eo.c"
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_efl_ui_scrollable_interactive_content_pos_set(Eo *obj EINA_UNUSED, Efl_Ui_List_Data *psd, Eina_Position2D pos)
|
||||
{
|
||||
efl_ui_scrollable_content_pos_set(psd->scrl_mgr, pos);
|
||||
}
|
||||
|
||||
EOLIAN static Eina_Position2D
|
||||
_efl_ui_list_efl_ui_scrollable_interactive_content_pos_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Data *psd)
|
||||
{
|
||||
Eina_Position2D pos = efl_ui_scrollable_content_pos_get(psd->scrl_mgr);
|
||||
return pos;
|
||||
}
|
||||
|
||||
EOLIAN static Eina_Size2D
|
||||
_efl_ui_list_efl_ui_scrollable_interactive_content_size_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Data *psd)
|
||||
{
|
||||
Eina_Size2D size = efl_ui_scrollable_content_size_get(psd->scrl_mgr);
|
||||
return size;
|
||||
}
|
||||
|
||||
EOLIAN static Eina_Rect
|
||||
_efl_ui_list_efl_ui_scrollable_interactive_viewport_geometry_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Data *psd)
|
||||
{
|
||||
Eina_Rect gmt = efl_ui_scrollable_viewport_geometry_get(psd->scrl_mgr);
|
||||
return gmt;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_efl_model_properties_has(Efl_Model *model, Eina_Stringshare *propfind)
|
||||
{
|
||||
|
@ -173,12 +203,6 @@ _children_slice_error(void * data EINA_UNUSED, Efl_Event const* event EINA_UNUSE
|
|||
pd->slice_future = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
_show_region_hook(void *data EINA_UNUSED, Evas_Object *obj, Eina_Rect r)
|
||||
{
|
||||
elm_interface_scrollable_content_region_show(obj, r.x, r.y, r.w, r.h);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_select_mode_set(Eo *obj EINA_UNUSED, Efl_Ui_List_Data *pd, Elm_Object_Select_Mode mode)
|
||||
{
|
||||
|
@ -219,35 +243,21 @@ _efl_ui_list_homogeneous_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Data *pd)
|
|||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_efl_gfx_position_set(Eo *obj, Efl_Ui_List_Data *pd, Eina_Position2D p)
|
||||
_efl_ui_list_efl_gfx_position_set(Eo *obj, Efl_Ui_List_Data *pd, Eina_Position2D pos)
|
||||
{
|
||||
int pan_x, pan_y;
|
||||
if (_evas_object_intercept_call(obj, EVAS_OBJECT_INTERCEPT_CB_MOVE, 0, p.x, p.y))
|
||||
if (_evas_object_intercept_call(obj, EVAS_OBJECT_INTERCEPT_CB_MOVE, 0, pos.x, pos.y))
|
||||
return;
|
||||
|
||||
efl_gfx_position_set(efl_super(obj, MY_CLASS), p);
|
||||
|
||||
elm_pan_pos_get(pd->pan_obj, &pan_x, &pan_y);
|
||||
evas_object_move(pd->hit_rect, p.x, p.y);
|
||||
evas_object_move(pd->pan_obj, p.x - pan_x, p.y - pan_y);
|
||||
efl_gfx_position_set(efl_super(obj, MY_CLASS), pos);
|
||||
evas_object_smart_changed(pd->obj);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_elm_interface_scrollable_region_bring_in(Eo *obj, Efl_Ui_List_Data *pd, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
|
||||
{
|
||||
int pan_x, pan_y;
|
||||
elm_pan_pos_get(pd->pan_obj, &pan_x, &pan_y);
|
||||
elm_interface_scrollable_region_bring_in(efl_super(obj, MY_CLASS), x + pan_x, y + pan_y, w, h);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_efl_gfx_size_set(Eo *obj, Efl_Ui_List_Data *pd, Eina_Size2D size)
|
||||
{
|
||||
if (_evas_object_intercept_call(obj, EVAS_OBJECT_INTERCEPT_CB_RESIZE, 0, size.w, size.h))
|
||||
return;
|
||||
|
||||
evas_object_resize(pd->hit_rect, size.w, size.h);
|
||||
efl_gfx_size_set(efl_super(obj, MY_CLASS), size);
|
||||
|
||||
evas_object_smart_changed(pd->obj);
|
||||
|
@ -263,16 +273,345 @@ EOLIAN static void
|
|||
_efl_ui_list_efl_canvas_group_group_member_add(Eo *obj, Efl_Ui_List_Data *pd, Evas_Object *member)
|
||||
{
|
||||
efl_canvas_group_member_add(efl_super(obj, MY_CLASS), member);
|
||||
}
|
||||
|
||||
if (pd->hit_rect)
|
||||
evas_object_raise(pd->hit_rect);
|
||||
//Scrollable Implement
|
||||
static void
|
||||
_efl_ui_list_bar_read_and_update(Eo *obj)
|
||||
{
|
||||
EFL_UI_LIST_DATA_GET(obj, pd);
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
||||
double vx, vy;
|
||||
|
||||
edje_object_part_drag_value_get
|
||||
(wd->resize_obj, "elm.dragable.vbar", NULL, &vy);
|
||||
edje_object_part_drag_value_get
|
||||
(wd->resize_obj, "elm.dragable.hbar", &vx, NULL);
|
||||
|
||||
efl_ui_scrollbar_bar_position_set(pd->scrl_mgr, vx, vy);
|
||||
|
||||
efl_canvas_group_change(pd->pan_obj);
|
||||
}
|
||||
|
||||
static void
|
||||
_efl_ui_list_reload_cb(void *data,
|
||||
Evas_Object *obj EINA_UNUSED,
|
||||
const char *emission EINA_UNUSED,
|
||||
const char *source EINA_UNUSED)
|
||||
{
|
||||
EFL_UI_LIST_DATA_GET(data, pd);
|
||||
|
||||
efl_ui_scrollbar_bar_visibility_update(pd->scrl_mgr);
|
||||
}
|
||||
|
||||
static void
|
||||
_efl_ui_list_vbar_drag_cb(void *data,
|
||||
Evas_Object *obj EINA_UNUSED,
|
||||
const char *emission EINA_UNUSED,
|
||||
const char *source EINA_UNUSED)
|
||||
{
|
||||
_efl_ui_list_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_list_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_list_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_list_edje_drag_start_cb(void *data,
|
||||
Evas_Object *obj EINA_UNUSED,
|
||||
const char *emission EINA_UNUSED,
|
||||
const char *source EINA_UNUSED)
|
||||
{
|
||||
EFL_UI_LIST_DATA_GET(data, pd);
|
||||
|
||||
_efl_ui_list_bar_read_and_update(data);
|
||||
|
||||
pd->scrl_freeze = efl_ui_scrollable_scroll_freeze_get(pd->scrl_mgr);
|
||||
efl_ui_scrollable_scroll_freeze_set(pd->scrl_mgr, EINA_TRUE);
|
||||
efl_event_callback_call(data, EFL_UI_EVENT_SCROLL_DRAG_START, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
_efl_ui_list_edje_drag_stop_cb(void *data,
|
||||
Evas_Object *obj EINA_UNUSED,
|
||||
const char *emission EINA_UNUSED,
|
||||
const char *source EINA_UNUSED)
|
||||
{
|
||||
EFL_UI_LIST_DATA_GET(data, pd);
|
||||
|
||||
_efl_ui_list_bar_read_and_update(data);
|
||||
|
||||
efl_ui_scrollable_scroll_freeze_set(pd->scrl_mgr, pd->scrl_freeze);
|
||||
efl_event_callback_call(data, EFL_UI_EVENT_SCROLL_DRAG_STOP, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
_efl_ui_list_edje_drag_cb(void *data,
|
||||
Evas_Object *obj EINA_UNUSED,
|
||||
const char *emission EINA_UNUSED,
|
||||
const char *source EINA_UNUSED)
|
||||
{
|
||||
_efl_ui_list_bar_read_and_update(data);
|
||||
}
|
||||
|
||||
static void
|
||||
_efl_ui_list_hbar_drag_cb(void *data,
|
||||
Evas_Object *obj EINA_UNUSED,
|
||||
const char *emission EINA_UNUSED,
|
||||
const char *source EINA_UNUSED)
|
||||
{
|
||||
_efl_ui_list_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_list_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_list_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
|
||||
_scroll_cb(void *data EINA_UNUSED, const Efl_Event *event EINA_UNUSED)
|
||||
{
|
||||
//scroll cb
|
||||
}
|
||||
|
||||
static void
|
||||
_efl_ui_list_bar_size_changed_cb(void *data, const Efl_Event *event EINA_UNUSED)
|
||||
{
|
||||
Eo *obj = data;
|
||||
EFL_UI_LIST_DATA_GET(obj, pd);
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
||||
|
||||
double width = 0.0, height = 0.0;
|
||||
|
||||
efl_ui_scrollbar_bar_size_get(pd->scrl_mgr, &width, &height);
|
||||
|
||||
edje_object_part_drag_size_set(wd->resize_obj, "elm.dragable.hbar", width, 1.0);
|
||||
edje_object_part_drag_size_set(wd->resize_obj, "elm.dragable.vbar", 1.0, height);
|
||||
}
|
||||
|
||||
static void
|
||||
_efl_ui_list_bar_pos_changed_cb(void *data, const Efl_Event *event EINA_UNUSED)
|
||||
{
|
||||
Eo *obj = data;
|
||||
EFL_UI_LIST_DATA_GET(obj, pd);
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
||||
|
||||
double posx = 0.0, posy = 0.0;
|
||||
|
||||
efl_ui_scrollbar_bar_position_get(pd->scrl_mgr, &posx, &posy);
|
||||
|
||||
edje_object_part_drag_value_set(wd->resize_obj, "elm.dragable.hbar", posx, 0.0);
|
||||
edje_object_part_drag_value_set(wd->resize_obj, "elm.dragable.vbar", 0.0, posy);
|
||||
}
|
||||
|
||||
static void
|
||||
_efl_ui_list_bar_show_cb(void *data, const Efl_Event *event)
|
||||
{
|
||||
Eo *obj = data;
|
||||
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)
|
||||
edje_object_signal_emit(wd->resize_obj, "elm,action,show,hbar", "elm");
|
||||
else if (type == EFL_UI_SCROLLBAR_DIRECTION_VERTICAL)
|
||||
edje_object_signal_emit(wd->resize_obj, "elm,action,show,vbar", "elm");
|
||||
}
|
||||
|
||||
static void
|
||||
_efl_ui_list_bar_hide_cb(void *data, const Efl_Event *event)
|
||||
{
|
||||
Eo *obj = data;
|
||||
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)
|
||||
edje_object_signal_emit(wd->resize_obj, "elm,action,hide,hbar", "elm");
|
||||
else if (type == EFL_UI_SCROLLBAR_DIRECTION_VERTICAL)
|
||||
edje_object_signal_emit(wd->resize_obj, "elm,action,hide,vbar", "elm");
|
||||
}
|
||||
|
||||
EOLIAN static Eina_Bool
|
||||
_efl_ui_list_efl_layout_signal_signal_callback_add(Eo *obj EINA_UNUSED, Efl_Ui_List_Data *sd EINA_UNUSED, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data)
|
||||
{
|
||||
Eina_Bool ok;
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
|
||||
|
||||
ok = efl_layout_signal_callback_add(wd->resize_obj, emission, source, func_cb, data);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
EOLIAN static Eina_Bool
|
||||
_efl_ui_list_efl_layout_signal_signal_callback_del(Eo *obj EINA_UNUSED, Efl_Ui_List_Data *sd EINA_UNUSED, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data)
|
||||
{
|
||||
Eina_Bool ok;
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
|
||||
|
||||
ok = efl_layout_signal_callback_del(wd->resize_obj, emission, source, func_cb, data);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
static void
|
||||
_efl_ui_list_edje_object_attach(Eo *obj)
|
||||
{
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "reload", "elm", _efl_ui_list_reload_cb, obj);
|
||||
//Vertical bar
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "drag", "elm.dragable.vbar", _efl_ui_list_vbar_drag_cb,
|
||||
obj);
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "drag,set", "elm.dragable.vbar",
|
||||
_efl_ui_list_edje_drag_cb, obj);
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "drag,start", "elm.dragable.vbar",
|
||||
_efl_ui_list_edje_drag_start_cb, obj);
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "drag,stop", "elm.dragable.vbar",
|
||||
_efl_ui_list_edje_drag_stop_cb, obj);
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "drag,step", "elm.dragable.vbar",
|
||||
_efl_ui_list_edje_drag_cb, obj);
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "drag,page", "elm.dragable.vbar",
|
||||
_efl_ui_list_edje_drag_cb, obj);
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "elm,vbar,press", "elm",
|
||||
_efl_ui_list_vbar_press_cb, obj);
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "elm,vbar,unpress", "elm",
|
||||
_efl_ui_list_vbar_unpress_cb, obj);
|
||||
|
||||
//Horizontal bar
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "drag", "elm.dragable.hbar", _efl_ui_list_hbar_drag_cb,
|
||||
obj);
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "drag,set", "elm.dragable.hbar",
|
||||
_efl_ui_list_edje_drag_cb, obj);
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "drag,start", "elm.dragable.hbar",
|
||||
_efl_ui_list_edje_drag_start_cb, obj);
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "drag,stop", "elm.dragable.hbar",
|
||||
_efl_ui_list_edje_drag_stop_cb, obj);
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "drag,step", "elm.dragable.hbar",
|
||||
_efl_ui_list_edje_drag_cb, obj);
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "drag,page", "elm.dragable.hbar",
|
||||
_efl_ui_list_edje_drag_cb, obj);
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "elm,hbar,press", "elm",
|
||||
_efl_ui_list_hbar_press_cb, obj);
|
||||
efl_layout_signal_callback_add
|
||||
(obj, "elm,hbar,unpress", "elm",
|
||||
_efl_ui_list_hbar_unpress_cb, obj);
|
||||
}
|
||||
|
||||
static void
|
||||
_efl_ui_list_edje_object_detach(Evas_Object *obj)
|
||||
{
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "reload", "elm", _efl_ui_list_reload_cb, obj);
|
||||
//Vertical bar
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "drag", "elm.dragable.vbar", _efl_ui_list_vbar_drag_cb,
|
||||
obj);
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "drag,set", "elm.dragable.vbar",
|
||||
_efl_ui_list_edje_drag_cb, obj);
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "drag,start", "elm.dragable.vbar",
|
||||
_efl_ui_list_edje_drag_start_cb, obj);
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "drag,stop", "elm.dragable.vbar",
|
||||
_efl_ui_list_edje_drag_stop_cb, obj);
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "drag,step", "elm.dragable.vbar",
|
||||
_efl_ui_list_edje_drag_cb, obj);
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "drag,page", "elm.dragable.vbar",
|
||||
_efl_ui_list_edje_drag_cb, obj);
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "elm,vbar,press", "elm",
|
||||
_efl_ui_list_vbar_press_cb, obj);
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "elm,vbar,unpress", "elm",
|
||||
_efl_ui_list_vbar_unpress_cb, obj);
|
||||
|
||||
//Horizontal bar
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "drag", "elm.dragable.hbar", _efl_ui_list_hbar_drag_cb,
|
||||
obj);
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "drag,set", "elm.dragable.hbar",
|
||||
_efl_ui_list_edje_drag_cb, obj);
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "drag,start", "elm.dragable.hbar",
|
||||
_efl_ui_list_edje_drag_start_cb, obj);
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "drag,stop", "elm.dragable.hbar",
|
||||
_efl_ui_list_edje_drag_stop_cb, obj);
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "drag,step", "elm.dragable.hbar",
|
||||
_efl_ui_list_edje_drag_cb, obj);
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "drag,page", "elm.dragable.hbar",
|
||||
_efl_ui_list_edje_drag_cb, obj);
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "elm,hbar,press", "elm",
|
||||
_efl_ui_list_hbar_press_cb, obj);
|
||||
efl_layout_signal_callback_del
|
||||
(obj, "elm,hbar,unpress", "elm",
|
||||
_efl_ui_list_hbar_unpress_cb, obj);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_list_efl_canvas_group_group_add(Eo *obj, Efl_Ui_List_Data *pd)
|
||||
{
|
||||
Efl_Ui_List_Pan_Data *pan_data;
|
||||
Evas_Coord minw, minh;
|
||||
Eina_Size2D min = {};
|
||||
Eina_Bool bounce = _elm_config->thumbscroll_bounce_enable;
|
||||
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
||||
|
||||
|
@ -284,34 +623,38 @@ _efl_ui_list_efl_canvas_group_group_add(Eo *obj, Efl_Ui_List_Data *pd)
|
|||
if (!elm_layout_theme_set(obj, "list", "base", elm_widget_style_get(obj)))
|
||||
CRI("Failed to set layout!");
|
||||
|
||||
pd->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
|
||||
evas_object_data_set(pd->hit_rect, "_elm_leaveme", obj);
|
||||
evas_object_smart_member_add(pd->hit_rect, obj);
|
||||
elm_widget_sub_object_add(obj, pd->hit_rect);
|
||||
|
||||
/* common scroller hit rectangle setup */
|
||||
evas_object_color_set(pd->hit_rect, 0, 0, 0, 0);
|
||||
evas_object_show(pd->hit_rect);
|
||||
evas_object_repeat_events_set(pd->hit_rect, EINA_TRUE);
|
||||
|
||||
elm_widget_on_show_region_hook_set(obj, NULL, _show_region_hook, NULL);
|
||||
|
||||
elm_interface_scrollable_objects_set(obj, wd->resize_obj, pd->hit_rect);
|
||||
elm_interface_scrollable_bounce_allow_set
|
||||
(obj, EINA_FALSE, _elm_config->thumbscroll_bounce_enable);
|
||||
|
||||
pd->mode = ELM_LIST_COMPRESS;
|
||||
|
||||
efl_access_type_set(obj, EFL_ACCESS_TYPE_DISABLED);
|
||||
pd->pan_obj = efl_add(MY_PAN_CLASS, evas_object_evas_get(obj));
|
||||
pd->scrl_mgr = efl_add(EFL_UI_SCROLL_MANAGER_CLASS, obj,
|
||||
efl_ui_mirrored_set(efl_added, efl_ui_mirrored_get(obj)));
|
||||
pd->pan_obj = efl_add(MY_PAN_CLASS, obj);
|
||||
pan_data = efl_data_scope_get(pd->pan_obj, MY_PAN_CLASS);
|
||||
pan_data->wobj = obj;
|
||||
|
||||
elm_interface_scrollable_extern_pan_set(obj, pd->pan_obj);
|
||||
evas_object_show(pd->pan_obj);
|
||||
efl_ui_scroll_manager_pan_set(pd->scrl_mgr, pd->pan_obj);
|
||||
efl_ui_scrollable_bounce_enabled_set(pd->scrl_mgr, bounce, bounce);
|
||||
|
||||
edje_object_size_min_calc(wd->resize_obj, &minw, &minh);
|
||||
evas_object_size_hint_min_set(obj, minw, minh);
|
||||
edje_object_part_swallow(wd->resize_obj, "elm.swallow.content", pd->pan_obj);
|
||||
efl_gfx_stack_raise((Eo *)edje_object_part_object_get(wd->resize_obj, "elm.dragable.vbar"));
|
||||
|
||||
pd->mode = ELM_LIST_COMPRESS;
|
||||
|
||||
efl_gfx_visible_set(pd->pan_obj, EINA_TRUE);
|
||||
|
||||
efl_access_type_set(obj, EFL_ACCESS_TYPE_DISABLED);
|
||||
|
||||
edje_object_size_min_calc(wd->resize_obj, &min.w, &min.h);
|
||||
efl_gfx_size_hint_restricted_min_set(obj, min);
|
||||
|
||||
efl_event_callback_add(obj, EFL_UI_EVENT_SCROLL, _scroll_cb, obj);
|
||||
efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SIZE_CHANGED,
|
||||
_efl_ui_list_bar_size_changed_cb, obj);
|
||||
efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_POS_CHANGED,
|
||||
_efl_ui_list_bar_pos_changed_cb, obj);
|
||||
efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SHOW,
|
||||
_efl_ui_list_bar_show_cb, obj);
|
||||
efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_HIDE,
|
||||
_efl_ui_list_bar_hide_cb, obj);
|
||||
|
||||
_efl_ui_list_edje_object_attach(obj);
|
||||
|
||||
elm_layout_sizing_eval(obj);
|
||||
}
|
||||
|
@ -386,6 +729,12 @@ _efl_ui_list_efl_object_destructor(Eo *obj, Efl_Ui_List_Data *pd)
|
|||
efl_unref(pd->model);
|
||||
eina_stringshare_del(pd->style);
|
||||
|
||||
efl_event_callback_del(obj, EFL_UI_EVENT_SCROLL, _scroll_cb, obj);
|
||||
_efl_ui_list_edje_object_detach(obj);
|
||||
|
||||
ELM_SAFE_FREE(pd->pan_obj, evas_object_del);
|
||||
efl_canvas_group_del(efl_super(obj, MY_CLASS));
|
||||
|
||||
efl_ui_list_segarray_flush(&pd->segarray);
|
||||
|
||||
efl_destructor(efl_super(obj, MY_CLASS));
|
||||
|
@ -592,7 +941,7 @@ _efl_ui_list_efl_ui_list_model_min_size_set(Eo *obj, Efl_Ui_List_Data *pd, Eina_
|
|||
pd->min.h = min.h;
|
||||
|
||||
evas_object_size_hint_min_set(wd->resize_obj, pd->min.w, pd->min.h);
|
||||
efl_event_callback_legacy_call(pd->pan_obj, ELM_PAN_EVENT_CHANGED, NULL);
|
||||
efl_event_callback_call(pd->pan_obj, EFL_UI_PAN_EVENT_CONTENT_CHANGED, NULL);
|
||||
}
|
||||
|
||||
EOLIAN static Efl_Ui_List_LayoutItem *
|
||||
|
|
|
@ -6,7 +6,7 @@ struct Efl.Ui.List.Item_Event
|
|||
child: Efl.Model;
|
||||
index: int;
|
||||
}
|
||||
class Efl.Ui.List (Efl.Ui.Layout, Efl.Ui.View, Elm.Interface_Scrollable,
|
||||
class Efl.Ui.List (Efl.Ui.Layout, Efl.Ui.View, Efl.Ui.Scrollable.Interactive, Efl.Ui.Scrollbar,
|
||||
Efl.Access.Widget.Action, Efl.Access.Selection,
|
||||
Efl.Ui.Clickable, Efl.Ui.Selectable, Efl.Ui.List.Model)
|
||||
{
|
||||
|
@ -92,7 +92,12 @@ class Efl.Ui.List (Efl.Ui.Layout, Efl.Ui.View, Elm.Interface_Scrollable,
|
|||
//Efl.Ui.Layout.sizing_eval;
|
||||
Efl.Ui.View.model { get; set; }
|
||||
|
||||
Elm.Interface_Scrollable.region_bring_in;
|
||||
Efl.Ui.Scrollable.Interactive.viewport_geometry { get; }
|
||||
Efl.Ui.Scrollable.Interactive.content_pos { get; set; }
|
||||
Efl.Ui.Scrollable.Interactive.content_size { get; }
|
||||
// Efl.Ui.Scrollable.Interactive.scroll;
|
||||
Efl.Layout.Signal.signal_callback_add;
|
||||
Efl.Layout.Signal.signal_callback_del;
|
||||
// Elm.Interface.Atspi_Accessible.children { get; }
|
||||
// Elm.Interface.Atspi_Widget_Action.elm_actions { get; }
|
||||
// Efl.Access.Widget.Action.elm_actions { get; }
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
class Efl.Ui.List.Pan (Elm.Pan)
|
||||
class Efl.Ui.List.Pan (Efl.Ui.Pan)
|
||||
{
|
||||
[[Elementary Efl_Ui_List pan class]]
|
||||
implements {
|
||||
Efl.Object.destructor;
|
||||
Elm.Pan.content_size { get; }
|
||||
Elm.Pan.pos { get; set; }
|
||||
Elm.Pan.pos_min { get; }
|
||||
Elm.Pan.pos_max { get; }
|
||||
Efl.Ui.Pan.content_size { get; }
|
||||
Efl.Ui.Pan.pan_position { get; set; }
|
||||
Efl.Ui.Pan.pan_position_min { get; }
|
||||
Efl.Ui.Pan.pan_position_max { get; }
|
||||
Efl.Canvas.Group.group_calculate;
|
||||
}
|
||||
events {
|
||||
|
|
|
@ -414,13 +414,14 @@ static void
|
|||
_calc_range(Efl_Ui_List_Precise_Layouter_Data *pd)
|
||||
{
|
||||
Efl_Ui_List_SegArray_Node *node;
|
||||
Evas_Coord ow, oh, scr_x, scr_y, ch;
|
||||
Evas_Coord ch;
|
||||
Eina_Rect vgmt;
|
||||
Eina_Position2D spos;
|
||||
Efl_Ui_List_Precise_Layouter_Node_Data *nodedata;
|
||||
int i;
|
||||
|
||||
elm_interface_scrollable_content_viewport_geometry_get
|
||||
(pd->modeler, NULL, NULL, &ow, &oh);
|
||||
elm_interface_scrollable_content_pos_get(pd->modeler, &scr_x, &scr_y);
|
||||
vgmt = efl_ui_scrollable_viewport_geometry_get(pd->modeler);
|
||||
spos = efl_ui_scrollable_content_pos_get(pd->modeler);
|
||||
|
||||
ch = 0;
|
||||
Eina_Accessor *nodes = efl_ui_list_segarray_node_accessor_get(pd->segarray);
|
||||
|
@ -430,8 +431,7 @@ _calc_range(Efl_Ui_List_Precise_Layouter_Data *pd)
|
|||
if (!nodedata || !nodedata->min.h)
|
||||
continue;
|
||||
|
||||
if ((scr_y < ch || scr_y < nodedata->min.h + ch) &&
|
||||
(scr_y + oh > ch || scr_y + oh > nodedata->min.h + ch))
|
||||
if ((ch > spos.y || nodedata->min.h + ch > spos.y) && (ch < (spos.y + vgmt.h) || nodedata->min.h + ch < spos.y + vgmt.h))
|
||||
_node_realize(pd, node);
|
||||
else
|
||||
_node_unrealize(pd, node);
|
||||
|
@ -550,7 +550,8 @@ _efl_ui_list_precise_layouter_efl_ui_list_relayout_model_set(Eo *obj EINA_UNUSED
|
|||
static void
|
||||
_efl_ui_list_relayout_layout_do(Efl_Ui_List_Precise_Layouter_Data *pd)
|
||||
{
|
||||
Evas_Coord ow, oh, scr_x, scr_y;
|
||||
Eina_Rect vgmt;
|
||||
Eina_Position2D spos;
|
||||
double cur_pos = 0;
|
||||
Efl_Ui_List_LayoutItem* layout_item;
|
||||
Efl_Ui_List_SegArray_Node *items_node;
|
||||
|
@ -582,8 +583,8 @@ _efl_ui_list_relayout_layout_do(Efl_Ui_List_Precise_Layouter_Data *pd)
|
|||
|
||||
efl_ui_list_model_min_size_set(pd->modeler, pd->min);
|
||||
|
||||
elm_interface_scrollable_content_viewport_geometry_get(pd->modeler, NULL, NULL, &ow, &oh);
|
||||
elm_interface_scrollable_content_pos_get(pd->modeler, &scr_x, &scr_y);
|
||||
vgmt = efl_ui_scrollable_viewport_geometry_get(pd->modeler);
|
||||
spos = efl_ui_scrollable_content_pos_get(pd->modeler);
|
||||
|
||||
Eina_Accessor *nodes = efl_ui_list_segarray_node_accessor_get(pd->segarray);
|
||||
EINA_ACCESSOR_FOREACH(nodes, i, items_node)
|
||||
|
@ -620,9 +621,9 @@ _efl_ui_list_relayout_layout_do(Efl_Ui_List_Precise_Layouter_Data *pd)
|
|||
cur_pos += h;
|
||||
|
||||
if (w < pd->min.w) w = pd->min.w;
|
||||
if (w > ow) w = ow;
|
||||
if (w > vgmt.w) w = vgmt.w;
|
||||
|
||||
evas_object_geometry_set(layout_item->layout, (x + 0 - scr_x), (y + 0 - scr_y), w, h);
|
||||
evas_object_geometry_set(layout_item->layout, (x + 0 - spos.x), (y + 0 - spos.y), w, h);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,7 +34,8 @@ typedef struct _Efl_Ui_List_Data Efl_Ui_List_Data;
|
|||
struct _Efl_Ui_List_Data
|
||||
{
|
||||
Eo *obj;
|
||||
Evas_Object *hit_rect;
|
||||
Eo *scrl_mgr;
|
||||
Efl_Ui_List_Pan *pan_obj;
|
||||
Efl_Model *model;
|
||||
|
||||
Efl_Orient orient;
|
||||
|
@ -61,8 +62,6 @@ struct _Efl_Ui_List_Data
|
|||
int segarray_first;
|
||||
Efl_Ui_List_SegArray segarray;
|
||||
|
||||
Evas_Object *pan_obj;
|
||||
|
||||
Efl_Ui_Layout_Factory *factory;
|
||||
Eina_List *selected_items;
|
||||
// struct {
|
||||
|
@ -73,6 +72,7 @@ struct _Efl_Ui_List_Data
|
|||
Elm_List_Mode mode;
|
||||
|
||||
Efl_Ui_Focus_Manager *manager;
|
||||
Eina_Rect gmt;
|
||||
Eina_Size2D min;
|
||||
int /*average_item_size, avsom, */item_count;
|
||||
Efl_Future *slice_future;
|
||||
|
@ -86,6 +86,7 @@ struct _Efl_Ui_List_Data
|
|||
Eina_Bool homogeneous : 1;
|
||||
Eina_Bool recalc : 1;
|
||||
Eina_Bool on_hold : 1;
|
||||
Eina_Bool scrl_freeze : 1;
|
||||
};
|
||||
|
||||
typedef struct _Efl_Ui_List_Pan_Data Efl_Ui_List_Pan_Data;
|
||||
|
@ -93,7 +94,8 @@ typedef struct _Efl_Ui_List_Pan_Data Efl_Ui_List_Pan_Data;
|
|||
struct _Efl_Ui_List_Pan_Data
|
||||
{
|
||||
Eo *wobj;
|
||||
Evas_Coord x, y, move_diff;
|
||||
Eina_Rect gmt;
|
||||
Evas_Coord move_diff;
|
||||
|
||||
Ecore_Job *resize_job;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue