Sun, 19 Oct 2025 21:20:08 +0200
update toolkit
| 100 | 1 | /* |
| 2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. | |
| 3 | * | |
| 4 | * Copyright 2024 Olaf Wintermann. All rights reserved. | |
| 5 | * | |
| 6 | * Redistribution and use in source and binary forms, with or without | |
| 7 | * modification, are permitted provided that the following conditions are met: | |
| 8 | * | |
| 9 | * 1. Redistributions of source code must retain the above copyright | |
| 10 | * notice, this list of conditions and the following disclaimer. | |
| 11 | * | |
| 12 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 13 | * notice, this list of conditions and the following disclaimer in the | |
| 14 | * documentation and/or other materials provided with the distribution. | |
| 15 | * | |
| 16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| 17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| 19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
| 20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
| 21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
| 22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
| 23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
| 24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
| 25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
| 26 | * POSSIBILITY OF SUCH DAMAGE. | |
| 27 | */ | |
| 28 | ||
| 29 | #import "GridLayout.h" | |
| 30 | ||
| 31 | ||
| 32 | ||
| 33 | @implementation GridLayout | |
| 34 | ||
| 112 | 35 | @synthesize container = _container; |
| 100 | 36 | |
| 37 | - (GridLayout*)init { | |
| 38 | self = [super init]; | |
| 39 | _columnspacing = 0; | |
| 40 | _rowspacing = 0; | |
| 41 | _children = cxArrayListCreateSimple(sizeof(GridElm), 32); | |
|
110
c00e968d018b
fix repolist menu button
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
109
diff
changeset
|
42 | _preferredSize.width = -1; |
|
c00e968d018b
fix repolist menu button
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
109
diff
changeset
|
43 | _preferredSize.height = -1; |
| 100 | 44 | |
| 45 | return self; | |
| 46 | } | |
| 47 | ||
| 48 | /* | |
| 49 | - (void) layout { | |
| 50 | [super layout]; | |
| 51 | ||
| 52 | NSRect r1 = _test.frame; | |
| 53 | NSSize s1 = _test.intrinsicContentSize; | |
| 54 | NSEdgeInsets e1 = _test.alignmentRectInsets; | |
| 55 | ||
| 56 | } | |
| 57 | */ | |
| 58 | ||
| 112 | 59 | - (BOOL)isFlipped { |
| 60 | return YES; | |
| 61 | } | |
| 100 | 62 | |
| 63 | - (void) layout { | |
| 64 | int ncols = _cols+1; | |
| 65 | int nrows = _rows+1; | |
| 66 | ||
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
67 | GridDef *cols = calloc(ncols, sizeof(GridDef)); |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
68 | GridDef *rows = calloc(nrows, sizeof(GridDef)); |
| 100 | 69 | |
| 112 | 70 | //NSRect viewFrame = self.frame; |
| 71 | NSRect viewFrame = self.bounds; | |
| 100 | 72 | |
| 73 | int colspacing = _columnspacing; | |
| 74 | int rowspacing = _rowspacing; | |
| 75 | ||
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
76 | int span_max = 1; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
77 | for(int r=0;r<2;r++) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
78 | CxIterator i = cxListIterator(_children); |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
79 | cx_foreach(GridElm *, elm, i) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
80 | int x = elm->x; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
81 | int y = elm->y; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
82 | GridDef *col = &cols[x]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
83 | GridDef *row = &rows[y]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
84 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
85 | NSSize size = elm->view.intrinsicContentSize; |
|
103
6606616eca9f
update uwproj, toolkit, libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
86 | NSSize size2 = elm->view.fittingSize; |
|
6606616eca9f
update uwproj, toolkit, libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
87 | if(size.width == NSViewNoIntrinsicMetric) { |
|
6606616eca9f
update uwproj, toolkit, libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
88 | size.width = size2.width; |
|
6606616eca9f
update uwproj, toolkit, libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
89 | } |
|
6606616eca9f
update uwproj, toolkit, libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
90 | if(size.height == NSViewNoIntrinsicMetric) { |
|
6606616eca9f
update uwproj, toolkit, libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
91 | size.height = size2.height; |
|
6606616eca9f
update uwproj, toolkit, libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
92 | } |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
93 | if(size.width != NSViewNoIntrinsicMetric) { |
| 112 | 94 | CGFloat width = size.width + elm->margin.left + elm->margin.right; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
95 | if(width > cols[elm->x].preferred_size && elm->colspan <= 1 && span_max == 1) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
96 | cols[elm->x].preferred_size = width; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
97 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
98 | elm->preferred_width = width; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
99 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
100 | if(size.height != NSViewNoIntrinsicMetric) { |
| 112 | 101 | CGFloat height = size.height + elm->margin.top + elm->margin.bottom; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
102 | if(height > rows[elm->y].preferred_size && elm->rowspan <= 1 && span_max == 1) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
103 | rows[elm->y].preferred_size = height; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
104 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
105 | elm->preferred_height = height; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
106 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
107 | |
| 112 | 108 | |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
109 | if(elm->rowspan > span_max || elm->colspan > span_max) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
110 | continue; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
111 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
112 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
113 | int end_col = x+elm->colspan; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
114 | if(end_col > ncols) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
115 | end_col = ncols; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
116 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
117 | int end_row = y+elm->rowspan; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
118 | if(end_row > nrows) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
119 | end_row = nrows; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
120 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
121 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
122 | // are all columns in the span > preferred_width? |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
123 | if(elm->colspan > 1) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
124 | int span_width = 0; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
125 | GridDef *last_col = col; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
126 | for(int c=x;c<end_col;c++) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
127 | span_width += cols[c].size; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
128 | last_col = &cols[c]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
129 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
130 | if(span_width < elm->preferred_width) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
131 | last_col->size += elm->preferred_width - span_width; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
132 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
133 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
134 | // are all rows in the span > preferred_height? |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
135 | if(elm->rowspan > 1) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
136 | int span_height = 0; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
137 | GridDef *last_row = row; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
138 | for(int c=x;c<end_row;c++) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
139 | span_height += rows[c].size; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
140 | last_row = &rows[c]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
141 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
142 | if(span_height < elm->preferred_height) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
143 | last_row->size += elm->preferred_height - span_height; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
144 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
145 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
146 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
147 | if(elm->hexpand) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
148 | if(elm->colspan > 1) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
149 | // check if any column in the span is expanding |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
150 | // if not, make the last column expanding |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
151 | GridDef *last_col = col; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
152 | for(int c=x;c<end_col;c++) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
153 | last_col = &cols[c]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
154 | if(last_col->expand) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
155 | break; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
156 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
157 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
158 | last_col->expand = TRUE; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
159 | } else { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
160 | col->expand = TRUE; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
161 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
162 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
163 | if(elm->vexpand) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
164 | if(elm->rowspan > 1) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
165 | // same as colspan |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
166 | GridDef *last_row = row; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
167 | for(int c=x;c<nrows;c++) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
168 | last_row = &rows[c]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
169 | if(last_row->expand) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
170 | break; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
171 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
172 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
173 | last_row->expand = TRUE; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
174 | } else { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
175 | row->expand = TRUE; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
176 | } |
| 100 | 177 | } |
| 178 | } | |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
179 | span_max = 50000; // not sure if this is unreasonable low or high |
| 100 | 180 | } |
| 181 | ||
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
182 | |
| 100 | 183 | int col_ext = 0; |
| 184 | int row_ext = 0; | |
| 185 | ||
| 186 | int preferred_width = 0; | |
| 187 | int preferred_height = 0; | |
| 188 | for(int j=0;j<ncols;j++) { | |
| 112 | 189 | preferred_width += cols[j].preferred_size; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
190 | if(cols[j].expand) { |
| 100 | 191 | col_ext++; |
| 192 | } | |
| 193 | } | |
| 194 | for(int j=0;j<nrows;j++) { | |
| 112 | 195 | preferred_height += rows[j].preferred_size; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
196 | if(rows[j].expand) { |
| 100 | 197 | row_ext++; |
| 198 | } | |
| 199 | } | |
| 112 | 200 | if(ncols > 0) { |
| 201 | preferred_width += (ncols-1) * colspacing; | |
| 202 | } | |
| 203 | if(nrows > 0) { | |
| 204 | preferred_height += (nrows-1) * rowspacing; | |
| 205 | } | |
| 100 | 206 | |
| 207 | _preferredSize.width = preferred_width; | |
| 208 | _preferredSize.height = preferred_height; | |
| 209 | ||
| 210 | ||
| 211 | int hremaining = viewFrame.size.width - preferred_width; | |
| 212 | int vremaining = viewFrame.size.height - preferred_height; | |
| 213 | int hext = hremaining/col_ext; | |
| 214 | int vext = vremaining/row_ext; | |
| 215 | ||
| 216 | for(int j=0;j<ncols;j++) { | |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
217 | GridDef *col = &cols[j]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
218 | if(col->expand) { |
| 100 | 219 | col->size = col->preferred_size + hext; |
| 220 | } else { | |
| 221 | col->size = col->preferred_size; | |
| 222 | } | |
| 223 | } | |
| 224 | for(int j=0;j<nrows;j++) { | |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
225 | GridDef *row = &rows[j]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
226 | if(row->expand) { |
| 100 | 227 | row->size = row->preferred_size + vext; |
| 228 | } else { | |
| 229 | row->size = row->preferred_size; | |
| 230 | } | |
| 231 | } | |
| 232 | ||
| 233 | int pos = 0; | |
| 234 | for(int j=0;j<ncols;j++) { | |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
235 | cols[j].pos = pos; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
236 | pos += cols[j].size + colspacing; |
| 100 | 237 | } |
| 238 | pos = 0; | |
| 239 | for(int j=0;j<nrows;j++) { | |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
240 | rows[j].pos = pos; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
241 | pos += rows[j].size + rowspacing; |
| 100 | 242 | } |
| 243 | ||
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
244 | CxIterator i = cxListIterator(_children); |
| 100 | 245 | cx_foreach(GridElm *, elm, i) { |
| 246 | //NSSize size = elm->view.intrinsicContentSize; | |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
247 | GridDef *col = &cols[elm->x]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
248 | GridDef *row = &rows[elm->y]; |
| 100 | 249 | |
| 250 | NSRect frame; | |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
251 | if(elm->hfill) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
252 | if(elm->colspan > 1) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
253 | int cwidth = 0; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
254 | int end_col = elm->x + elm->colspan; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
255 | if(end_col > ncols) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
256 | end_col = ncols; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
257 | } |
| 112 | 258 | int real_span = 0; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
259 | for(int c=elm->x;c<end_col;c++) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
260 | cwidth += cols[c].size; |
| 112 | 261 | real_span++; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
262 | } |
| 112 | 263 | if(real_span > 0) { |
| 264 | cwidth += (real_span-1) * colspacing; | |
| 265 | } | |
| 266 | frame.size.width = cwidth; | |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
267 | } else { |
| 112 | 268 | frame.size.width = col->size; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
269 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
270 | } else { |
| 112 | 271 | frame.size.width = elm->preferred_width; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
272 | } |
| 112 | 273 | frame.size.width -= elm->margin.left + elm->margin.right; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
274 | if(elm->vfill) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
275 | if(elm->rowspan > 1) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
276 | int rheight = 0; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
277 | int end_row = elm->y + elm->rowspan; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
278 | if(end_row > nrows) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
279 | end_row = nrows; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
280 | } |
| 112 | 281 | int real_span = 0; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
282 | for(int r=elm->y;r<end_row;r++) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
283 | rheight += rows[r].size; |
| 112 | 284 | real_span++; |
| 285 | } | |
| 286 | if(real_span > 0) { | |
| 287 | rheight += (real_span-1) * rowspacing; | |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
288 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
289 | frame.size.height = rheight; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
290 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
291 | frame.size.height = row->size; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
292 | } else { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
293 | frame.size.height = elm->preferred_height; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
294 | } |
| 112 | 295 | frame.size.height -= elm->margin.top + elm->margin.bottom; |
| 296 | ||
| 297 | frame.origin.x = col->pos + elm->margin.left; | |
| 298 | frame.origin.y = row->pos + elm->margin.top; | |
| 299 | NSRect viewFrame = [elm->view frameForAlignmentRect:frame]; | |
| 300 | elm->view.frame = viewFrame; | |
| 100 | 301 | } |
| 302 | ||
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
303 | free(cols); |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
304 | free(rows); |
| 100 | 305 | } |
| 306 | ||
| 307 | ||
| 308 | - (NSSize)intrinsicContentSize { | |
|
110
c00e968d018b
fix repolist menu button
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
109
diff
changeset
|
309 | if(_preferredSize.width == -1) { |
|
c00e968d018b
fix repolist menu button
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
109
diff
changeset
|
310 | [self layout]; |
|
c00e968d018b
fix repolist menu button
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
109
diff
changeset
|
311 | } |
| 100 | 312 | return self.preferredSize; |
| 313 | } | |
| 314 | ||
| 112 | 315 | - (void) addView:(NSView*)view layout:(UiLayout*)layout { |
|
110
c00e968d018b
fix repolist menu button
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
109
diff
changeset
|
316 | _preferredSize.width = -1; |
|
c00e968d018b
fix repolist menu button
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
109
diff
changeset
|
317 | _preferredSize.height = -1; |
|
c00e968d018b
fix repolist menu button
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
109
diff
changeset
|
318 | |
| 112 | 319 | if(self.container != nil && self.container->newline) { |
| 100 | 320 | _y++; |
| 321 | _x = 0; | |
| 112 | 322 | self.container->newline = FALSE; |
| 100 | 323 | } |
| 324 | ||
| 325 | GridElm elm; | |
| 326 | elm.x = _x; | |
| 327 | elm.y = _y; | |
| 112 | 328 | elm.margin = NSEdgeInsetsMake(layout->margin_top, layout->margin_left, layout->margin_bottom, layout->margin_right); |
| 329 | elm.colspan = layout->colspan; | |
| 330 | elm.rowspan = layout->rowspan; | |
| 331 | if(layout->fill) { | |
|
103
6606616eca9f
update uwproj, toolkit, libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
332 | elm.hfill = TRUE; |
|
6606616eca9f
update uwproj, toolkit, libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
333 | elm.vfill = TRUE; |
|
6606616eca9f
update uwproj, toolkit, libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
334 | elm.hexpand = TRUE; |
|
6606616eca9f
update uwproj, toolkit, libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
335 | elm.vexpand = TRUE; |
|
6606616eca9f
update uwproj, toolkit, libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
336 | } else { |
| 112 | 337 | elm.hfill = layout->hfill; |
| 338 | elm.vfill = layout->vfill; | |
| 339 | elm.hexpand = layout->hexpand; | |
| 340 | elm.vexpand = layout->vexpand; | |
|
103
6606616eca9f
update uwproj, toolkit, libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
341 | } |
| 100 | 342 | elm.view = view; |
| 343 | cxListAdd(_children, &elm); | |
| 344 | ||
| 345 | [self addSubview:view]; | |
| 346 | self.needsLayout = YES; | |
| 347 | ||
| 348 | if(_x > _cols) { | |
| 349 | _cols = _x; | |
| 350 | } | |
| 351 | if(_y > _rows) { | |
| 352 | _rows = _y; | |
| 353 | } | |
| 354 | _x++; | |
| 355 | } | |
| 356 | ||
| 357 | - (void) dealloc { | |
|
101
7b3a3130be44
update ucx, toolkit
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
358 | cxListFree(_children); |
| 100 | 359 | } |
| 360 | ||
| 361 | @end |