forked from enlightenment/efl
scroller: add loop feature.
This feature works the infinite loop horizontally or vertically. If the content is set, it will be shown repeatedly. @feature Change-Id: I1f20b794ae44bc8e5d120901222c7cccadca96b7 Conflicts: src/lib/elm_scroller.c src/lib/elm_scroller_legacy.h
This commit is contained in:
parent
9a2f068740
commit
1925ec3b8e
|
@ -1252,3 +1252,55 @@ group { name: "elm/scroller/base/noclip";
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
group { name: "elm/scroller/contents/default";
|
||||
parts {
|
||||
part { name: "elm.swallow.content";
|
||||
type: SWALLOW;
|
||||
description { state: "default" 0.0;
|
||||
}
|
||||
}
|
||||
part { name: "elm.swallow.content_r";
|
||||
type: SWALLOW;
|
||||
description { state: "default" 0.0;
|
||||
fixed: 1 1;
|
||||
rel1 {
|
||||
relative: 1.0 0.0;
|
||||
to: "elm.swallow.content";
|
||||
}
|
||||
rel2 {
|
||||
relative: 2.0 1.0;
|
||||
to: "elm.swallow.content";
|
||||
}
|
||||
}
|
||||
}
|
||||
part { name: "elm.swallow.content_b";
|
||||
type: SWALLOW;
|
||||
description { state: "default" 0.0;
|
||||
fixed: 1 1;
|
||||
rel1 {
|
||||
relative: 0.0 1.0;
|
||||
to: "elm.swallow.content";
|
||||
}
|
||||
rel2 {
|
||||
relative: 1.0 2.0;
|
||||
to: "elm.swallow.content";
|
||||
}
|
||||
}
|
||||
}
|
||||
part { name: "elm.swallow.content_rb";
|
||||
type: SWALLOW;
|
||||
description { state: "default" 0.0;
|
||||
fixed: 1 1;
|
||||
rel1 {
|
||||
relative: 1.0 1.0;
|
||||
to: "elm.swallow.content";
|
||||
}
|
||||
rel2 {
|
||||
relative: 2.0 2.0;
|
||||
to: "elm.swallow.content";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -112,6 +112,28 @@ my_bt_block_movements_y_axis(void *data, Evas_Object *obj,
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
my_bt_loop_x_axis(void *data, Evas_Object *obj EINA_UNUSED,
|
||||
void *event_info EINA_UNUSED)
|
||||
{
|
||||
Eina_Bool loop_h, loop_v;
|
||||
Evas_Object *scroller = (Evas_Object *)data;
|
||||
|
||||
elm_scroller_loop_get(scroller, &loop_h, &loop_v);
|
||||
elm_scroller_loop_set(scroller, !loop_h, loop_v);
|
||||
}
|
||||
|
||||
void
|
||||
my_bt_loop_y_axis(void *data, Evas_Object *obj EINA_UNUSED,
|
||||
void *event_info EINA_UNUSED)
|
||||
{
|
||||
Eina_Bool loop_h, loop_v;
|
||||
Evas_Object *scroller = (Evas_Object *)data;
|
||||
|
||||
elm_scroller_loop_get(scroller, &loop_h, &loop_v);
|
||||
elm_scroller_loop_set(scroller, loop_h, !loop_v);
|
||||
}
|
||||
|
||||
void
|
||||
page_change_cb(void *data EINA_UNUSED,
|
||||
Evas_Object *obj,
|
||||
|
@ -152,7 +174,7 @@ void
|
|||
test_scroller(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||
{
|
||||
Evas_Object *win, *bg2, *tb, *tb2, *sc, *bt, *ck1, *ck2, *bx, *bx2, *fr,
|
||||
*ck3, *ck4, *ck5;
|
||||
*ck3, *ck4, *ck5, *ck6, *ck7;
|
||||
int i, j, n;
|
||||
char buf[PATH_MAX];
|
||||
Evas_Coord x = 0, y = 0, w = 0, h = 0;
|
||||
|
@ -214,6 +236,16 @@ test_scroller(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_
|
|||
elm_box_pack_end(bx2, ck5);
|
||||
evas_object_show(ck5);
|
||||
|
||||
ck6 = elm_check_add(win);
|
||||
elm_object_text_set(ck6, "Loop in X axis");
|
||||
elm_box_pack_end(bx2, ck6);
|
||||
evas_object_show(ck6);
|
||||
|
||||
ck7 = elm_check_add(win);
|
||||
elm_object_text_set(ck7, "Loop in Y axis");
|
||||
elm_box_pack_end(bx2, ck7);
|
||||
evas_object_show(ck7);
|
||||
|
||||
sc = elm_scroller_add(win);
|
||||
evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
||||
evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
||||
|
@ -256,6 +288,8 @@ test_scroller(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_
|
|||
evas_object_smart_callback_add(ck4, "changed", my_bt_block_movements_y_axis,
|
||||
sc);
|
||||
evas_object_smart_callback_add(ck5, "changed", my_bt_snap_to_pages, sc);
|
||||
evas_object_smart_callback_add(ck6, "changed", my_bt_loop_x_axis, sc);
|
||||
evas_object_smart_callback_add(ck7, "changed", my_bt_loop_y_axis, sc);
|
||||
|
||||
bt = elm_spinner_add(win);
|
||||
elm_spinner_min_max_set(bt, 0, 500);
|
||||
|
|
|
@ -1209,14 +1209,24 @@ _elm_scroll_wanted_coordinates_update(Elm_Scrollable_Smart_Interface_Data *sid,
|
|||
eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
|
||||
(NULL, NULL, &sid->ww, &sid->wh));
|
||||
|
||||
if (x < minx) sid->wx = minx;
|
||||
else if (x > mx) sid->wx = mx;
|
||||
if (x < minx)
|
||||
{
|
||||
if (!sid->loop_h) sid->wx = minx;
|
||||
else sid->wx = mx;
|
||||
}
|
||||
else if (!sid->loop_h && (x > mx)) sid->wx = mx;
|
||||
else if (sid->loop_h && x >= (sid->ww + mx)) sid->wx = 0;
|
||||
else if (sid->is_mirrored)
|
||||
sid->wx = _elm_scroll_x_mirrored_get(sid->obj, x);
|
||||
else sid->wx = x;
|
||||
|
||||
if (y < miny) sid->wy = miny;
|
||||
else if (y > my) sid->wy = my;
|
||||
if (y < miny)
|
||||
{
|
||||
if (!sid->loop_v) sid->wy = miny;
|
||||
else sid->wy = my;
|
||||
}
|
||||
else if (!sid->loop_v && (y > my)) sid->wy = my;
|
||||
else if (sid->loop_v && y >= (sid->wh + my)) sid->wy = 0;
|
||||
else sid->wy = y;
|
||||
}
|
||||
|
||||
|
@ -1446,6 +1456,7 @@ EOLIAN static void
|
|||
_elm_interface_scrollable_content_pos_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x, Evas_Coord y, Eina_Bool sig)
|
||||
{
|
||||
Evas_Coord mx = 0, my = 0, px = 0, py = 0, spx = 0, spy = 0, minx = 0, miny = 0;
|
||||
Evas_Coord cw = 0, ch = 0, pw = 0, ph = 0;
|
||||
double vx, vy;
|
||||
|
||||
|
||||
|
@ -1454,7 +1465,9 @@ _elm_interface_scrollable_content_pos_set(Eo *obj, Elm_Scrollable_Smart_Interfac
|
|||
// FIXME: allow for bounce outside of range
|
||||
eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
|
||||
eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
|
||||
eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&cw, &ch));
|
||||
eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
|
||||
evas_object_geometry_get(sid->pan_obj, NULL, NULL, &pw, &ph);
|
||||
|
||||
if (_paging_is_enabled(sid))
|
||||
{
|
||||
|
@ -1478,24 +1491,35 @@ _elm_interface_scrollable_content_pos_set(Eo *obj, Elm_Scrollable_Smart_Interfac
|
|||
}
|
||||
}
|
||||
|
||||
if (sid->loop_h && cw > 0)
|
||||
{
|
||||
if (x < 0) x = cw + (x % cw);
|
||||
else if (x >= cw) x = (x % cw);
|
||||
}
|
||||
if (sid->loop_v && ch > 0)
|
||||
{
|
||||
if (y < 0) y = ch + (y % ch);
|
||||
else if (y >= ch) y = (y % ch);
|
||||
}
|
||||
|
||||
if (!_elm_config->thumbscroll_bounce_enable)
|
||||
{
|
||||
|
||||
if (x < minx) x = minx;
|
||||
if ((x - minx) > mx) x = mx + minx;
|
||||
if (!sid->loop_h && (x - minx) > mx) x = mx + minx;
|
||||
if (y < miny) y = miny;
|
||||
if ((y - miny) > my) y = my + miny;
|
||||
if (!sid->loop_v && (y - miny) > my) y = my + miny;
|
||||
}
|
||||
|
||||
if (!sid->bounce_horiz)
|
||||
{
|
||||
if (x < minx) x = minx;
|
||||
if ((x - minx) > mx) x = mx + minx;
|
||||
if (!sid->loop_h && (x - minx) > mx) x = mx + minx;
|
||||
}
|
||||
if (!sid->bounce_vert)
|
||||
{
|
||||
if (y < miny) y = miny;
|
||||
if (y - miny > my) y = my + miny;
|
||||
if (!sid->loop_v && (y - miny) > my) y = my + miny;
|
||||
}
|
||||
|
||||
eo_do(sid->pan_obj, elm_obj_pan_pos_set(x, y));
|
||||
|
@ -1520,7 +1544,7 @@ _elm_interface_scrollable_content_pos_set(Eo *obj, Elm_Scrollable_Smart_Interfac
|
|||
edje_object_part_drag_value_set
|
||||
(sid->edje_obj, "elm.dragable.hbar", vx, 0.0);
|
||||
|
||||
if (!sid->down.bounce_x_animator)
|
||||
if (!sid->loop_h && !sid->down.bounce_x_animator)
|
||||
{
|
||||
if (((x < minx) && (0 <= sid->down.dx)) ||
|
||||
((x > (mx + minx)) && (0 >= sid->down.dx)))
|
||||
|
@ -1531,7 +1555,7 @@ _elm_interface_scrollable_content_pos_set(Eo *obj, Elm_Scrollable_Smart_Interfac
|
|||
else
|
||||
sid->bouncemex = EINA_FALSE;
|
||||
}
|
||||
if (!sid->down.bounce_y_animator)
|
||||
if (!sid->loop_v && !sid->down.bounce_y_animator)
|
||||
{
|
||||
if (((y < miny) && (0 <= sid->down.dy)) ||
|
||||
((y > (my + miny)) && (0 >= sid->down.dy)))
|
||||
|
@ -1717,10 +1741,16 @@ _elm_scroll_content_region_show_internal(Evas_Object *obj,
|
|||
x = nx;
|
||||
y = ny;
|
||||
}
|
||||
if ((x + pw) > cw) x = cw - pw;
|
||||
if (x < minx) x = minx;
|
||||
if ((y + ph) > ch) y = ch - ph;
|
||||
if (y < miny) y = miny;
|
||||
if (!sid->loop_h)
|
||||
{
|
||||
if ((x + pw) > cw) x = cw - pw;
|
||||
if (x < minx) x = minx;
|
||||
}
|
||||
if (!sid->loop_v)
|
||||
{
|
||||
if ((y + ph) > ch) y = ch - ph;
|
||||
if (y < miny) y = miny;
|
||||
}
|
||||
|
||||
if ((x == px) && (y == py)) return EINA_FALSE;
|
||||
*_x = x;
|
||||
|
@ -2007,12 +2037,12 @@ _elm_scroll_momentum_animator(void *data)
|
|||
if (!_elm_config->thumbscroll_bounce_enable || !sid->bounce_horiz)
|
||||
{
|
||||
if (x <= minx) no_bounce_x_end = EINA_TRUE;
|
||||
if ((x - minx) >= maxx) no_bounce_x_end = EINA_TRUE;
|
||||
if (!sid->loop_h && (x - minx) >= maxx) no_bounce_x_end = EINA_TRUE;
|
||||
}
|
||||
if (!_elm_config->thumbscroll_bounce_enable || !sid->bounce_vert)
|
||||
{
|
||||
if (y <= miny) no_bounce_y_end = EINA_TRUE;
|
||||
if ((y - miny) >= maxy) no_bounce_y_end = EINA_TRUE;
|
||||
if (sid->loop_v && (y - miny) >= maxy) no_bounce_y_end = EINA_TRUE;
|
||||
}
|
||||
if ((dt >= 1.0) ||
|
||||
((sid->down.bounce_x_hold) && (sid->down.bounce_y_hold)) ||
|
||||
|
@ -2072,8 +2102,11 @@ _elm_scroll_page_x_get(Elm_Scrollable_Smart_Interface_Data *sid,
|
|||
x = x / (sid->pagesize_h);
|
||||
x = x * (sid->pagesize_h);
|
||||
}
|
||||
if ((x + w) > cw) x = cw - w;
|
||||
if (x < minx) x = minx;
|
||||
if (!sid->loop_h)
|
||||
{
|
||||
if ((x + w) > cw) x = cw - w;
|
||||
if (x < minx) x = minx;
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
|
@ -2113,8 +2146,11 @@ _elm_scroll_page_y_get(Elm_Scrollable_Smart_Interface_Data *sid,
|
|||
y = y / (sid->pagesize_v);
|
||||
y = y * (sid->pagesize_v);
|
||||
}
|
||||
if ((y + h) > ch) y = ch - h;
|
||||
if (y < miny) y = miny;
|
||||
if (!sid->loop_v)
|
||||
{
|
||||
if ((y + h) > ch) y = ch - h;
|
||||
if (y < miny) y = miny;
|
||||
}
|
||||
|
||||
return y;
|
||||
}
|
||||
|
@ -2803,19 +2839,19 @@ _elm_scroll_down_coord_eval(Elm_Scrollable_Smart_Interface_Data *sid,
|
|||
|
||||
eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
|
||||
|
||||
if (*x < minx)
|
||||
if (!sid->loop_h && *x < minx)
|
||||
*x += (minx - *x) * _elm_config->thumbscroll_border_friction;
|
||||
else if (sid->content_info.w <= sid->w)
|
||||
else if (!sid->loop_h && sid->content_info.w <= sid->w)
|
||||
*x += (sid->down.sx - *x) * _elm_config->thumbscroll_border_friction;
|
||||
else if ((sid->content_info.w - sid->w + minx) < *x)
|
||||
else if (!sid->loop_h && (sid->content_info.w - sid->w + minx) < *x)
|
||||
*x += (sid->content_info.w - sid->w + minx - *x) *
|
||||
_elm_config->thumbscroll_border_friction;
|
||||
|
||||
if (*y < miny)
|
||||
if (!sid->loop_v && *y < miny)
|
||||
*y += (miny - *y) * _elm_config->thumbscroll_border_friction;
|
||||
else if (sid->content_info.h <= sid->h)
|
||||
else if (!sid->loop_v && sid->content_info.h <= sid->h)
|
||||
*y += (sid->down.sy - *y) * _elm_config->thumbscroll_border_friction;
|
||||
else if ((sid->content_info.h - sid->h + miny) < *y)
|
||||
else if (!sid->loop_v && (sid->content_info.h - sid->h + miny) < *y)
|
||||
*y += (sid->content_info.h - sid->h + miny - *y) *
|
||||
_elm_config->thumbscroll_border_friction;
|
||||
}
|
||||
|
@ -3222,22 +3258,22 @@ _elm_scroll_mouse_move_event_cb(void *data,
|
|||
|
||||
eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
|
||||
eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
|
||||
if (y < miny)
|
||||
if (!sid->loop_v && y < miny)
|
||||
y += (miny - y) *
|
||||
_elm_config->thumbscroll_border_friction;
|
||||
else if (my <= 0)
|
||||
else if (!sid->loop_v && my <= 0)
|
||||
y += (sid->down.sy - y) *
|
||||
_elm_config->thumbscroll_border_friction;
|
||||
else if ((my + miny) < y)
|
||||
else if (!sid->loop_v && (my + miny) < y)
|
||||
y += (my + miny - y) *
|
||||
_elm_config->thumbscroll_border_friction;
|
||||
if (x < minx)
|
||||
if (!sid->loop_h && x < minx)
|
||||
x += (minx - x) *
|
||||
_elm_config->thumbscroll_border_friction;
|
||||
else if (mx <= 0)
|
||||
else if (!sid->loop_h && mx <= 0)
|
||||
x += (sid->down.sx - x) *
|
||||
_elm_config->thumbscroll_border_friction;
|
||||
else if ((mx + minx) < x)
|
||||
else if (!sid->loop_h && (mx + minx) < x)
|
||||
x += (mx + minx - x) *
|
||||
_elm_config->thumbscroll_border_friction;
|
||||
}
|
||||
|
@ -4304,6 +4340,22 @@ _elm_interface_scrollable_movement_block_get(Eo *obj EINA_UNUSED, Elm_Scrollable
|
|||
return sid->block;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_elm_interface_scrollable_loop_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool loop_h, Eina_Bool loop_v)
|
||||
{
|
||||
if (sid->loop_h == loop_h && sid->loop_v == loop_v) return;
|
||||
|
||||
sid->loop_h = loop_h;
|
||||
sid->loop_v = loop_v;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_elm_interface_scrollable_loop_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool *loop_h, Eina_Bool *loop_v)
|
||||
{
|
||||
*loop_h = sid->loop_h;
|
||||
*loop_v = sid->loop_v;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_elm_interface_scrollable_evas_object_smart_add(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid)
|
||||
{
|
||||
|
@ -4325,6 +4377,8 @@ _elm_interface_scrollable_evas_object_smart_add(Eo *obj, Elm_Scrollable_Smart_In
|
|||
sid->vbar_flags = ELM_SCROLLER_POLICY_AUTO;
|
||||
sid->hbar_visible = EINA_TRUE;
|
||||
sid->vbar_visible = EINA_TRUE;
|
||||
sid->loop_h = EINA_FALSE;
|
||||
sid->loop_v = EINA_FALSE;
|
||||
|
||||
sid->bounce_horiz = EINA_TRUE;
|
||||
sid->bounce_vert = EINA_TRUE;
|
||||
|
|
|
@ -297,6 +297,32 @@ mixin Elm_Interface_Scrollable(Evas.Scrollable_Interface, Evas.Object_Smart)
|
|||
Evas_Coord y;
|
||||
}
|
||||
}
|
||||
loop {
|
||||
set {
|
||||
/*@ Sets an infinite loop for a scroller.
|
||||
|
||||
This sets an infinite loop for a scroller.
|
||||
|
||||
@since 1.14
|
||||
|
||||
@ingroup Widget
|
||||
*/
|
||||
}
|
||||
get {
|
||||
/*@ Gets an infinite loop for a scroller.
|
||||
|
||||
This gets an infinite loop for a scroller.
|
||||
|
||||
@since 1.14
|
||||
|
||||
@ingroup Widget
|
||||
*/
|
||||
}
|
||||
values {
|
||||
Eina_Bool loop_h; /*@ The scrolling horizontal loop */
|
||||
Eina_Bool loop_v; /*@ The scrolling vertical loop */
|
||||
}
|
||||
}
|
||||
scroll_up_cb {
|
||||
set {
|
||||
/*@ Set the callback to run when the content has been moved up.
|
||||
|
|
|
@ -212,6 +212,8 @@ struct _Elm_Scrollable_Smart_Interface_Data
|
|||
Eina_Bool go_right : 1;
|
||||
Eina_Bool go_up : 1;
|
||||
Eina_Bool go_down : 1;
|
||||
Eina_Bool loop_h : 1;
|
||||
Eina_Bool loop_v : 1;
|
||||
};
|
||||
|
||||
#define ELM_SCROLLABLE_CHECK(obj, ...) \
|
||||
|
|
|
@ -56,6 +56,28 @@ static const Elm_Action key_actions[] = {
|
|||
{NULL, NULL}
|
||||
};
|
||||
|
||||
static void
|
||||
_elm_scroller_proxy_set(Evas_Object *obj, Elm_Scroller_Data *sd, Evas_Object *proxy)
|
||||
{
|
||||
Evas_Coord h_pagesize, v_pagesize;
|
||||
Evas_Coord cw, ch;
|
||||
Evas_Object *content = sd->content;
|
||||
|
||||
if (!content) return;
|
||||
|
||||
eo_do(obj, elm_interface_scrollable_paging_get(NULL, NULL, &h_pagesize, &v_pagesize));
|
||||
eo_do(obj, elm_interface_scrollable_content_size_get(&cw, &ch));
|
||||
/* Since Proxy has the texture size limitation problem, we set a key value
|
||||
for evas works in some hackish way to avoid this problem. This hackish
|
||||
code should be removed once evas supports a mechanism like a virtual
|
||||
texture. */
|
||||
evas_object_image_fill_set(proxy, 0, 0, cw, ch);
|
||||
evas_object_size_hint_min_set(proxy, h_pagesize, v_pagesize);
|
||||
evas_object_image_source_clip_set(proxy, EINA_FALSE);
|
||||
evas_object_image_source_set(proxy, content);
|
||||
evas_object_show(proxy);
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_key_action_move(Evas_Object *obj, const char *params)
|
||||
{
|
||||
|
@ -289,7 +311,9 @@ _elm_scroller_elm_layout_sizing_eval(Eo *obj, Elm_Scroller_Data *sd)
|
|||
{
|
||||
Evas_Coord vw = 0, vh = 0, minw = 0, minh = 0, maxw = 0, maxh = 0, w, h,
|
||||
vmw, vmh;
|
||||
Evas_Coord h_pagesize, v_pagesize;
|
||||
double xw = 0.0, yw = 0.0;
|
||||
int i;
|
||||
|
||||
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
||||
|
||||
|
@ -323,6 +347,16 @@ _elm_scroller_elm_layout_sizing_eval(Eo *obj, Elm_Scroller_Data *sd)
|
|||
vh = minh;
|
||||
|
||||
if (sd->content) evas_object_resize(sd->content, vw, vh);
|
||||
if (sd->contents) evas_object_resize(sd->contents, vw, vh);
|
||||
|
||||
for (i = 0 ; i < 3 ; i++)
|
||||
{
|
||||
if (!sd->proxy_content[i]) continue;
|
||||
eo_do((Eo *)obj, elm_interface_scrollable_paging_get(NULL, NULL, &h_pagesize, &v_pagesize));
|
||||
evas_object_image_fill_set(sd->proxy_content[i], 0, 0, vw, vh);
|
||||
evas_object_size_hint_min_set(sd->proxy_content[i],
|
||||
h_pagesize, v_pagesize);
|
||||
}
|
||||
|
||||
w = -1;
|
||||
h = -1;
|
||||
|
@ -595,6 +629,54 @@ _page_change_cb(Evas_Object *obj,
|
|||
evas_object_smart_callback_call(obj, SIG_SCROLL_PAGE_CHANGE, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
_loop_content_set(Evas_Object *obj, Elm_Scroller_Data *sd, Evas_Object *content)
|
||||
{
|
||||
if (!sd->contents)
|
||||
{
|
||||
sd->contents = elm_layout_add(obj);
|
||||
evas_object_smart_member_add(sd->contents, obj);
|
||||
elm_layout_theme_set(sd->contents, "scroller", "contents", elm_widget_style_get(obj));
|
||||
evas_object_size_hint_weight_set(sd->contents, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
||||
evas_object_size_hint_align_set(sd->contents, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
||||
|
||||
elm_widget_sub_object_add(obj, sd->contents);
|
||||
elm_widget_on_show_region_hook_set(sd->contents, _show_region_hook, obj);
|
||||
}
|
||||
elm_object_part_content_set(sd->contents, "elm.swallow.content", content);
|
||||
sd->content = content;
|
||||
|
||||
if (sd->loop_h)
|
||||
{
|
||||
if (!sd->proxy_content[0])
|
||||
sd->proxy_content[0] =
|
||||
evas_object_image_add(evas_object_evas_get(sd->contents));
|
||||
_elm_scroller_proxy_set(obj, sd, sd->proxy_content[0]);
|
||||
elm_object_part_content_set(sd->contents, "elm.swallow.content_r",
|
||||
sd->proxy_content[0]);
|
||||
}
|
||||
|
||||
if (sd->loop_v)
|
||||
{
|
||||
if (!sd->proxy_content[1])
|
||||
sd->proxy_content[1] =
|
||||
evas_object_image_add(evas_object_evas_get(sd->contents));
|
||||
_elm_scroller_proxy_set(obj, sd, sd->proxy_content[1]);
|
||||
elm_object_part_content_set(sd->contents, "elm.swallow.content_b",
|
||||
sd->proxy_content[1]);
|
||||
}
|
||||
|
||||
if (sd->loop_h && sd->loop_v)
|
||||
{
|
||||
if (!sd->proxy_content[2])
|
||||
sd->proxy_content[2] =
|
||||
evas_object_image_add(evas_object_evas_get(sd->contents));
|
||||
_elm_scroller_proxy_set(obj, sd, sd->proxy_content[2]);
|
||||
elm_object_part_content_set(sd->contents, "elm.swallow.content_rb",
|
||||
sd->proxy_content[2]);
|
||||
}
|
||||
}
|
||||
|
||||
EOLIAN static Eina_Bool
|
||||
_elm_scroller_elm_container_content_set(Eo *obj, Elm_Scroller_Data *sd, const char *part, Evas_Object *content)
|
||||
{
|
||||
|
@ -616,8 +698,24 @@ _elm_scroller_elm_container_content_set(Eo *obj, Elm_Scroller_Data *sd, const ch
|
|||
elm_widget_on_show_region_hook_set(content, _show_region_hook, obj);
|
||||
elm_widget_sub_object_add(obj, content);
|
||||
|
||||
if (sd->loop_h || sd->loop_v)
|
||||
{
|
||||
_loop_content_set(obj, sd, content);
|
||||
if(sd->contents)
|
||||
content = sd->contents;
|
||||
}
|
||||
eo_do(obj, elm_interface_scrollable_content_set(content));
|
||||
}
|
||||
else
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 3; i ++)
|
||||
{
|
||||
if (!sd->proxy_content[i]) continue;
|
||||
evas_object_del(sd->proxy_content[i]);
|
||||
sd->proxy_content[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
elm_layout_sizing_eval(obj);
|
||||
|
||||
|
@ -650,7 +748,10 @@ _elm_scroller_elm_container_content_unset(Eo *obj, Elm_Scroller_Data *sd, const
|
|||
if (!sd->content) return NULL;
|
||||
|
||||
ret = sd->content;
|
||||
elm_widget_sub_object_del(obj, sd->content);
|
||||
if (sd->loop_h || sd->loop_v)
|
||||
elm_widget_sub_object_del(obj, sd->contents);
|
||||
else
|
||||
elm_widget_sub_object_del(obj, sd->content);
|
||||
eo_do(obj, elm_interface_scrollable_content_set(NULL));
|
||||
sd->content = NULL;
|
||||
|
||||
|
@ -1125,6 +1226,62 @@ elm_scroller_step_size_get(const Evas_Object *obj,
|
|||
eo_do((Eo *) obj, elm_interface_scrollable_step_size_get(x, y));
|
||||
}
|
||||
|
||||
EAPI void
|
||||
elm_scroller_loop_set(Evas_Object *obj,
|
||||
Eina_Bool loop_h,
|
||||
Eina_Bool loop_v)
|
||||
{
|
||||
ELM_SCROLLABLE_CHECK(obj);
|
||||
ELM_SCROLLER_DATA_GET(obj, sd);
|
||||
|
||||
int i;
|
||||
|
||||
if (sd->loop_h == loop_h && sd->loop_v == loop_v) return;
|
||||
|
||||
sd->loop_h = loop_h;
|
||||
sd->loop_v = loop_v;
|
||||
|
||||
eo_do(obj, elm_interface_scrollable_loop_set(loop_h, loop_v));
|
||||
|
||||
if (sd->content)
|
||||
{
|
||||
if (sd->loop_h || sd->loop_v)
|
||||
{
|
||||
eo_do(obj, elm_interface_scrollable_content_set(NULL));
|
||||
_loop_content_set(obj, sd, sd->content);
|
||||
|
||||
if (sd->contents)
|
||||
{
|
||||
eo_do(obj, elm_interface_scrollable_content_set(sd->contents));
|
||||
elm_widget_sub_object_add(obj, sd->contents);
|
||||
elm_widget_on_show_region_hook_set(sd->contents, _show_region_hook, obj);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0 ; i < 3 ; i++)
|
||||
{
|
||||
if (sd->proxy_content[i])
|
||||
{
|
||||
evas_object_del(sd->proxy_content[i]);
|
||||
sd->proxy_content[i]= NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
elm_layout_sizing_eval(obj);
|
||||
}
|
||||
|
||||
EAPI void
|
||||
elm_scroller_loop_get(const Evas_Object *obj,
|
||||
Eina_Bool *loop_h,
|
||||
Eina_Bool *loop_v)
|
||||
{
|
||||
ELM_SCROLLABLE_CHECK(obj);
|
||||
|
||||
eo_do(obj, elm_interface_scrollable_loop_get(loop_h, loop_v));
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_elm_scroller_propagate_events_set(Eo *obj, Elm_Scroller_Data *_pd EINA_UNUSED, Eina_Bool propagation)
|
||||
{
|
||||
|
|
|
@ -494,4 +494,35 @@ EAPI void elm_scroller_step_size_set(Evas_Object *obj,
|
|||
*/
|
||||
EAPI void elm_scroller_step_size_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y);
|
||||
|
||||
/**
|
||||
* @brief Set an infinite loop_ for a scroller
|
||||
*
|
||||
* @param obj The scroller object
|
||||
* @param loop_h The scrolling horizontal loop
|
||||
* @param loop_v The scrolling vertical loop
|
||||
*
|
||||
* This function sets the infinite loop horizontally or vertically.
|
||||
* If the content is set, it will be shown repeatedly.
|
||||
*
|
||||
* @since 1.14
|
||||
*
|
||||
* @ingroup Scroller
|
||||
*/
|
||||
EAPI void elm_scroller_loop_set(Evas_Object *obj, Eina_Bool loop_h, Eina_Bool loop_v);
|
||||
|
||||
/**
|
||||
* @brief Get an infinite loop_ for a scroller
|
||||
*
|
||||
* @param obj The scroller object
|
||||
* @param loop_h The scrolling horizontal loop
|
||||
* @param loop_v The scrolling vertical loop
|
||||
*
|
||||
* @since 1.14
|
||||
*
|
||||
* @see elm_scroller_loop_set() for more details
|
||||
*
|
||||
* @ingroup Scroller
|
||||
*/
|
||||
EAPI void elm_scroller_loop_get(const Evas_Object *obj, Eina_Bool *loop_h, Eina_Bool *loop_v);
|
||||
|
||||
#include "elm_scroller.eo.legacy.h"
|
||||
|
|
|
@ -30,9 +30,13 @@ struct _Elm_Scroller_Data
|
|||
Evas_Object *g_layer;
|
||||
|
||||
Evas_Object *content;
|
||||
Evas_Object *contents;
|
||||
Evas_Object *proxy_content[3];
|
||||
|
||||
Eina_Bool min_w : 1;
|
||||
Eina_Bool min_h : 1;
|
||||
Eina_Bool loop_h : 1;
|
||||
Eina_Bool loop_v : 1;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue