182 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			182 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Linq;
 | 
						|
using System.Reflection;
 | 
						|
 | 
						|
using Barotrauma;
 | 
						|
using Microsoft.Xna.Framework;
 | 
						|
using Microsoft.Xna.Framework.Input;
 | 
						|
using Microsoft.Xna.Framework.Graphics;
 | 
						|
 | 
						|
namespace QICrabUI
 | 
						|
{
 | 
						|
  /// <summary>
 | 
						|
  /// A Grid containing children in its cells  
 | 
						|
  /// Dividing host into rows and columns basing on GridTemplate  
 | 
						|
  /// And then placing children basin on their GridCell 
 | 
						|
  /// </summary>
 | 
						|
  public class CUILayoutGrid : CUILayout
 | 
						|
  {
 | 
						|
    public enum TrackSizeType
 | 
						|
    {
 | 
						|
      Unknown,
 | 
						|
      Absolute,
 | 
						|
      Relative,
 | 
						|
      Fractional,
 | 
						|
    }
 | 
						|
 | 
						|
    public class GridTrack
 | 
						|
    {
 | 
						|
      public TrackSizeType Type;
 | 
						|
      public float? Absolute;
 | 
						|
      public float? Relative;
 | 
						|
      public float? Fractional;
 | 
						|
      public float Start;
 | 
						|
      public float End;
 | 
						|
      public float Size;
 | 
						|
 | 
						|
      public float RealSize(float hostSize)
 | 
						|
      {
 | 
						|
        float size = 0;
 | 
						|
 | 
						|
        if (Absolute.HasValue) size = Absolute.Value;
 | 
						|
        if (Relative.HasValue) size = Relative.Value * hostSize;
 | 
						|
 | 
						|
        return size;
 | 
						|
      }
 | 
						|
 | 
						|
      public GridTrack(string value)
 | 
						|
      {
 | 
						|
        value = value.Trim();
 | 
						|
 | 
						|
        float f = 0;
 | 
						|
        if (value.EndsWith("fr"))
 | 
						|
        {
 | 
						|
          if (float.TryParse(value.Substring(0, value.Length - 2), out f))
 | 
						|
          {
 | 
						|
            Fractional = f;
 | 
						|
            Type = TrackSizeType.Fractional;
 | 
						|
          }
 | 
						|
        }
 | 
						|
 | 
						|
        if (value.EndsWith("%"))
 | 
						|
        {
 | 
						|
          if (float.TryParse(value.Substring(0, value.Length - 1), out f))
 | 
						|
          {
 | 
						|
            Relative = f / 100f;
 | 
						|
            Type = TrackSizeType.Relative;
 | 
						|
          }
 | 
						|
        }
 | 
						|
 | 
						|
        if (float.TryParse(value, out f))
 | 
						|
        {
 | 
						|
          Absolute = f;
 | 
						|
          Type = TrackSizeType.Absolute;
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      public override string ToString() => $"[{Absolute},{Relative},{Fractional}]";
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    List<GridTrack> Rows = new();
 | 
						|
    List<GridTrack> Columns = new();
 | 
						|
 | 
						|
    public void CalculateTracks()
 | 
						|
    {
 | 
						|
      Rows.Clear();
 | 
						|
      Columns.Clear();
 | 
						|
 | 
						|
      if (Host.GridTemplateRows != null)
 | 
						|
      {
 | 
						|
        foreach (string s in Host.GridTemplateRows.Split(' '))
 | 
						|
        {
 | 
						|
          Rows.Add(new GridTrack(s));
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      if (Host.GridTemplateColumns != null)
 | 
						|
      {
 | 
						|
        foreach (string s in Host.GridTemplateColumns.Split(' '))
 | 
						|
        {
 | 
						|
          Columns.Add(new GridTrack(s));
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      if (Rows.Count == 0) Rows.Add(new GridTrack("100%"));
 | 
						|
      if (Columns.Count == 0) Columns.Add(new GridTrack("100%"));
 | 
						|
 | 
						|
      float x = 0;
 | 
						|
      foreach (GridTrack track in Columns)
 | 
						|
      {
 | 
						|
        track.Start = x;
 | 
						|
        track.Size = track.RealSize(Host.Real.Width);
 | 
						|
        x += track.Size;
 | 
						|
        track.End = x;
 | 
						|
      }
 | 
						|
 | 
						|
      float y = 0;
 | 
						|
      foreach (GridTrack track in Rows)
 | 
						|
      {
 | 
						|
        track.Start = y;
 | 
						|
        track.Size = track.RealSize(Host.Real.Height);
 | 
						|
        y += track.Size;
 | 
						|
        track.End = y;
 | 
						|
      }
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    internal override void Update()
 | 
						|
    {
 | 
						|
      if (Changed && Host.Children.Count > 0)
 | 
						|
      {
 | 
						|
        Host.InvokeOnLayoutUpdated();
 | 
						|
 | 
						|
        CalculateTracks();
 | 
						|
 | 
						|
        foreach (CUIComponent c in Host.Children)
 | 
						|
        {
 | 
						|
          float x = 0;
 | 
						|
          float y = 0;
 | 
						|
          float w = 0;
 | 
						|
          float h = 0;
 | 
						|
 | 
						|
          int startCellX = 0;
 | 
						|
          int startCellY = 0;
 | 
						|
          if (c.GridStartCell != null)
 | 
						|
          {
 | 
						|
            startCellX = Math.Clamp(c.GridStartCell.Value.X, 0, Rows.Count);
 | 
						|
            startCellY = Math.Clamp(c.GridStartCell.Value.Y, 0, Columns.Count);
 | 
						|
          }
 | 
						|
 | 
						|
          int endCellX = 0;
 | 
						|
          int endCellY = 0;
 | 
						|
          if (c.GridEndCell != null)
 | 
						|
          {
 | 
						|
            endCellX = Math.Clamp(c.GridEndCell.Value.X, 0, Rows.Count);
 | 
						|
            endCellY = Math.Clamp(c.GridEndCell.Value.Y, 0, Columns.Count);
 | 
						|
          }
 | 
						|
 | 
						|
          CUIRect real = new CUIRect(
 | 
						|
            Columns[startCellX].Start,
 | 
						|
            Rows[startCellY].Start,
 | 
						|
            Columns[endCellX].End - Columns[startCellX].Start,
 | 
						|
            Rows[endCellY].End - Rows[startCellY].Start
 | 
						|
          );
 | 
						|
 | 
						|
          real = real.Shift(Host.Real.Position);
 | 
						|
 | 
						|
          c.AmIOkWithThisSize(real.Size);
 | 
						|
 | 
						|
          c.SetReal(real, "Grid Layout update");
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      base.Update();
 | 
						|
    }
 | 
						|
 | 
						|
    public CUILayoutGrid() : base() { }
 | 
						|
    public CUILayoutGrid(CUIComponent host) : base(host) { }
 | 
						|
  }
 | 
						|
} |