ui/win32/grid.c

Wed, 08 Oct 2025 16:09:54 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 08 Oct 2025 16:09:54 +0200
changeset 818
8185cd761897
parent 815
7ddf5fb7ec2a
child 841
651cf2c59dd9
permissions
-rw-r--r--

implement box container (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
818
8185cd761897 implement box container (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 815
diff changeset
37 UiGridLayout* ui_grid_layout_create(const CxAllocator *a, 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));
6d9066951cdb implement ui_show (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
39 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
40 grid->columnspacing = columnspacing;
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 grid->rowspacing = rowspacing;
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 return grid;
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 }
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 void ui_grid_add_widget(
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 UiGridLayout *grid,
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 short x,
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 short y,
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 W32Widget *widget,
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 GridLayoutInfo *layout)
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 {
815
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
52 // add the widget
667
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 GridElm elm;
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 elm.widget = widget;
813
6d9066951cdb implement ui_show (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
55 elm.gridx = x;
6d9066951cdb implement ui_show (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
56 elm.gridy = y;
667
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 elm.layout = *layout;
813
6d9066951cdb implement ui_show (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
58 cxListAdd(grid->widgets, &elm);
815
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
59
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
60 // adjust max col/row count
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
61 if (x > grid->max_column) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
62 grid->max_column = x;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
63 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
64 if (y > grid->max_row) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
65 grid->max_row = y;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
66 }
667
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67 }
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68
815
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
69 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
70 int ncols = grid->max_column+1;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
71 int nrows = grid->max_row+1;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
72
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
73 GridDef *cols = calloc(ncols, sizeof(GridDef));
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
74 GridDef *rows = calloc(nrows, sizeof(GridDef));
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
75
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
76 int colspacing = grid->columnspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
77 int rowspacing = grid->rowspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
78
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
79 int span_max = 1;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
80 for(int r=0;r<2;r++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
81 CxIterator i = cxListIterator(grid->widgets);
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
82 cx_foreach(GridElm *, elm, i) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
83 int x = elm->gridx;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
84 int y = elm->gridy;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
85 GridDef *col = &cols[x];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
86 GridDef *row = &rows[y];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
87
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
88 W32Size size = w32_widget_get_preferred_size(elm->widget);
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
89 elm->layout.preferred_width = size.width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
90 elm->layout.preferred_height = size.height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
91
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
92 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
93 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
94 cols[elm->gridx].preferred_size = elm_width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
95 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
96 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
97 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
98 rows[elm->gridy].preferred_size = elm_height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
99 }
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 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
102 continue;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
103 }
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 int end_col = x+elm->layout.colspan;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
106 if(end_col > ncols) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
107 end_col = ncols;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
108 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
109 int end_row = y+elm->layout.rowspan;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
110 if(end_row > nrows) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
111 end_row = nrows;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
112 }
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 // are all columns in the span > preferred_width?
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
115 if(elm->layout.colspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
116 int span_width = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
117 GridDef *last_col = col;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
118 for(int c=x;c<end_col;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
119 span_width += cols[c].size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
120 last_col = &cols[c];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
121 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
122 if(span_width < elm->layout.preferred_width) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
123 last_col->size += elm->layout.preferred_width - span_width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
124 }
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 // are all rows in the span > preferred_height?
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
128 if(elm->layout.rowspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
129 int span_height = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
130 GridDef *last_row = row;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
131 for(int c=x;c<end_row;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
132 span_height += rows[c].size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
133 last_row = &rows[c];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
134 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
135 if(span_height < elm->layout.preferred_height) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
136 last_row->size += elm->layout.preferred_height - span_height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
137 }
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 if(elm->layout.hexpand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
141 if(elm->layout.colspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
142 // check if any column in the span is expanding
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
143 // if not, make the last column expanding
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
144 GridDef *last_col = col;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
145 for(int c=x;c<end_col;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
146 last_col = &cols[c];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
147 if(last_col->expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
148 break;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
149 }
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 last_col->expand = TRUE;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
152 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
153 col->expand = TRUE;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
154 }
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 if(elm->layout.vexpand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
157 if(elm->layout.rowspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
158 // same as colspan
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
159 GridDef *last_row = row;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
160 for(int c=x;c<nrows;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
161 last_row = &rows[c];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
162 if(last_row->expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
163 break;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
164 }
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 last_row->expand = TRUE;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
167 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
168 row->expand = TRUE;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
169 }
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 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
173 }
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 int col_ext = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
176 int row_ext = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
177
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
178 int preferred_width = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
179 int preferred_height = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
180 for(int j=0;j<ncols;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
181 preferred_width += cols[j].preferred_size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
182 if(cols[j].expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
183 col_ext++;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
184 }
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 for(int j=0;j<nrows;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
187 preferred_height += rows[j].preferred_size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
188 if(rows[j].expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
189 row_ext++;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
190 }
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 if(ncols > 0) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
193 preferred_width += (ncols-1) * colspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
194 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
195 if(nrows > 0) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
196 preferred_height += (nrows-1) * rowspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
197 }
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 grid->preferred_width = preferred_width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
200 grid->preferred_height = preferred_height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
201
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
202 int hremaining = width - preferred_width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
203 int vremaining = height - preferred_height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
204 int hext = col_ext > 0 ? hremaining/col_ext : 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
205 int vext = row_ext > 0 ? vremaining/row_ext : 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
206
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
207 for(int j=0;j<ncols;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
208 GridDef *col = &cols[j];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
209 if(col->expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
210 col->size = col->preferred_size + hext;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
211 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
212 col->size = col->preferred_size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
213 }
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 for(int j=0;j<nrows;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
216 GridDef *row = &rows[j];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
217 if(row->expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
218 row->size = row->preferred_size + vext;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
219 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
220 row->size = row->preferred_size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
221 }
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 int pos = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
225 for(int j=0;j<ncols;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
226 cols[j].pos = pos;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
227 pos += cols[j].size + colspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
228 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
229 pos = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
230 for(int j=0;j<nrows;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
231 rows[j].pos = pos;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
232 pos += rows[j].size + rowspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
233 }
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 CxIterator i = cxListIterator(grid->widgets);
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
236 cx_foreach(GridElm *, elm, i) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
237 GridDef *col = &cols[elm->gridx];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
238 GridDef *row = &rows[elm->gridy];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
239
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
240 int child_width = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
241 int child_height = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
242 int child_x = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
243 int child_y = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
244 if(elm->layout.hfill) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
245 if(elm->layout.colspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
246 int cwidth = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
247 int end_col = elm->gridx + elm->layout.colspan;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
248 if(end_col > ncols) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
249 end_col = ncols;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
250 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
251 int real_span = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
252 for(int c=elm->gridx;c<end_col;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
253 cwidth += cols[c].size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
254 real_span++;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
255 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
256 if(real_span > 0) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
257 cwidth += (real_span-1) * colspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
258 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
259 child_width = cwidth;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
260 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
261 child_width = col->size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
262 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
263 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
264 child_width = elm->layout.preferred_width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
265 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
266 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
267
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
268 if(elm->layout.vfill) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
269 if(elm->layout.rowspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
270 int rheight = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
271 int end_row = elm->gridy + elm->layout.rowspan;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
272 if(end_row > nrows) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
273 end_row = nrows;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
274 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
275 int real_span = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
276 for(int r=elm->gridy;r<end_row;r++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
277 rheight += rows[r].size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
278 real_span++;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
279 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
280 if(real_span > 0) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
281 rheight += (real_span-1) * rowspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
282 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
283 child_height = rheight;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
284 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
285 child_height = row->size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
286 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
287 child_height = elm->layout.preferred_height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
288 }
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 child_x = col->pos + elm->layout.margin.left;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
291 child_y = row->pos + elm->layout.margin.top;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
292 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
293 }
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 free(cols);
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
296 free(rows);
667
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
297 }

mercurial