Files

176 lines
4.8 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;
using HarmonyLib;
namespace QICrabUI
{
public partial class CUIComponent : IDisposable
{
/// <summary>
/// Global ID, unique for component
/// </summary>
public int ID { get; set; }
internal bool DebugHighlight { get; set; }
private CUIMainComponent mainComponent;
/// <summary>
/// Link to CUIMainComponent, passed to children
/// </summary>
public CUIMainComponent MainComponent
{
get => mainComponent;
set
{
mainComponent = value;
foreach (var child in Children) { child.MainComponent = value; }
}
}
internal int positionalZIndex;
internal int addedZIndex;
[Calculated] public bool Focused { get; set; }
/// <summary>
/// True when parent has HideChildrenOutsideFrame and child wanders beyond parents border
/// </summary>
[Calculated] internal bool CulledOut { get; set; }
/// <summary>
/// BackgroundColor != Color.Transparent
/// </summary>
protected bool BackgroundVisible { get; set; }
protected bool OutlineVisible { get; set; }
// This is for state clones, to protect them from style changes
internal bool Unreal { get; set; }
public bool MouseOver { get; set; }
public bool MousePressed { get; set; }
/// <summary>
/// This is used by text to prevent resizing beyond that
/// and works as AbsoluteMin
/// </summary>
[Calculated]
public CUINullVector2 ForcedMinSize
{
get => forsedSize;
set => SetForcedMinSize(value);
}
protected CUINullVector2 forsedSize; internal void SetForcedMinSize(CUINullVector2 value, [CallerMemberName] string memberName = "")
{
forsedSize = value;
CUIDebug.Capture(null, this, "SetForcedMinSize", memberName, "ForcedMinSize", ForcedMinSize.ToString());
OnPropChanged();//TODO this is the reason why lists with a lot of children lag
//OnSelfAndParentChanged();
OnAbsolutePropChanged();
}
/// <summary>
/// This is set by ChildrenOffset when zooming, and iirc consumed by text to adjust text scale
/// </summary>
[Calculated]
public float Scale
{
get => scale;
set => SetScale(value);
}
protected float scale = 1f; internal void SetScale(float value, [CallerMemberName] string memberName = "")
{
scale = value;
foreach (var child in Children) { child.Scale = value; }
// OnDecorPropChanged();
}
/// <summary>
/// Calculated Prop, Real + BorderThickness
/// </summary>
protected CUIRect BorderBox { get; set; }
protected CUIRect OutlineBox { get; set; }
internal Rectangle? ScissorRect { get; set; }
/// <summary>
/// Buffer for texture data, for IgnoreTransparent checks
/// </summary>
protected Color[] TextureData;
/// <summary>
/// Calculated prop, position on real screen in pixels
/// Should be fully calculated after CUIMainComponent.Update
/// </summary>
[Calculated]
public CUIRect Real
{
get => real;
set => SetReal(value);
}
private CUIRect real; internal void SetReal(CUIRect value, [CallerMemberName] string memberName = "")
{
//HACK idk if i need it
real = new CUIRect(
(float)Math.Round(value.Left),
(float)Math.Round(value.Top),
(float)Math.Round(value.Width),
(float)Math.Round(value.Height)
);
// real = value;
CUIDebug.Capture(null, this, "SetReal", memberName, "real", real.ToString());
BorderBox = real;
// BorderBox = new CUIRect(
// real.Left - BorderThickness,
// real.Top - BorderThickness,
// real.Width + 2 * BorderThickness,
// real.Height + 2 * BorderThickness
// );
OutlineBox = new CUIRect(
real.Left - OutlineThickness,
real.Top - OutlineThickness,
real.Width + 2 * OutlineThickness,
real.Height + 2 * OutlineThickness
);
if (HideChildrenOutsideFrame)
{
Rectangle SRect = real.Box;
// //HACK Remove these + 1
// Rectangle SRect = new Rectangle(
// (int)real.Left + 1,
// (int)real.Top + 1,
// (int)real.Width - 2,
// (int)real.Height - 2
// );
if (Parent?.ScissorRect != null)
{
ScissorRect = Rectangle.Intersect(Parent.ScissorRect.Value, SRect);
}
else
{
ScissorRect = SRect;
}
}
else ScissorRect = Parent?.ScissorRect;
}
}
}