Skip to content

Commit

Permalink
fix(textview): size not updated after setting text
Browse files Browse the repository at this point in the history
  • Loading branch information
lc-soft committed Aug 19, 2018
1 parent adada31 commit 31e0582
Show file tree
Hide file tree
Showing 6 changed files with 191 additions and 15 deletions.
5 changes: 4 additions & 1 deletion src/gui/widget/textview.c
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,7 @@ static void TextView_OnTask(LCUI_Widget w)
txt->tasks[i].is_valid = FALSE;
TextLayer_SetTextW(txt->layer, txt->tasks[i].text, NULL);
txt->tasks[TASK_UPDATE].is_valid = TRUE;
txt->tasks[TASK_UPDATE_SIZE].is_valid = TRUE;
free(txt->tasks[i].text);
txt->tasks[i].text = NULL;
LCUIMutex_Unlock(&txt->mutex);
Expand Down Expand Up @@ -398,7 +399,9 @@ static void TextView_OnTask(LCUI_Widget w)
i = TASK_UPDATE_SIZE;
if (txt->tasks[i].is_valid) {
TextView_UpdateLayerSize(w);
if (Widget_HasFitContentWidth(w)) {
if (Widget_HasFitContentWidth(w) ||
Widget_HasAutoStyle(w, key_width) ||
Widget_HasAutoStyle(w, key_height)) {
Widget_AddTask(w, LCUI_WTASK_RESIZE);
}
txt->tasks[i].is_valid = FALSE;
Expand Down
7 changes: 4 additions & 3 deletions src/gui/widget_base.c
Original file line number Diff line number Diff line change
Expand Up @@ -1256,13 +1256,15 @@ static void Widget_ComputeSize(LCUI_Widget w)
width = ToContentBoxWidth(w, width);
height = ToContentBoxHeight(w, height);
}
if (Widget_HasAutoStyle(w, key_width) && Widget_HasFillAvailableWidth(w)) {
if (Widget_HasAutoStyle(w, key_width) &&
Widget_HasFillAvailableWidth(w)) {
width = Widget_ComputeFillAvailableWidth(w);
width = ToContentBoxWidth(w, width);
if (!Widget_HasStaticWidthParent(w)) {
default_width = w->parent->box.content.width;
if (w->computed_style.box_sizing == SV_BORDER_BOX) {
default_width = ToContentBoxWidth(w, default_width);
default_width =
ToContentBoxWidth(w, default_width);
}
max_width = width;
width = 0;
Expand Down Expand Up @@ -1407,7 +1409,6 @@ void Widget_UpdateSize(LCUI_Widget w)
padding.right == w->padding.right &&
padding.bottom == w->padding.bottom &&
padding.left == w->padding.left) {
DEBUG_MSG("[%d] %s, size not change\n", w->index, w->id);
return;
}
/* 若在变化前后的宽高中至少有一个为 0,则不继续处理 */
Expand Down
10 changes: 7 additions & 3 deletions test/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ AM_CFLAGS = -I$(top_builddir)/include $(CODE_COVERAGE_CFLAGS)
##需要编译的测试程序, noinst指的是不安装
noinst_PROGRAMS = helloworld test test_charset test_touch test_char_render \
test_string_render test_widget_render test_widget_layout test_widget_flex_layout \
test_widget_inline_block_layout test_scaling_support test_scrollbar
test_widget_inline_block_layout test_scaling_support test_scrollbar \
test_textview_resize

##指定测试程序的源码文件
helloworld_SOURCES = helloworld.c
Expand All @@ -13,7 +14,7 @@ helloworld_LDADD = $(top_builddir)/src/libLCUI.la

test_SOURCES = test.c test_charset.c test_css_parser.c test_xml_parser.c \
test_string.c test_font_load.c test_image_reader.c test_widget_rect.c \
test_widget_layout.c test_widget_flex_layout.c \
test_widget_layout.c test_widget_flex_layout.c test_textview_resize.c \
test_widget_inline_block_layout.c test_thread.c

test_LDADD = $(top_builddir)/src/libLCUI.la -lm $(CODE_COVERAGE_LIBS)
Expand Down Expand Up @@ -52,5 +53,8 @@ test_scaling_support_LDADD = $(top_builddir)/src/libLCUI.la
test_scrollbar_SOURCES = test_scrollbar.c
test_scrollbar_LDADD = $(top_builddir)/src/libLCUI.la

@CODE_COVERAGE_RULES@
test_textview_resize_SOURCES = test_textview_resize.c
test_textview_resize_LDADD = $(top_builddir)/src/libLCUI.la
test_textview_resize_CFLAGS = $(AM_CFLAGS) -D PREVIEW_MODE

@CODE_COVERAGE_RULES@
17 changes: 9 additions & 8 deletions test/test.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,23 @@
#include "test.h"

#ifdef LCUI_BUILD_IN_WIN32
static void LoggerHandler( const char *str )
static void LoggerHandler(const char *str)
{
OutputDebugStringA( str );
OutputDebugStringA(str);
}

static void LoggerHandlerW( const wchar_t *str )
static void LoggerHandlerW(const wchar_t *str)
{
OutputDebugStringW( str );
OutputDebugStringW(str);
}
#endif

int main( void )
int main(void)
{
int ret = 0;
#ifdef LCUI_BUILD_IN_WIN32
Logger_SetHandler( LoggerHandler );
Logger_SetHandlerW( LoggerHandlerW );
Logger_SetHandler(LoggerHandler);
Logger_SetHandlerW(LoggerHandlerW);
#endif
ret += test_charset();
ret += test_string();
Expand All @@ -34,6 +34,7 @@ int main( void )
ret += test_widget_flex_layout();
ret += test_widget_inline_block_layout();
ret += test_widget_rect();
PRINT_TEST_RESULT( ret );
ret += test_textview_resize();
PRINT_TEST_RESULT(ret);
return ret;
}
1 change: 1 addition & 0 deletions test/test.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,5 @@ int test_widget_layout(void);
int test_widget_flex_layout(void);
int test_widget_inline_block_layout(void);
int test_widget_rect(void);
int test_textview_resize(void);
int test_image_reader(void);
166 changes: 166 additions & 0 deletions test/test_textview_resize.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
#include <LCUI_Build.h>
#include <LCUI/LCUI.h>
#include <LCUI/timer.h>
#include <LCUI/gui/widget.h>
#include <LCUI/gui/widget/textview.h>
#include <LCUI/gui/css_parser.h>
#include "test.h"

/* clang-format off */

static struct {
LCUI_Widget block;
LCUI_Widget inline_block;
} self;

static const char *css = CodeToString(

.block {
width: 100px;
margin: 10px;
padding: 10px;
display: block;
border: 1px solid #f00;
}

.inline-block {
margin: 10px;
padding: 10px;
display: inline-block;
border: 1px solid #f00;
}

.short-content {
content: "hello!";
}

.long-content {
content: "this is long long long long long long long text";
}

);

/* clang-format on */

static void build(void)
{
LCUI_Widget root;

LCUI_LoadCSSString(css, __FILE__);

self.block = LCUIWidget_New("textview");
self.inline_block = LCUIWidget_New("textview");

TextView_SetTextW(self.block, L"block");
TextView_SetTextW(self.inline_block, L"inline block");
Widget_AddClass(self.block, "block");
Widget_AddClass(self.inline_block, "inline-block");

root = LCUIWidget_GetRoot();
Widget_Append(root, self.block);
Widget_Append(root, self.inline_block);
}

static void test_textview_set_text(void *arg)
{
TextView_SetText(self.inline_block,
"long long long long long long long "
"long long long long long long long "
"long long long long long long long text");

TextView_SetText(self.block, "long long long long long long long "
"long long long long long long long "
"long long long long long long long text");
}

static int check_textview_set_text(void)
{
int ret = 0;

LCUIWidget_Update();

CHECK(self.block->width == 122.0f);
CHECK(self.block->height > 140.0f);
CHECK(self.inline_block->width > 520.0f);
CHECK(self.inline_block->height < 45.0f);

return ret;
}

static void test_textview_set_short_content_css(void *arg)
{
Widget_AddClass(self.block, "short-content");
Widget_AddClass(self.inline_block, "short-content");
}

static int check_textview_set_short_content_css(void)
{
int ret = 0;

LCUIWidget_Update();

CHECK(self.block->width == 122.0f);
CHECK(self.block->height < 45.0f);
CHECK(self.inline_block->width < 60.0f);
CHECK(self.inline_block->height < 45.0f);

return ret;
}

static void test_textview_set_long_content_css(void *arg)
{
Widget_RemoveClass(self.block, "short-content");
Widget_RemoveClass(self.inline_block, "short-content");
Widget_AddClass(self.block, "long-content");
Widget_AddClass(self.inline_block, "long-content");
}

static int check_textview_set_long_content_css(void)
{
int ret = 0;

LCUIWidget_Update();

CHECK(self.block->width == 122.0f);
CHECK(self.block->height > 60.0f);
CHECK(self.inline_block->width > 250.0f);
CHECK(self.inline_block->height < 45.0f);
return ret;
}

int test_textview_resize(void)
{
int ret = 0;

LCUI_Init();

build();

test_textview_set_text(NULL);
ret += check_textview_set_text();
test_textview_set_short_content_css(NULL);
ret += check_textview_set_short_content_css();
test_textview_set_long_content_css(NULL);
ret += check_textview_set_long_content_css();

LCUI_Destroy();
return ret;
}

#ifdef PREVIEW_MODE

int tests_count = 0;

int main(void)
{
LCUI_Init();

build();
LCUI_SetTimeout(2000, test_textview_set_text, NULL);
LCUI_SetTimeout(3000, test_textview_set_short_content_css, NULL);
LCUI_SetTimeout(4000, test_textview_set_long_content_css, NULL);

return LCUI_Main();
}

#endif

0 comments on commit 31e0582

Please sign in to comment.