diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-04-30 22:11:34 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-04-30 22:11:34 +0200 |
| commit | 5a3b46ee43fc601121a85d910d044033d891748f (patch) | |
| tree | 661fafdc6c4c6a99a360e8b101adfa1c1c6ed949 /alf/alflayout.cpp | |
| parent | d28cd7fb71a6fe56a04d4e21f2b95907a1ec105c (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.cpp | 44 |
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) { |
