ui/win32/grid.c

Wed, 08 Oct 2025 12:36:16 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 08 Oct 2025 12:36:16 +0200
changeset 815
7ddf5fb7ec2a
parent 813
6d9066951cdb
child 818
8185cd761897
permissions
-rw-r--r--

implement grid layout (win32)

667
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2025 Olaf Wintermann. All rights reserved.
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "grid.h"
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include "../../ucx/cx/array_list.h"
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 #include "../common/context.h"
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33
815
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
34 #include <stdio.h>
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
35 #include <stdlib.h>
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
36
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
37 UiGridLayout* ui_grid_layout_create(const CxAllocator *a, HWND control, short columnspacing, short rowspacing) {
813
6d9066951cdb implement ui_show (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
38 UiGridLayout *grid = cxZalloc(a, sizeof(UiGridLayout));
667
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 grid->hwnd = control;
813
6d9066951cdb implement ui_show (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
40 grid->widgets = cxArrayListCreate(a, NULL, sizeof(GridElm), 32);
667
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 grid->columnspacing = columnspacing;
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 grid->rowspacing = rowspacing;
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 return grid;
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 }
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 void ui_grid_add_widget(
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 UiGridLayout *grid,
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 short x,
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 short y,
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 W32Widget *widget,
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 GridLayoutInfo *layout)
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 {
815
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
53 // add the widget
667
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 GridElm elm;
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 elm.widget = widget;
813
6d9066951cdb implement ui_show (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
56 elm.gridx = x;
6d9066951cdb implement ui_show (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
57 elm.gridy = y;
667
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 elm.layout = *layout;
813
6d9066951cdb implement ui_show (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
59 cxListAdd(grid->widgets, &elm);
815
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
60
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
61 // adjust max col/row count
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
62 if (x > grid->max_column) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
63 grid->max_column = x;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
64 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
65 if (y > grid->max_row) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
66 grid->max_row = y;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
67 }
667
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 }
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69
815
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
70 void ui_grid_layout(UiGridLayout *grid, int width, int height) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
71 int ncols = grid->max_column+1;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
72 int nrows = grid->max_row+1;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
73
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
74 GridDef *cols = calloc(ncols, sizeof(GridDef));
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
75 GridDef *rows = calloc(nrows, sizeof(GridDef));
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
76
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
77 int colspacing = grid->columnspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
78 int rowspacing = grid->rowspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
79
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
80 int span_max = 1;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
81 for(int r=0;r<2;r++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
82 CxIterator i = cxListIterator(grid->widgets);
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
83 cx_foreach(GridElm *, elm, i) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
84 int x = elm->gridx;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
85 int y = elm->gridy;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
86 GridDef *col = &cols[x];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
87 GridDef *row = &rows[y];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
88
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
89 W32Size size = w32_widget_get_preferred_size(elm->widget);
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
90 elm->layout.preferred_width = size.width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
91 elm->layout.preferred_height = size.height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
92
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
93 int elm_width = size.width + elm->layout.margin.left + elm->layout.margin.right;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
94 if(elm_width > cols[elm->gridx].preferred_size && elm->layout.colspan <= 1 && span_max == 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
95 cols[elm->gridx].preferred_size = elm_width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
96 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
97 int elm_height = size.height + elm->layout.margin.top + elm->layout.margin.bottom;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
98 if(elm_height > rows[elm->gridy].preferred_size && elm->layout.rowspan <= 1 && span_max == 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
99 rows[elm->gridy].preferred_size = elm_height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
100 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
101
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
102 if(elm->layout.rowspan > span_max || elm->layout.colspan > span_max) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
103 continue;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
104 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
105
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
106 int end_col = x+elm->layout.colspan;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
107 if(end_col > ncols) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
108 end_col = ncols;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
109 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
110 int end_row = y+elm->layout.rowspan;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
111 if(end_row > nrows) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
112 end_row = nrows;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
113 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
114
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
115 // are all columns in the span > preferred_width?
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
116 if(elm->layout.colspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
117 int span_width = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
118 GridDef *last_col = col;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
119 for(int c=x;c<end_col;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
120 span_width += cols[c].size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
121 last_col = &cols[c];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
122 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
123 if(span_width < elm->layout.preferred_width) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
124 last_col->size += elm->layout.preferred_width - span_width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
125 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
126 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
127
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
128 // are all rows in the span > preferred_height?
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
129 if(elm->layout.rowspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
130 int span_height = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
131 GridDef *last_row = row;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
132 for(int c=x;c<end_row;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
133 span_height += rows[c].size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
134 last_row = &rows[c];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
135 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
136 if(span_height < elm->layout.preferred_height) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
137 last_row->size += elm->layout.preferred_height - span_height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
138 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
139 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
140
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
141 if(elm->layout.hexpand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
142 if(elm->layout.colspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
143 // check if any column in the span is expanding
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
144 // if not, make the last column expanding
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
145 GridDef *last_col = col;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
146 for(int c=x;c<end_col;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
147 last_col = &cols[c];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
148 if(last_col->expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
149 break;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
150 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
151 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
152 last_col->expand = TRUE;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
153 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
154 col->expand = TRUE;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
155 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
156 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
157 if(elm->layout.vexpand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
158 if(elm->layout.rowspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
159 // same as colspan
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
160 GridDef *last_row = row;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
161 for(int c=x;c<nrows;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
162 last_row = &rows[c];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
163 if(last_row->expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
164 break;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
165 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
166 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
167 last_row->expand = TRUE;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
168 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
169 row->expand = TRUE;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
170 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
171 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
172 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
173 span_max = 50000; // not sure if this is unreasonable low or high
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
174 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
175
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
176 int col_ext = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
177 int row_ext = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
178
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
179 int preferred_width = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
180 int preferred_height = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
181 for(int j=0;j<ncols;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
182 preferred_width += cols[j].preferred_size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
183 if(cols[j].expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
184 col_ext++;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
185 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
186 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
187 for(int j=0;j<nrows;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
188 preferred_height += rows[j].preferred_size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
189 if(rows[j].expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
190 row_ext++;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
191 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
192 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
193 if(ncols > 0) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
194 preferred_width += (ncols-1) * colspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
195 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
196 if(nrows > 0) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
197 preferred_height += (nrows-1) * rowspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
198 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
199
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
200 grid->preferred_width = preferred_width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
201 grid->preferred_height = preferred_height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
202
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
203 int hremaining = width - preferred_width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
204 int vremaining = height - preferred_height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
205 int hext = col_ext > 0 ? hremaining/col_ext : 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
206 int vext = row_ext > 0 ? vremaining/row_ext : 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
207
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
208 for(int j=0;j<ncols;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
209 GridDef *col = &cols[j];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
210 if(col->expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
211 col->size = col->preferred_size + hext;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
212 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
213 col->size = col->preferred_size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
214 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
215 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
216 for(int j=0;j<nrows;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
217 GridDef *row = &rows[j];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
218 if(row->expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
219 row->size = row->preferred_size + vext;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
220 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
221 row->size = row->preferred_size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
222 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
223 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
224
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
225 int pos = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
226 for(int j=0;j<ncols;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
227 cols[j].pos = pos;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
228 pos += cols[j].size + colspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
229 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
230 pos = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
231 for(int j=0;j<nrows;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
232 rows[j].pos = pos;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
233 pos += rows[j].size + rowspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
234 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
235
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
236 CxIterator i = cxListIterator(grid->widgets);
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
237 cx_foreach(GridElm *, elm, i) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
238 GridDef *col = &cols[elm->gridx];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
239 GridDef *row = &rows[elm->gridy];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
240
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
241 int child_width = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
242 int child_height = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
243 int child_x = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
244 int child_y = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
245 if(elm->layout.hfill) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
246 if(elm->layout.colspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
247 int cwidth = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
248 int end_col = elm->gridx + elm->layout.colspan;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
249 if(end_col > ncols) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
250 end_col = ncols;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
251 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
252 int real_span = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
253 for(int c=elm->gridx;c<end_col;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
254 cwidth += cols[c].size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
255 real_span++;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
256 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
257 if(real_span > 0) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
258 cwidth += (real_span-1) * colspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
259 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
260 child_width = cwidth;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
261 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
262 child_width = col->size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
263 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
264 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
265 child_width = elm->layout.preferred_width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
266 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
267 child_width -= elm->layout.margin.left + elm->layout.margin.right;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
268
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
269 if(elm->layout.vfill) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
270 if(elm->layout.rowspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
271 int rheight = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
272 int end_row = elm->gridy + elm->layout.rowspan;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
273 if(end_row > nrows) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
274 end_row = nrows;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
275 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
276 int real_span = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
277 for(int r=elm->gridy;r<end_row;r++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
278 rheight += rows[r].size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
279 real_span++;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
280 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
281 if(real_span > 0) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
282 rheight += (real_span-1) * rowspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
283 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
284 child_height = rheight;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
285 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
286 child_height = row->size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
287 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
288 child_height = elm->layout.preferred_height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
289 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
290
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
291 child_x = col->pos + elm->layout.margin.left;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
292 child_y = row->pos + elm->layout.margin.top;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
293 SetWindowPos(elm->widget->hwnd, NULL, child_x, child_y, child_width, child_height, SWP_NOZORDER);
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
294 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
295
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
296 free(cols);
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
297 free(rows);
667
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
298 }

mercurial