annotate dynamin/gui/layout.d @ 106:acdbb30fee7e

Port to D2. Most of the effort was dealing with immutable and const.
author Jordan Miner <jminer7@gmail.com>
date Mon, 17 Dec 2012 23:41:50 -0600
parents 5c8c1c2e12c0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
1
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
2 /*
103
73060bc3f004 Change license to Boost 1.0 and MPL 2.0.
Jordan Miner <jminer7@gmail.com>
parents: 100
diff changeset
3 * Copyright Jordan Miner
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
4 *
103
73060bc3f004 Change license to Boost 1.0 and MPL 2.0.
Jordan Miner <jminer7@gmail.com>
parents: 100
diff changeset
5 * This Source Code Form is subject to the terms of the Mozilla Public
73060bc3f004 Change license to Boost 1.0 and MPL 2.0.
Jordan Miner <jminer7@gmail.com>
parents: 100
diff changeset
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
73060bc3f004 Change license to Boost 1.0 and MPL 2.0.
Jordan Miner <jminer7@gmail.com>
parents: 100
diff changeset
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
8 *
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
9 */
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
10
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
11 module dynamin.gui.layout;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
12
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
13 import dynamin.all_gui;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
14 import dynamin.gui.control;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
15 import dynamin.all_painting;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
16 import dynamin.core.string;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
17 import tango.io.Stdout;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
18 import dynamin.core.benchmark;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
19
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
20 // this is a temporary file to hold layout code until I figure out what
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
21 // files to put it in
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
22
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
23 /*
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
24 Opera's find dialog:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
25
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
26 auto whatLabel = win.content.add(new Label("Find What"));
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
27 ...
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
28
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
29 V( whatLabel
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
30 H( findBox findButton )
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
31 H( V(wholeWordCheck caseCheck) ~ V(upRadio downRadio) ~)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
32 H( ~ closeButton )
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
33 )
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
34 */
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
35
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
36 enum LayoutType {
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
37 Table, Control, Filler, Spacer
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
38 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
39 enum Elasticity {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
40 No, Semi, Yes
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
41 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
42 struct LayoutGroup {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
43 LayoutType type;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
44 LayoutGroup* parent;
37
f9fea816b1fb Correct a comment and remove an unused variable.
Jordan Miner <jminer7@gmail.com>
parents: 11
diff changeset
45 LayoutGroup[] children; // used if type == LayoutType.Table
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
46 Control control; // used if type == LayoutType.Control
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
47 int numColumns; // used if type == LayoutType.Table
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
48 int numRows() { return children.length / numColumns; }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
49
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
50 bool cacheActive;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
51 private Elasticity _elasticXCache, _elasticYCache;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
52 private Size _bestSizeCache;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
53 private int _baselineCache;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
54
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
55 // spacing variables
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
56 int spacing = 8;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
57 static LayoutGroup opCall(LayoutType type, LayoutGroup* parent) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
58 LayoutGroup layout;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
59 layout.type = type;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
60 layout.parent = parent;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
61 layout.children.length = 3;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
62 layout.children.length = 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
63 return layout;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
64 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
65
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
66 void setCache() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
67 for(int i = 0; i < children.length; ++i) // can't use foreach--copies
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
68 children[i].setCache();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
69 _elasticXCache = _elasticX;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
70 _elasticYCache = _elasticY;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
71 _bestSizeCache = _bestSize;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
72 _baselineCache = _baseline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
73 cacheActive = true;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
74 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
75 void clearCache() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
76 cacheActive = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
77 for(int i = 0; i < children.length; ++i) // can't use foreach--copies
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
78 children[i].clearCache();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
79 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
80 Elasticity elasticX() { return cacheActive ? _elasticXCache : _elasticX; }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
81 Elasticity elasticY() { return cacheActive ? _elasticYCache : _elasticY; }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
82 Size bestSize() { return cacheActive ? _bestSizeCache : _bestSize; }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
83 int baseline() { return cacheActive ? _baselineCache : _baseline; }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
84
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
85 //{{{ _elasticX()
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
86 private Elasticity _elasticX() {
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
87 final switch(type) {
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
88 case LayoutType.Control:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
89 return control.elasticX ? Elasticity.Yes : Elasticity.No;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
90 case LayoutType.Table:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
91 auto e = Elasticity.No;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
92 foreach(layout; children) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
93 if(layout.elasticX > e)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
94 e = layout.elasticX;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
95 if(e == Elasticity.Yes)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
96 return e;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
97 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
98 return e;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
99 case LayoutType.Filler:
38
69df5369c5f7 Fix filler to only be elastic in the direction of its parent.
Jordan Miner <jminer7@gmail.com>
parents: 37
diff changeset
100 if(!parent || parent.numColumns > 1 || children.length == 1)
69df5369c5f7 Fix filler to only be elastic in the direction of its parent.
Jordan Miner <jminer7@gmail.com>
parents: 37
diff changeset
101 return Elasticity.Semi;
69df5369c5f7 Fix filler to only be elastic in the direction of its parent.
Jordan Miner <jminer7@gmail.com>
parents: 37
diff changeset
102 else
69df5369c5f7 Fix filler to only be elastic in the direction of its parent.
Jordan Miner <jminer7@gmail.com>
parents: 37
diff changeset
103 return Elasticity.No;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
104 case LayoutType.Spacer:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
105 return Elasticity.No;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
106 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
107 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
108 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
109 //{{{ _elasticY()
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
110 private Elasticity _elasticY() {
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
111 final switch(type) {
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
112 case LayoutType.Control:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
113 return control.elasticY ? Elasticity.Yes : Elasticity.No;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
114 case LayoutType.Table:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
115 auto e = Elasticity.No;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
116 foreach(layout; children) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
117 if(layout.elasticY > e)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
118 e = layout.elasticY;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
119 if(e == Elasticity.Yes)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
120 return e;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
121 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
122 return e;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
123 case LayoutType.Filler:
38
69df5369c5f7 Fix filler to only be elastic in the direction of its parent.
Jordan Miner <jminer7@gmail.com>
parents: 37
diff changeset
124 if(!parent || parent.numRows > 1 || children.length == 1)
69df5369c5f7 Fix filler to only be elastic in the direction of its parent.
Jordan Miner <jminer7@gmail.com>
parents: 37
diff changeset
125 return Elasticity.Semi;
69df5369c5f7 Fix filler to only be elastic in the direction of its parent.
Jordan Miner <jminer7@gmail.com>
parents: 37
diff changeset
126 else
69df5369c5f7 Fix filler to only be elastic in the direction of its parent.
Jordan Miner <jminer7@gmail.com>
parents: 37
diff changeset
127 return Elasticity.No;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
128 case LayoutType.Spacer:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
129 return Elasticity.No;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
130 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
131 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
132 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
133
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
134 //{{{ _bestSize()
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
135 private Size _bestSize() {
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
136 final switch(type) {
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
137 case LayoutType.Control:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
138 return control.bestSize;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
139 case LayoutType.Table:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
140 scope colsInfo = new ColRowInfo[numColumns];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
141 scope rowsInfo = new ColRowInfo[numRows];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
142 TableInfo info;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
143 getTableSizes(colsInfo, rowsInfo, info);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
144 return info.bestSize;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
145 case LayoutType.Filler:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
146 case LayoutType.Spacer:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
147 return Size(0, 0);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
148 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
149 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
150 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
151 //{{{ _baseline()
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
152 private int _baseline() {
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
153 final switch(type) {
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
154 case LayoutType.Control:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
155 return control.baseline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
156 case LayoutType.Table:
40
735223842a85 Make horizontal layouts align along their baseline.
Jordan Miner <jminer7@gmail.com>
parents: 39
diff changeset
157 if(numRows != 1)
735223842a85 Make horizontal layouts align along their baseline.
Jordan Miner <jminer7@gmail.com>
parents: 39
diff changeset
158 return 0;
735223842a85 Make horizontal layouts align along their baseline.
Jordan Miner <jminer7@gmail.com>
parents: 39
diff changeset
159 scope colsInfo = new ColRowInfo[numColumns];
735223842a85 Make horizontal layouts align along their baseline.
Jordan Miner <jminer7@gmail.com>
parents: 39
diff changeset
160 scope rowsInfo = new ColRowInfo[numRows];
735223842a85 Make horizontal layouts align along their baseline.
Jordan Miner <jminer7@gmail.com>
parents: 39
diff changeset
161 TableInfo info;
735223842a85 Make horizontal layouts align along their baseline.
Jordan Miner <jminer7@gmail.com>
parents: 39
diff changeset
162 getTableSizes(colsInfo, rowsInfo, info);
735223842a85 Make horizontal layouts align along their baseline.
Jordan Miner <jminer7@gmail.com>
parents: 39
diff changeset
163 return cast(int)rowsInfo[0].baseline;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
164 case LayoutType.Filler:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
165 case LayoutType.Spacer:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
166 return 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
167 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
168 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
169 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
170
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
171 //{{{ layout()
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
172 void layout(Rect rect) {
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
173 final switch(type) {
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
174 case LayoutType.Control:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
175 control.location = Point(rect.x, rect.y);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
176 control.size = Size(rect.width, rect.height);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
177 return;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
178 case LayoutType.Table:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
179 scope colsInfo = new ColRowInfo[numColumns];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
180 scope rowsInfo = new ColRowInfo[numRows];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
181 TableInfo info;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
182 getTableSizes(colsInfo, rowsInfo, info);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
183
104
5c8c1c2e12c0 Change from real to double.
Jordan Miner <jminer7@gmail.com>
parents: 103
diff changeset
184 double extraWidth = rect.width - bestSize.width;
5c8c1c2e12c0 Change from real to double.
Jordan Miner <jminer7@gmail.com>
parents: 103
diff changeset
185 double extraHeight = rect.height - bestSize.height;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
186
104
5c8c1c2e12c0 Change from real to double.
Jordan Miner <jminer7@gmail.com>
parents: 103
diff changeset
187 void distExtra(ref double extra, ref ColRowInfo info,
5c8c1c2e12c0 Change from real to double.
Jordan Miner <jminer7@gmail.com>
parents: 103
diff changeset
188 ref double totalElastic, ref int semis, Elasticity e) {
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
189 if(info.elastic == Elasticity.No || extra <= 0)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
190 return;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
191 if(e == Elasticity.Semi &&
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
192 info.elastic == Elasticity.Semi) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
193 auto thisExtra = extra / semis;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
194 extra -= thisExtra;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
195 semis--;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
196 info.bestSize += thisExtra;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
197 } else if(e == Elasticity.Yes &&
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
198 info.elastic == Elasticity.Yes) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
199 auto thisExtra = extra * info.bestSize/totalElastic;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
200 extra -= thisExtra;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
201 totalElastic -= info.bestSize; // subtract original size
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
202 info.bestSize += thisExtra;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
203 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
204 }
104
5c8c1c2e12c0 Change from real to double.
Jordan Miner <jminer7@gmail.com>
parents: 103
diff changeset
205 double y = 0;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
206 for(int row = 0; row < numRows; ++row) { // go over each row
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
207 distExtra(extraHeight, rowsInfo[row], info.elasticHeight, info.semiRows, elasticY);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
208
104
5c8c1c2e12c0 Change from real to double.
Jordan Miner <jminer7@gmail.com>
parents: 103
diff changeset
209 double x = 0;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
210 for(int col = 0; col < numColumns; ++col) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
211 distExtra(extraWidth, colsInfo[col], info.elasticWidth, info.semiColumns, elasticX);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
212
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
213 auto layout = children[row * numColumns + col];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
214
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
215 Rect r = Point(x, y) + layout.bestSize;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
216
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
217 if(layout.baseline > 0)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
218 r.y = r.y + rowsInfo[row].baseline - layout.baseline;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
219 if(layout.elasticX)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
220 r.width = colsInfo[col].bestSize;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
221 if(layout.elasticY)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
222 r.height = rowsInfo[row].bestSize;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
223
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
224 layout.layout(r + Point(rect.x, rect.y));
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
225
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
226 x += colsInfo[col].bestSize +
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
227 (colsInfo[col].filler ? 0 : spacing);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
228 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
229 y += rowsInfo[row].bestSize +
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
230 (rowsInfo[row].filler ? 0 : spacing);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
231 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
232 return;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
233 case LayoutType.Filler:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
234 case LayoutType.Spacer:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
235 return;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
236 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
237 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
238 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
239
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
240 struct ColRowInfo {
104
5c8c1c2e12c0 Change from real to double.
Jordan Miner <jminer7@gmail.com>
parents: 103
diff changeset
241 double bestSize = 0; // large enough to hold the largest control
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
242 Elasticity elastic = Elasticity.No;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
243 bool filler = true; // if the entire column/row is filler
104
5c8c1c2e12c0 Change from real to double.
Jordan Miner <jminer7@gmail.com>
parents: 103
diff changeset
244 double baseline; // only applies to rows: max baseline in row
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
245 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
246 struct TableInfo {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
247 // number of semi-elastic columns/rows
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
248 int semiColumns = 0; int semiRows = 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
249 // the sum of fully elastic width/height, not including semi
104
5c8c1c2e12c0 Change from real to double.
Jordan Miner <jminer7@gmail.com>
parents: 103
diff changeset
250 double elasticWidth = 0, elasticHeight = 0;
100
4f2d709760eb Change from individual fields to a static array for x, y, width, height, etc.
Jordan Miner <jminer7@gmail.com>
parents: 42
diff changeset
251 Size bestSize;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
252 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
253 //{{{ getTableSizes()
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
254 // Fills in the passed in array with the column and row sizes, as well
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
255 // as whether they are elastic. The passed in arrays must be the right
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
256 // sizes. They may be stack allocated. The table best size does
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
257 // including spacing, but column and row best sizes do not.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
258 private void getTableSizes(ColRowInfo[] colsInfo, ColRowInfo[] rowsInfo, ref TableInfo info) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
259 assert(children.length % numColumns == 0);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
260 assert(type == LayoutType.Table);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
261
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
262 assert(colsInfo.length == numColumns);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
263 assert(rowsInfo.length == numRows);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
264
104
5c8c1c2e12c0 Change from real to double.
Jordan Miner <jminer7@gmail.com>
parents: 103
diff changeset
265 double max = 0;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
266 LayoutGroup* l;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
267
39
04d2867d335c Fix possible incorrect extra space after the last control in a layout.
Jordan Miner <jminer7@gmail.com>
parents: 38
diff changeset
268 bool prevNonFiller = false;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
269 int sp = 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
270 for(int col = 0; col < numColumns; ++col) { // go down each column
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
271 for(int row = 0; row < numRows; ++row) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
272 l = &children[row * numColumns + col];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
273 max = l.bestSize.width > max ? l.bestSize.width : max;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
274 if(l.elasticX > colsInfo[col].elastic)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
275 colsInfo[col].elastic = l.elasticX;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
276 if(l.type != LayoutType.Filler)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
277 colsInfo[col].filler = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
278 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
279 colsInfo[col].bestSize = max;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
280 if(colsInfo[col].elastic == Elasticity.Yes)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
281 info.elasticWidth += max;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
282 else if(colsInfo[col].elastic == Elasticity.Semi)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
283 info.semiColumns++;
39
04d2867d335c Fix possible incorrect extra space after the last control in a layout.
Jordan Miner <jminer7@gmail.com>
parents: 38
diff changeset
284 // this won't add spacing to the first non-filler
04d2867d335c Fix possible incorrect extra space after the last control in a layout.
Jordan Miner <jminer7@gmail.com>
parents: 38
diff changeset
285 sp = (!colsInfo[col].filler && prevNonFiller) ? spacing : 0;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
286 info.bestSize.width = info.bestSize.width + sp + max;
39
04d2867d335c Fix possible incorrect extra space after the last control in a layout.
Jordan Miner <jminer7@gmail.com>
parents: 38
diff changeset
287 prevNonFiller = !colsInfo[col].filler ? true : prevNonFiller ;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
288 max = 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
289 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
290
39
04d2867d335c Fix possible incorrect extra space after the last control in a layout.
Jordan Miner <jminer7@gmail.com>
parents: 38
diff changeset
291 prevNonFiller = false;
104
5c8c1c2e12c0 Change from real to double.
Jordan Miner <jminer7@gmail.com>
parents: 103
diff changeset
292 double maxBl = 0;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
293 sp = 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
294 for(int row = 0; row < numRows; ++row) { // go over each row
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
295 for(int col = 0; col < numColumns; ++col) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
296 l = &children[row * numColumns + col];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
297 max = l.bestSize.height > max ? l.bestSize.height : max;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
298 maxBl = l.baseline > maxBl ? l.baseline : maxBl;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
299 if(l.elasticY > rowsInfo[row].elastic)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
300 rowsInfo[row].elastic = l.elasticY;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
301 if(l.type != LayoutType.Filler)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
302 rowsInfo[row].filler = false;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
303 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
304 rowsInfo[row].bestSize = max;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
305 rowsInfo[row].baseline = maxBl;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
306 if(rowsInfo[row].elastic == Elasticity.Yes)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
307 info.elasticHeight += max;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
308 else if(rowsInfo[row].elastic == Elasticity.Semi)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
309 info.semiRows++;
39
04d2867d335c Fix possible incorrect extra space after the last control in a layout.
Jordan Miner <jminer7@gmail.com>
parents: 38
diff changeset
310 // this won't add spacing to the first non-filler
04d2867d335c Fix possible incorrect extra space after the last control in a layout.
Jordan Miner <jminer7@gmail.com>
parents: 38
diff changeset
311 sp = (!rowsInfo[row].filler && prevNonFiller) ? spacing : 0;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
312 info.bestSize.height = info.bestSize.height + sp + max;
39
04d2867d335c Fix possible incorrect extra space after the last control in a layout.
Jordan Miner <jminer7@gmail.com>
parents: 38
diff changeset
313 prevNonFiller = !rowsInfo[row].filler ? true : prevNonFiller ;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
314 max = maxBl = 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
315 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
316 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
317 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
318 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
319
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
320 //{{{ LayoutPanel class
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
321 class LayoutPanel : Panel {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
322 LayoutGroup root;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
323 LayoutGroup* current;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
324 void startLayout(int ncolumns) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
325 if(current is null) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
326 root = LayoutGroup(LayoutType.Table, null);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
327 root.numColumns = ncolumns;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
328 current = &root;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
329 return;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
330 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
331 current.children.length = current.children.length+1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
332 current.children[$-1] = LayoutGroup(LayoutType.Table, current);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
333 current.children[$-1].numColumns = ncolumns;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
334 current = &current.children[$-1];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
335 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
336 void endLayout() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
337 current = current.parent;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
338 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
339 override void add(Control c) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
340 if(current is null)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
341 throw new Exception("Cannot add a control until a layout is started");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
342 current.children.length = current.children.length+1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
343 current.children[$-1] = LayoutGroup(LayoutType.Control, current);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
344 current.children[$-1].control = c;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
345 super.add(c);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
346 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
347 void addFiller() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
348 current.children.length = current.children.length+1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
349 current.children[$-1] = LayoutGroup(LayoutType.Filler, current);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
350 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
351 void addSpacer() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
352 current.children.length = current.children.length+1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
353 current.children[$-1] = LayoutGroup(LayoutType.Spacer, current);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
354 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
355
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
356 override Size bestSize() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
357 return root.bestSize + Size(root.spacing*2, root.spacing*2);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
358 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
359 override bool elasticX() { return root.elasticX == Elasticity.Yes; }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
360 override bool elasticY() { return root.elasticY == Elasticity.Yes; }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
361 override void layout() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
362 //benchmarkAndWrite("layout", {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
363 root.setCache();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
364 int sp = root.spacing;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
365 root.layout(Rect(sp, sp, width-2*sp, height-2*sp));
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
366 root.clearCache();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
367 //});
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
368 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
369 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
370 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
371
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
372 //{{{ createLayout() etc.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
373 /**
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
374 * Note: if you do this:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
375 * -----
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
376 * char[] s = createLayout("V( b1 H(b2 b3) )");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
377 * -----
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
378 * Then the program will crash when compiled with the -release flag. (I am
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
379 * pretty sure it is a DMD bug, but I don't have time to make a testcase
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
380 * for a bug that does not bother me.) This will work correctly:
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
381 * -----
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
382 * enum char[] s = createLayout("V( b1 H(b2 b3) )");
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
383 * -----
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
384 * Because then the function is interpreted at compile time with CTFE.
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
385 */
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
386 string createLayout(string layout) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
387 string code = "delegate LayoutPanel() {\n";
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
388 code ~= "auto panel = new LayoutPanel;\n";
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
389 assert(getToken(layout) == "H" || getToken(layout) == "V" ||
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
390 getToken(layout) == "T", "layout type 'H', 'V', or 'T' expected");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
391 code ~= parseLayout(layout);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
392 code ~= "return panel;\n";
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
393 code ~= "}()";
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
394 return code;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
395 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
396
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
397 void skipWS(ref string str) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
398 int i = 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
399 while(" \t\n\r\v\f".contains(str[i]))
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
400 i++;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
401 str = str[i..$];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
402 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
403 // advances to the next token and returns it
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
404 string nextToken(ref string str) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
405 skipWS(str);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
406 str = str[getToken(str).length..$];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
407 return getToken(str);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
408 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
409 // returns H or V or ( or ) or myControl
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
410 // gets the current token
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
411 string getToken(string str) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
412 string idChars =
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
413 "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
414
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
415 // TODO: // for line comments?
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
416 skipWS(str);
11
df1c8e659b75 Change layout language to use * for filler and ~ for spacing. Ticket #24
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
417 if("()[]*~".contains(str[0])) {
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
418 return str[0..1];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
419 } else if(idChars.contains(str[0])) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
420 int i = 1;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
421 while(idChars.contains(str[i]))
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
422 i++;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
423 return str[0..i];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
424 } else {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
425 assert(0, "unknown character: " ~ str[0]);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
426 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
427 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
428
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
429 // {{{ copied from Phobos
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
430 string ctfeUintToString(uint u) {
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
431 char[uint.sizeof * 3] buffer = void;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
432 int ndigits;
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
433 string result;
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
434 string digits = "0123456789";
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
435
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
436 ndigits = 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
437 if (u < 10)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
438 // Avoid storage allocation for simple stuff
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
439 result = digits[u .. u + 1];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
440 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
441 {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
442 while (u)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
443 {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
444 uint c = (u % 10) + '0';
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
445 u /= 10;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
446 ndigits++;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
447 buffer[buffer.length - ndigits] = cast(char)c;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
448 }
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
449 result = buffer[$ - ndigits .. $].idup;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
450 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
451 return result;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
452 }
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
453 uint ctfeStringToUint(string s)
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
454 {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
455 int length = s.length;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
456
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
457 if (!length)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
458 return 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
459
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
460 uint v = 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
461
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
462 for (int i = 0; i < length; i++)
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
463 {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
464 char c = s[i];
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
465 if (c >= '0' && c <= '9')
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
466 {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
467 if (v < uint.max/10 || (v == uint.max/10 && c <= '5'))
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
468 v = v * 10 + (c - '0');
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
469 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
470 return 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
471 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
472 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
473 return 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
474 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
475 return v;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
476 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
477 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
478
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
479 uint parseBody(ref string layout, ref string bcode) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
480 uint count = 0;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
481 assert(nextToken(layout) == "(", "open parenthesis expected");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
482 while(nextToken(layout) != ")") {
11
df1c8e659b75 Change layout language to use * for filler and ~ for spacing. Ticket #24
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
483 if(getToken(layout) == "*")
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
484 bcode = bcode ~ "panel.addFiller();\n";
11
df1c8e659b75 Change layout language to use * for filler and ~ for spacing. Ticket #24
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
485 else if(getToken(layout) == "~")
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
486 bcode = bcode ~ "panel.addSpacer();\n";
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
487 else
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
488 bcode = bcode ~ parseLayout(layout);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
489 count++;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
490 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
491 bcode = bcode ~ "panel.endLayout();\n";
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
492 return count;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
493 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
494
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
495 string parseLayout(ref string layout) {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
496 string code = "";
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
497
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
498 if(getToken(layout) == "H") {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
499 string bodyCode;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
500 auto count = parseBody(layout, bodyCode);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
501 code ~= "panel.startLayout(" ~ ctfeUintToString(count) ~ ");\n";
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
502 code ~= bodyCode;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
503 } else if(getToken(layout) == "V") {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
504 code ~= "panel.startLayout(1);\n";
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
505 parseBody(layout, code);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
506 } else if(getToken(layout) == "T") {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
507 assert(nextToken(layout) == "[", "open bracket expected");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
508 nextToken(layout);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
509 assert("0123456789".contains(getToken(layout)[0]),
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
510 "number of table columns expected");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
511 uint columns = ctfeStringToUint(getToken(layout));
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
512 code ~= "panel.startLayout(" ~ getToken(layout) ~ ");\n";
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
513 assert(nextToken(layout) == "]", "close bracket expected");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
514 assert(parseBody(layout, code) % columns == 0,
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
515 "number of controls must be a multiple of number of columns");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
516 } else {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
517 code ~= "panel.add(" ~ getToken(layout) ~ ");\n";
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
518 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
519
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
520 return code;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
521 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
522
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
523 //{{{ parser tests
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
524 static assert(createLayout("H()") != "not evaluatable at compile time");
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
525 //pragma(msg, createLayout("V()"));
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
526
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
527 static assert(createLayout("V(c1 c2)") ==
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
528 `delegate LayoutPanel() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
529 auto panel = new LayoutPanel;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
530 panel.startLayout(1);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
531 panel.add(c1);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
532 panel.add(c2);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
533 panel.endLayout();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
534 return panel;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
535 }()`);
11
df1c8e659b75 Change layout language to use * for filler and ~ for spacing. Ticket #24
Jordan Miner <jminer7@gmail.com>
parents: 0
diff changeset
536 static assert(createLayout("V(c1 * c2 H(c3 ~) c4)") ==
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
537 `delegate LayoutPanel() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
538 auto panel = new LayoutPanel;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
539 panel.startLayout(1);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
540 panel.add(c1);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
541 panel.addFiller();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
542 panel.add(c2);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
543 panel.startLayout(2);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
544 panel.add(c3);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
545 panel.addSpacer();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
546 panel.endLayout();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
547 panel.add(c4);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
548 panel.endLayout();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
549 return panel;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
550 }()`);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
551 static assert(createLayout("V( c1 T[2](c2 c3) c4 )") ==
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
552 `delegate LayoutPanel() {
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
553 auto panel = new LayoutPanel;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
554 panel.startLayout(1);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
555 panel.add(c1);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
556 panel.startLayout(2);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
557 panel.add(c2);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
558 panel.add(c3);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
559 panel.endLayout();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
560 panel.add(c4);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
561 panel.endLayout();
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
562 return panel;
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
563 }()`);
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
564 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
565
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
566 //}}}
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
567
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
568 unittest {
41
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
569 class FakeButton : Control {
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
570 override Size bestSize() { return Size(80, 30); }
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
571 override bool elasticX() { return false; }
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
572 override bool elasticY() { return false; }
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
573 override int baseline() { return 20; }
41
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
574 }
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
575 class FakeTextBox : Control {
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
576 override Size bestSize() { return Size(100, 20); }
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
577 override bool elasticX() { return true; }
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
578 override bool elasticY() { return false; }
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
579 override int baseline() { return 18; }
41
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
580 }
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
581 class FakeListBox : Control {
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
582 override Size bestSize() { return Size(100, 300); }
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
583 override bool elasticX() { return false; }
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
584 override bool elasticY() { return true; }
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
585 override int baseline() { return 15; }
41
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
586 }
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
587 class FakeLabel : Control {
106
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
588 override Size bestSize() { return Size(70, 15); }
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
589 override bool elasticX() { return false; }
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
590 override bool elasticY() { return false; }
acdbb30fee7e Port to D2.
Jordan Miner <jminer7@gmail.com>
parents: 104
diff changeset
591 override int baseline() { return 13; }
41
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
592 }
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
593 auto button1 = new FakeButton();
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
594 auto tb1 = new FakeTextBox();
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
595 auto tb2 = new FakeTextBox();
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
596 auto lb1 = new FakeListBox();
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
597 auto label1 = new FakeLabel();
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
598 auto label2 = new FakeLabel();
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
599
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
600 Panel panel;
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
601 auto sp = 8; // TODO: get from same place as layout
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
602
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
603 // vertical layout
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
604 panel = mixin(createLayout(`V( label1 button1 )`));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
605 assert(panel.bestSize == Size(80+sp*2, 30+15+sp*3));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
606 assert(panel.elasticX == false);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
607 assert(panel.elasticY == false);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
608 panel.size = [1000, 1000];
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
609 assert(label1.location == Point(sp, sp));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
610 assert(label1.size == label1.bestSize);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
611 assert(button1.location == Point(sp, 15+sp*2));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
612 assert(button1.size == button1.bestSize);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
613
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
614 // horizontal layout
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
615 panel = mixin(createLayout(`H( label1 button1 * )`));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
616 assert(panel.bestSize == Size(80+70+sp*3, 30+sp*2));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
617 assert(panel.elasticX == false);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
618 assert(panel.elasticY == false);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
619 panel.size = [1000, 1000];
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
620 assert(label1.location == Point(sp, 20-13+sp));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
621 assert(label1.size == label1.bestSize);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
622 assert(button1.location == Point(70+sp*2, sp));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
623 assert(button1.size == button1.bestSize);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
624
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
625 // filler is last priority
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
626 panel = mixin(createLayout(`H( * label1 tb1 )`));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
627 assert(panel.bestSize == Size(70+100+sp*3, 20+sp*2));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
628 assert(panel.elasticX == true);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
629 assert(panel.elasticY == false);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
630 panel.size = [500, 1000];
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
631 assert(label1.location == Point(sp, 18-13+sp));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
632 assert(label1.size == label1.bestSize);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
633 assert(tb1.location == Point(70+sp*2, sp));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
634 assert(tb1.size == Size(panel.width-70-sp*3, tb1.bestSize.height));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
635
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
636 // extra space is distributed evenly between elastic controls
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
637 panel = mixin(createLayout(`V( H( tb1 label1 tb2 ) H( * label2 button1) )`));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
638 assert(panel.bestSize == Size(270+sp*4, 20+30+sp*3));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
639 assert(panel.elasticX == true);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
640 assert(panel.elasticY == false);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
641 panel.size = [500, 1000];
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
642 assert(tb1.location == Point(sp, sp));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
643 assert(tb1.size == Size((panel.width-70-sp*4) / 2, 20));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
644 assert(label1.location == Point(tb1.width+sp*2, 18-13+sp));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
645 assert(label1.size == label1.bestSize);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
646 assert(tb2.location == Point(tb1.width+70+sp*3, sp));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
647 assert(tb2.size == Size(tb1.width, 20));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
648 assert(label2.location == Point(panel.width-80-70-sp*2, 20+(20-13)+sp*2));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
649 assert(label2.size == label2.bestSize);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
650 assert(button1.location == Point(panel.width-80-sp, 20+sp*2));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
651 assert(button1.size == button1.bestSize);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
652
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
653 // extra space is distributed evenly between filler
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
654 panel = mixin(createLayout(`V( * label1 * label2 * )`));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
655 assert(panel.bestSize == Size(70+sp*2, 15+15+sp*3));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
656 assert(panel.elasticX == false);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
657 assert(panel.elasticY == false);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
658 panel.size = [500, 120];
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
659 assert(label1.location == Point(sp, 30));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
660 assert(label1.size == label1.bestSize);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
661 assert(label2.location == Point(sp, 75));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
662 assert(label2.size == label2.bestSize);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
663
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
664 // spacing
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
665 panel = mixin(createLayout(`H( ~ label1 ~ button1 ~ )`));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
666 assert(panel.bestSize == Size(70+80+sp*6, 30+sp*2));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
667 assert(panel.elasticX == false);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
668 assert(panel.elasticY == false);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
669 panel.size = [500, 500];
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
670 assert(label1.location == Point(sp*2, 20-13+sp));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
671 assert(button1.location == Point(70+sp*4, sp));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
672
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
673 // semielastic
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
674 panel = mixin(createLayout(`T[2]( H(*label1) tb1 H(*button1) tb2 )`));
42
2e466b478c0b Fix a bug in a test that somehow slipped by in last commits.
Jordan Miner <jminer7@gmail.com>
parents: 41
diff changeset
675 assert(panel.bestSize == Size(80+100+sp*3, 20+30+sp*3));
41
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
676 assert(panel.elasticX == true);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
677 assert(panel.elasticY == false);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
678 panel.size = [500, 500];
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
679 assert(label1.location == Point(10+sp, 18-13+sp));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
680 assert(label1.size == label1.bestSize);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
681 assert(button1.location == Point(sp, 20+sp*2));
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
682 assert(button1.size == button1.bestSize);
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
683
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
684 //assert(.location == Point());
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
685 //assert(.size == Size());
c25e8b83c5b8 Add a few layout tests (with decent coverage).
Jordan Miner <jminer7@gmail.com>
parents: 40
diff changeset
686 //Stdout("1:")(panel.bestSize).newline;
0
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
687 }
aa4efef0f0b1 Initial commit of code.
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
688