|
1 using System; |
|
2 using System.Collections.Generic; |
|
3 using System.Linq; |
|
4 using System.Text; |
|
5 using System.Threading.Tasks; |
|
6 using System.Windows; |
|
7 using System.Windows.Controls; |
|
8 |
|
9 namespace UI |
|
10 { |
|
11 public interface Container |
|
12 { |
|
13 Layout Layout { get; set; } |
|
14 |
|
15 void Add(UIElement control, bool fill); |
|
16 } |
|
17 |
|
18 public class Layout |
|
19 { |
|
20 public bool? Fill { get; set; } |
|
21 public bool Hexpand { get; set; } |
|
22 public bool Vexpand { get; set; } |
|
23 public bool NewLine { get; set; } |
|
24 public int GridWidth { get; set; } |
|
25 public String Label { get; set; } |
|
26 |
|
27 public Layout() |
|
28 { |
|
29 Reset(); |
|
30 } |
|
31 |
|
32 public bool IsFill(bool fill) |
|
33 { |
|
34 if (Fill != null) |
|
35 { |
|
36 |
|
37 return (bool)Fill; |
|
38 } |
|
39 return fill; |
|
40 } |
|
41 |
|
42 public void Reset() |
|
43 { |
|
44 Fill = null; |
|
45 Hexpand = false; |
|
46 Vexpand = false; |
|
47 NewLine = false; |
|
48 GridWidth = 1; |
|
49 Label = null; |
|
50 } |
|
51 } |
|
52 |
|
53 public enum BoxOrientation |
|
54 { |
|
55 VERTICAL, |
|
56 HORIZONTAL |
|
57 } |
|
58 |
|
59 public class BoxContainer : Grid, Container |
|
60 { |
|
61 public Layout Layout { get; set; } |
|
62 |
|
63 private BoxOrientation Orientation; |
|
64 private int Spacing; |
|
65 |
|
66 private int x = 0; |
|
67 private int y = 0; |
|
68 |
|
69 private bool filled = false; |
|
70 |
|
71 public BoxContainer(BoxOrientation orientation, int margin, int spacing) : base() |
|
72 { |
|
73 Layout = new Layout(); |
|
74 Margin = new Thickness(margin); |
|
75 Spacing = spacing; |
|
76 |
|
77 Orientation = orientation; |
|
78 if(Orientation == BoxOrientation.HORIZONTAL) |
|
79 { |
|
80 RowDefinition row = new RowDefinition(); |
|
81 row.Height = new GridLength(1, GridUnitType.Star); |
|
82 RowDefinitions.Add(row); |
|
83 } |
|
84 else |
|
85 { |
|
86 ColumnDefinition col = new ColumnDefinition(); |
|
87 col.Width = new GridLength(1, GridUnitType.Star); |
|
88 ColumnDefinitions.Add(col); |
|
89 } |
|
90 } |
|
91 |
|
92 public BoxContainer(Container parent, BoxOrientation orientation, int margin, int spacing) : this(orientation, margin, spacing) |
|
93 { |
|
94 parent.Add(this, true); |
|
95 } |
|
96 |
|
97 public void Add(UIElement control, bool fill) |
|
98 { |
|
99 fill = Layout.IsFill(fill); |
|
100 |
|
101 if(Orientation == BoxOrientation.HORIZONTAL) |
|
102 { |
|
103 if(Spacing > 0) |
|
104 { |
|
105 ColumnDefinition spaceCol = new ColumnDefinition(); |
|
106 spaceCol.Width = new GridLength(Spacing, GridUnitType.Pixel); |
|
107 ColumnDefinitions.Add(spaceCol); |
|
108 x++; |
|
109 } |
|
110 |
|
111 ColumnDefinition col = new ColumnDefinition(); |
|
112 if(filled && fill) |
|
113 { |
|
114 fill = false; |
|
115 Console.WriteLine("BoxContainer can only contain one filled control"); |
|
116 } |
|
117 if(fill) |
|
118 { |
|
119 col.Width = new GridLength(1, GridUnitType.Star); |
|
120 filled = true; |
|
121 } |
|
122 else |
|
123 { |
|
124 col.Width = GridLength.Auto; |
|
125 } |
|
126 ColumnDefinitions.Add(col); |
|
127 } |
|
128 else |
|
129 { |
|
130 if (Spacing > 0) |
|
131 { |
|
132 RowDefinition spaceRow = new RowDefinition(); |
|
133 spaceRow.Height = new GridLength(Spacing, GridUnitType.Pixel); |
|
134 RowDefinitions.Add(spaceRow); |
|
135 y++; |
|
136 } |
|
137 |
|
138 RowDefinition row = new RowDefinition(); |
|
139 if (filled && fill) |
|
140 { |
|
141 fill = false; |
|
142 Console.WriteLine("BoxContainer can only contain one filled control"); |
|
143 } |
|
144 if(fill) |
|
145 { |
|
146 row.Height = new GridLength(1, GridUnitType.Star); |
|
147 filled = true; |
|
148 } |
|
149 else |
|
150 { |
|
151 row.Height = GridLength.Auto; |
|
152 } |
|
153 RowDefinitions.Add(row); |
|
154 } |
|
155 |
|
156 Grid.SetColumn(control, x); |
|
157 Grid.SetRow(control, y); |
|
158 Children.Add(control); |
|
159 |
|
160 if(Orientation == BoxOrientation.HORIZONTAL) |
|
161 { |
|
162 x++; |
|
163 } |
|
164 else |
|
165 { |
|
166 y++; |
|
167 } |
|
168 |
|
169 Layout.Reset(); |
|
170 } |
|
171 } |
|
172 |
|
173 public class GridContainer : Grid, Container |
|
174 { |
|
175 public Layout Layout { get; set; } |
|
176 |
|
177 private int X = 0; |
|
178 private int Y = 0; |
|
179 private int CurrentWidth = 0; |
|
180 private int CurrentHeight = 0; |
|
181 |
|
182 private int ColSpacing; |
|
183 private int RowSpacing; |
|
184 |
|
185 public GridContainer(Container parent, int margin, int colspacing, int rowspacing) : base() |
|
186 { |
|
187 Layout = new Layout(); |
|
188 |
|
189 Margin = new Thickness(margin); |
|
190 ColSpacing = colspacing; |
|
191 RowSpacing = rowspacing; |
|
192 |
|
193 parent.Add(this, true); |
|
194 } |
|
195 |
|
196 public void Add(UIElement control, bool fill) |
|
197 { |
|
198 if(Layout.NewLine) |
|
199 { |
|
200 X = 0; |
|
201 Y++; |
|
202 } |
|
203 |
|
204 ColumnDefinition col; |
|
205 RowDefinition row; |
|
206 bool getcol = false; |
|
207 if(X >= CurrentWidth) |
|
208 { |
|
209 if (ColSpacing > 0 && X != 0) |
|
210 { |
|
211 ColumnDefinition spaceCol = new ColumnDefinition(); |
|
212 spaceCol.Width = new GridLength(ColSpacing, GridUnitType.Pixel); |
|
213 ColumnDefinitions.Add(spaceCol); |
|
214 X++; |
|
215 } |
|
216 |
|
217 col = new ColumnDefinition(); |
|
218 col.Width = GridLength.Auto; |
|
219 ColumnDefinitions.Add(col); |
|
220 |
|
221 CurrentWidth = X + 1; |
|
222 } |
|
223 else |
|
224 { |
|
225 if (ColSpacing > 0 && X % 2 > 0) |
|
226 { |
|
227 X++; |
|
228 } |
|
229 col = ColumnDefinitions.ElementAt(X); |
|
230 } |
|
231 |
|
232 if(getcol) |
|
233 { |
|
234 col = ColumnDefinitions.ElementAt(X); |
|
235 } |
|
236 |
|
237 if (Y >= CurrentHeight) |
|
238 { |
|
239 if (RowSpacing > 0 && Y != 0) |
|
240 { |
|
241 RowDefinition spaceRow = new RowDefinition(); |
|
242 spaceRow.Height = new GridLength(RowSpacing, GridUnitType.Pixel); |
|
243 RowDefinitions.Add(spaceRow); |
|
244 Y++; |
|
245 } |
|
246 |
|
247 row = new RowDefinition(); |
|
248 row.Height = GridLength.Auto; |
|
249 RowDefinitions.Add(row); |
|
250 CurrentHeight = Y + 1; |
|
251 } |
|
252 else |
|
253 { |
|
254 row = RowDefinitions.ElementAt(Y); |
|
255 } |
|
256 |
|
257 if(Layout.Hexpand) |
|
258 { |
|
259 col.Width = new GridLength(1, GridUnitType.Star); |
|
260 } |
|
261 if(Layout.Vexpand) |
|
262 { |
|
263 row.Height = new GridLength(1, GridUnitType.Star); |
|
264 } |
|
265 |
|
266 int gridwidth = Layout.GridWidth; |
|
267 if(gridwidth > 1) |
|
268 { |
|
269 gridwidth++; |
|
270 } |
|
271 |
|
272 Grid.SetColumn(control, X); |
|
273 Grid.SetRow(control, Y); |
|
274 Grid.SetColumnSpan(control, gridwidth); |
|
275 Children.Add(control); |
|
276 |
|
277 Layout.Reset(); |
|
278 X += gridwidth; |
|
279 } |
|
280 } |
|
281 |
|
282 public class ScrollViewerContainer : ScrollViewer, Container |
|
283 { |
|
284 public Layout Layout { get; set; } |
|
285 |
|
286 public ScrollViewerContainer(Container parent) : base() |
|
287 { |
|
288 Layout = new Layout(); |
|
289 |
|
290 HorizontalScrollBarVisibility = ScrollBarVisibility.Auto; |
|
291 VerticalScrollBarVisibility = ScrollBarVisibility.Auto; |
|
292 |
|
293 parent.Add(this, true); |
|
294 } |
|
295 |
|
296 public void Add(UIElement control, bool fill) |
|
297 { |
|
298 Content = control; |
|
299 } |
|
300 } |
|
301 |
|
302 public class TabViewContainer : TabControl, Container |
|
303 { |
|
304 public Layout Layout { get; set; } |
|
305 |
|
306 public TabViewContainer(Container parent) : base() |
|
307 { |
|
308 Layout = new Layout(); |
|
309 parent.Add(this, true); |
|
310 } |
|
311 |
|
312 public void Add(UIElement control, bool fill) |
|
313 { |
|
314 TabItem tab = new TabItem(); |
|
315 tab.Header = Layout.Label != null ? Layout.Label : "New Tab"; |
|
316 Items.Add(tab); |
|
317 tab.Content = control; |
|
318 Layout.Reset(); |
|
319 } |
|
320 } |
|
321 } |