Skip to content

Commit 095f4b8

Browse files
committed
fix(gui): widget auto size computation bug
1 parent a40eda2 commit 095f4b8

8 files changed

+281
-212
lines changed

include/LCUI/gui/widget_base.h

+17-5
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,10 @@ typedef struct LCUI_WidgetRec_ {
226226
(Widget_CheckStyleType( W, key_width, SCALE ) ||\
227227
Widget_CheckStyleType( W, key_height, SCALE ))
228228

229+
#define Widget_HasParentDependentWidth(W) \
230+
(Widget_CheckStyleType( W, key_width, scale ) &&\
231+
!Widget_HasStaticWidthParent( W ))
232+
229233
/** 部件是否有值为自动(默认)的样式 */
230234
LCUI_API LCUI_BOOL Widget_HasAutoStyle( LCUI_Widget w, int key );
231235

@@ -313,9 +317,15 @@ LCUI_API void Widget_ComputeBorder( LCUI_Widget w, LCUI_Border *out );
313317
LCUI_API void Widget_PaintBorder( LCUI_Widget w, LCUI_PaintContext paint,
314318
LCUI_WidgetActualStyle style );
315319

316-
LCUI_API float Widget_GetGraphWidth( LCUI_Widget widget );
320+
LCUI_API float Widget_GetCanvasWidth( LCUI_Widget widget );
321+
322+
LCUI_API float Widget_GetCanvasHeight( LCUI_Widget widget );
323+
324+
LCUI_API float Widget_GetLimitedWidth( LCUI_Widget w, float width );
317325

318-
LCUI_API float Widget_GetGraphHeight( LCUI_Widget widget );
326+
LCUI_API float Widget_GetLimitedHeight( LCUI_Widget w, float height );
327+
328+
LCUI_API void Widget_AutoSize( LCUI_Widget w );
319329

320330
/** 根据阴影参数获取部件区域的横向偏移距离 */
321331
LCUI_API float Widget_GetBoxShadowOffsetX( LCUI_Widget w );
@@ -324,10 +334,10 @@ LCUI_API float Widget_GetBoxShadowOffsetX( LCUI_Widget w );
324334
LCUI_API float Widget_GetBoxShadowOffsetY( LCUI_Widget w );
325335

326336
/** 获取部件在添加阴影后的高度 */
327-
LCUI_API float Widget_GetGraphWidth( LCUI_Widget w );
337+
LCUI_API float Widget_GetCanvasWidth( LCUI_Widget w );
328338

329339
/** 获取部件在添加阴影后的宽度 */
330-
LCUI_API float Widget_GetGraphWidth( LCUI_Widget w );
340+
LCUI_API float Widget_GetCanvasWidth( LCUI_Widget w );
331341

332342
/** 更新部件矩形阴影样式 */
333343
LCUI_API void Widget_UpdateBoxShadow( LCUI_Widget w );
@@ -426,8 +436,10 @@ LCUI_API float Widget_ComputeMaxContentWidth( LCUI_Widget w );
426436
/** 计算部件的最大可用宽度 */
427437
LCUI_API float Widget_ComputeMaxAvaliableWidth( LCUI_Widget widget );
428438

439+
LCUI_API void Widget_ComputeLimitSize( LCUI_Widget w );
440+
429441
/** 从部件中移除一个状态 */
430-
int Widget_RemoveStatus( LCUI_Widget w, const char *status_name );
442+
LCUI_API int Widget_RemoveStatus( LCUI_Widget w, const char *status_name );
431443

432444
/** 打印部件树 */
433445
LCUI_API void Widget_PrintTree( LCUI_Widget w );

src/font/textlayer.c

+10-1
Original file line numberDiff line numberDiff line change
@@ -913,6 +913,9 @@ int TextLayer_GetWidth( LCUI_TextLayer layer )
913913
int i, row, w, max_w;
914914
TextRow txtrow;
915915

916+
DEBUG_MSG( "rows: %d, font-size: %d\n",
917+
layer->text_rows.length,
918+
layer->text_style.pixel_size );
916919
for( row = 0, max_w = 0; row < layer->text_rows.length; ++row ) {
917920
txtrow = layer->text_rows.rows[row];
918921
for( i = 0, w = 0; i < txtrow->length; ++i ) {
@@ -921,6 +924,12 @@ int TextLayer_GetWidth( LCUI_TextLayer layer )
921924
continue;
922925
}
923926
w += txtrow->string[i]->bitmap->advance.x;
927+
DEBUG_MSG("[%d/%d] %d %c, width: %d/%d\n",
928+
i, txtrow->length,
929+
txtrow->string[i]->char_code,
930+
txtrow->string[i]->char_code,
931+
txtrow->string[i]->bitmap->advance.x,
932+
w);
924933
}
925934
if( w > max_w ) {
926935
max_w = w;
@@ -1247,7 +1256,7 @@ static void TextLayer_ValidateArea( LCUI_TextLayer layer, LCUI_Rect *area )
12471256
width = layer->width;
12481257
}
12491258
if( layer->fixed_height > 0 ) {
1250-
height = layer->fixed_width;
1259+
height = layer->fixed_height;
12511260
} else {
12521261
height = TextLayer_GetHeight( layer );
12531262
}

src/gui/widget/textview.c

+38-18
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ static void TextView_SetTaskForLineHeight( LCUI_Widget w, int height )
146146
txt->tasks[TASK_UPDATE].is_valid = TRUE;
147147
}
148148

