167 lines
3.9 KiB
C#
167 lines
3.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
using Barotrauma;
|
|
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Input;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
|
|
namespace QICrabUI
|
|
{
|
|
/// <summary>
|
|
/// Unfinished crap, don't use
|
|
/// </summary>
|
|
public class CUIRadialMenuOption : CUIComponent
|
|
{
|
|
public GUISoundType ClickSound { get; set; } = GUISoundType.Select;
|
|
|
|
public Color BaseColor
|
|
{
|
|
get => (Color)this.Animations["hover"].StartValue;
|
|
set => this.Animations["hover"].StartValue = value;
|
|
}
|
|
|
|
public Color Hover
|
|
{
|
|
get => (Color)this.Animations["hover"].EndValue;
|
|
set => this.Animations["hover"].EndValue = value;
|
|
}
|
|
|
|
public float TextRadius { get; set; } = 0.4f;
|
|
|
|
public void SetRotation(float angle)
|
|
{
|
|
BackgroundSprite.Offset = new Vector2(0.5f, 0.5f);
|
|
BackgroundSprite.Rotation = angle;
|
|
|
|
|
|
this["Text"].Relative = new CUINullRect(
|
|
(float)(TextRadius * Math.Cos(angle - Math.PI / 2)),
|
|
(float)(TextRadius * Math.Sin(angle - Math.PI / 2))
|
|
);
|
|
}
|
|
|
|
public Action Callback;
|
|
|
|
public CUIRadialMenuOption(string name = "", Action callback = null)
|
|
{
|
|
IgnoreTransparent = true;
|
|
Relative = new CUINullRect(0, 0, 1, 1);
|
|
|
|
Callback = callback;
|
|
OnMouseDown += (e) =>
|
|
{
|
|
SoundPlayer.PlayUISound(ClickSound);
|
|
Callback?.Invoke();
|
|
};
|
|
|
|
this.Animations["hover"] = new CUIAnimation()
|
|
{
|
|
StartValue = new Color(255, 255, 255, 255),
|
|
EndValue = new Color(0, 255, 255, 255),
|
|
Property = "BackgroundColor",
|
|
Duration = 0.2,
|
|
ReverseDuration = 0.3,
|
|
};
|
|
|
|
this.Animations["hover"].ApplyValue();
|
|
|
|
OnMouseEnter += (e) => Animations["hover"].Forward();
|
|
OnMouseLeave += (e) => Animations["hover"].Back();
|
|
|
|
this["Text"] = new CUITextBlock(name)
|
|
{
|
|
Anchor = CUIAnchor.Center,
|
|
ZIndex = 100,
|
|
TextScale = 1.0f,
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Unfinished crap, don't use
|
|
/// </summary>
|
|
public class CUIRadialMenu : CUIComponent
|
|
{
|
|
public CUIRadialMenuOption OptionTemplate = new();
|
|
|
|
public Dictionary<string, CUIRadialMenuOption> Options = new();
|
|
|
|
public CUIRadialMenuOption AddOption(string name, Action callback)
|
|
{
|
|
CUIRadialMenuOption option = new CUIRadialMenuOption(name, callback);
|
|
option.ApplyState(OptionTemplate);
|
|
option.Animations["hover"].Interpolate = OptionTemplate.Animations["hover"].Interpolate;
|
|
option.Animations["hover"].ApplyValue();
|
|
|
|
this[name] = Options[name] = option;
|
|
option.OnClick += (e) => Close();
|
|
|
|
CalculateRotations();
|
|
|
|
return option;
|
|
}
|
|
|
|
public void CalculateRotations()
|
|
{
|
|
float delta = (float)(Math.PI * 2 / Options.Count);
|
|
|
|
int i = 0;
|
|
foreach (CUIRadialMenuOption option in Options.Values)
|
|
{
|
|
option.SetRotation(delta * i);
|
|
i++;
|
|
}
|
|
}
|
|
|
|
public bool IsOpened => Parent != null;
|
|
|
|
public void Open(CUIComponent host = null)
|
|
{
|
|
host ??= CUI.Main;
|
|
host.Append(this);
|
|
Animations["fade"].SetToStart();
|
|
Animations["fade"].Forward();
|
|
}
|
|
|
|
public void Close()
|
|
{
|
|
// BlockChildrenAnimations();
|
|
// Animations["fade"].SetToEnd();
|
|
// Animations["fade"].Back();
|
|
RemoveSelf();
|
|
}
|
|
|
|
|
|
public CUIRadialMenu() : base()
|
|
{
|
|
Anchor = CUIAnchor.Center;
|
|
Relative = new CUINullRect(h: 0.8f);
|
|
CrossRelative = new CUINullRect(w: 0.8f);
|
|
BackgroundColor = new Color(255, 255, 255, 255);
|
|
//BackgroundSprite = new CUISprite("RadialMenu.png");
|
|
|
|
Animations["fade"] = new CUIAnimation()
|
|
{
|
|
StartValue = 0.0f,
|
|
EndValue = 1.0f,
|
|
Property = "Transparency",
|
|
Duration = 0.2,
|
|
ReverseDuration = 0.1,
|
|
};
|
|
|
|
//HACK
|
|
Animations["fade"].OnStop += (dir) =>
|
|
{
|
|
if (dir == CUIDirection.Reverse)
|
|
{
|
|
RemoveSelf();
|
|
}
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
} |