using System; using System.Numerics; using FFXIVClientStructs.FFXIV.Component.GUI; using KamiToolKit.Classes; using KamiToolKit.Enums; using KamiToolKit.Timelines; using Lumina.Text.ReadOnly; namespace KamiToolKit.Nodes; internal unsafe class RadioButtonNode : ComponentNode { public readonly TextNode LabelNode; public readonly ImageNode SelectedImageNode; public readonly ImageNode UnselectedImageNode; public RadioButtonNode() { SetInternalComponentType(ComponentType.RadioButton); UnselectedImageNode = new SimpleImageNode { NodeId = 4, TexturePath = "ui/uld/RadioButtonA.tex", TextureCoordinates = new Vector2(0.0f, 0.0f), TextureSize = new Vector2(16.0f, 16.0f), Size = new Vector2(16.0f, 16.0f), WrapMode = WrapMode.Tile, }; UnselectedImageNode.AttachNode(this); SelectedImageNode = new SimpleImageNode { NodeId = 3, TexturePath = "ui/uld/RadioButtonA.tex", TextureCoordinates = new Vector2(16.0f, 0.0f), TextureSize = new Vector2(16.0f, 16.0f), Size = new Vector2(16.0f, 16.0f), IsVisible = false, WrapMode = WrapMode.Tile, }; SelectedImageNode.AttachNode(this); LabelNode = new TextNode { NodeId = 2, Position = new Vector2(20.0f, 0.0f), Size = new Vector2(98.0f, 16.0f), FontSize = 14, TextColor = ColorHelper.GetColor(8), TextOutlineColor = ColorHelper.GetColor(7), AlignmentType = AlignmentType.Left, }; LabelNode.AttachNode(this); BuildTimelines(); Data->Nodes[0] = LabelNode.NodeId; Data->Nodes[1] = UnselectedImageNode.NodeId; Data->Nodes[2] = 0; Data->Nodes[3] = 0; AddEvent(AtkEventType.ButtonClick, ClickHandler); InitializeComponentEvents(); } public Action? Callback { get; set; } public ReadOnlySeString String { get => LabelNode.String; set { LabelNode.String = value; Width = LabelNode.Width + LabelNode.Position.X; } } public bool IsChecked { get => Component->IsChecked; set => Component->SetChecked(value); } public bool IsSelected { get => Component->IsSelected; set { Component->IsSelected = value; SelectedImageNode.IsVisible = value; } } private void ClickHandler(AtkEventListener* thisPtr, AtkEventType eventType, int eventParam, AtkEvent* atkEvent, AtkEventData* atkEventData) { Callback?.Invoke(); } private void BuildTimelines() { AddTimeline(new TimelineBuilder() .BeginFrameSet(1, 9) .AddFrame(1, new Vector2(24, 62)) .EndFrameSet() .BeginFrameSet(10, 19) .AddFrame(10, new Vector2(24, 44)) .EndFrameSet() .Build() ); CollisionNode.AddTimeline(new TimelineBuilder() .BeginFrameSet(1, 159) .AddEmptyFrame(1) .EndFrameSet() .Build() ); UnselectedImageNode.AddTimeline(new TimelineBuilder() .BeginFrameSet(1, 9) .AddFrame(1, alpha: 255) .AddFrame(1, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(10, 19) .AddFrame(10, alpha: 255) .AddFrame(12, alpha: 255) .AddFrame(10, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .AddFrame(12, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(20, 29) .AddFrame(20, alpha: 255) .AddFrame(20, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(30, 39) .AddFrame(30, alpha: 102) .AddFrame(30, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(80, 80, 80)) .EndFrameSet() .BeginFrameSet(40, 49) .AddFrame(40, alpha: 255) .AddFrame(40, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(50, 59) .AddFrame(50, alpha: 255) .AddFrame(52, alpha: 255) .AddFrame(50, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .AddFrame(52, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(60, 69) .AddFrame(60, alpha: 255) .AddFrame(60, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(70, 79) .AddFrame(70, alpha: 255) .AddFrame(72, alpha: 255) .AddFrame(70, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .AddFrame(72, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(80, 89) .AddFrame(80, alpha: 255) .AddFrame(80, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(90, 99) .AddFrame(90, alpha: 102) .AddFrame(90, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(80, 80, 80)) .EndFrameSet() .BeginFrameSet(100, 109) .AddFrame(100, alpha: 255) .AddFrame(100, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(110, 119) .AddFrame(110, alpha: 255) .AddFrame(112, alpha: 255) .AddFrame(110, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .AddFrame(112, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(120, 129) .AddFrame(120, alpha: 255) .AddFrame(120, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(130, 139) .AddFrame(130, alpha: 255) .AddFrame(130, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(140, 149) .AddFrame(140, alpha: 255) .AddFrame(140, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(150, 159) .AddFrame(150, alpha: 255) .AddFrame(150, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .Build() ); SelectedImageNode.AddTimeline(new TimelineBuilder() .BeginFrameSet(60, 69) .AddFrame(60, alpha: 255) .AddFrame(60, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(70, 79) .AddFrame(70, alpha: 255) .AddFrame(72, alpha: 255) .AddFrame(70, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .AddFrame(72, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(80, 89) .AddFrame(80, alpha: 255) .AddFrame(80, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(90, 99) .AddFrame(90, alpha: 102) .AddFrame(90, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(80, 80, 80)) .EndFrameSet() .BeginFrameSet(100, 109) .AddFrame(100, alpha: 255) .AddFrame(100, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(110, 119) .AddFrame(110, alpha: 255) .AddFrame(112, alpha: 255) .AddFrame(110, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .AddFrame(112, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(120, 129) .AddFrame(120, alpha: 0) .AddFrame(122, alpha: 255) .AddFrame(120, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .AddFrame(122, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(130, 139) .AddFrame(130, alpha: 255) .AddFrame(132, alpha: 0) .AddFrame(130, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .AddFrame(132, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(140, 149) .AddFrame(140, alpha: 0) .AddFrame(142, alpha: 255) .AddFrame(140, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .AddFrame(142, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(150, 159) .AddFrame(150, alpha: 255) .AddFrame(152, alpha: 0) .AddFrame(150, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .AddFrame(152, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .Build() ); LabelNode.AddTimeline(new TimelineBuilder() .BeginFrameSet(1, 9) .AddFrame(1, alpha: 255) .AddFrame(1, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(10, 19) .AddFrame(10, alpha: 255) .AddFrame(10, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(20, 29) .AddFrame(20, alpha: 255) .AddFrame(20, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(30, 39) .AddFrame(30, alpha: 102) .AddFrame(30, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(80, 80, 80)) .EndFrameSet() .BeginFrameSet(40, 49) .AddFrame(40, alpha: 255) .AddFrame(40, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(50, 59) .AddFrame(50, alpha: 255) .AddFrame(50, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(60, 69) .AddFrame(60, alpha: 255) .AddFrame(60, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(70, 79) .AddFrame(70, alpha: 255) .AddFrame(70, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(80, 89) .AddFrame(80, alpha: 255) .AddFrame(80, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(90, 99) .AddFrame(90, alpha: 102) .AddFrame(90, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(80, 80, 80)) .EndFrameSet() .BeginFrameSet(100, 109) .AddFrame(100, alpha: 255) .AddFrame(100, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(110, 119) .AddFrame(110, alpha: 255) .AddFrame(110, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(120, 129) .AddFrame(120, alpha: 255) .AddFrame(120, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(130, 139) .AddFrame(130, alpha: 255) .AddFrame(130, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(140, 149) .AddFrame(140, alpha: 255) .AddFrame(140, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .BeginFrameSet(150, 159) .AddFrame(150, alpha: 255) .AddFrame(150, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100)) .EndFrameSet() .Build() ); } }