149-
static void TextView_SetTaskForTextStyle( LCUI_Widget w, LCUI_TextStyle style )
149+
static void TextView_SetTaskForTextStyle( LCUI_Widget w,
150+
LCUI_TextStyle style )
150151
{
151152
LCUI_TextView txt = GetData( w );
152153
TextStyle_Copy( &txt->tasks[TASK_SET_TEXT_STYLE].style, style );
@@ -196,19 +197,16 @@ static void TextView_UpdateStyle( LCUI_Widget w )
196197
TextStyle_Destroy( &ts );
197198
}
198199

199-
static void TextView_UpdateSize( LCUI_Widget w )
200+
static void TextView_UpdateLayerSize( LCUI_Widget w )
200201
{
201-
LCUI_RectF rect;
202202
LCUI_TextView txt;
203-
LinkedList rects;
204-
LinkedListNode *node;
205203
int width = 0, height = 0;
206204
float scale, max_width = 0, max_height = 0;
207205

208206
txt = GetData( w );
209-
LinkedList_Init( &rects );
210207
scale = LCUIMetrics_GetScale();
211-
if( Widget_HasFitContentWidth( w ) ) {
208+
if( Widget_HasFitContentWidth( w ) ||
209+
Widget_HasParentDependentWidth( w ) ) {
212210
max_width = Widget_ComputeMaxContentWidth( w );
213211
} else {
214212
max_width = w->box.content.width;
@@ -223,6 +221,20 @@ static void TextView_UpdateSize( LCUI_Widget w )
223221
width = LCUIMetrics_ComputeActual( max_width, SVT_PX );
224222
height = LCUIMetrics_ComputeActual( max_height, SVT_PX );
225223
TextLayer_SetMaxSize( txt->layer, width, height );
224+
}
225+
226+
static void TextView_OnResize( LCUI_Widget w, LCUI_WidgetEvent e, void *arg )
227+
{
228+
float scale;
229+
LCUI_RectF rect;
230+
LCUI_TextView txt;
231+
LinkedList rects;
232+
LinkedListNode *node;
233+
234+
txt = GetData( w );
235+
LinkedList_Init( &rects );
236+
scale = LCUIMetrics_GetScale();
237+
TextView_UpdateLayerSize( w );
226238
TextLayer_Update( txt->layer, &rects );
227239
for( LinkedList_Each( node, &rects ) ) {
228240
LCUIRect_ToRectF( node->data, &rect, 1.0f / scale );
@@ -232,11 +244,6 @@ static void TextView_UpdateSize( LCUI_Widget w )
232244
TextLayer_ClearInvalidRect( txt->layer );
233245
}
234246

235-
static void TextView_OnResize( LCUI_Widget w, LCUI_WidgetEvent e, void *arg )
236-
{
237-
TextView_UpdateSize( w );
238-
}
239-
240247
/** 初始化 TextView 部件数据 */
241248
static void TextView_OnInit( LCUI_Widget w )
242249
{
@@ -287,14 +294,22 @@ static void TextView_OnDestroy( LCUI_Widget w )
287294

288295
static void TextView_AutoSize( LCUI_Widget w, float *width, float *height )
289296
{
297+
float max_width;
298+
int fixed_w, fixed_h;
290299
LCUI_TextView txt = GetData( w );
291300
float scale = LCUIMetrics_GetScale();
301+
302+
TextView_UpdateLayerSize( w );
303+
fixed_w = txt->layer->fixed_width;
304+
fixed_h = txt->layer->fixed_height;
292305
if( Widget_HasFitContentWidth( w ) ||
293306
!Widget_HasStaticWidthParent( w ) ) {
294-
int fixed_w = txt->layer->fixed_width;
295-
int fixed_h = txt->layer->fixed_height;
296307
/* 解除固定宽高设置,以计算最大宽高 */
297308
TextLayer_SetFixedSize( txt->layer, (int)(*width * scale), 0 );
309+
if( Widget_HasParentDependentWidth( w ) ) {
310+
max_width = scale * Widget_ComputeMaxContentWidth( w );
311+
TextLayer_SetMaxSize( txt->layer, (int)max_width, 0 );
312+
}
298313
TextLayer_Update( txt->layer, NULL );
299314
if( *width <= 0 ) {
300315
*width = TextLayer_GetWidth( txt->layer ) / scale;
@@ -379,8 +394,12 @@ static void TextView_OnTask( LCUI_Widget w )
379394
}
380395
i = TASK_UPDATE_SIZE;
381396
if( txt->tasks[i].is_valid ) {
382-
TextView_UpdateSize( w );
397+
TextView_UpdateLayerSize( w );
398+
if( Widget_HasFitContentWidth( w ) ) {
399+
Widget_AddTask( w, LCUI_WTASK_RESIZE );
400+
}
383401
txt->tasks[i].is_valid = FALSE;
402+
txt->tasks[TASK_UPDATE].is_valid = TRUE;
384403
}
385404
i = TASK_UPDATE;
386405
if( !txt->tasks[i].is_valid ) {
@@ -396,9 +415,10 @@ static void TextView_OnTask( LCUI_Widget w )
396415
}
397416
RectList_Clear( &rects );
398417
TextLayer_ClearInvalidRect( txt->layer );
399-
if( w->style->sheet[key_width].type == SVT_AUTO
400-
|| w->style->sheet[key_height].type == SVT_AUTO ) {
401-
Widget_AddTask( w, LCUI_WTASK_RESIZE );
418+
if( Widget_HasParentDependentWidth( w ) ||
419+
Widget_HasAutoStyle( w, key_width ) ||
420+
Widget_HasAutoStyle( w, key_height ) ) {
421+
Widget_AddTask( w->parent, LCUI_WTASK_RESIZE );
402422
}
403423
}
404424

0 commit comments

Comments
 (0)