Skip to content

Commit

Permalink
refactor(gui): improve widget update processing
Browse files Browse the repository at this point in the history
BREAKING CHANGE: Some widget operation functions have been renamed or removed.
  • Loading branch information
lc-soft committed Feb 16, 2020
1 parent 5ad4fec commit 1a50aec
Show file tree
Hide file tree
Showing 27 changed files with 1,258 additions and 1,138 deletions.
1 change: 1 addition & 0 deletions build/windows/LCUI/LCUI.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,7 @@
<ClCompile Include="..\..\..\src\gui\widget_prototype.c" />
<ClCompile Include="..\..\..\src\gui\widget_paint.c" />
<ClCompile Include="..\..\..\src\gui\widget_shadow.c" />
<ClCompile Include="..\..\..\src\gui\widget_size.c" />
<ClCompile Include="..\..\..\src\gui\widget_status.c" />
<ClCompile Include="..\..\..\src\gui\widget_style.c" />
<ClCompile Include="..\..\..\src\gui\widget_task.c" />
Expand Down
9 changes: 6 additions & 3 deletions build/windows/LCUI/LCUI.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -147,9 +147,6 @@
<ClInclude Include="..\..\..\include\LCUI\cursor.h">
<Filter>头文件\LCUI</Filter>
</ClInclude>
<ClInclude Include="..\..\..\include\LCUI\config.h">
<Filter>头文件\LCUI</Filter>
</ClInclude>
<ClInclude Include="..\..\..\include\LCUI\draw\background.h">
<Filter>头文件\LCUI\draw</Filter>
</ClInclude>
Expand Down Expand Up @@ -309,6 +306,9 @@
<ClInclude Include="..\..\..\include\LCUI\gui\widget\canvas.h">
<Filter>头文件\LCUI\gui\widget</Filter>
</ClInclude>
<ClInclude Include="..\..\..\include\LCUI\config.h">
<Filter>头文件\LCUI</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\..\src\draw\border.c">
Expand Down Expand Up @@ -551,6 +551,9 @@
<ClCompile Include="..\..\..\src\gui\widget\canvas.c">
<Filter>源文件\gui\widget</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\gui\widget_size.c">
<Filter>源文件\gui</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Text Include="..\..\..\LICENSE.TXT" />
Expand Down
9 changes: 9 additions & 0 deletions include/LCUI/gui/metrics.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,13 @@

LCUI_BEGIN_HEADER

typedef struct LCUI_MetricsRec_ {
float dpi;
float density;
float scaled_density;
float scale;
} LCUI_MetricsRec, *LCUI_Metrics;

