summaryrefslogtreecommitdiff
path: root/alf/alflayout.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'alf/alflayout.cpp')
-rw-r--r--alf/alflayout.cpp82
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;
}