ui/win32/grid.c

Sun, 07 Dec 2025 15:45:30 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 07 Dec 2025 15:45:30 +0100
changeset 969
7385c26d998d
parent 892
0fbaac4aafc8
permissions
-rw-r--r--

rename combobox to dropdown

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) {
844
3106d9ca2f9c fix wrong child height in grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 841
diff changeset
70 if (width == 0 || height == 0) {
3106d9ca2f9c fix wrong child height in grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 841
diff changeset
71 return;
3106d9ca2f9c fix wrong child height in grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 841
diff changeset
72 }
3106d9ca2f9c fix wrong child height in grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 841
diff changeset
73
815
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
74 int ncols = grid->max_column+1;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
75 int nrows = grid->max_row+1;
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 GridDef *cols = calloc(ncols, sizeof(GridDef));
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
78 GridDef *rows = calloc(nrows, sizeof(GridDef));
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 colspacing = grid->columnspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
81 int rowspacing = grid->rowspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
82
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
83 int span_max = 1;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
84 for(int r=0;r<2;r++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
85 CxIterator i = cxListIterator(grid->widgets);
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
86 cx_foreach(GridElm *, elm, i) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
87 int x = elm->gridx;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
88 int y = elm->gridy;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
89 GridDef *col = &cols[x];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
90 GridDef *row = &rows[y];
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 W32Size size = w32_widget_get_preferred_size(elm->widget);
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
93 elm->layout.preferred_width = size.width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
94 elm->layout.preferred_height = size.height;
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_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
97 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
98 cols[elm->gridx].preferred_size = elm_width;
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 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
101 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
102 rows[elm->gridy].preferred_size = elm_height;
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 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
106 continue;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
107 }
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_col = x+elm->layout.colspan;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
110 if(end_col > ncols) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
111 end_col = ncols;
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 int end_row = y+elm->layout.rowspan;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
114 if(end_row > nrows) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
115 end_row = nrows;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
116 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
117
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
118 // are all columns in the span > preferred_width?
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
119 if(elm->layout.colspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
120 int span_width = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
121 GridDef *last_col = col;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
122 for(int c=x;c<end_col;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
123 span_width += cols[c].size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
124 last_col = &cols[c];
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 if(span_width < elm->layout.preferred_width) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
127 last_col->size += elm->layout.preferred_width - span_width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
128 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
129 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
130
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
131 // are all rows in the span > preferred_height?
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
132 if(elm->layout.rowspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
133 int span_height = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
134 GridDef *last_row = row;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
135 for(int c=x;c<end_row;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
136 span_height += rows[c].size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
137 last_row = &rows[c];
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 if(span_height < elm->layout.preferred_height) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
140 last_row->size += elm->layout.preferred_height - span_height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
141 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
142 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
143
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
144 if(elm->layout.hexpand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
145 if(elm->layout.colspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
146 // check if any column in the span is expanding
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
147 // if not, make the last column expanding
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
148 GridDef *last_col = col;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
149 for(int c=x;c<end_col;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
150 last_col = &cols[c];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
151 if(last_col->expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
152 break;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
153 }
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 last_col->expand = TRUE;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
156 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
157 col->expand = TRUE;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
158 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
159 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
160 if(elm->layout.vexpand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
161 if(elm->layout.rowspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
162 // same as colspan
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
163 GridDef *last_row = row;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
164 for(int c=x;c<nrows;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
165 last_row = &rows[c];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
166 if(last_row->expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
167 break;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
168 }
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 last_row->expand = TRUE;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
171 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
172 row->expand = TRUE;
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 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
176 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
177 }
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 col_ext = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
180 int row_ext = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
181
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
182 int preferred_width = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
183 int preferred_height = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
184 for(int j=0;j<ncols;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
185 preferred_width += cols[j].preferred_size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
186 if(cols[j].expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
187 col_ext++;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
188 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
189 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
190 for(int j=0;j<nrows;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
191 preferred_height += rows[j].preferred_size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
192 if(rows[j].expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
193 row_ext++;
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 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
196 if(ncols > 0) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
197 preferred_width += (ncols-1) * colspacing;
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 if(nrows > 0) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
200 preferred_height += (nrows-1) * rowspacing;
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
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
203 grid->preferred_width = preferred_width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
204 grid->preferred_height = preferred_height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
205
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
206 int hremaining = width - preferred_width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
207 int vremaining = height - preferred_height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
208 int hext = col_ext > 0 ? hremaining/col_ext : 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
209 int vext = row_ext > 0 ? vremaining/row_ext : 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
210
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
211 for(int j=0;j<ncols;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
212 GridDef *col = &cols[j];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
213 if(col->expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
214 col->size = col->preferred_size + hext;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
215 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
216 col->size = col->preferred_size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
217 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
218 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
219 for(int j=0;j<nrows;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
220 GridDef *row = &rows[j];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
221 if(row->expand) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
222 row->size = row->preferred_size + vext;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
223 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
224 row->size = row->preferred_size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
225 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
226 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
227
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
228 int pos = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
229 for(int j=0;j<ncols;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
230 cols[j].pos = pos;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
231 pos += cols[j].size + colspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
232 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
233 pos = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
234 for(int j=0;j<nrows;j++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
235 rows[j].pos = pos;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
236 pos += rows[j].size + rowspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
237 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
238
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
239 CxIterator i = cxListIterator(grid->widgets);
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
240 cx_foreach(GridElm *, elm, i) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
241 GridDef *col = &cols[elm->gridx];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
242 GridDef *row = &rows[elm->gridy];
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
243
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
244 int child_width = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
245 int child_height = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
246 int child_x = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
247 int child_y = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
248 if(elm->layout.hfill) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
249 if(elm->layout.colspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
250 int cwidth = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
251 int end_col = elm->gridx + elm->layout.colspan;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
252 if(end_col > ncols) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
253 end_col = ncols;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
254 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
255 int real_span = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
256 for(int c=elm->gridx;c<end_col;c++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
257 cwidth += cols[c].size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
258 real_span++;
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 if(real_span > 0) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
261 cwidth += (real_span-1) * colspacing;
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 child_width = cwidth;
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 = col->size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
266 }
844
3106d9ca2f9c fix wrong child height in grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 841
diff changeset
267 child_width -= elm->layout.margin.left + elm->layout.margin.right;
815
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
268 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
269 child_width = elm->layout.preferred_width;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
270 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
271
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
272 if(elm->layout.vfill) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
273 if(elm->layout.rowspan > 1) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
274 int rheight = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
275 int end_row = elm->gridy + elm->layout.rowspan;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
276 if(end_row > nrows) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
277 end_row = nrows;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
278 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
279 int real_span = 0;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
280 for(int r=elm->gridy;r<end_row;r++) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
281 rheight += rows[r].size;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
282 real_span++;
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 if(real_span > 0) {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
285 rheight += (real_span-1) * rowspacing;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
286 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
287 child_height = rheight;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
288 }
844
3106d9ca2f9c fix wrong child height in grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 841
diff changeset
289 child_height = row->size - elm->layout.margin.top - elm->layout.margin.bottom;
815
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
290 } else {
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
291 child_height = elm->layout.preferred_height;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
292 }
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 child_x = col->pos + elm->layout.margin.left;
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
295 child_y = row->pos + elm->layout.margin.top;
892
0fbaac4aafc8 fix win32 drawing issue after layout changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 891
diff changeset
296 SetWindowPos(elm->widget->hwnd, NULL, child_x, child_y, child_width, child_height, SWP_NOZORDER | SWP_NOACTIVATE);
891
0804fc9298f6 fix grid background painting
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 844
diff changeset
297 InvalidateRect(elm->widget->hwnd, NULL, TRUE);
892
0fbaac4aafc8 fix win32 drawing issue after layout changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 891
diff changeset
298 //UpdateWindow(elm->widget->hwnd);
841
651cf2c59dd9 implement ui_grid_create (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 818
diff changeset
299 if (elm->widget->layout) {
651cf2c59dd9 implement ui_grid_create (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 818
diff changeset
300 elm->widget->layout(elm->widget->layoutmanager, child_width, child_height);
651cf2c59dd9 implement ui_grid_create (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 818
diff changeset
301 }
815
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
302 }
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
303
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
304 free(cols);
7ddf5fb7ec2a implement grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 813
diff changeset
305 free(rows);
667
35c64574f862 add basic structure for grid layout (win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
306 }

mercurial