Skip to content

Commit 93f086a

Browse files
committed
Added UnionNode.
1 parent 7fafaeb commit 93f086a

File tree

11 files changed

+171
-8
lines changed

11 files changed

+171
-8
lines changed

ReClass.NET/CodeGenerator/CppCodeGenerator.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,24 @@ private void WriteNode(IndentedTextWriter writer, BaseNode node, ILogger logger)
457457
}
458458
writer.WriteLine();
459459
}
460+
else if (node is UnionNode unionNode)
461+
{
462+
writer.Write("union //0x");
463+
writer.Write($"{node.Offset:X04}");
464+
if (!string.IsNullOrEmpty(node.Comment))
465+
{
466+
writer.Write(" ");
467+
writer.Write(node.Comment);
468+
}
469+
writer.WriteLine();
470+
writer.WriteLine("{");
471+
writer.Indent++;
472+
473+
WriteNodes(writer, unionNode.Nodes, logger);
474+
475+
writer.Indent--;
476+
writer.WriteLine("};");
477+
}
460478
else
461479
{
462480
logger.Log(LogLevel.Error, $"Skipping node with unhandled type: {node.GetType()}");

ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -264,10 +264,16 @@ ClassNode GetClassNodeFromElementReference()
264264
IsHidden = (bool?)e.Attribute(XmlHiddenAttribute) ?? false
265265
});
266266

267-
foreach (var vmethodNode in nodes)
268-
{
269-
vtableNode.AddNode(vmethodNode);
270-
}
267+
vtableNode.AddNodes(nodes);
268+
break;
269+
}
270+
case UnionNode unionNode:
271+
{
272+
var nodes = element
273+
.Elements()
274+
.Select(e => CreateNodeFromElement(e, unionNode, logger));
275+
276+
unionNode.AddNodes(nodes);
271277
break;
272278
}
273279
case BaseWrapperArrayNode arrayNode:

ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@ XElement CreateElement()
141141
)));
142142
break;
143143
}
144+
case UnionNode unionNode:
145+
{
146+
element.Add(unionNode.Nodes.Select(n => CreateElementFromNode(n, logger)));
147+
break;
148+
}
144149
case BaseWrapperArrayNode arrayNode:
145150
{
146151
element.SetAttributeValue(XmlCountAttribute, arrayNode.Count);

ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ static ReClassNetFile()
7272
typeof(Vector4Node),
7373
typeof(VirtualMethodTableNode),
7474
typeof(ArrayNode),
75-
typeof(PointerNode)
75+
typeof(PointerNode),
76+
typeof(UnionNode)
7677
}.ToDictionary(t => t.Name, t => t);
7778

7879
private static readonly Dictionary<Type, string> buildInTypeToStringMap = buildInStringToTypeMap.ToDictionary(kv => kv.Value, kv => kv.Key);

ReClass.NET/Nodes/BaseContainerNode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public override void ClearSelection()
4242
}
4343

