summaryrefslogtreecommitdiff
path: root/alf/alflayout.cpp
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-04-30 22:11:34 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-04-30 22:11:34 +0200
commit5a3b46ee43fc601121a85d910d044033d891748f (patch)
tree661fafdc6c4c6a99a360e8b101adfa1c1c6ed949 /alf/alflayout.cpp
parentd28cd7fb71a6fe56a04d4e21f2b95907a1ec105c (diff)
panel: support edge (like delphi)
mainly to force me to implement layout margins
Diffstat (limited to 'alf/alflayout.cpp')
-rw-r--r--alf/alflayout.cpp44
1 files changed, 32 insertions, 12 deletions
diff --git a/alf/alflayout.cpp b/alf/alflayout.cpp
index 1cdd328..9c35b65 100644
--- a/alf/alflayout.cpp
+++ b/alf/alflayout.cpp
@@ -278,6 +278,11 @@ ALF_Layout_CalcMinWidgetSize(ALFLayout *layout, ALFWidgetPriv *c, HWND window, S
void
ALF_Layout_CalcSizes(ALFLayout* layout, HWND window)
{
+ SIZE containerMinSize = { 0, 0 };
+ if (layout->calculateContainerMetrics) {
+ layout->calculateContainerMetrics(layout, window, &layout->containerMargins, &containerMinSize);
+ }
+
layout->biggestColumnNo = 0;
layout->columnExpandDenominator = 0;
for (int i = 0; i < layout->nColumns; ++i) {
@@ -371,6 +376,12 @@ ALF_Layout_CalcSizes(ALFLayout* layout, HWND window)
}
}
+ if (layout->totalMinWidth < containerMinSize.cx - layout->containerMargins.left - layout->containerMargins.right)
+ layout->totalMinWidth = containerMinSize.cx - layout->containerMargins.left - layout->containerMargins.right;
+
+ if (layout->totalMinHeight < containerMinSize.cy - layout->containerMargins.top - layout->containerMargins.bottom)
+ layout->totalMinHeight = containerMinSize.cy - layout->containerMargins.top - layout->containerMargins.bottom;
+
layout->layoutValididityFlags &= ~ALF_LAYOUT_NEED_RECALC;
}
@@ -380,16 +391,26 @@ ALF_Layout_Apply(ALFLayout* layout, HWND window)
if (layout->layoutValididityFlags & ALF_LAYOUT_NEED_RECALC)
ALF_Layout_CalcSizes(layout, window);
+ GetClientRect(window, &layout->allocatedWidgetRect);
+ layout->allocatedWidgetRect.left += layout->containerMargins.left;
+ layout->allocatedWidgetRect.right -= layout->containerMargins.right;
+ layout->allocatedWidgetRect.top += layout->containerMargins.top;
+ layout->allocatedWidgetRect.bottom -= layout->containerMargins.bottom;
+
+ // FIXME! can that happen?
+ if (layout->allocatedWidgetRect.right < layout->allocatedWidgetRect.left)
+ layout->allocatedWidgetRect.right = layout->allocatedWidgetRect.left;
+ if (layout->allocatedWidgetRect.bottom < layout->allocatedWidgetRect.top)
+ layout->allocatedWidgetRect.bottom = layout->allocatedWidgetRect.top;
+
// distribute extra space
int extraWidth = 0;
int extraHeight = 0;
- RECT client;
- if (GetClientRect(window, &client)) {
- if (client.right - client.left > layout->totalMinWidth)
- extraWidth = client.right - client.left - layout->totalMinWidth;
- if (client.bottom - client.top > layout->totalMinHeight)
- extraHeight = client.bottom - client.top - layout->totalMinHeight;
- }
+
+ if (layout->allocatedWidgetRect.right - layout->allocatedWidgetRect.left > layout->totalMinWidth)
+ extraWidth = layout->allocatedWidgetRect.right - layout->allocatedWidgetRect.left - layout->totalMinWidth;
+ if (layout->allocatedWidgetRect.bottom - layout->allocatedWidgetRect.top > layout->totalMinHeight)
+ extraHeight = layout->allocatedWidgetRect.bottom - layout->allocatedWidgetRect.top - layout->totalMinHeight;
int extraWidthLeft = extraWidth;
for (int i = 0; i < layout->nColumns; ++i) {
@@ -422,12 +443,12 @@ ALF_Layout_Apply(ALFLayout* layout, HWND window)
layout->rows[layout->biggestRowNo].calculatedMinWidth + extraHeightLeft;
// set row/column positions
- int x = 0;
+ int x = layout->allocatedWidgetRect.left;
for (int i = 0; i < layout->nColumns; ++i) {
layout->columns[i].allocatedPosition = x;
x += layout->columns[i].allocatedWidth;
}
- int y = 0;
+ int y = layout->allocatedWidgetRect.top;
for (int i = 0; i < layout->nRows; ++i) {
layout->rows[i].allocatedPosition = y;
y += layout->rows[i].allocatedWidth;
@@ -568,8 +589,8 @@ ALF_Layout_GetMinSize(ALFLayout *layout, HWND window, SIZE *size)
ALF_Layout_CalcSizes(layout, window);
}
- size->cx = layout->totalMinWidth;
- size->cy = layout->totalMinHeight;
+ size->cx = layout->totalMinWidth + layout->containerMargins.left + layout->containerMargins.right;
+ size->cy = layout->totalMinHeight + layout->containerMargins.top + layout->containerMargins.bottom;
}
BOOL
@@ -813,7 +834,6 @@ ALF_Layout_SetRowFlags(ALFLayout *layout, HWND window, int rowno, DWORD flags)
return TRUE;
}
-
BOOL
ALF_Layout_HandleMessage(ALFLayout *layout, HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LRESULT *pRet)
{