typedef enum LCUI_DensityLevel {
DENSITY_LEVEL_SMALL,
DENSITY_LEVEL_NORMAL,
Expand Down Expand Up @@ -72,6 +79,8 @@ LCUI_API void LCUIMetrics_SetScale(float scale);

LCUI_API void LCUI_InitMetrics(void);

LCUI_API const LCUI_MetricsRec *LCUI_GetMetrics(void);

void LCUI_FreeMetrics(void);

LCUI_END_HEADER
Expand Down
72 changes: 23 additions & 49 deletions include/LCUI/gui/widget_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,9 @@ typedef enum LCUI_WidgetTaskType {
LCUI_WTASK_BACKGROUND,
LCUI_WTASK_LAYOUT,
LCUI_WTASK_RESIZE,
LCUI_WTASK_RESIZE_WITH_SURFACE,
LCUI_WTASK_POSITION,
LCUI_WTASK_ZINDEX,
LCUI_WTASK_OPACITY,
LCUI_WTASK_BODY,
LCUI_WTASK_REFRESH,
LCUI_WTASK_USER,
LCUI_WTASK_TOTAL_NUM
} LCUI_WidgetTaskType;
Expand All @@ -107,9 +104,18 @@ typedef struct LCUI_WidgetBoxModelRec_ {
} LCUI_WidgetBoxModelRec, *LCUI_WidgetBoxModel;

typedef struct LCUI_WidgetTaskBoxRec_ {
LCUI_BOOL for_self; /**< 标志,指示当前部件是否有待处理的任务 */
LCUI_BOOL for_children; /**< 标志,指示是否有待处理的子级部件 */
LCUI_BOOL states[LCUI_WTASK_TOTAL_NUM]; /**< 各个任务的状态标记 */
/** update for self */

LCUI_BOOL for_self;

/** update for children */
LCUI_BOOL for_children;

/** skip the property synchronization of bound surface */
LCUI_BOOL skip_surface_props_sync;

/** states of tasks */
LCUI_BOOL states[LCUI_WTASK_TOTAL_NUM];
} LCUI_WidgetTaskBoxRec;

/** 部件状态 */
Expand All @@ -124,7 +130,6 @@ typedef enum LCUI_WidgetState {

typedef struct LCUI_WidgetRec_* LCUI_Widget;
typedef struct LCUI_WidgetPrototypeRec_ *LCUI_WidgetPrototype;
typedef struct LCUI_WidgetTaskContextRec_ *LCUI_WidgetTaskContext;
typedef const struct LCUI_WidgetPrototypeRec_ *LCUI_WidgetPrototypeC;

typedef void(*LCUI_WidgetFunction)(LCUI_Widget);
Expand Down Expand Up @@ -161,13 +166,6 @@ typedef struct LCUI_WidgetData_ {
LCUI_WidgetDataEntryRec *list;
} LCUI_WidgetData;

typedef struct LCUI_WidgetTaskContextRec_ {
Dict *style_cache;
unsigned style_hash;
LCUI_WidgetTaskContext parent;
LCUI_WidgetTasksProfile profile;
} LCUI_WidgetTaskContextRec;

/* clang-format on */

typedef struct LCUI_WidgetRulesRec_ {
Expand Down Expand Up @@ -308,6 +306,10 @@ typedef struct LCUI_WidgetRec_ {
(Widget_CheckStyleType(W, key_width, scale) && \
!Widget_HasStaticWidthParent(W))

LCUI_API float Widget_ComputeXMetric(LCUI_Widget w, int key);

LCUI_API float Widget_ComputeYMetric(LCUI_Widget w, int key);

/** 部件是否有值为自动(默认)的样式 */
LCUI_API LCUI_BOOL Widget_HasAutoStyle(LCUI_Widget w, int key);

Expand Down Expand Up @@ -352,7 +354,7 @@ LCUI_API void Widget_InitBackground(LCUI_Widget w);
LCUI_API void Widget_DestroyBackground(LCUI_Widget w);

/** 更新部件背景样式 */
LCUI_API void Widget_UpdateBackground(LCUI_Widget widget);
LCUI_API void Widget_ComputeBackgroundStyle(LCUI_Widget widget);

/** 绘制部件背景 */
LCUI_API void Widget_PaintBakcground(LCUI_Widget w, LCUI_PaintContext paint,
Expand All @@ -361,12 +363,11 @@ LCUI_API void Widget_PaintBakcground(LCUI_Widget w, LCUI_PaintContext paint,
/** 计算部件背景样式的实际值 */
LCUI_API void Widget_ComputeBackground(LCUI_Widget w, LCUI_Background *out);

/** 更新部件边框样式 */
LCUI_API void Widget_UpdateBorder(LCUI_Widget w);

/** 计算部件边框样式的实际值 */
LCUI_API void Widget_ComputeBorder(LCUI_Widget w, LCUI_Border *out);

LCUI_API void Widget_ComputeBorderStyle(LCUI_Widget w);

/** 绘制部件边框 */
LCUI_API void Widget_PaintBorder(LCUI_Widget w, LCUI_PaintContext paint,
LCUI_WidgetActualStyle style);
Expand All @@ -384,6 +385,8 @@ LCUI_API float Widget_GetLimitedHeight(LCUI_Widget w, float height);

LCUI_API void Widget_AutoSize(LCUI_Widget w);

LCUI_API void Widget_ComputeSizeStyle(LCUI_Widget w);

/** 根据阴影参数获取部件区域的横向偏移距离 */
LCUI_API float Widget_GetBoxShadowOffsetX(LCUI_Widget w);

Expand All @@ -396,50 +399,21 @@ LCUI_API float Widget_GetCanvasWidth(LCUI_Widget w);
/** 获取部件在添加阴影后的宽度 */
LCUI_API float Widget_GetCanvasWidth(LCUI_Widget w);

/** 更新部件矩形阴影样式 */
LCUI_API void Widget_UpdateBoxShadow(LCUI_Widget w);

/** 计算部件阴影样式的实际值 */
LCUI_API void Widget_ComputeBoxShadow(LCUI_Widget w, LCUI_BoxShadow *out);

LCUI_API void Widget_ComputeBoxShadowStyle(LCUI_Widget w);

/** 绘制部件阴影 */
LCUI_API void Widget_PaintBoxShadow(LCUI_Widget w, LCUI_PaintContext paint,
LCUI_WidgetActualStyle style);

/** 更新可见性 */
LCUI_API void Widget_UpdateVisibility(LCUI_Widget w);

/** 更新显示方式 */
LCUI_API void Widget_UpdateDisplay(LCUI_Widget w);

/** 设置部件为顶级部件 */
LCUI_API int Widget_Top(LCUI_Widget w);

LCUI_API void Widget_SortChildrenShow(LCUI_Widget w);

/** 刷新堆叠顺序 */
LCUI_API void Widget_UpdateZIndex(LCUI_Widget w);

LCUI_API void Widget_ExecUpdateZIndex(LCUI_Widget w);

/** 刷新位置 */
LCUI_API void Widget_UpdatePosition(LCUI_Widget w);

/** 刷新外间距 */
LCUI_API void Widget_UpdateMargin(LCUI_Widget w);

/** 刷新尺寸 */
LCUI_API void Widget_UpdateSize(LCUI_Widget w);

/** 刷新部件尺寸以及与之绑定的表面的尺寸 */
LCUI_API void Widget_UpdateSizeWithSurface(LCUI_Widget w);

/** 刷新各项属性 */
LCUI_API void Widget_UpdateProps(LCUI_Widget w);

/** 更新透明度 */
LCUI_API void Widget_UpdateOpacity(LCUI_Widget w);

/** 设置部件标题 */
LCUI_API void Widget_SetTitleW(LCUI_Widget w, const wchar_t *title);

Expand Down
3 changes: 0 additions & 3 deletions include/LCUI/gui/widget_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,6 @@ LCUI_API void Widget_Move(LCUI_Widget w, float left, float top);
/** 调整部件尺寸 */
LCUI_API void Widget_Resize(LCUI_Widget w, float width, float height);

LCUI_API void Widget_ResizeWithSurface(LCUI_Widget w, float width,
float height);

LCUI_API LCUI_Style Widget_GetStyle(LCUI_Widget w, int key);

LCUI_API int Widget_UnsetStyle(LCUI_Widget w, int key);
Expand Down
4 changes: 1 addition & 3 deletions include/LCUI/gui/widget_layout.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@
#ifndef LCUI_WIDGET_LAYOUT_H
#define LCUI_WIDGET_LAYOUT_H

LCUI_API void Widget_UpdateLayout(LCUI_Widget w);

LCUI_API void Widget_ExecUpdateLayout(LCUI_Widget w);
LCUI_API void Widget_DoLayout(LCUI_Widget w);

#endif
4 changes: 0 additions & 4 deletions include/LCUI/gui/widget_task.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,6 @@ LCUI_API size_t Widget_Update(LCUI_Widget w);
LCUI_API void Widget_UpdateWithProfile(LCUI_Widget w,
LCUI_WidgetTasksProfile profile);

/** 根据给定的上下文来处理部件中当前积累的任务 */
LCUI_API size_t Widget_UpdateWithContext(LCUI_Widget w,
LCUI_WidgetTaskContext ctx);

/** 为子级部件添加任务 */
LCUI_API void Widget_AddTaskForChildren(LCUI_Widget widget, int task);

Expand Down
27 changes: 24 additions & 3 deletions include/LCUI/util/rect.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* rect.h -- Rectangle area handling
*
* Copyright (c) 2018, Liu chao <[email protected]> All rights reserved.
* Copyright (c) 2018-2019, Liu chao <[email protected]> All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
Expand Down Expand Up @@ -65,7 +65,10 @@ LCUI_API void LCUIRectF_ToRect(const LCUI_RectF *rectf, LCUI_Rect *rect,
float scale);

/** 检测矩形是否遮盖另一个矩形 */
LCUI_API LCUI_BOOL LCUIRect_IsCoverRect(LCUI_Rect *rect1, LCUI_Rect *rect2);
LCUI_API LCUI_BOOL LCUIRect_IsCoverRect(const LCUI_Rect *a, const LCUI_Rect *b);

LCUI_API LCUI_BOOL LCUIRectF_IsCoverRect(const LCUI_RectF *a,
const LCUI_RectF *b);

/**
* 获取两个矩形中的重叠矩形
Expand All @@ -82,7 +85,11 @@ LCUI_API LCUI_BOOL LCUIRectF_GetOverlayRect(const LCUI_RectF *a,
LCUI_RectF *out);

/** 合并两个矩形 */
LCUI_API void LCUIRect_MergeRect(LCUI_Rect *big, LCUI_Rect *a, LCUI_Rect *b);
LCUI_API void LCUIRect_MergeRect(LCUI_Rect *big, const LCUI_Rect *a,
const LCUI_Rect *b);

LCUI_API void LCUIRectF_MergeRect(LCUI_RectF *big, const LCUI_RectF *a,
const LCUI_RectF *b);

/**
* 根据重叠矩形 rect1,将矩形 rect2 分割成四个矩形
Expand All @@ -104,6 +111,20 @@ LCUI_API void LCUIRect_CutFourRect(LCUI_Rect *rect1, LCUI_Rect *rect2,
LCUI_API void LCUIRect_Split(LCUI_Rect *base, LCUI_Rect *target,
LCUI_Rect rects[4]);

INLINE LCUI_BOOL LCUIRectF_IsEquals(const LCUI_RectF *a, const LCUI_RectF *b)
{
return (int)(100 * (a->x - b->x)) == 0 &&
(int)(100 * (a->y - b->y)) == 0 &&
(int)(100 * (a->width - b->width)) == 0 &&
(int)(100 * (a->height - b->height)) == 0;
}

INLINE LCUI_BOOL LCUIRect_IsEquals(const LCUI_Rect *a, const LCUI_Rect *b)
{
return a->x == b->x && a->y == b->y && a->width == b->width &&
a->height == b->height;
}

LCUI_API int RectList_AddEx(LinkedList *list, LCUI_Rect *rect,
LCUI_BOOL auto_merge);

Expand Down
8 changes: 4 additions & 4 deletions src/display.c
Original file line number Diff line number Diff line change
Expand Up @@ -207,8 +207,9 @@ static void SurfaceRecord_DumpRects(SurfaceRecord record, LinkedList *rects)

int i;
int max_dirty;
int layer_width = LCUIDisplay_GetWidth();
int layer_height = LCUIDisplay_GetHeight();
float scale = LCUIMetrics_GetScale();
int layer_width = LCUIDisplay_GetWidth() * scale;
int layer_height = LCUIDisplay_GetHeight() * scale;

LCUI_Rect rect;
LCUI_Rect *sub_rect;
Expand Down Expand Up @@ -872,10 +873,9 @@ static void OnResize(LCUI_Event e, void *arg)
widget = LCUIDisplay_GetBindWidget(dpy_ev->surface);
if (widget) {
Widget_Resize(widget, width, height);
widget->task.skip_surface_props_sync = TRUE;
}
LCUI_RunFrame();
Logger_Debug("[display] resize: (%d,%d)\n", dpy_ev->resize.width,
dpy_ev->resize.height);
}

static void OnMinMaxInfo(LCUI_Event e, void *arg)
Expand Down
1 change: 1 addition & 0 deletions src/gui/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ widget_attribute.c \
widget_id.c \
widget_class.c \
widget_status.c \
widget_size.c \
widget_tree.c \
widget_helper.c \
widget_layout.c \
Expand Down
12 changes: 6 additions & 6 deletions src/gui/metrics.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,7 @@
#include <LCUI/util/math.h>
#include <LCUI/gui/metrics.h>

static struct LCUI_MetricsModule {
float dpi;
float density;
float scaled_density;
float scale;
} metrics;
static LCUI_MetricsRec metrics;

float LCUIMetrics_Compute(float value, LCUI_StyleType type)
{
Expand Down Expand Up @@ -128,3 +123,8 @@ void LCUI_FreeMetrics(void)
{

}

const LCUI_MetricsRec *LCUI_GetMetrics(void)
{
return &metrics;
}
5 changes: 0 additions & 5 deletions src/gui/widget/textview.c
Original file line number Diff line number Diff line change
Expand Up @@ -415,11 +415,6 @@ static void TextView_OnTask(LCUI_Widget w)
}
RectList_Clear(&rects);
TextLayer_ClearInvalidRect(txt->layer);
if (Widget_HasParentDependentWidth(w) ||
Widget_HasAutoStyle(w, key_width) ||
Widget_HasAutoStyle(w, key_height)) {
Widget_AddTask(w->parent, LCUI_WTASK_RESIZE);
}
}

/** 绘制 TextView 部件 */
Expand Down
Loading

0 comments on commit 1a50aec

Please sign in to comment.