Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
TreeViewWidget.cs
浏览该文件的文档.
1using System.Xml.Linq;
2using Engine;
3using Engine.Media;
5
6namespace Game {
8 #region 字段
9
10 List<TreeViewNode> m_nodes = new();
11 public bool m_widgetsDirty;
12 public Vector2 lastActualSize = new(-1f);
13 public int m_visibleItemsCount; //显示出来的项的数量
14 public Action<TreeViewNode> m_onNodeClicked;
16
17 #endregion
18
19 #region 属性
20
21 public List<TreeViewNode> Nodes {
22 get => m_nodes;
23 set => m_nodes = value;
24 }
25
26 public int ItemSize { get; set; } = 70;
27
28 public Action<TreeViewNode> OnNodeClicked {
29 get => m_onNodeClicked;
30 set => m_onNodeClicked = value;
31 }
32
34
35 #endregion
36
37 #region 方法
38
39 public override void MeasureOverride(Vector2 parentAvailableSize) {
40 base.MeasureOverride(parentAvailableSize);
41 foreach (Widget child in Children) {
42 if (child.IsVisible) { //限制子条目大小
43 child.Measure(new Vector2(MathUtils.Max(parentAvailableSize.X - child.MarginHorizontalSum, 0f), ItemSize));
44 }
45 }
46 }
47
48 public override void Draw(DrawContext dc) {
49 base.Draw(dc);
50 if (m_widgetsDirty) {
51 m_widgetsDirty = false;
53 }
54 }
55
56 public virtual void UpdateNodes() {
57 Children.Clear();
58 foreach (TreeViewNode viewNode in Nodes) {
59 AddNodeToWidget(viewNode, 0);
60 }
61 }
62
63 public void AddNodeToWidget(TreeViewNode node, float xOffset) {
64 TreeViewNodeContentItem obj = new(node, xOffset);
65 obj.OnClicked = clickedNode => {
66 if (clickedNode.Nodes.Count > 0) {
67 m_widgetsDirty = true; //点击到的条目有子项(即子项展开/收起了),更新列表
68 }
69
70 //切换选中的节点
71 if (m_selectedNode != null) {
72 m_selectedNode.Selected = false;
73 }
74 if (clickedNode.Selectable) {
75 clickedNode.Selected = true;
76 m_selectedNode = clickedNode;
77 }
78 OnNodeClicked?.Invoke(clickedNode);
79 };
80 Children.Add(obj);
81 if (node.Nodes.Count > 0
82 && node.Expanded) {
83 foreach (TreeViewNode child in node.Nodes) {
84 AddNodeToWidget(child, xOffset + 20);
85 }
86 }
87 }
88
89 public override void ArrangeOverride() {
91 m_widgetsDirty = true;
92 }
94 int num = 0;
95 foreach (Widget child in Children) {
96 Vector2 vector2 = new(0f, num * ItemSize - ScrollPosition);
97 ArrangeChildWidgetInCell(vector2, vector2 + new Vector2(ActualSize.X, ItemSize), child);
98 num++;
99 }
101 }
102
104
105 public void AddRoot(TreeViewNode node) {
106 m_nodes.Add(node);
107 node.ParentTree = this;
108 m_widgetsDirty = true;
109 }
110
111 public void RemoveRoot(TreeViewNode node) {
112 m_nodes.Remove(node);
113 node.ParentTree = null;
114 m_widgetsDirty = true;
115 }
116
117 public void RemoveAtTag(object tag) {
118 TreeViewNode node = m_nodes.First(x => x.Tag == tag);
119 node.ParentTree = null;
120 m_nodes.Remove(node);
121 m_widgetsDirty = true;
122 }
123
124 public void Clear(bool dispose = true) {
125 Nodes.ForEach(x => {
126 if (dispose) {
127 x.Dispose();
128 }
129 else {
130 x.ParentTree = null;
131 }
132 }
133 );
134 Nodes.Clear();
135 m_widgetsDirty = true;
136 }
137
138 #endregion
139
140 public TreeViewWidget() => m_widgetsDirty = true;
141 }
142
143 public class TreeViewNode : IDisposable {
144 #region 字段
145
146 List<TreeViewNode> m_nodes;
151
152 #endregion
153
154 #region 属性
155
156 public List<TreeViewNode> Nodes {
157 get => m_nodes;
158 set => m_nodes = value;
159 }
160
161 public bool Expanded {
162 get => m_expanded;
163 set {
164 if (m_expanded == value) {
165 return;
166 }
167 if (value && Nodes.Count == 0) {
168 return;
169 }
170 m_expanded = value;
171 }
172 }
173
174 public string Text { get; set; }
175
176 public Color TextColor { get; set; }
177
178 public string SubText { get; set; }
179
180 public Color SubTextColor { get; set; }
181
182 public Color SelectedColor { get; set; }
183
184 public Texture2D Icon { get; set; }
185
186 public Vector2 IconMargin { get; set; }
187
189 get {
190 if (m_subtexture == null
191 && Icon != null) {
193 }
194 return m_subtexture;
195 }
196 }
197
198 public TreeViewNode ParentNode { get; set; }
199
200 public TreeViewWidget ParentTree { get; set; }
201
202 public object Tag { get; set; }
203
204 public bool Selected {
205 get => m_selectable && m_selected;
206 set => m_selected = m_selectable && value;
207 }
208
210
211 public Action OnClicked { get; set; }
212
213 public bool Selectable {
214 get => m_selectable;
215 set => m_selectable = value;
216 }
217
218 #endregion
219
220 #region 构造函数
221
222 public void Init(string text,
223 Color textColor,
224 string subText,
225 Color subTextColor,
226 Texture2D icon,
227 Color selectedColor,
228 List<TreeViewNode> children) {
229 Nodes = children;
230 Text = text;
231 TextColor = textColor;
232 SubText = subText;
233 SubTextColor = subTextColor;
234 SelectedColor = selectedColor;
235 Icon = icon;
236 m_selectable = true;
237 }
238
239 public TreeViewNode() {
240 Init(
241 string.Empty,
242 Color.White,
243 string.Empty,
244 Color.White,
245 null,
246 new Color(10, 70, 0, 90),
247 new List<TreeViewNode>()
248 );
249 }
250
251 public TreeViewNode(string text, string subText, Texture2D icon = null) {
252 Init(
253 text,
254 Color.White,
255 subText,
256 Color.White,
257 icon,
258 new Color(10, 70, 0, 90),
259 new List<TreeViewNode>()
260 );
261 }
262
263 public TreeViewNode(string text, Color textColor, string subText, Color subTextColor, Texture2D icon = null) {
264 Init(
265 text,
266 textColor,
267 subText,
268 subTextColor,
269 icon,
270 new Color(10, 70, 0, 90),
271 new List<TreeViewNode>()
272 );
273 }
274
275 #endregion
276
277 #region 其他函数
278
279 public void Remove(bool dispose = true) {
280 if (ParentNode != null) {
281 ParentNode.Nodes.Remove(this);
282 }
283 else {
284 ParentTree.Nodes.Remove(this);
285 }
286 if (dispose) {
287 Dispose();
288 }
289 }
290
291 public void EnsureVisible() {
292 TreeViewNode parent = ParentNode;
293 while (parent != null) {
294 parent.Expanded = true;
295 parent = parent.ParentNode;
296 }
297 }
298
299 public void AddChild(TreeViewNode child) {
300 m_nodes.Add(child);
301 child.ParentTree = ParentTree;
302 child.ParentNode = this;
303 }
304
305 public void RemoveChild(TreeViewNode child, bool dispose = true) {
306 if (dispose) {
307 child.Dispose();
308 }
309 else {
310 child.ParentTree = null;
311 child.ParentNode = null;
312 }
313 m_nodes.Remove(child);
314 }
315
316 public void AddChildren(List<TreeViewNode> children) {
317 children.ForEach(AddChild);
318 }
319
320 public void ClearChildren(bool dispose = true) {
321 m_nodes.ForEach(x => {
322 if (dispose) {
323 x.Dispose();
324 }
325 else {
326 x.ParentTree = null;
327 x.ParentNode = null;
328 }
329 }
330 );
331 m_nodes.Clear();
332 }
333
334 #endregion
335
336 public void Dispose() {
338 ParentTree = null;
339 ParentNode = null;
340 //Icon?.Dispose();
341 if (Icon != null) {
342 if (Icon.Tag is Image image) {
343 image.Dispose();
344 }
345 Icon.Dispose();
346 }
347 GC.SuppressFinalize(this);
348 }
349 }
350
353
354 public Action<TreeViewNode> OnClicked;
355
357
359
361
363
365
367
368 public TreeViewNodeContentItem(TreeViewNode node, float xOffset) {
369 m_node = node;
370 OnClicked = _ => { };
371 node.LinkedWidget = this;
372 XElement node2 = ContentManager.Get<XElement>("Widgets/TreeViewNodeContentItem");
373 LoadContents(this, node2);
374 Children.Find<LabelWidget>("TreeViewNodeContentItem.Text").Text = node.Text;
375 Children.Find<LabelWidget>("TreeViewNodeContentItem.Text").Color = node.TextColor;
376 Children.Find<LabelWidget>("TreeViewNodeContentItem.Details").Text = node.SubText;
377 Children.Find<LabelWidget>("TreeViewNodeContentItem.Details").Color = node.SubTextColor;
378 m_selectedHighLight = Children.Find<RectangleWidget>("TreeViewNodeContentItem.SelectedHighLight");
379 m_selectedHighLight.FillColor = m_node.SelectedColor;
380 m_icon = Children.Find<RectangleWidget>("TreeViewNodeContentItem.Icon");
381 m_expandIcon = Children.Find<RectangleWidget>("TreeViewNodeContentItem.ExpandIcon");
382 m_expandIcon.FillColor = node.Nodes.Count > 0 ? new Color(128, 128, 128, 128) : Color.Transparent;
383 m_expandIconTexture = ContentManager.Get<Subtexture>("Textures/Atlas/ArrowDown");
384 m_unexpandIconTexture = ContentManager.Get<Subtexture>("Textures/Atlas/ArrowRight");
385 Margin = new Vector2(xOffset, 0);
388 }
389
390 public override void Update() {
391 if (m_clickableWidget.IsClicked) {
392 m_node.Expanded = !m_node.Expanded;
394 m_node.OnClicked?.Invoke();
395 }
396 m_icon.IsVisible = m_node.Icon != null;
397 if (m_node.Icon != null) {
398 m_icon.Subtexture = m_node.Subtexture;
399 m_icon.Margin = m_node.IconMargin;
400 }
401 m_selectedHighLight.IsVisible = m_node.Selected;
402 m_expandIcon.Subtexture = m_node.Expanded ? m_expandIconTexture : m_unexpandIconTexture;
403 }
404 }
405}
Engine.Color Color
static int Max(int x1, int x2)
readonly WidgetsList Children
static void ArrangeChildWidgetInCell(Vector2 c1, Vector2 c2, Widget widget)
static object Get(Type type, string name)
TreeViewNodeContentItem(TreeViewNode node, float xOffset)
void ClearChildren(bool dispose=true)
TreeViewNode(string text, Color textColor, string subText, Color subTextColor, Texture2D icon=null)
void Init(string text, Color textColor, string subText, Color subTextColor, Texture2D icon, Color selectedColor, List< TreeViewNode > children)
List< TreeViewNode > m_nodes
void Remove(bool dispose=true)
TreeViewNodeContentItem LinkedWidget
TreeViewNode(string text, string subText, Texture2D icon=null)
List< TreeViewNode > Nodes
void AddChildren(List< TreeViewNode > children)
void RemoveChild(TreeViewNode child, bool dispose=true)
void AddChild(TreeViewNode child)
void RemoveRoot(TreeViewNode node)
override float CalculateScrollAreaLength()
void RemoveAtTag(object tag)
void AddNodeToWidget(TreeViewNode node, float xOffset)
Action< TreeViewNode > OnNodeClicked
void AddRoot(TreeViewNode node)
override void ArrangeOverride()
List< TreeViewNode > m_nodes
Action< TreeViewNode > m_onNodeClicked
override void Draw(DrawContext dc)
void Clear(bool dispose=true)
List< TreeViewNode > Nodes
override void MeasureOverride(Vector2 parentAvailableSize)
virtual bool IsVisible
virtual float MarginHorizontalSum
virtual Vector2 Margin
Vector2 ActualSize
virtual void LoadContents(object eventsTarget, XElement node)
virtual void Measure(Vector2 parentAvailableSize)
static Color Transparent
定义 Color.cs:5
static Color White
static readonly Vector2 Zero
static readonly Vector2 One