Skip to content

Commit

Permalink
Make values bold when changed from SH defaults
Browse files Browse the repository at this point in the history
  • Loading branch information
ItEndsWithTens committed Jul 4, 2024
1 parent 424dba0 commit 2f38a1d
Show file tree
Hide file tree
Showing 6 changed files with 195 additions and 36 deletions.
49 changes: 25 additions & 24 deletions src/SHME.ExternalTool/UI/CameraTab.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,32 +17,14 @@ private void InitializeCameraTab()
CbxSelectedCameraPathDisabled.Tag = nameof(CameraPath.Disabled);

LblSelectedCameraPathVolumeMin.Tag = nameof(CameraPath.VolumeMin);

TbxCameraPathVolumeMinX.Tag =
nameof(CameraPath.VolumeMin) +
nameof(CameraPath.VolumeMin.X);

TbxCameraPathVolumeMinY.Tag =
nameof(CameraPath.VolumeMin) +
nameof(CameraPath.VolumeMin.Y);

TbxCameraPathVolumeMinZ.Tag =
nameof(CameraPath.VolumeMin) +
nameof(CameraPath.VolumeMin.Z);
TbxCameraPathVolumeMinX.Tag = $"{nameof(CameraPath.VolumeMin)}.X";
TbxCameraPathVolumeMinY.Tag = $"{nameof(CameraPath.VolumeMin)}.Y";
TbxCameraPathVolumeMinZ.Tag = $"{nameof(CameraPath.VolumeMin)}.Z";

LblSelectedCameraPathVolumeMax.Tag = nameof(CameraPath.VolumeMax);

TbxCameraPathVolumeMaxX.Tag =
nameof(CameraPath.VolumeMax) +
nameof(CameraPath.VolumeMax.X);

TbxCameraPathVolumeMaxY.Tag =
nameof(CameraPath.VolumeMax) +
nameof(CameraPath.VolumeMax.Y);

TbxCameraPathVolumeMaxZ.Tag =
nameof(CameraPath.VolumeMax) +
nameof(CameraPath.VolumeMax.Z);
TbxCameraPathVolumeMaxX.Tag = $"{nameof(CameraPath.VolumeMax)}.X";
TbxCameraPathVolumeMaxY.Tag = $"{nameof(CameraPath.VolumeMax)}.Y";
TbxCameraPathVolumeMaxZ.Tag = $"{nameof(CameraPath.VolumeMax)}.Z";

LblSelectedCameraPathAreaMin.Tag =
nameof(CameraPath.AreaMinX) +
Expand All @@ -59,11 +41,19 @@ private void InitializeCameraTab()
TbxCameraPathAreaMaxZ.Tag = nameof(CameraPath.AreaMaxZ);

LblSelectedCameraPathThing4.Tag = nameof(CameraPath.Thing4);
MtbCameraPathThing4.Tag = nameof(CameraPath.Thing4);

LblSelectedCameraPathThing5.Tag = nameof(CameraPath.Thing5);
MtbCameraPathThing5.Tag = nameof(CameraPath.Thing5);

LblSelectedCameraPathThing6.Tag = nameof(CameraPath.Thing6);
MtbCameraPathThing6.Tag = nameof(CameraPath.Thing6);

LblSelectedCameraPathPitch.Tag = nameof(CameraPath.Pitch);
TbxCameraPathPitch.Tag = nameof(CameraPath.Pitch);

LblSelectedCameraPathYaw.Tag = nameof(CameraPath.Yaw);
TbxCameraPathYaw.Tag = nameof(CameraPath.Yaw);
}

private int? _previousSelectedCameraPathIndex;
Expand Down Expand Up @@ -297,6 +287,7 @@ private void LbxCameraPaths_SelectedIndexChanged(object sender, EventArgs e)
CultureInfo c = CultureInfo.CurrentCulture;

SuspendLayout();

LblCameraPathAddress.Text = $"0x{path.Address.ToString("X", c)}";
CbxSelectedCameraPathDisabled.Enabled = true;
CbxSelectedCameraPathDisabled.Checked = path.Disabled;
Expand All @@ -315,6 +306,16 @@ private void LbxCameraPaths_SelectedIndexChanged(object sender, EventArgs e)
MtbCameraPathThing6.Text = $"0x{path.Thing6.ToString("X4", c)}";
TbxCameraPathPitch.Text = path.Pitch.ToString(c);
TbxCameraPathYaw.Text = path.Yaw.ToString(c);

IList<(string, IList<Control>)> map = _fontChangeMap[typeof(CameraPath)];
foreach ((string property, IList<Control> controls) in map)
{
foreach (Control control in controls)
{
MakeBoldIfChanged(control, path, property);
}
}

