diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-04-16 13:12:32 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-04-16 13:12:32 +0200 |
| commit | 5cbb664bd49cd2b9c035ccfc3024aa436d28c36c (patch) | |
| tree | e7f83c28b89b8597d38a6b5664ba2ff0afee852e /alf/alflayout.cpp | |
| parent | fc7b721e12b6a07cb2b6566c196b9a6c4265c2af (diff) | |
layout: invalidate and recalculate, automatically
Diffstat (limited to 'alf/alflayout.cpp')
| -rw-r--r-- | alf/alflayout.cpp | 82 |
1 files changed, 75 insertions, 7 deletions
diff --git a/alf/alflayout.cpp b/alf/alflayout.cpp index 0cc6cdf..b98ae93 100644 --- a/alf/alflayout.cpp +++ b/alf/alflayout.cpp @@ -1,5 +1,8 @@ #include "alfpriv.h" +static void +ALF_Layout_CalcSizes(ALFLayout *layout, HWND window); + void ALF_Layout_Init(ALFLayout *layout) { @@ -131,11 +134,16 @@ ALF_Layout_CalcSizes(ALFLayout* layout, HWND window) } } } + + layout->layoutValididityFlags &= ~ALF_LAYOUT_NEED_RECALC; } void ALF_Layout_Apply(ALFLayout* layout, HWND window) { + if (layout->layoutValididityFlags & ALF_LAYOUT_NEED_RECALC) + ALF_Layout_CalcSizes(layout, window); + // allocate cell positions // distribute free space int extraWidth = 0; @@ -229,6 +237,8 @@ ALF_Layout_Apply(ALFLayout* layout, HWND window) } EndDeferWindowPos(hdwp); + + layout->layoutValididityFlags &= ~ALF_LAYOUT_NEED_REAPPLY; } void @@ -254,10 +264,12 @@ ALF_Layout_AddWidget(ALFLayout* layout, HWND window, const ALFWidgetLayoutParams } ALF_ListInsert(layout->widgets.prev, &w->list); + + ALF_InvalidateLayout(window); } BOOL -ALF_Layout_SetWidgetParams(ALFLayout* layout, const ALFWidgetLayoutParams* params, HWND widget) +ALF_Layout_SetWidgetParams(ALFLayout* layout, HWND window, const ALFWidgetLayoutParams* params, HWND widget) { ALF_FOR_LIST(ALFWidgetPriv, list, &layout->widgets, w) { if (w->hwnd == widget) { @@ -272,6 +284,11 @@ ALF_Layout_SetWidgetParams(ALFLayout* layout, const ALFWidgetLayoutParams* param w->cptMarginBottom = params->margins[2]; w->cptMarginLeft = params->margins[3]; + if (w->flags & ALF_INHERITFONT) + SendMessage(w->hwnd, WM_SETFONT, (WPARAM)SendMessage(window, WM_GETFONT, 0, 0), 0); + + ALF_InvalidateLayout(window); + return TRUE; } } @@ -314,6 +331,51 @@ ALF_Layout_WidgetAtPos(ALFLayout* layout, UINT x, UINT y) return NULL; } +void +ALF_Layout_Invalidate(ALFLayout *layout, HWND window) +{ + if (layout->layoutValididityFlags & ALF_LAYOUT_NEED_RECALC) + return; + + layout->layoutValididityFlags |= ALF_LAYOUT_NEED_RECALC | ALF_LAYOUT_NEED_REAPPLY; + + HWND parent = GetParent(window); + if (parent) { + ALF_InvalidateLayout(parent); + } else { + PostMessage(window, ALF_WM_VALIDATELAYOUT, 0, 0); + } +} + + +BOOL +ALF_Layout_Validate(ALFLayout *layout, HWND window) +{ + BOOL ret = FALSE; + + if (layout->layoutValididityFlags & ALF_LAYOUT_NEED_RECALC) { + ALF_Layout_CalcSizes(layout, window); + ret = TRUE; + } + + if (layout->layoutValididityFlags & ALF_LAYOUT_NEED_REAPPLY) { + ALF_Layout_Apply(layout, window); + ret = TRUE; + } + + return ret; +} + +void +ALF_Layout_GetMinSize(ALFLayout *layout, HWND window, SIZE *size) +{ + if (layout->layoutValididityFlags & ALF_LAYOUT_NEED_RECALC) { + ALF_Layout_CalcSizes(layout, window); + } + + size->cx = layout->totalMinWidth; + size->cy = layout->totalMinHeight; +} BOOL ALF_Layout_HandleMessage(ALFLayout *layout, HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LRESULT *pRet) @@ -321,10 +383,7 @@ ALF_Layout_HandleMessage(ALFLayout *layout, HWND hwnd, UINT msg, WPARAM wparam, *pRet = 0; if (msg == ALF_WM_QUERYSIZE) { - ALF_Layout_CalcSizes(layout, hwnd); - SIZE *ps = (SIZE*)lparam; - ps->cx = layout->totalMinWidth; - ps->cy = layout->totalMinHeight; + ALF_Layout_GetMinSize(layout, hwnd, (SIZE*)lparam); return TRUE; } @@ -344,7 +403,7 @@ ALF_Layout_HandleMessage(ALFLayout *layout, HWND hwnd, UINT msg, WPARAM wparam, } if (msg == ALF_WM_SETLAYOUTPARAMS) { - *pRet = (LRESULT)ALF_Layout_SetWidgetParams(layout, (const ALFWidgetLayoutParams *)lparam, (HWND)wparam); + *pRet = (LRESULT)ALF_Layout_SetWidgetParams(layout, hwnd, (const ALFWidgetLayoutParams *)lparam, (HWND)wparam); return TRUE; } @@ -355,7 +414,16 @@ ALF_Layout_HandleMessage(ALFLayout *layout, HWND hwnd, UINT msg, WPARAM wparam, if (msg == WM_SETFONT) { ALF_Layout_ForwardFont(layout, hwnd, (HFONT)wparam, lparam); - *pRet = 0; + return TRUE; + } + + if (msg == ALF_WM_INVALIDATELAYOUT) { + ALF_Layout_Invalidate(layout, hwnd); + return TRUE; + } + + if (msg == ALF_WM_VALIDATELAYOUT) { + ALF_Layout_Validate(layout, hwnd); return TRUE; } |
