scroll bar mobile support auto scroll

This commit is contained in:
lixianjing 2021-06-04 17:35:48 +08:00
parent 3a51a17749
commit 319b391b4a
7 changed files with 73 additions and 1 deletions

1
.gitignore vendored
View File

@ -35,3 +35,4 @@ dllexports/awtk.def
dllexports/tkc.def
tools/idl_gen/idl.json
tools/idl_gen/tkc.json
t.*

View File

@ -1,5 +1,7 @@
# 最新动态
2021/06/04
* scroll bar mobile支持auto\_hide属性。
2021/06/03
* 完善 scroll bar。
* 完善 menu layout。

View File

@ -737,6 +737,12 @@ BEGIN_C_DECLS
*/
#define WIDGET_PROP_ANIMATABLE "animatable"
/**
* @const WIDGET_PROP_AUTO_HIDE
*
*/
#define WIDGET_PROP_AUTO_HIDE "auto_hide"
/**
* @const WIDGET_PROP_AUTO_HIDE_SCROLL_BAR
*

View File

@ -359,7 +359,10 @@ static ret_t children_layouter_list_view_for_list_view_set_scroll_bar_info(widge
if (widget->h > virtual_h) {
scroll_bar_set_params(widget, widget->h, item_height);
}
widget_set_visible_only(widget, FALSE);
if (SCROLL_BAR(widget)->auto_hide) {
widget_set_visible_only(widget, FALSE);
}
} else {
if (scroll_view->h >= virtual_h) {
scroll_bar_set_value(widget, 0);

View File

@ -477,6 +477,9 @@ static ret_t scroll_bar_get_prop(widget_t* widget, const char* name, value_t* v)
} else if (tk_str_eq(name, WIDGET_PROP_VALUE)) {
value_set_int(v, scroll_bar->value);
return RET_OK;
} else if (tk_str_eq(name, WIDGET_PROP_AUTO_HIDE)) {
value_set_bool(v, scroll_bar->auto_hide);
return RET_OK;
}
return RET_NOT_FOUND;
@ -499,6 +502,9 @@ static ret_t scroll_bar_set_prop(widget_t* widget, const char* name, const value
scroll_bar_set_value(widget, value_int(v));
scroll_bar_update_dragger(widget);
return RET_OK;
} else if (tk_str_eq(name, WIDGET_PROP_AUTO_HIDE)) {
scroll_bar_set_auto_hide(widget, value_bool(v));
return RET_OK;
}
return RET_NOT_FOUND;
@ -661,6 +667,8 @@ static widget_t* scroll_bar_create_internal(widget_t* parent, xy_t x, xy_t y, wh
return_value_if_fail(scroll_bar != NULL, NULL);
scroll_bar->animatable = TRUE;
scroll_bar->auto_hide = scroll_bar_is_mobile(widget);
widget_set_state(widget, WIDGET_STATE_NORMAL);
return widget;
@ -703,6 +711,10 @@ ret_t scroll_bar_hide_by_opacity_animation(widget_t* widget, int32_t duration, i
scroll_bar_t* scroll_bar = SCROLL_BAR(widget);
return_value_if_fail(scroll_bar != NULL, RET_BAD_PARAMS);
if (!scroll_bar->auto_hide) {
return RET_OK;
}
#ifndef WITHOUT_WIDGET_ANIMATORS
if (scroll_bar->wa_opactiy != NULL) {
widget_animator_destroy(scroll_bar->wa_opactiy);
@ -735,5 +747,19 @@ ret_t scroll_bar_show_by_opacity_animation(widget_t* widget, int32_t duration, i
scroll_bar);
widget_animator_opacity_set_params(scroll_bar->wa_opactiy, widget->opacity, 0xff);
widget_animator_start(scroll_bar->wa_opactiy);
return RET_OK;
}
ret_t scroll_bar_set_auto_hide(widget_t* widget, bool_t auto_hide) {
scroll_bar_t* scroll_bar = SCROLL_BAR(widget);
return_value_if_fail(scroll_bar != NULL, RET_BAD_PARAMS);
assert(scroll_bar_is_mobile(widget));
scroll_bar->auto_hide = auto_hide;
if (!auto_hide) {
widget_set_visible(widget, TRUE);
}
return RET_OK;
}

View File

@ -95,6 +95,12 @@ typedef struct _scroll_bar_t {
*
*/
bool_t animatable;
/**
* @property {bool_t} auto_hide
* @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"]
* (mobile风格的滚动条有效)
*/
bool_t auto_hide;
/*private*/
widget_t* dragger;
@ -235,6 +241,20 @@ ret_t scroll_bar_scroll_delta(widget_t* widget, int32_t delta);
*/
ret_t scroll_bar_set_value_only(widget_t* widget, int32_t value);
/**
* @method scroll_bar_set_auto_hide
* auto_hide属性
*
*>mobile风格的滚动条有效
*
* @annotation ["scriptable"]
* @param {widget_t*} widget scroll_bar控件
* @param {bool_t} auto_hide
*
* @return {ret_t} RET_OK表示成功
*/
ret_t scroll_bar_set_auto_hide(widget_t* widget, bool_t auto_hide);
/**
* @method scroll_bar_is_mobile
* mobile风格的滚动条

View File

@ -64,3 +64,17 @@ TEST(ScrollBar, cast) {
widget_destroy(w);
}
TEST(ScrollBar, auto_hide) {
widget_t* w = scroll_bar_create_mobile(NULL, 10, 20, 30, 40);
ASSERT_EQ(SCROLL_BAR(w)->auto_hide, TRUE);
scroll_bar_set_auto_hide(w, FALSE);
ASSERT_EQ(SCROLL_BAR(w)->auto_hide, FALSE);
ASSERT_EQ(widget_set_prop_bool(w, WIDGET_PROP_AUTO_HIDE, TRUE), RET_OK);
ASSERT_EQ(SCROLL_BAR(w)->auto_hide, TRUE);
ASSERT_EQ(widget_get_prop_bool(w, WIDGET_PROP_AUTO_HIDE, FALSE), TRUE);
widget_destroy(w);
}