284 lines
8.8 KiB
C#
284 lines
8.8 KiB
C#
|
|
using Godot;
|
|
using Rokojori;
|
|
|
|
namespace Rokojori
|
|
{
|
|
public class UILayouting
|
|
{
|
|
public static Vector2 GetContentSize( Control control )
|
|
{
|
|
if ( control is UIRegion )
|
|
{
|
|
return ( (UIRegion) control ).contentSize;
|
|
}
|
|
|
|
return control.Size;
|
|
}
|
|
|
|
public static Vector2 GetContentOffset( Control control )
|
|
{
|
|
if ( control is UIRegion )
|
|
{
|
|
return ( (UIRegion) control ).contentOffset;
|
|
}
|
|
|
|
return control.Size;
|
|
}
|
|
|
|
public static void UpdateChild( Control control )
|
|
{
|
|
if ( ! control.Visible )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( control is UIRegion )
|
|
{
|
|
var childUIRegion = (UIRegion) control;
|
|
childUIRegion.Layout();
|
|
}
|
|
else if ( control is UIImage || control is UIBorderImage )
|
|
{
|
|
var tw = 0;
|
|
var th = 0;
|
|
|
|
if ( control is UIImage )
|
|
{
|
|
var uiImage = (UIImage) control;
|
|
|
|
if ( uiImage.Texture == null )
|
|
{
|
|
uiImage.Size = new Vector2( 0, 0 );
|
|
return;
|
|
}
|
|
|
|
tw = uiImage.Texture.GetWidth();
|
|
th = uiImage.Texture.GetHeight();
|
|
}
|
|
else if ( control is UIBorderImage )
|
|
{
|
|
var uiBorderImage = (UIBorderImage) control;
|
|
|
|
if ( uiBorderImage.Texture == null )
|
|
{
|
|
uiBorderImage.Size = new Vector2( 0, 0 );
|
|
return;
|
|
}
|
|
|
|
tw = uiBorderImage.Texture.GetWidth();
|
|
th = uiBorderImage.Texture.GetHeight();
|
|
}
|
|
|
|
|
|
var container = (UIStylePropertyContainer) control;
|
|
|
|
var w = UINumber.Compute( control, UIStyleNumberProperty.Width, tw, tw / 100f );
|
|
var h = UINumber.Compute( control, UIStyleNumberProperty.Height, th, th / 100f );
|
|
|
|
control.Size = new Vector2( w, h );
|
|
|
|
if ( control is UIImage )
|
|
{
|
|
var uiImage = (UIImage) control;
|
|
|
|
if ( uiImage.Material != null )
|
|
{
|
|
var ui = Unique<UI>.Get();
|
|
|
|
if ( ui == null )
|
|
{
|
|
ui = NodesWalker.Get().GetInParents( control, n => n is UI ) as UI;
|
|
}
|
|
|
|
if ( ui == null )
|
|
{
|
|
RJLog.Log( "No UI Found" );
|
|
return;
|
|
}
|
|
|
|
if ( ui.settings == null )
|
|
{
|
|
// RJLog.Log( "No UI.settings Found" );
|
|
return;
|
|
}
|
|
|
|
if ( ui.settings.sizePropertyName == null )
|
|
{
|
|
RJLog.Log( "No UI.settings.sizePropertyName Found" );
|
|
return;
|
|
}
|
|
|
|
//RJLog.Log( "Setting Size", ui.settings.sizePropertyName.propertyName, HierarchyName.Of( uiImage ) );
|
|
ui.settings.sizePropertyName.Set( uiImage.Material, uiImage.Size );
|
|
|
|
UIShaderProperties.UpdateProperties( uiImage, uiImage.Material );
|
|
return;
|
|
}
|
|
|
|
}
|
|
}
|
|
else if ( control is UIText )
|
|
{
|
|
var text = (UIText) control;
|
|
|
|
var container = (UIStylePropertyContainer) control;
|
|
|
|
text.uiTextLabelSettings.FontSize =
|
|
UINumber.ComputeInt( control, UIStyleNumberProperty.FontSize, UINumber.em(), UINumber.em() / 100f );
|
|
text.uiTextLabelSettings.FontColor =
|
|
UIColor.Compute( control, UIStyleColorProperty.FontColor, Colors.White );
|
|
|
|
text.uiTextLabelSettings.OutlineSize =
|
|
UINumber.ComputeInt( control, UIStyleNumberProperty.FontOutlineSize, 0 );
|
|
|
|
text.uiTextLabelSettings.OutlineColor =
|
|
UIColor.Compute( control, UIStyleColorProperty.FontOutlineColor, Colors.Transparent );
|
|
|
|
text.uiTextLabelSettings.ShadowSize =
|
|
UINumber.ComputeInt( control, UIStyleNumberProperty.FontShadowSize, 0 );
|
|
|
|
text.uiTextLabelSettings.ShadowColor =
|
|
UIColor.Compute( control, UIStyleColorProperty.FontShadowColor, Colors.Black );
|
|
|
|
text.uiTextLabelSettings.ShadowOffset = new Vector2(
|
|
UINumber.Compute( control, UIStyleNumberProperty.FontShadowOffsetX, 0 ),
|
|
UINumber.Compute( control, UIStyleNumberProperty.FontShadowOffsetY, 0 )
|
|
);
|
|
|
|
control.UpdateMinimumSize();
|
|
control.Size = control.GetMinimumSize();
|
|
}
|
|
else
|
|
{
|
|
// control.UpdateMinimumSize();
|
|
// control.Size = control.GetMinimumSize();
|
|
}
|
|
|
|
UILayouting.UpdatePivot( control );
|
|
}
|
|
|
|
public static void SetPositionInParentAnchor( UIStylePropertyContainer container )
|
|
{
|
|
var control = (Control) container;
|
|
var p = NodesWalker.Get().Parent( control ) as Control;
|
|
|
|
var pWidth = p == null ? UI.GetWindowWidth( control ) : UILayouting.GetWidth( p );
|
|
var pHeight = p == null ? UI.GetWindowHeight( control ) : UILayouting.GetHeight( p );
|
|
|
|
var x = p.Position.X;
|
|
var y = p.Position.Y;
|
|
|
|
|
|
if ( ! UINumber.IsNullOrNone( container, UIStyleNumberProperty.Left ) )
|
|
{
|
|
var left = UINumber.Compute( control, UIStyleNumberProperty.Left, 0 );
|
|
x = left;
|
|
}
|
|
else if ( ! UINumber.IsNullOrNone( container, UIStyleNumberProperty.Right ) )
|
|
{
|
|
var right = UINumber.Compute( control, UIStyleNumberProperty.Right, 0 );
|
|
x = ( pWidth - UILayouting.GetWidth( control ) ) - right;
|
|
}
|
|
|
|
if ( ! UINumber.IsNullOrNone( container, UIStyleNumberProperty.Top ))
|
|
{
|
|
var top = UINumber.Compute( control, UIStyleNumberProperty.Top, 0 );
|
|
y = top;
|
|
}
|
|
else if ( ! UINumber.IsNullOrNone( container, UIStyleNumberProperty.Bottom ) )
|
|
{
|
|
var bottom = UINumber.Compute( control, UIStyleNumberProperty.Bottom, 0 );
|
|
y = ( pHeight - UILayouting.GetHeight( control ) ) - bottom;
|
|
}
|
|
|
|
// var margin = UINumber.Compute( control, UIStyle.Margin( container ), 0 );
|
|
// var marginLeft = margin + UINumber.Compute( control, UIStyle.MarginLeft( container ), 0 );
|
|
// var marginTop = margin + UINumber.Compute( control, UIStyle.MarginRight( container ), 0 );
|
|
// var marginRight = margin + UINumber.Compute( control, UIStyle.MarginRight( container ), 0 );
|
|
// var marginBottom = margin + UINumber.Compute( control, UIStyle.MarginBottom( container ), 0 );
|
|
|
|
// UILayouting.SetPosition( control, new Vector2( x - ( marginLeft + marginRight ), y - ( marginTop + marginBottom ) ) );
|
|
|
|
UILayouting.SetPosition( control, new Vector2( x, y ) );
|
|
}
|
|
|
|
public static void UpdatePivot( Control c )
|
|
{
|
|
if ( ! ( c is UIImage || c is UIRegion || c is UIText ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
var container = c as UIStylePropertyContainer;
|
|
|
|
var pivotX = UINumber.Compute( c, UIStyleNumberProperty.PivotX, 0.5f * c.Size.X, c.Size.X );
|
|
var pivotY = UINumber.Compute( c, UIStyleNumberProperty.PivotY, 0.5f * c.Size.Y, c.Size.Y );
|
|
|
|
c.PivotOffset = new Vector2( pivotX, pivotY );
|
|
|
|
c.Rotation = UINumber.Compute( c, UIStyleNumberProperty.Rotation, 0 );
|
|
|
|
var scale = UINumber.Compute( c, UIStyleNumberProperty.Scale, 1, 1 );
|
|
|
|
c.Scale = new Vector2(
|
|
UINumber.Compute( c, UIStyleNumberProperty.ScaleX, 1, 1 ) ,
|
|
UINumber.Compute( c, UIStyleNumberProperty.ScaleY, 1, 1 )
|
|
) * scale;
|
|
|
|
}
|
|
|
|
public static void SetPosition( Control c, Vector2 position )
|
|
{
|
|
if ( UIStyling.HasInnerMargins( c ) )
|
|
{
|
|
var container = c as UIStylePropertyContainer;
|
|
|
|
var margin = UINumber.Compute( c, UIStyleNumberProperty.Margin, 0 );
|
|
var marginLeft = margin + UINumber.Compute( c, UIStyleNumberProperty.MarginLeft, 0 );
|
|
var marginTop = margin + UINumber.Compute( c, UIStyleNumberProperty.MarginTop, 0 );
|
|
|
|
position.X += marginLeft;
|
|
position.Y += marginTop;
|
|
|
|
}
|
|
|
|
c.Position = position;
|
|
}
|
|
|
|
public static float GetWidth( Control c )
|
|
{
|
|
if ( UIStyling.HasInnerMargins( c ) )
|
|
{
|
|
var container = c as UIStylePropertyContainer;
|
|
|
|
var margin = UINumber.Compute( c, UIStyleNumberProperty.Margin, 0 );
|
|
var marginLeft = margin + UINumber.Compute( c, UIStyleNumberProperty.MarginLeft, 0 );
|
|
var marginRight = margin + UINumber.Compute( c, UIStyleNumberProperty.MarginRight, 0 );
|
|
|
|
return c.Size.X + marginLeft + marginRight;
|
|
|
|
}
|
|
|
|
return c.Size.X;
|
|
}
|
|
|
|
public static float GetHeight( Control c )
|
|
{
|
|
if ( UIStyling.HasInnerMargins( c ) )
|
|
{
|
|
var container = c as UIStylePropertyContainer;
|
|
|
|
var margin = UINumber.Compute( c, UIStyleNumberProperty.Margin, 0 );
|
|
var marginTop = margin + UINumber.Compute( c, UIStyleNumberProperty.MarginTop, 0 );
|
|
var marginBottom = margin + UINumber.Compute( c, UIStyleNumberProperty.MarginBottom, 0 );
|
|
|
|
return c.Size.Y + marginTop + marginBottom;
|
|
|
|
}
|
|
|
|
return c.Size.Y;
|
|
}
|
|
|
|
}
|
|
} |