4444
/// <summary>Calculates the offset of every child node.</summary>
45-
public void UpdateOffsets()
45+
public virtual void UpdateOffsets()
4646
{
4747
var offset = 0;
4848
foreach (var node in Nodes)

ReClass.NET/Nodes/UnionNode.cs

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
using System;
2+
using System.Drawing;
3+
using System.Linq;
4+
using ReClassNET.UI;
5+
6+
namespace ReClassNET.Nodes
7+
{
8+
public class UnionNode : BaseContainerNode
9+
{
10+
public override int MemorySize => Nodes.Max(n => n.MemorySize);
11+
12+
protected override bool ShouldCompensateSizeChanges => false;
13+
14+
public override void GetUserInterfaceInfo(out string name, out Image icon)
15+
{
16+
name = "Union";
17+
icon = Properties.Resources.B16x16_Button_Union;
18+
}
19+
20+
public override bool CanHandleChildNode(BaseNode node)
21+
{
22+
switch (node)
23+
{
24+
case null:
25+
case ClassNode _:
26+
case VirtualMethodNode _:
27+
return false;
28+
}
29+
30+
return true;
31+
}
32+
33+
public override void Initialize()
34+
{
35+
AddNode(CreateDefaultNodeForSize(IntPtr.Size));
36+
}
37+
38+
public override void UpdateOffsets()
39+
{
40+
foreach (var node in Nodes)
41+
{
42+
node.Offset = 0;
43+
}
44+
}
45+
46+
public override Size Draw(ViewInfo view, int x, int y)
47+
{
48+
if (IsHidden && !IsWrapped)
49+
{
50+
return DrawHidden(view, x, y);
51+
}
52+
53+
var origX = x;
54+
var origY = y;
55+
56+
AddSelection(view, x, y, view.Font.Height);
57+
58+
x = AddOpenCloseIcon(view, x, y);
59+
x = AddIcon(view, x, y, Icons.VTable, -1, HotSpotType.None);
60+
61+
var tx = x;
62+
x = AddAddressOffset(view, x, y);
63+
64+
x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Union") + view.Font.Width;
65+
66+
x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"[Nodes: {Nodes.Count}, Size: {MemorySize}]") + view.Font.Width;
67+
68+
x = AddComment(view, x, y);
69+
70+
DrawInvalidMemoryIndicatorIcon(view, y);
71+
AddContextDropDownIcon(view, y);
72+
AddDeleteIcon(view, y);
73+
74+
y += view.Font.Height;
75+
76+
var size = new Size(x - origX, y - origY);
77+
78+
if (LevelsOpen[view.Level])
79+
{
80+
var v = view.Clone();
81+
v.Settings = Program.Settings.Clone();
82+
v.Settings.ShowNodeAddress = false;
83+
v.Address = view.Address + Offset;
84+
v.Memory = view.Memory.Clone();
85+
v.Memory.Offset += Offset;
86+
87+
foreach (var node in Nodes)
88+
{
89+
var innerSize = node.Draw(v, tx, y);
90+
91+
size.Width = Math.Max(size.Width, innerSize.Width + tx - origX);
92+
size.Height += innerSize.Height;
93+
94+
y += innerSize.Height;
95+
}
96+
}
97+
98+
return size;
99+
}
100+
101+
public override int CalculateDrawnHeight(ViewInfo view)
102+
{
103+
if (IsHidden && !IsWrapped)
104+
{
105+
return HiddenHeight;
106+
}
107+
108+
var height = view.Font.Height;
109+
if (LevelsOpen[view.Level])
110+
{
111+
height += Nodes.Sum(n => n.CalculateDrawnHeight(view));
112+
}
113+
return height;
114+
}
115+
}
116+
}

ReClass.NET/Properties/Resources.Designer.cs

Lines changed: 11 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ReClass.NET/Properties/Resources.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,4 +508,7 @@
508508
<data name="B16x16_Button_Enum" type="System.Resources.ResXFileRef, System.Windows.Forms">
509509
<value>..\Resources\Images\B16x16_Button_Enum.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
510510
</data>
511+
<data name="B16x16_Button_Union" type="System.Resources.ResXFileRef, System.Windows.Forms">
512+
<value>..\Resources\Images\B16x16_Button_Union.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
513+
</data>
511514
</root>

ReClass.NET/ReClass.NET.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@
272272
<Compile Include="Nodes\FunctionNode.cs" />
273273
<Compile Include="Nodes\NodeUuid.cs" />
274274
<Compile Include="Nodes\PointerNode.cs" />
275+
<Compile Include="Nodes\UnionNode.cs" />
275276
<Compile Include="Project\CppTypeMapping.cs" />
276277
<Compile Include="Project\EnumDescription.cs" />
277278
<Compile Include="Project\ReClassNetProject.cs" />
@@ -993,6 +994,9 @@
993994
<ItemGroup>
994995
<None Include="Resources\Images\B16x16_Button_Enum.png" />
995996
</ItemGroup>
997+
<ItemGroup>
998+
<None Include="Resources\Images\B16x16_Button_Union.png" />
999+
</ItemGroup>
9961000
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
9971001
<PropertyGroup>
9981002
<PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'"</PreBuildEvent>
183 Bytes
Loading

0 commit comments

Comments
 (0)