ResumeLayout();
}
}
Expand Down
1 change: 1 addition & 0 deletions src/SHME.ExternalTool/UI/CustomMainForm.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions src/SHME.ExternalTool/UI/CustomMainForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,8 @@ public CustomMainForm()
InitializeFramebufferTab();
InitializeUtilityTab();

InitializeEditBindings();

Guts.GameCameraLookAt = new BoxGenerator(0.25f, Color.Purple).Generate().ToWorld();
}

Expand Down Expand Up @@ -182,6 +184,9 @@ public override void Restart()
{
base.Restart();

_fontDefaultValue = DefaultFont;
_fontChangedValue = new Font(DefaultFont, FontStyle.Bold);

_disc?.Dispose();
_disc = Disc.LoadAutomagic(MainForm.CurrentlyOpenRom);

Expand Down Expand Up @@ -684,6 +689,9 @@ private void CleanUpDisposables()

_disc?.Dispose();

_fontDefaultValue?.Dispose();
_fontChangedValue?.Dispose();

GameSurface = null;
}

Expand Down
18 changes: 9 additions & 9 deletions src/SHME.ExternalTool/UI/Edit_CameraPath.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ private void SelectedCameraPath_ValidateInput(Control? c)

switch (c?.Tag)
{
case nameof(CameraPath.VolumeMin) + nameof(CameraPath.VolumeMin.X):
case $"{nameof(CameraPath.VolumeMin)}.X":
if (Single.TryParse(c.Text, out float x))
{
if (path.VolumeMin.X.ApproximatelyEquivalent(x, Tolerance))
Expand All @@ -113,7 +113,7 @@ private void SelectedCameraPath_ValidateInput(Control? c)
path.VolumeMin = min;
}
break;
case nameof(CameraPath.VolumeMin) + nameof(CameraPath.VolumeMin.Y):
case $"{nameof(CameraPath.VolumeMin)}.Y":
if (Single.TryParse(c.Text, out float y))
{
if (path.VolumeMin.Y.ApproximatelyEquivalent(y, Tolerance))
Expand All @@ -123,7 +123,7 @@ private void SelectedCameraPath_ValidateInput(Control? c)
path.VolumeMin = min;
}
break;
case nameof(CameraPath.VolumeMin) + nameof(CameraPath.VolumeMin.Z):
case $"{nameof(CameraPath.VolumeMin)}.Z":
if (Single.TryParse(c.Text, out float z))
{
if (path.VolumeMin.Z.ApproximatelyEquivalent(z, Tolerance))
Expand All @@ -133,7 +133,7 @@ private void SelectedCameraPath_ValidateInput(Control? c)
path.VolumeMin = min;
}
break;
case nameof(CameraPath.VolumeMax) + nameof(CameraPath.VolumeMax.X):
case $"{nameof(CameraPath.VolumeMax)}.X":
if (Single.TryParse(c.Text, out x))
{
if (path.VolumeMax.X.ApproximatelyEquivalent(x, Tolerance))
Expand All @@ -143,7 +143,7 @@ private void SelectedCameraPath_ValidateInput(Control? c)
path.VolumeMax = max;
}
break;
case nameof(CameraPath.VolumeMax) + nameof(CameraPath.VolumeMax.Y):
case $"{nameof(CameraPath.VolumeMax)}.Y":
if (Single.TryParse(c.Text, out y))
{
if (path.VolumeMax.Y.ApproximatelyEquivalent(y, Tolerance))
Expand All @@ -153,7 +153,7 @@ private void SelectedCameraPath_ValidateInput(Control? c)
path.VolumeMax = max;
}
break;
case nameof(CameraPath.VolumeMax) + nameof(CameraPath.VolumeMax.Z):
case $"{nameof(CameraPath.VolumeMax)}.Z":
if (Single.TryParse(c.Text, out z))
{
if (path.VolumeMax.Z.ApproximatelyEquivalent(z, Tolerance))
Expand Down Expand Up @@ -214,10 +214,10 @@ private void SelectedCameraPath_ValidateInput(Control? c)
path.Thing5 = b;
break;
case nameof(CameraPath.Thing6):
good = Byte.TryParse(c.Text, hex, culture, out b);
if (!good || path.Thing6 == b)
good = Int16.TryParse(c.Text, hex, culture, out short s);
if (!good || path.Thing6 == s)
return;
path.Thing6 = b;
path.Thing6 = s;
break;
case nameof(CameraPath.Pitch):
if (Single.TryParse(c.Text, out float pitch))
Expand Down
133 changes: 132 additions & 1 deletion src/SHME.ExternalTool/UI/Edit_Common.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
using System.Windows.Forms;
using SHME.ExternalTool;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;

namespace BizHawk.Client.EmuHawk;

Expand All @@ -11,6 +17,94 @@ partial class CustomMainForm
/// </summary>
private bool _userChange;

private readonly Dictionary<Type, IList<(string, IList<Control>)>> _fontChangeMap = [];
private void InitializeEditBindings()
{
List<(string, IList<Control>)> cameraPathFontChangeMap = [
(nameof(CameraPath.Disabled), [CbxSelectedCameraPathDisabled]),
($"{nameof(CameraPath.VolumeMin)}.X", [TbxCameraPathVolumeMinX]),
($"{nameof(CameraPath.VolumeMin)}.Y", [TbxCameraPathVolumeMinY]),
($"{nameof(CameraPath.VolumeMin)}.Z", [TbxCameraPathVolumeMinZ]),
($"{nameof(CameraPath.VolumeMax)}.X", [TbxCameraPathVolumeMaxX]),
($"{nameof(CameraPath.VolumeMax)}.Y", [TbxCameraPathVolumeMaxY]),
($"{nameof(CameraPath.VolumeMax)}.Z", [TbxCameraPathVolumeMaxZ]),
(nameof(CameraPath.AreaMinX), [TbxCameraPathAreaMinX]),
(nameof(CameraPath.AreaMinZ), [TbxCameraPathAreaMinZ]),
(nameof(CameraPath.AreaMaxX), [TbxCameraPathAreaMaxX]),
(nameof(CameraPath.AreaMaxZ), [TbxCameraPathAreaMaxZ]),
(nameof(CameraPath.Thing4), [MtbCameraPathThing4]),
(nameof(CameraPath.Thing5), [MtbCameraPathThing5]),
(nameof(CameraPath.Thing6), [MtbCameraPathThing6]),
(nameof(CameraPath.Pitch), [TbxCameraPathPitch]),
(nameof(CameraPath.Yaw), [TbxCameraPathYaw])];

List<(string, IList<Control>)> poiFontChangeMap = [
(nameof(PointOfInterest.X), [TbxSelectedPoiX]),
(nameof(PointOfInterest.Z), [TbxSelectedPoiZ]),
(nameof(PointOfInterest.Geometry), [
MtbSelectedPoiGeometry,
MtbSelectedTriggerPoiGeometry])];

List<(string, IList<Control>)> triggerFontChangeMap = [
(nameof(Trigger.Disabled), [CbxSelectedTriggerDisabled]),
(nameof(Trigger.Thing0), [MtbSelectedTriggerThing0]),
(nameof(Trigger.Thing1), [MtbSelectedTriggerThing1]),
(nameof(Trigger.FiredGroup), [
NudSelectedTriggerFiredGroup,
LblSelectedTriggerFiredDetails]),
(nameof(Trigger.Fired), [CbxSelectedTriggerFired]),
(nameof(Trigger.Thing2), [MtbSelectedTriggerThing2]),
(nameof(Trigger.Style), [CmbSelectedTriggerStyle]),
(nameof(Trigger.PoiIndex), [NudSelectedTriggerPoiIndex]),
(nameof(Trigger.Thing3), [MtbSelectedTriggerThing3]),
(nameof(Trigger.Thing4), [MtbSelectedTriggerThing4]),
(nameof(Trigger.TriggerType), [CmbSelectedTriggerType]),
(nameof(Trigger.TargetIndex), [NudSelectedTriggerTargetIndex]),
(nameof(Trigger.Thing5), [MtbSelectedTriggerThing5]),
(nameof(Trigger.Thing6), [MtbSelectedTriggerThing6]),
(nameof(Trigger.StageIndex), [NudSelectedTriggerStageIndex]),
(nameof(Trigger.SomeBool), [CbxSelectedTriggerSomeBool])];

_fontChangeMap.Clear();
_fontChangeMap.Add(typeof(CameraPath), cameraPathFontChangeMap);
_fontChangeMap.Add(typeof(PointOfInterest), poiFontChangeMap);
_fontChangeMap.Add(typeof(Trigger), triggerFontChangeMap);
}

private static object? GetMemberFromObject(object o, string name)
{
return GetMemberFromObject(o, name.Split('.'));
}
private static object? GetMemberFromObject(object o, Span<string> chain)
{
BindingFlags flags =
BindingFlags.Static |
BindingFlags.Instance |
BindingFlags.Public |
BindingFlags.NonPublic;

MemberInfo info = o
.GetType()
.GetMember(chain[0], flags)
.FirstOrDefault();

object? member = info.MemberType switch
{
MemberTypes.Field => ((FieldInfo)info).GetValue(o),
MemberTypes.Property => ((PropertyInfo)info).GetValue(o),
_ => throw new ArgumentException("Couldn't find member!", nameof(chain))
};

if (chain.Length > 1)
{
return GetMemberFromObject(member, chain.Slice(1));
}
else
{
return member;
}
}

private int _topBeforeP;
private int _topBeforeT;
private int _topBeforeA;
Expand Down Expand Up @@ -54,6 +148,43 @@ private void EndArrayUpdate()
LbxCameraPaths.EndUpdate();
}

private Font _fontDefaultValue = DefaultFont;
private Font _fontChangedValue = new(DefaultFont, FontStyle.Bold);
private void MakeBoldIfChanged(Control ctrl, SilentHillType changed, string name)
{
if (Guts.Stage is null)
{
return;
}

MainRamAddresses ram = Rom.Addresses.MainRam;
int ofs = (int)(changed.Address - ram.StageHeader);

ReadOnlySpan<byte> slice = Guts.Stage
.ToBytes()
.Slice(ofs, changed.SizeInBytes);

SilentHillType reset = changed switch
{
CameraPath => new CameraPath(changed.Address, slice),
PointOfInterest => new PointOfInterest(changed.Address, slice),
Trigger => new Trigger(changed.Address, slice),
_ => throw new ArgumentException("Unknown SilentHillType subclass!", nameof(changed))
};

object? memberC = GetMemberFromObject(changed, name);
object? memberR = GetMemberFromObject(reset, name);

if (memberC != null && memberR != null && memberC.Equals(memberR))
{
ctrl.Font = _fontDefaultValue;
}
else
{
ctrl.Font = _fontChangedValue;
}
}

private void HexMaskedTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
bool alphanumeric =
Expand Down
22 changes: 20 additions & 2 deletions src/SHME.ExternalTool/UI/PoisTab.cs
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,7 @@ private void BtnReadPois_Click(object sender, EventArgs e)
LblPoiCount.Text = count.ToString(CultureInfo.CurrentCulture);
NudSelectedTriggerTargetIndex.Maximum = count - 1;

var generator = new BoxGenerator(1.0f, Color.White);
BoxGenerator generator = new(1.0f, Color.White);

Guts.Pois.Clear();
LbxPois.Items.Clear();
Expand Down Expand Up @@ -509,6 +509,15 @@ private void LbxPois_SelectedIndexChanged(object sender, EventArgs e)
TbxSelectedPoiZ.Text = poi.Z.ToString("0.##", c);
MtbSelectedPoiGeometry.Text = $"0x{poi.Geometry.ToString("X8", c)}";

IList<(string, IList<Control>)> map = _fontChangeMap[typeof(PointOfInterest)];
foreach ((string property, IList<Control> controls) in map)
{
foreach (Control control in controls)
{
MakeBoldIfChanged(control, poi, property);
}
}

RefreshLbxPoiAssociatedTriggers();

IEnumerable<Trigger>? associated = LbxTriggers.Items
Expand Down Expand Up @@ -628,9 +637,9 @@ private void LbxTriggers_SelectedIndexChanged(object sender, EventArgs e)
CultureInfo c = CultureInfo.CurrentCulture;

LblSelectedTriggerAddress.Text = $"0x{t.Address.ToString("X", c)}";
MtbSelectedTriggerThing0.Text = $"0x{t.Thing0.ToString("X2", c)}";
CbxSelectedTriggerDisabled.Checked = t.Disabled;
CbxSelectedTriggerDisabled.Enabled = true;
MtbSelectedTriggerThing0.Text = $"0x{t.Thing0.ToString("X2", c)}";
MtbSelectedTriggerThing1.Text = $"0x{t.Thing1.ToString("X2", c)}";
NudSelectedTriggerFiredGroup.Value = t.FiredGroup;
MtbSelectedTriggerThing2.Text = $"0x{t.Thing2.ToString("X1", c)}";
Expand Down Expand Up @@ -737,6 +746,15 @@ private void LbxTriggers_SelectedIndexChanged(object sender, EventArgs e)
{
LbxPoiAssociatedTriggers.SelectedItem = LbxTriggers.SelectedItem;
}

IList<(string, IList<Control>)> map = _fontChangeMap[typeof(Trigger)];
foreach ((string property, IList<Control> controls) in map)
{
foreach (Control control in controls)
{
MakeBoldIfChanged(control, t, property);
}
}
}

private void RdoOverlayAxisColors_CheckedChanged(object sender, EventArgs e)
Expand Down

0 comments on commit 2f38a1d

Please sign in to comment.