Files
barotrauma-localmods/Quick Interactions/CSharp/Client/CrabUI/Components/CUIComponent/CUIComponent.Tree.cs

201 lines
5.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.IO;
using Barotrauma;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Graphics;
using System.Xml;
using System.Xml.Linq;
namespace QICrabUI
{
public partial class CUIComponent
{
#region Tree --------------------------------------------------------
public List<CUIComponent> Children { get; set; } = new();
private CUIComponent? parent; public CUIComponent? Parent
{
get => parent;
set => SetParent(value);
}
internal void SetParent(CUIComponent? value, [CallerMemberName] string memberName = "")
{
if (parent != null)
{
TreeChanged = true;
OnPropChanged();
parent.Forget(this);
parent.Children.Remove(this);
parent.OnChildRemoved?.Invoke(this);
}
parent = value;
CUIDebug.Capture(null, this, "SetParent", memberName, "parent", $"{parent}");
if (parent != null)
{
if (parent is CUIMainComponent main) MainComponent = main;
if (parent?.MainComponent != null) MainComponent = parent.MainComponent;
//parent.Children.Add(this);
TreeChanged = true;
if (AKA != null) parent.Remember(this, AKA);
parent.PassPropsToChild(this);
OnPropChanged();
parent.OnChildAdded?.Invoke(this);
}
}
private bool treeChanged = true; internal bool TreeChanged
{
get => treeChanged;
set
{
treeChanged = value;
if (value)
{
OnTreeChanged?.Invoke();
if (Parent != null) Parent.TreeChanged = true;
}
}
}
/// <summary>
/// Allows you to add array of children
/// </summary>
public IEnumerable<CUIComponent> AddChildren
{
set
{
foreach (CUIComponent c in value) { Append(c); }
}
}
public event Action<CUIComponent> OnChildAdded;
public event Action<CUIComponent> OnChildRemoved;
/// <summary>
/// Adds children to the end of the list
/// </summary>
/// <param name="child"></param>
/// <param name="name"> AKA </param>
/// <returns> child </returns>
public virtual CUIComponent Append(CUIComponent child, string name = null, [CallerMemberName] string memberName = "")
{
if (child == null) return child;
child.Parent = this;
Children.Add(child);
if (name != null) Remember(child, name);
return child;
}
/// <summary>
/// Adds children to the begining of the list
/// </summary>
/// <param name="child"></param>
/// <param name="name"> AKA </param>
/// <returns> child </returns>
public virtual CUIComponent Prepend(CUIComponent child, string name = null, [CallerMemberName] string memberName = "")
{
if (child == null) return child;
child.Parent = this;
Children.Insert(0, child);
if (name != null) Remember(child, name);
return child;
}
public virtual CUIComponent Insert(CUIComponent child, int index, string name = null, [CallerMemberName] string memberName = "")
{
if (child == null) return child;
child.Parent = this;
index = Math.Clamp(index, 0, Children.Count);
Children.Insert(index, child);
if (name != null) Remember(child, name);
return child;
}
//TODO DRY
public void RemoveSelf() => Parent?.RemoveChild(this);
public CUIComponent RemoveChild(CUIComponent child, [CallerMemberName] string memberName = "")
{
if (child == null || !Children.Contains(child)) return child;
if (this != null) // kek
{
child.TreeChanged = true;
child.OnPropChanged();
//HACK i'm sure it doesn't belong here, find a better place
forsedSize = new CUINullVector2();
OnAbsolutePropChanged();
// Forget(child);
Children.Remove(child);
OnChildRemoved?.Invoke(child);
}
child.parent = null;
CUIDebug.Capture(null, this, "RemoveChild", memberName, "child", $"{child}");
return child;
}
//TODO DRY
public void RemoveAllChildren([CallerMemberName] string memberName = "")
{
foreach (CUIComponent c in Children)
{
if (this != null) // kek
{
c.TreeChanged = true;
c.OnPropChanged();
//Forget(c);
//Children.Remove(c);
OnChildRemoved?.Invoke(c);
}
c.parent = null;
CUIDebug.Capture(null, this, "RemoveAllChildren", memberName, "child", $"{c}");
}
NamedComponents.Clear();
Children.Clear();
}
/// <summary>
/// Pass props like ZIndex, Visible to a new child
/// </summary>
/// <param name="child"></param>
protected virtual void PassPropsToChild(CUIComponent child)
{
if (!ShouldPassPropsToChildren) return;
//child.Palette = Palette;
if (ZIndex.HasValue && !child.IgnoreParentZIndex) child.ZIndex = ZIndex.Value + 1;
if (IgnoreEvents && !child.IgnoreParentEventIgnorance) child.IgnoreEvents = true;
if (!Visible && !child.IgnoreParentVisibility) child.Visible = false;
}
#endregion
}
}