HexEditor - HexLabelEx control that will paint multiple colours within a Label
This commit is contained in:
parent
90287b3396
commit
d0411b5ee1
|
@ -89,7 +89,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
this.MemoryViewerBox = new System.Windows.Forms.GroupBox();
|
this.MemoryViewerBox = new System.Windows.Forms.GroupBox();
|
||||||
this.HexScrollBar = new System.Windows.Forms.VScrollBar();
|
this.HexScrollBar = new System.Windows.Forms.VScrollBar();
|
||||||
this.AddressLabel = new BizHawk.WinForms.Controls.LocLabelEx();
|
this.AddressLabel = new BizHawk.WinForms.Controls.LocLabelEx();
|
||||||
this.AddressesLabel = new BizHawk.WinForms.Controls.LocLabelEx();
|
this.AddressesLabel = new BizHawk.WinForms.Controls.HexLabelEx();
|
||||||
this.Header = new BizHawk.WinForms.Controls.LocLabelEx();
|
this.Header = new BizHawk.WinForms.Controls.LocLabelEx();
|
||||||
this.HexMenuStrip.SuspendLayout();
|
this.HexMenuStrip.SuspendLayout();
|
||||||
this.ViewerContextMenuStrip.SuspendLayout();
|
this.ViewerContextMenuStrip.SuspendLayout();
|
||||||
|
@ -454,6 +454,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
this.AddressesLabel.MouseLeave += new System.EventHandler(this.AddressesLabel_MouseLeave);
|
this.AddressesLabel.MouseLeave += new System.EventHandler(this.AddressesLabel_MouseLeave);
|
||||||
this.AddressesLabel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.AddressesLabel_MouseMove);
|
this.AddressesLabel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.AddressesLabel_MouseMove);
|
||||||
this.AddressesLabel.MouseUp += new System.Windows.Forms.MouseEventHandler(this.AddressesLabel_MouseUp);
|
this.AddressesLabel.MouseUp += new System.Windows.Forms.MouseEventHandler(this.AddressesLabel_MouseUp);
|
||||||
|
this.AddressesLabel.Paint += new System.Windows.Forms.PaintEventHandler(this.AddressesLabel_Paint);
|
||||||
//
|
//
|
||||||
// Header
|
// Header
|
||||||
//
|
//
|
||||||
|
@ -511,7 +512,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
private BizHawk.WinForms.Controls.ToolStripMenuItemEx AddToRamWatchMenuItem;
|
private BizHawk.WinForms.Controls.ToolStripMenuItemEx AddToRamWatchMenuItem;
|
||||||
private BizHawk.WinForms.Controls.ToolStripMenuItemEx FreezeAddressMenuItem;
|
private BizHawk.WinForms.Controls.ToolStripMenuItemEx FreezeAddressMenuItem;
|
||||||
public System.Windows.Forms.GroupBox MemoryViewerBox;
|
public System.Windows.Forms.GroupBox MemoryViewerBox;
|
||||||
private BizHawk.WinForms.Controls.LocLabelEx AddressesLabel;
|
private BizHawk.WinForms.Controls.HexLabelEx AddressesLabel;
|
||||||
private System.Windows.Forms.VScrollBar HexScrollBar;
|
private System.Windows.Forms.VScrollBar HexScrollBar;
|
||||||
private BizHawk.WinForms.Controls.ToolStripMenuItemEx UnfreezeAllMenuItem;
|
private BizHawk.WinForms.Controls.ToolStripMenuItemEx UnfreezeAllMenuItem;
|
||||||
private BizHawk.WinForms.Controls.ToolStripMenuItemEx UnfreezeAllContextItem;
|
private BizHawk.WinForms.Controls.ToolStripMenuItemEx UnfreezeAllContextItem;
|
||||||
|
|
|
@ -2055,6 +2055,54 @@ namespace BizHawk.Client.EmuHawk
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void AddressesLabel_Paint(object sender, PaintEventArgs e)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (sender is not Label label)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char gap = ' ';
|
||||||
|
|
||||||
|
//PointF point = new PointF(label.Location.X, label.Location.Y);
|
||||||
|
PointF point = new PointF(0, 0);
|
||||||
|
string text = label.Text;
|
||||||
|
Font font = label.Font;
|
||||||
|
|
||||||
|
string[] lines = text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
|
||||||
|
|
||||||
|
Color color = label.ForeColor;
|
||||||
|
|
||||||
|
foreach (string line in lines)
|
||||||
|
{
|
||||||
|
string[] words = line.Split(gap);
|
||||||
|
|
||||||
|
foreach (string word in words)
|
||||||
|
{
|
||||||
|
if (word == "00")
|
||||||
|
{
|
||||||
|
color = Color.SlateGray;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
color = label.ForeColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
SizeF size = e.Graphics.MeasureString(word, font);
|
||||||
|
|
||||||
|
using (Brush brush = new SolidBrush(color))
|
||||||
|
{
|
||||||
|
e.Graphics.DrawString(word, font, brush, point);
|
||||||
|
}
|
||||||
|
|
||||||
|
point.X += size.Width + e.Graphics.MeasureString(gap.ToString(), font).Width;
|
||||||
|
}
|
||||||
|
|
||||||
|
point.X = label.Location.X;
|
||||||
|
point.Y += e.Graphics.MeasureString(line, font).Height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void MemoryViewerBox_Paint(object sender, PaintEventArgs e)
|
private void MemoryViewerBox_Paint(object sender, PaintEventArgs e)
|
||||||
{
|
{
|
||||||
var activeCheats = MainForm.CheatList.Where(x => x.Enabled);
|
var activeCheats = MainForm.CheatList.Where(x => x.Enabled);
|
||||||
|
|
|
@ -10,4 +10,9 @@
|
||||||
<PackageReference Include="System.Drawing.Common" />
|
<PackageReference Include="System.Drawing.Common" />
|
||||||
<ProjectReference Include="$(ProjectDir)../BizHawk.Common/BizHawk.Common.csproj" />
|
<ProjectReference Include="$(ProjectDir)../BizHawk.Common/BizHawk.Common.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Update="LabelEx\HexLabelEx.cs">
|
||||||
|
<SubType>Component</SubType>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -0,0 +1,121 @@
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using BizHawk.Common;
|
||||||
|
|
||||||
|
|
||||||
|
namespace BizHawk.WinForms.Controls
|
||||||
|
{
|
||||||
|
/// <inheritdoc cref="Docs.LabelOrLinkLabel"/>
|
||||||
|
public class HexLabelEx : LabelExBase
|
||||||
|
{
|
||||||
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
||||||
|
public new bool AutoSize => base.AutoSize;
|
||||||
|
|
||||||
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
||||||
|
public new Size Size => base.Size;
|
||||||
|
|
||||||
|
public Color ZeroColor { get; set; } = Color.SlateGray;
|
||||||
|
|
||||||
|
private float spacingHexModifier;
|
||||||
|
private float spacingPreDivider;
|
||||||
|
private float spacingPostDividerModifier;
|
||||||
|
private float spacingAscii;
|
||||||
|
private float spacingLineModifier;
|
||||||
|
|
||||||
|
public HexLabelEx()
|
||||||
|
{
|
||||||
|
base.AutoSize = true;
|
||||||
|
this.BackColor = Color.Transparent;
|
||||||
|
|
||||||
|
spacingHexModifier = 0.7F;
|
||||||
|
spacingPreDivider = 3.0F;
|
||||||
|
spacingPostDividerModifier = 3.5F;
|
||||||
|
spacingAscii = 7.0F;
|
||||||
|
spacingLineModifier = 0.56F;
|
||||||
|
|
||||||
|
if (OSTailoredCode.IsUnixHost)
|
||||||
|
{
|
||||||
|
// TODO: spacing values will probably be different on linux
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnPaint(PaintEventArgs e)
|
||||||
|
{
|
||||||
|
string text = this.Text;
|
||||||
|
Font font = this.Font;
|
||||||
|
PointF point = new PointF(0, 0);
|
||||||
|
char gap = ' ';
|
||||||
|
|
||||||
|
string[] lines = text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
|
||||||
|
|
||||||
|
Color color00 = this.ForeColor;
|
||||||
|
Color color = this.ForeColor;
|
||||||
|
|
||||||
|
foreach (string line in lines)
|
||||||
|
{
|
||||||
|
// split left and right panes
|
||||||
|
string[] panes = line.Split('|');
|
||||||
|
|
||||||
|
if (panes.Length < 2)
|
||||||
|
{
|
||||||
|
// skip - last line appears to be empty
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// hex pane
|
||||||
|
string[] words = panes[0].Split(gap);
|
||||||
|
foreach (var word in words)
|
||||||
|
{
|
||||||
|
SizeF size = e.Graphics.MeasureString(word, font);
|
||||||
|
|
||||||
|
switch (word)
|
||||||
|
{
|
||||||
|
case "00":
|
||||||
|
color = ZeroColor;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
color = this.ForeColor;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
using (Brush brush = new SolidBrush(color))
|
||||||
|
{
|
||||||
|
e.Graphics.DrawString(word, font, brush, point);
|
||||||
|
}
|
||||||
|
|
||||||
|
point.X += size.Width + e.Graphics.MeasureString(gap.ToString(), font).Width + spacingHexModifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
// divider
|
||||||
|
string div = "|";
|
||||||
|
point.X -= spacingPreDivider;
|
||||||
|
SizeF sizeDiv = e.Graphics.MeasureString(div, font);
|
||||||
|
using (Brush brush = new SolidBrush(this.ForeColor))
|
||||||
|
{
|
||||||
|
e.Graphics.DrawString(div, font, brush, point);
|
||||||
|
}
|
||||||
|
|
||||||
|
point.X += e.Graphics.MeasureString(gap.ToString(), font).Width + spacingPostDividerModifier;
|
||||||
|
|
||||||
|
// ascii pane
|
||||||
|
char[] chars = panes[1].ToCharArray();
|
||||||
|
foreach (var c in chars)
|
||||||
|
{
|
||||||
|
string str = c.ToString();
|
||||||
|
|
||||||
|
using (Brush brush = new SolidBrush(this.ForeColor))
|
||||||
|
{
|
||||||
|
e.Graphics.DrawString(str, font, brush, point);
|
||||||
|
}
|
||||||
|
|
||||||
|
// fixed size
|
||||||
|
point.X += spacingAscii;
|
||||||
|
}
|
||||||
|
|
||||||
|
point.X = 0;
|
||||||
|
point.Y += e.Graphics.MeasureString(line, font).Height + spacingLineModifier;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue