From 3d0a59768abcf9449af3079f3e859aea11becef8 Mon Sep 17 00:00:00 2001 From: xianjimli Date: Fri, 27 Sep 2019 12:28:15 +0800 Subject: [PATCH] progress bar support max property --- demos/assets.c | 12 +++--- demos/common.inc | 6 +-- docs/changes.md | 1 + src/ext_widgets/time_clock/time_clock.c | 53 ++++++++++++------------ src/ext_widgets/time_clock/time_clock.h | 25 +++++++----- src/widgets/progress_bar.c | 54 ++++++++++++++++++++----- src/widgets/progress_bar.h | 38 +++++++++++++++-- tests/progress_bar_test.cc | 18 +++++++++ tests/time_clock_test.cc | 2 - 9 files changed, 147 insertions(+), 62 deletions(-) diff --git a/demos/assets.c b/demos/assets.c index 7f0ba13ef..b0b895bd2 100644 --- a/demos/assets.c +++ b/demos/assets.c @@ -389,7 +389,7 @@ #include "assets/inc/images/arrow_left_n.data" #include "assets/inc/images/edit_clear_p.data" #include "assets/inc/images/battery_2.data" -#endif/*WITH_STB_IMAGE*/ +#endif /*WITH_STB_IMAGE*/ #ifdef WITH_VGCANVAS #include "assets/inc/images/pointer_4.bsvg" #include "assets/inc/images/ball.bsvg" @@ -397,13 +397,13 @@ #include "assets/inc/images/pointer_1.bsvg" #include "assets/inc/images/pointer.bsvg" #include "assets/inc/images/girl.bsvg" -#endif/*WITH_VGCANVAS*/ +#endif /*WITH_VGCANVAS*/ #if defined(WITH_TRUETYPE_FONT) #include "assets/inc/fonts/default.res" -#else/*WITH_TRUETYPE_FONT*/ +#else /*WITH_TRUETYPE_FONT*/ #include "assets/inc/fonts/default.data" -#endif/*WITH_TRUETYPE_FONT*/ -#endif/*WITH_FS_RES*/ +#endif /*WITH_TRUETYPE_FONT*/ +#endif /*WITH_FS_RES*/ ret_t assets_init(void) { assets_manager_t* am = assets_manager(); @@ -685,7 +685,7 @@ ret_t assets_init(void) { assets_manager_add(am, image_pointer_1); assets_manager_add(am, image_pointer); assets_manager_add(am, image_girl); -#endif/*WITH_VGCANVAS*/ +#endif /*WITH_VGCANVAS*/ #endif tk_init_assets(); diff --git a/demos/common.inc b/demos/common.inc index 4b0d356a4..e11d659bc 100644 --- a/demos/common.inc +++ b/demos/common.inc @@ -2,7 +2,7 @@ static inline ret_t on_timer(const timer_info_t* timer) { widget_t* progress_bar = (widget_t*)timer->ctx; - uint8_t value = (PROGRESS_BAR(progress_bar)->value + 5) % 100; + float_t value = ((int)(PROGRESS_BAR(progress_bar)->value + 5)) % 100; progress_bar_set_value(progress_bar, value); return RET_REPEAT; @@ -10,7 +10,7 @@ static inline ret_t on_timer(const timer_info_t* timer) { static inline ret_t on_inc(void* ctx, event_t* e) { widget_t* progress_bar = (widget_t*)ctx; - uint8_t value = (PROGRESS_BAR(progress_bar)->value + 10) % 100; + float_t value = ((int)(PROGRESS_BAR(progress_bar)->value + 10)) % 100; progress_bar_set_value(progress_bar, value); (void)e; return RET_OK; @@ -18,7 +18,7 @@ static inline ret_t on_inc(void* ctx, event_t* e) { static inline ret_t on_dec(void* ctx, event_t* e) { widget_t* progress_bar = (widget_t*)ctx; - uint8_t value = (PROGRESS_BAR(progress_bar)->value + 90) % 100; + float_t value = ((int)(PROGRESS_BAR(progress_bar)->value + 90)) % 100; progress_bar_set_value(progress_bar, value); (void)e; return RET_OK; diff --git a/docs/changes.md b/docs/changes.md index 127ce6635..938f4f7a6 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -5,6 +5,7 @@ * edit/mledit 获得焦点时选中文本。 * combo\_box 增加localize\_options选项 * edit min/max/step/type支持脚本绑定。 + * progress bar支持max属性。 * 2019/09/26 * rename stream\_socket to stream\_tcp。 diff --git a/src/ext_widgets/time_clock/time_clock.c b/src/ext_widgets/time_clock/time_clock.c index 01cbf17b3..ea78f5ab8 100644 --- a/src/ext_widgets/time_clock/time_clock.c +++ b/src/ext_widgets/time_clock/time_clock.c @@ -62,16 +62,14 @@ ret_t time_clock_set_anchor_for_str(float_t max_size, const char* anchor, float_ } ret_t time_clock_set_hour_anchor(widget_t* widget, const char* anchor_x, const char* anchor_y) { - ret_t ret = RET_OK; - float_t tmp = 0.0f; time_clock_t* time_clock = TIME_CLOCK(widget); return_value_if_fail(time_clock != NULL, RET_BAD_PARAMS); - if(anchor_x != NULL) { + if (anchor_x != NULL) { time_clock->hour_anchor_x = tk_str_copy(time_clock->hour_anchor_x, anchor_x); } - if(anchor_y != NULL) { + if (anchor_y != NULL) { time_clock->hour_anchor_y = tk_str_copy(time_clock->hour_anchor_y, anchor_y); } @@ -79,16 +77,14 @@ ret_t time_clock_set_hour_anchor(widget_t* widget, const char* anchor_x, const c } ret_t time_clock_set_minute_anchor(widget_t* widget, const char* anchor_x, const char* anchor_y) { - ret_t ret = RET_OK; - float_t tmp = 0.0f; time_clock_t* time_clock = TIME_CLOCK(widget); return_value_if_fail(time_clock != NULL, RET_BAD_PARAMS); - if(anchor_x != NULL) { + if (anchor_x != NULL) { time_clock->minute_anchor_x = tk_str_copy(time_clock->minute_anchor_x, anchor_x); } - if(anchor_y != NULL) { + if (anchor_y != NULL) { time_clock->minute_anchor_y = tk_str_copy(time_clock->minute_anchor_y, anchor_y); } @@ -96,16 +92,14 @@ ret_t time_clock_set_minute_anchor(widget_t* widget, const char* anchor_x, const } ret_t time_clock_set_second_anchor(widget_t* widget, const char* anchor_x, const char* anchor_y) { - ret_t ret = RET_OK; - float_t tmp = 0.0f; time_clock_t* time_clock = TIME_CLOCK(widget); return_value_if_fail(time_clock != NULL, RET_BAD_PARAMS); - if(anchor_x != NULL) { + if (anchor_x != NULL) { time_clock->second_anchor_x = tk_str_copy(time_clock->second_anchor_x, anchor_x); } - if(anchor_y != NULL) { + if (anchor_y != NULL) { time_clock->second_anchor_y = tk_str_copy(time_clock->second_anchor_y, anchor_y); } @@ -255,17 +249,17 @@ static ret_t time_clock_set_prop(widget_t* widget, const char* name, const value } else if (tk_str_eq(name, TIME_CLOCK_PROP_IMAGE)) { return time_clock_set_image(widget, value_str(v)); } else if (tk_str_eq(name, TIME_CLOCK_PROP_HOUR_ANCHOR_X)) { - return time_clock_set_hour_anchor( widget, value_str(v), NULL); + return time_clock_set_hour_anchor(widget, value_str(v), NULL); } else if (tk_str_eq(name, TIME_CLOCK_PROP_HOUR_ANCHOR_Y)) { - return time_clock_set_hour_anchor( widget, NULL, value_str(v)); + return time_clock_set_hour_anchor(widget, NULL, value_str(v)); } else if (tk_str_eq(name, TIME_CLOCK_PROP_MINUTE_ANCHOR_X)) { - return time_clock_set_minute_anchor( widget, value_str(v), NULL); + return time_clock_set_minute_anchor(widget, value_str(v), NULL); } else if (tk_str_eq(name, TIME_CLOCK_PROP_MINUTE_ANCHOR_Y)) { - return time_clock_set_minute_anchor( widget, NULL, value_str(v)); + return time_clock_set_minute_anchor(widget, NULL, value_str(v)); } else if (tk_str_eq(name, TIME_CLOCK_PROP_SECOND_ANCHOR_X)) { - return time_clock_set_second_anchor( widget, value_str(v), NULL); + return time_clock_set_second_anchor(widget, value_str(v), NULL); } else if (tk_str_eq(name, TIME_CLOCK_PROP_SECOND_ANCHOR_Y)) { - return time_clock_set_second_anchor( widget, NULL, value_str(v)); + return time_clock_set_second_anchor(widget, NULL, value_str(v)); } return RET_NOT_FOUND; @@ -360,7 +354,6 @@ static ret_t time_clock_on_paint_self(widget_t* widget, canvas_t* c) { if (time_clock_load_image(widget, time_clock->hour_image, &bitmap) == RET_OK && time_clock_set_anchor_for_str(bitmap.w, time_clock->hour_anchor_x, &anchor_x) == RET_OK && time_clock_set_anchor_for_str(bitmap.h, time_clock->hour_anchor_y, &anchor_y) == RET_OK) { - float_t dx = dst.w / 2 - anchor_x; float_t dy = dst.h / 2 - anchor_y; float_t hour = time_clock->hour + time_clock->minute / 60.0f; @@ -372,8 +365,7 @@ static ret_t time_clock_on_paint_self(widget_t* widget, canvas_t* c) { if (time_clock_load_image(widget, time_clock->minute_image, &bitmap) == RET_OK && time_clock_set_anchor_for_str(bitmap.w, time_clock->minute_anchor_x, &anchor_x) == RET_OK && - time_clock_set_anchor_for_str(bitmap.h, time_clock->minute_anchor_y, &anchor_y) == RET_OK ) { - + time_clock_set_anchor_for_str(bitmap.h, time_clock->minute_anchor_y, &anchor_y) == RET_OK) { float_t dx = dst.w / 2 - anchor_x; float_t dy = dst.h / 2 - anchor_y; float_t minute = time_clock->minute + time_clock->second / 60.0f; @@ -386,7 +378,6 @@ static ret_t time_clock_on_paint_self(widget_t* widget, canvas_t* c) { if (time_clock_load_image(widget, time_clock->second_image, &bitmap) == RET_OK && time_clock_set_anchor_for_str(bitmap.w, time_clock->second_anchor_x, &anchor_x) == RET_OK && time_clock_set_anchor_for_str(bitmap.h, time_clock->second_anchor_y, &anchor_y) == RET_OK) { - float_t dx = dst.w / 2 - anchor_x; float_t dy = dst.h / 2 - anchor_y; @@ -403,11 +394,19 @@ static ret_t time_clock_on_paint_self(widget_t* widget, canvas_t* c) { } static const char* s_time_clock_properties[] = { - TIME_CLOCK_PROP_HOUR, TIME_CLOCK_PROP_MINUTE, TIME_CLOCK_PROP_SECOND, - TIME_CLOCK_PROP_IMAGE, TIME_CLOCK_PROP_BG_IMAGE, TIME_CLOCK_PROP_HOUR_IMAGE, - TIME_CLOCK_PROP_MINUTE_IMAGE, TIME_CLOCK_PROP_SECOND_IMAGE, TIME_CLOCK_PROP_HOUR_ANCHOR_X - TIME_CLOCK_PROP_HOUR_ANCHOR_Y, TIME_CLOCK_PROP_MINUTE_ANCHOR_X, TIME_CLOCK_PROP_MINUTE_ANCHOR_Y - TIME_CLOCK_PROP_SECOND_ANCHOR_X, TIME_CLOCK_PROP_SECOND_ANCHOR_Y, NULL}; + TIME_CLOCK_PROP_HOUR, + TIME_CLOCK_PROP_MINUTE, + TIME_CLOCK_PROP_SECOND, + TIME_CLOCK_PROP_IMAGE, + TIME_CLOCK_PROP_BG_IMAGE, + TIME_CLOCK_PROP_HOUR_IMAGE, + TIME_CLOCK_PROP_MINUTE_IMAGE, + TIME_CLOCK_PROP_SECOND_IMAGE, + TIME_CLOCK_PROP_HOUR_ANCHOR_X TIME_CLOCK_PROP_HOUR_ANCHOR_Y, + TIME_CLOCK_PROP_MINUTE_ANCHOR_X, + TIME_CLOCK_PROP_MINUTE_ANCHOR_Y TIME_CLOCK_PROP_SECOND_ANCHOR_X, + TIME_CLOCK_PROP_SECOND_ANCHOR_Y, + NULL}; TK_DECL_VTABLE(time_clock) = {.size = sizeof(time_clock_t), .type = WIDGET_TYPE_TIME_CLOCK, diff --git a/src/ext_widgets/time_clock/time_clock.h b/src/ext_widgets/time_clock/time_clock.h index 95a6f3c89..7353753b4 100644 --- a/src/ext_widgets/time_clock/time_clock.h +++ b/src/ext_widgets/time_clock/time_clock.h @@ -114,7 +114,7 @@ typedef struct _time_clock_t { */ char* second_image; - /** + /** * @property {float_t} anchor_x * @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"] * 时针图片旋转锚点x坐标。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) @@ -128,7 +128,7 @@ typedef struct _time_clock_t { */ char* hour_anchor_y; - /** + /** * @property {float_t} anchor_x * @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"] * 分针图片旋转锚点x坐标。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) @@ -142,7 +142,7 @@ typedef struct _time_clock_t { */ char* minute_anchor_y; - /** + /** * @property {float_t} anchor_x * @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"] * 秒针图片旋转锚点x坐标。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) @@ -275,8 +275,10 @@ ret_t time_clock_set_image(widget_t* widget, const char* image); * 设置小时指针的旋转锚点。 * @annotation ["scriptable"] * @param {widget_t*} widget 控件对象。 - * @param {const char*} anchor_x 指针的锚点坐标x。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) - * @param {const char*} anchor_y 指针的锚点坐标y。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) + * @param {const char*} anchor_x + * 指针的锚点坐标x。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) + * @param {const char*} anchor_y + * 指针的锚点坐标y。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) * * @return {ret_t} 返回RET_OK表示成功,否则表示失败。 */ @@ -287,8 +289,10 @@ ret_t time_clock_set_hour_anchor(widget_t* widget, const char* anchor_x, const c * 设置分钟指针的旋转锚点。 * @annotation ["scriptable"] * @param {widget_t*} widget 控件对象。 - * @param {const char*} anchor_x 指针的锚点坐标x。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) - * @param {const char*} anchor_y 指针的锚点坐标y。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) + * @param {const char*} anchor_x + * 指针的锚点坐标x。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) + * @param {const char*} anchor_y + * 指针的锚点坐标y。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) * * @return {ret_t} 返回RET_OK表示成功,否则表示失败。 */ @@ -299,8 +303,10 @@ ret_t time_clock_set_minute_anchor(widget_t* widget, const char* anchor_x, const * 设置秒钟指针的旋转锚点。 * @annotation ["scriptable"] * @param {widget_t*} widget 控件对象。 - * @param {const char*} anchor_x 指针的锚点坐标x。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) - * @param {const char*} anchor_y 指针的锚点坐标y。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) + * @param {const char*} anchor_x + * 指针的锚点坐标x。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) + * @param {const char*} anchor_y + * 指针的锚点坐标y。(后面加上px为像素点,不加px为相对百分比坐标0.0f到1.0f) * * @return {ret_t} 返回RET_OK表示成功,否则表示失败。 */ @@ -332,7 +338,6 @@ ret_t time_clock_set_second_anchor(widget_t* widget, const char* anchor_x, const /*public for subclass and runtime type check*/ TK_EXTERN_VTABLE(time_clock); - /*public for test*/ ret_t time_clock_set_anchor_for_str(float_t max_size, const char* anchor, float_t* image_anchor); diff --git a/src/widgets/progress_bar.c b/src/widgets/progress_bar.c index b9924252c..0245676c3 100644 --- a/src/widgets/progress_bar.c +++ b/src/widgets/progress_bar.c @@ -21,9 +21,25 @@ #include "tkc/mem.h" #include "tkc/utils.h" -#include "widgets/progress_bar.h" #include "base/widget_vtable.h" #include "base/image_manager.h" +#include "widgets/progress_bar.h" + +static float_t progress_bar_get_progress(widget_t* widget) { + progress_bar_t* progress_bar = PROGRESS_BAR(widget); + return_value_if_fail(progress_bar != NULL, 0); + float_t range = progress_bar->max > 0 ? progress_bar->max : 100; + + range = tk_max(range, progress_bar->value); + + return progress_bar->value / range; +} + +uint32_t progress_bar_get_percent(widget_t* widget) { + float_t percent = progress_bar_get_progress(widget) * 100; + + return tk_roundi(percent); +} static ret_t progress_bar_on_paint_self(widget_t* widget, canvas_t* c) { rect_t r; @@ -32,16 +48,19 @@ static ret_t progress_bar_on_paint_self(widget_t* widget, canvas_t* c) { uint32_t radius = style_get_int(style, STYLE_ID_ROUND_RADIUS, 0); const char* bg_image = style_get_str(style, STYLE_ID_BG_IMAGE, NULL); image_draw_type_t draw_type = progress_bar->vertical ? IMAGE_DRAW_PATCH3_Y : IMAGE_DRAW_PATCH3_X; + float_t progress = progress_bar_get_progress(widget); + uint32_t progress_w = widget->w * progress; + uint32_t progress_h = widget->h * progress; if (progress_bar->vertical) { r.x = 0; r.y = 0; r.w = widget->w; - r.h = widget->h - (widget->h * progress_bar->value) / 100; + r.h = widget->h - progress_h; } else { r.y = 0; r.h = widget->h; - r.w = widget->w - (widget->w * progress_bar->value) / 100; + r.w = widget->w - progress_w; r.x = widget->w - r.w; } @@ -54,11 +73,11 @@ static ret_t progress_bar_on_paint_self(widget_t* widget, canvas_t* c) { if (progress_bar->vertical) { r.x = 0; r.w = widget->w; - r.h = (widget->h * progress_bar->value) / 100; + r.h = progress_h; r.y = widget->h - r.h; } else { r.h = widget->h; - r.w = (widget->w * progress_bar->value) / 100; + r.w = progress_w; r.y = 0; r.x = 0; } @@ -74,9 +93,9 @@ static ret_t progress_bar_on_paint_self(widget_t* widget, canvas_t* c) { return RET_OK; } -ret_t progress_bar_set_value(widget_t* widget, uint8_t value) { +ret_t progress_bar_set_value(widget_t* widget, float_t value) { progress_bar_t* progress_bar = PROGRESS_BAR(widget); - return_value_if_fail(progress_bar != NULL && value <= 100, RET_BAD_PARAMS); + return_value_if_fail(progress_bar != NULL, RET_BAD_PARAMS); if (progress_bar->value != value) { char str[TK_NUM_MAX_LEN + 1]; @@ -88,7 +107,7 @@ ret_t progress_bar_set_value(widget_t* widget, uint8_t value) { widget_dispatch(widget, &e); widget_invalidate(widget, NULL); - tk_snprintf(str, TK_NUM_MAX_LEN, "%d%%", progress_bar->value); + tk_snprintf(str, TK_NUM_MAX_LEN, "%d%%", progress_bar_get_percent(widget)); widget_set_text_utf8(widget, str); } @@ -120,6 +139,9 @@ static ret_t progress_bar_get_prop(widget_t* widget, const char* name, value_t* if (tk_str_eq(name, WIDGET_PROP_VALUE)) { value_set_uint8(v, progress_bar->value); return RET_OK; + } else if (tk_str_eq(name, WIDGET_PROP_MAX)) { + value_set_uint32(v, progress_bar->max); + return RET_OK; } else if (tk_str_eq(name, WIDGET_PROP_VERTICAL)) { value_set_bool(v, progress_bar->vertical); return RET_OK; @@ -136,6 +158,8 @@ static ret_t progress_bar_set_prop(widget_t* widget, const char* name, const val if (tk_str_eq(name, WIDGET_PROP_VALUE)) { return progress_bar_set_value(widget, value_int(v)); + } else if (tk_str_eq(name, WIDGET_PROP_MAX)) { + return progress_bar_set_max(widget, value_float(v)); } else if (tk_str_eq(name, WIDGET_PROP_VERTICAL)) { return progress_bar_set_vertical(widget, value_bool(v)); } else if (tk_str_eq(name, WIDGET_PROP_SHOW_TEXT)) { @@ -145,8 +169,8 @@ static ret_t progress_bar_set_prop(widget_t* widget, const char* name, const val return RET_NOT_FOUND; } -static const char* s_progress_bar_clone_properties[] = {WIDGET_PROP_VALUE, WIDGET_PROP_VERTICAL, - WIDGET_PROP_SHOW_TEXT, NULL}; +static const char* s_progress_bar_clone_properties[] = { + WIDGET_PROP_VALUE, WIDGET_PROP_MAX, WIDGET_PROP_VERTICAL, WIDGET_PROP_SHOW_TEXT, NULL}; TK_DECL_VTABLE(progress_bar) = {.size = sizeof(progress_bar_t), .type = WIDGET_TYPE_PROGRESS_BAR, .clone_properties = s_progress_bar_clone_properties, @@ -162,6 +186,7 @@ widget_t* progress_bar_create(widget_t* parent, xy_t x, xy_t y, wh_t w, wh_t h) progress_bar_t* progress_bar = PROGRESS_BAR(widget); return_value_if_fail(progress_bar != NULL, NULL); + progress_bar->max = 100; progress_bar->value = 0; progress_bar->vertical = FALSE; progress_bar->show_text = FALSE; @@ -174,3 +199,12 @@ widget_t* progress_bar_cast(widget_t* widget) { return widget; } + +ret_t progress_bar_set_max(widget_t* widget, float_t max) { + progress_bar_t* progress_bar = PROGRESS_BAR(widget); + return_value_if_fail(progress_bar != NULL, RET_BAD_PARAMS); + + progress_bar->max = max; + + return widget_invalidate(widget, NULL); +} diff --git a/src/widgets/progress_bar.h b/src/widgets/progress_bar.h index 83ed5f663..afab0e6de 100644 --- a/src/widgets/progress_bar.h +++ b/src/widgets/progress_bar.h @@ -71,11 +71,17 @@ BEGIN_C_DECLS typedef struct _progress_bar_t { widget_t widget; /** - * @property {uint8_t} value + * @property {float_t} value * @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"] * 进度条的值[0-100]。 */ - uint8_t value; + float_t value; + /** + * @property {float_t} max + * @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"] + * 最大值(缺省为100)。 + */ + float_t max; /** * @property {bool_t} vertical * @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"] @@ -129,11 +135,23 @@ widget_t* progress_bar_cast(widget_t* widget); * 设置进度条的进度。 * @annotation ["scriptable"] * @param {widget_t*} widget 控件对象。 - * @param {uint8_t} value 进度 + * @param {float_t} value 进度 * * @return {ret_t} 返回RET_OK表示成功,否则表示失败。 */ -ret_t progress_bar_set_value(widget_t* widget, uint8_t value); +ret_t progress_bar_set_value(widget_t* widget, float_t value); + +/** + * @method progress_bar_set_max + * 设置最大值。 + * + * @annotation ["scriptable"] + * @param {widget_t*} widget 控件对象。 + * @param {uint32_t} max 最大值。 + * + * @return {ret_t} 返回RET_OK表示成功,否则表示失败。 + */ +ret_t progress_bar_set_max(widget_t* widget, float_t max); /** * @method progress_bar_set_vertical @@ -157,6 +175,18 @@ ret_t progress_bar_set_vertical(widget_t* widget, bool_t vertical); */ ret_t progress_bar_set_show_text(widget_t* widget, bool_t show_text); +/** + * @method progress_bar_get_percent + * 获取进度百分比。 + * + * > 当max为100时,percent和value取整后一致。 + * @annotation ["scriptable"] + * @param {widget_t*} widget 控件对象。 + * + * @return {uint32_t} 返回百分比。 + */ +uint32_t progress_bar_get_percent(widget_t* widget); + #define PROGRESS_BAR(widget) ((progress_bar_t*)(progress_bar_cast(WIDGET(widget)))) /*public for subclass and runtime type check*/ diff --git a/tests/progress_bar_test.cc b/tests/progress_bar_test.cc index b47b7a3d5..e03ec5c67 100644 --- a/tests/progress_bar_test.cc +++ b/tests/progress_bar_test.cc @@ -19,6 +19,24 @@ TEST(progress_bar, basic) { widget_destroy(s); } +TEST(progress_bar, max) { + value_t v1; + value_t v2; + widget_t* s = progress_bar_create(NULL, 10, 20, 30, 40); + + ASSERT_EQ(widget_get_prop_int(s, WIDGET_PROP_MAX, 0), 100); + + value_set_int(&v1, 1000); + ASSERT_EQ(widget_set_prop(s, WIDGET_PROP_MAX, &v1), RET_OK); + ASSERT_EQ(widget_get_prop(s, WIDGET_PROP_MAX, &v2), RET_OK); + ASSERT_EQ(value_int(&v1), value_int(&v2)); + + ASSERT_EQ(progress_bar_set_value(s, 500), RET_OK); + ASSERT_EQ(progress_bar_get_percent(s), 50); + + widget_destroy(s); +} + #include "log_change_events.inc" TEST(ProgressBar, event) { diff --git a/tests/time_clock_test.cc b/tests/time_clock_test.cc index 674e4698c..103c5c653 100644 --- a/tests/time_clock_test.cc +++ b/tests/time_clock_test.cc @@ -96,7 +96,6 @@ TEST(TimeClock, basic) { ASSERT_EQ(string(value_str(&v1)), string(value_str(&v2))); ASSERT_EQ(string(value_str(&v1)), string(t->second_anchor_y)); - widget_destroy(w); } @@ -138,5 +137,4 @@ TEST(TimeClock, set_anchor_for_str) { ASSERT_EQ(time_clock_set_anchor_for_str(100.0f, "20", &image_anchor), RET_BAD_PARAMS); ASSERT_EQ(image_anchor, 0.0f); - }