Skip to content

Commit 6d6be5d

Browse files
committed
refactor help icon logic to use type-checked tuples
1 parent a27e06d commit 6d6be5d

File tree

1 file changed

+67
-61
lines changed

1 file changed

+67
-61
lines changed

Source/Menu/Options.cs

Lines changed: 67 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ public OptionsForm(UserSettings settings, UpdateManager updateManager, bool init
6767
Settings = settings;
6868
UpdateManager = updateManager;
6969

70+
InitializeHelpIcons();
71+
7072
// Collect all the available language codes by searching for
7173
// localisation files, but always include English (base language).
7274
var languageCodes = new List<string> { "en" };
@@ -795,6 +797,67 @@ private void checkPerformanceTuner_Click(object sender, EventArgs e)
795797

796798

797799
#region Help for General Options
800+
/// <summary>
801+
/// Allows multiple controls to change a single help icon with their hover events.
802+
/// </summary>
803+
private class HelpIconHover
804+
{
805+
private readonly PictureBox Icon;
806+
private int HoverCount = 0;
807+
808+
public HelpIconHover(PictureBox pb)
809+
{
810+
Icon = pb;
811+
}
812+
813+
public void Enter()
814+
{
815+
HoverCount++;
816+
SetImage();
817+
}
818+
819+
public void Leave()
820+
{
821+
HoverCount--;
822+
SetImage();
823+
}
824+
825+
private void SetImage()
826+
{
827+
Icon.Image = HoverCount > 0 ? Properties.Resources.info_18_hover : Properties.Resources.info_18;
828+
}
829+
}
830+
831+
private readonly IDictionary<Control, HelpIconHover> ToHelpIcon = new Dictionary<Control, HelpIconHover>();
832+
833+
private void InitializeHelpIcons()
834+
{
835+
// static mapping of picture boxes to controls
836+
var helpIconControls = new (PictureBox, Control[])[]
837+
{
838+
(pbAlerter, new[] { checkAlerter }),
839+
(pbControlConfirmations, new[] { checkControlConfirmations }),
840+
(pbMapWindow, new[] { checkViewMapWindow }),
841+
(pbLAA, new[] { checkUseLargeAddressAware }),
842+
(pbRetainers, new[] { checkRetainers }),
843+
(pbGraduatedRelease, new[] { checkGraduatedRelease }),
844+
(pbBrakePipeChargingRate, new[] { lBrakePipeChargingRate }),
845+
(pbLanguage, new Control[] { labelLanguage, comboLanguage }),
846+
(pbPressureUnit, new Control[] { labelPressureUnit, comboPressureUnit }),
847+
(pbOtherUnits, new Control[] { labelOtherUnits, comboOtherUnits }),
848+
(pbDisableTcsScripts, new[] { checkDisableTCSScripts }),
849+
(pbEnableWebServer, new[] { checkEnableWebServer }),
850+
(pbOverspeedMonitor, new[] { checkOverspeedMonitor }),
851+
};
852+
foreach ((PictureBox pb, Control[] controls) in helpIconControls)
853+
{
854+
var hover = new HelpIconHover(pb);
855+
ToHelpIcon[pb] = hover;
856+
foreach (Control control in controls)
857+
ToHelpIcon[control] = hover;
858+
}
859+
}
860+
798861
/// <summary>
799862
/// Loads a relevant page from the manual maintained by James Ross's automatic build.
800863
/// </summary>
@@ -877,71 +940,14 @@ private void HelpIcon_Click(object sender, EventArgs _)
877940
/// <param name="_"></param>
878941
private void HelpIcon_MouseEnter(object sender, EventArgs _)
879942
{
880-
if (sender is PictureBox pb)
881-
pb.Image = Properties.Resources.info_18_hover;
882-
else
883-
{
884-
EnterHelp(sender, "checkAlerter", "pbAlerter");
885-
EnterHelp(sender, "checkControlConfirmations", "pbControlConfirmations");
886-
EnterHelp(sender, "checkViewMapWindow", "pbMapWindow");
887-
EnterHelp(sender, "checkUseLargeAddressAware", "pbLAA");
888-
EnterHelp(sender, "checkRetainers", "pbRetainers");
889-
EnterHelp(sender, "checkGraduatedRelease", "pbGraduatedRelease");
890-
EnterHelp(sender, "lBrakePipeChargingRate", "pbBrakePipeChargingRate");
891-
EnterHelp(sender, "labelLanguage", "pbLanguage");
892-
EnterHelp(sender, "comboLanguage", "pbLanguage");
893-
EnterHelp(sender, "labelPressureUnit", "pbPressureUnit");
894-
EnterHelp(sender, "comboPressureUnit", "pbPressureUnit");
895-
EnterHelp(sender, "labelOtherUnits", "pbOtherUnits");
896-
EnterHelp(sender, "comboOtherUnits", "pbOtherUnits");
897-
EnterHelp(sender, "checkDisableTCSScripts", "pbDisableTcsScripts");
898-
EnterHelp(sender, "checkEnableWebServer", "pbEnableWebServer");
899-
EnterHelp(sender, "checkOverspeedMonitor", "pbOverspeedMonitor");
900-
}
943+
if (sender is Control control && ToHelpIcon.TryGetValue(control, out var hover))
944+
hover.Enter();
901945
}
902946

903947
private void HelpIcon_MouseLeave(object sender, EventArgs _)
904948
{
905-
if (sender is PictureBox pb)
906-
pb.Image = Properties.Resources.info_18;
907-
else
908-
{
909-
LeaveHelp(sender, "checkAlerter", "pbAlerter");
910-
LeaveHelp(sender, "checkControlConfirmations", "pbControlConfirmations");
911-
LeaveHelp(sender, "checkViewMapWindow", "pbMapWindow");
912-
LeaveHelp(sender, "checkUseLargeAddressAware", "pbLAA");
913-
LeaveHelp(sender, "checkRetainers", "pbRetainers");
914-
LeaveHelp(sender, "checkGraduatedRelease", "pbGraduatedRelease");
915-
LeaveHelp(sender, "lBrakePipeChargingRate", "pbBrakePipeChargingRate");
916-
LeaveHelp(sender, "comboLanguage", "pbLanguage");
917-
LeaveHelp(sender, "labelPressureUnit", "pbPressureUnit");
918-
LeaveHelp(sender, "comboPressureUnit", "pbPressureUnit");
919-
LeaveHelp(sender, "labelOtherUnits", "pbOtherUnits");
920-
LeaveHelp(sender, "comboOtherUnits", "pbOtherUnits");
921-
LeaveHelp(sender, "checkDisableTCSScripts", "pbDisableTcsScripts");
922-
LeaveHelp(sender, "checkEnableWebServer", "pbEnableWebServer");
923-
LeaveHelp(sender, "checkOverspeedMonitor", "pbOverspeedMonitor");
924-
}
925-
}
926-
927-
private void EnterHelp(object sender, string controlName, string iconName)
928-
{
929-
if (sender is Control control && control.Name == controlName)
930-
{
931-
var iconArray = Controls.Find(iconName, true);
932-
if (iconArray[0] is PictureBox pb2)
933-
pb2.Image = Properties.Resources.info_18_hover;
934-
}
935-
}
936-
937-
private void LeaveHelp(object sender, string controlName, string iconName)
938-
{
939-
if (sender is Control control && control.Name == controlName)
940-
{
941-
var iconArray = Controls.Find(iconName, true);
942-
if (iconArray[0] is PictureBox pb2)
943-
pb2.Image = Properties.Resources.info_18;
944-
}
949+
if (sender is Control control && ToHelpIcon.TryGetValue(control, out var hover))
950+
hover.Leave();
945951
}
946952
#endregion
947953
}

0 commit comments

Comments
 (0)