Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
FlexibleVerticalCells.cs
1using System;
2using System.Collections.Generic;
3using System.Threading.Tasks;
4using Waher.Script;
5
7{
12 {
13 private readonly List<Padding> currentColumn = new List<Padding>();
14 private readonly List<Tuple<float, float, Padding[]>> columns = new List<Tuple<float, float, Padding[]>>();
15 private readonly Variables session;
16 private readonly float limitHeight;
17 private readonly HorizontalDirection horizontalDirection;
18 private readonly VerticalDirection verticalDirection;
19 private readonly VerticalAlignment verticalAlignment;
20 private float maxWidth = 0;
21 private float maxHeight = 0;
22 private float x = 0;
23 private float y = 0;
24
33 public FlexibleVerticalCells(Variables Session, float WidthLimit,
36 {
37 this.session = Session;
38 this.limitHeight = WidthLimit;
39 this.horizontalDirection = HorizontalDirection;
40 this.verticalDirection = VerticalDirection;
41 this.verticalAlignment = VerticalAlignment;
42 }
43
48 public Task Add(ILayoutElement Element)
49 {
50 float Width = Element.Width ?? 0;
51 float Height = Element.Height ?? 0;
52
53 if (this.y + Height > this.limitHeight)
54 this.Flush();
55
56 this.currentColumn.Add(new Padding(Element, 0, 0));
57 this.y += Height;
58
59 if (Width > this.maxWidth)
60 this.maxWidth = Width;
61
62 return Task.CompletedTask;
63 }
64
68 public void Flush()
69 {
70 if (this.currentColumn.Count > 0)
71 {
72 this.columns.Add(new Tuple<float, float, Padding[]>(this.maxWidth, this.y, this.currentColumn.ToArray()));
73 this.currentColumn.Clear();
74 this.x += this.maxWidth;
75
76 if (this.y > this.maxHeight)
77 this.maxHeight = y;
78 }
79
80 this.maxWidth = 0;
81 this.y = 0;
82 }
83
88 public void MeasurePositions(DrawingState State)
89 {
90 ILayoutElement Element;
91
92 foreach (Tuple<float, float, Padding[]> Row in this.columns)
93 {
94 foreach (Padding P in Row.Item3)
95 {
96 Element = P.Element;
97
98 Element.MeasurePositions(State);
99 P.OffsetX -= Element.Left ?? 0;
100 P.OffsetY -= Element.Top ?? 0;
101 }
102 }
103 }
104
108 public float TotWidth => this.x;
109
113 public float TotHeight => this.maxHeight;
114
119 public void Distribute(bool SetPosition)
120 {
121 foreach (Tuple<float, float, Padding[]> Column in this.columns)
122 {
123 foreach (Padding P in Column.Item3)
124 P.Distribute(Column.Item1, null, this.session, SetPosition);
125 }
126 }
127
132 public Padding[] Align()
133 {
134 List<Padding> Result = new List<Padding>();
135 float X = this.horizontalDirection == HorizontalDirection.LeftRight ? 0 : this.x;
136 float Y;
137 float Diff;
138
139 foreach (Tuple<float, float, Padding[]> Column in this.columns)
140 {
141 Diff = this.maxHeight - Column.Item2;
142 switch (this.verticalAlignment)
143 {
144 case VerticalAlignment.Top:
145 default:
146 if (this.verticalDirection == VerticalDirection.TopDown)
147 Y = 0;
148 else
149 Y = this.maxHeight - Diff;
150 break;
151
152 case VerticalAlignment.Center:
153 if (this.verticalDirection == VerticalDirection.TopDown)
154 Y = Diff / 2;
155 else
156 Y = this.maxHeight - Diff / 2;
157 break;
158
159 case VerticalAlignment.Bottom:
160 case VerticalAlignment.BaseLine:
161 if (this.verticalDirection == VerticalDirection.TopDown)
162 Y = Diff;
163 else
164 Y = this.maxHeight;
165 break;
166 }
167
168 if (this.horizontalDirection == HorizontalDirection.RightLeft)
169 X -= Column.Item1;
170
171 foreach (Padding P in Column.Item3)
172 {
173 float Height = P.Element.Height ?? 0;
174
175 if (this.verticalDirection == VerticalDirection.BottomUp)
176 Y -= Height;
177
178 P.OffsetX += X;
179 P.OffsetY += Y;
180 Result.Add(P);
181
182 if (this.verticalDirection == VerticalDirection.TopDown)
183 Y += Height;
184 }
185
186 if (this.horizontalDirection == HorizontalDirection.LeftRight)
187 X += Column.Item1;
188 }
189
190 return Result.ToArray();
191 }
192 }
193}
Lays out elements flexibly, first vertically, then horizontally.
Padding[] Align()
Aligns cells and returns an array of padded cells.
FlexibleVerticalCells(Variables Session, float WidthLimit, HorizontalDirection HorizontalDirection, VerticalDirection VerticalDirection, VerticalAlignment VerticalAlignment)
Lays out elements flexibly, first vertically, then horizontally.
void Distribute(bool SetPosition)
Distributes cells in layout.
void MeasurePositions(DrawingState State)
Measures layout entities and defines unassigned properties, related to positions.
void Flush()
Flushes any waiting elements int he layout pipeline.
Task Add(ILayoutElement Element)
Adds a cell to the layout.
Provides padding for a layout element in a group contruct.
Definition: Padding.cs:11
Task Distribute(float? MaxWidth, float? MaxHeight, Variables Session, bool SetPosition)
Aligns a measured cell
Definition: Padding.cs:73
ILayoutElement Element
Embedded element
Definition: Padding.cs:36
Collection of variables.
Definition: Variables.cs:25
Basic interface for cell layout objects.
Definition: ICellLayout.cs:9
Base interface for all layout elements.
void MeasurePositions(DrawingState State)
Measures layout entities and defines unassigned properties, related to positions.
HorizontalDirection
Horizontal ordering
Definition: Flexible.cs:27
VerticalDirection
Vertical ordering
Definition: Flexible.cs:43
VerticalAlignment
Vertical alignment
Definition: Cell.cs:35