Added format type to save options

Changed crosshair size to be used instead of show
Added readonly config file support
This commit is contained in:
Ray 2026-06-28 13:02:58 +01:00
parent a382ab8dad
commit 5fa20668db
6 changed files with 105 additions and 110 deletions

View File

@ -4,6 +4,11 @@
{ {
public int Version { get; set; } = 1; public int Version { get; set; } = 1;
public string Format { get; set; } = "suzumagnifier";
public bool ReadOnly { get; set; } = false;
public bool AutoStart { get; set; } public bool AutoStart { get; set; }
public bool HighQuality { get; set; } public bool HighQuality { get; set; }
@ -16,10 +21,9 @@
public int CrosshairSize { get; set; } public int CrosshairSize { get; set; }
public Color CrosshairColour { get; set; } public string? CrosshairColour { get; set; }
public bool ShowAlwaysOnTop { get; set; } public bool ShowAlwaysOnTop { get; set; }
} }
} }

View File

@ -44,8 +44,6 @@
toolStripSeparator3 = new ToolStripSeparator(); toolStripSeparator3 = new ToolStripSeparator();
resetToolStripMenuItem = new ToolStripMenuItem(); resetToolStripMenuItem = new ToolStripMenuItem();
toolStripMenuItem9 = new ToolStripMenuItem(); toolStripMenuItem9 = new ToolStripMenuItem();
showToolStripMenuItem = new ToolStripMenuItem();
toolStripSeparator5 = new ToolStripSeparator();
sizeToolStripMenuItem = new ToolStripMenuItem(); sizeToolStripMenuItem = new ToolStripMenuItem();
smallToolStripMenuItem = new ToolStripMenuItem(); smallToolStripMenuItem = new ToolStripMenuItem();
mediumToolStripMenuItem = new ToolStripMenuItem(); mediumToolStripMenuItem = new ToolStripMenuItem();
@ -67,6 +65,8 @@
aboutToolStripMenuItem = new ToolStripMenuItem(); aboutToolStripMenuItem = new ToolStripMenuItem();
toolStripSeparator6 = new ToolStripSeparator(); toolStripSeparator6 = new ToolStripSeparator();
exitiToolStripMenuItem = new ToolStripMenuItem(); exitiToolStripMenuItem = new ToolStripMenuItem();
toolStripMenuItem11 = new ToolStripMenuItem();
toolStripSeparator7 = new ToolStripSeparator();
contextMenuStrip1.SuspendLayout(); contextMenuStrip1.SuspendLayout();
SuspendLayout(); SuspendLayout();
// //
@ -115,14 +115,14 @@
// fasterToolStripMenuItem // fasterToolStripMenuItem
// //
fasterToolStripMenuItem.Name = "fasterToolStripMenuItem"; fasterToolStripMenuItem.Name = "fasterToolStripMenuItem";
fasterToolStripMenuItem.Size = new Size(180, 22); fasterToolStripMenuItem.Size = new Size(100, 22);
fasterToolStripMenuItem.Text = "&Fast"; fasterToolStripMenuItem.Text = "&Fast";
fasterToolStripMenuItem.Click += fastToolStripMenuItem_Click; fasterToolStripMenuItem.Click += fastToolStripMenuItem_Click;
// //
// highToolStripMenuItem // highToolStripMenuItem
// //
highToolStripMenuItem.Name = "highToolStripMenuItem"; highToolStripMenuItem.Name = "highToolStripMenuItem";
highToolStripMenuItem.Size = new Size(180, 22); highToolStripMenuItem.Size = new Size(100, 22);
highToolStripMenuItem.Text = "&High"; highToolStripMenuItem.Text = "&High";
highToolStripMenuItem.Click += highToolStripMenuItem_Click; highToolStripMenuItem.Click += highToolStripMenuItem_Click;
// //
@ -165,27 +165,15 @@
// //
// toolStripMenuItem9 // toolStripMenuItem9
// //
toolStripMenuItem9.DropDownItems.AddRange(new ToolStripItem[] { showToolStripMenuItem, toolStripSeparator5, sizeToolStripMenuItem, colourToolStripMenuItem }); toolStripMenuItem9.DropDownItems.AddRange(new ToolStripItem[] { sizeToolStripMenuItem, colourToolStripMenuItem });
toolStripMenuItem9.Image = Resource1.crosshair; toolStripMenuItem9.Image = Resource1.crosshair;
toolStripMenuItem9.Name = "toolStripMenuItem9"; toolStripMenuItem9.Name = "toolStripMenuItem9";
toolStripMenuItem9.Size = new Size(204, 22); toolStripMenuItem9.Size = new Size(204, 22);
toolStripMenuItem9.Text = "Crosshair"; toolStripMenuItem9.Text = "Crosshair";
// //
// showToolStripMenuItem
//
showToolStripMenuItem.Name = "showToolStripMenuItem";
showToolStripMenuItem.Size = new Size(180, 22);
showToolStripMenuItem.Text = "Show";
showToolStripMenuItem.Click += showToolStripMenuItem_Click;
//
// toolStripSeparator5
//
toolStripSeparator5.Name = "toolStripSeparator5";
toolStripSeparator5.Size = new Size(177, 6);
//
// sizeToolStripMenuItem // sizeToolStripMenuItem
// //
sizeToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { smallToolStripMenuItem, mediumToolStripMenuItem, largeToolStripMenuItem }); sizeToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { toolStripMenuItem11, toolStripSeparator7, smallToolStripMenuItem, mediumToolStripMenuItem, largeToolStripMenuItem });
sizeToolStripMenuItem.Name = "sizeToolStripMenuItem"; sizeToolStripMenuItem.Name = "sizeToolStripMenuItem";
sizeToolStripMenuItem.Size = new Size(180, 22); sizeToolStripMenuItem.Size = new Size(180, 22);
sizeToolStripMenuItem.Text = "Size"; sizeToolStripMenuItem.Text = "Size";
@ -329,6 +317,18 @@
exitiToolStripMenuItem.Text = "E&xit"; exitiToolStripMenuItem.Text = "E&xit";
exitiToolStripMenuItem.Click += exitiToolStripMenuItem_Click; exitiToolStripMenuItem.Click += exitiToolStripMenuItem_Click;
// //
// toolStripMenuItem11
//
toolStripMenuItem11.Name = "toolStripMenuItem11";
toolStripMenuItem11.Size = new Size(180, 22);
toolStripMenuItem11.Text = "None";
toolStripMenuItem11.Click += toolStripMenuItem11_Click;
//
// toolStripSeparator7
//
toolStripSeparator7.Name = "toolStripSeparator7";
toolStripSeparator7.Size = new Size(177, 6);
//
// Form1 // Form1
// //
AutoScaleDimensions = new SizeF(96F, 96F); AutoScaleDimensions = new SizeF(96F, 96F);
@ -364,10 +364,8 @@
private ToolStripMenuItem resetToolStripMenuItem; private ToolStripMenuItem resetToolStripMenuItem;
private ToolStripSeparator toolStripSeparator4; private ToolStripSeparator toolStripSeparator4;
private ToolStripMenuItem toolStripMenuItem9; private ToolStripMenuItem toolStripMenuItem9;
private ToolStripMenuItem showToolStripMenuItem;
private ToolStripMenuItem sizeToolStripMenuItem; private ToolStripMenuItem sizeToolStripMenuItem;
private ToolStripMenuItem colourToolStripMenuItem; private ToolStripMenuItem colourToolStripMenuItem;
private ToolStripSeparator toolStripSeparator5;
private ToolStripMenuItem smallToolStripMenuItem; private ToolStripMenuItem smallToolStripMenuItem;
private ToolStripMenuItem mediumToolStripMenuItem; private ToolStripMenuItem mediumToolStripMenuItem;
private ToolStripMenuItem largeToolStripMenuItem; private ToolStripMenuItem largeToolStripMenuItem;
@ -382,5 +380,7 @@
private ToolStripMenuItem viewHelpToolStripMenuItem; private ToolStripMenuItem viewHelpToolStripMenuItem;
private ToolStripMenuItem aboutToolStripMenuItem; private ToolStripMenuItem aboutToolStripMenuItem;
private ToolStripSeparator toolStripSeparator6; private ToolStripSeparator toolStripSeparator6;
private ToolStripMenuItem toolStripMenuItem11;
private ToolStripSeparator toolStripSeparator7;
} }
} }

View File

@ -28,7 +28,7 @@ namespace SuzuMagnifier
private readonly System.Windows.Forms.Timer _timer = new(); private readonly System.Windows.Forms.Timer _timer = new();
private Bitmap? _bitmap; private Bitmap? _bitmap;
private string jsonfigFilename; private string _jsonfigFilename;
public Form1() public Form1()
@ -53,27 +53,31 @@ namespace SuzuMagnifier
var args = GetCommandLine()!; var args = GetCommandLine()!;
jsonfigFilename = args.Where(x => (x.Key.Equals("o") || x.Key.Equals("open"))).Select(x => x.Value).FirstOrDefault(); _jsonfigFilename = args.Where(x => (x.Key.Equals("o") || x.Key.Equals("open"))).Select(x => x.Value).FirstOrDefault();
if (string.IsNullOrWhiteSpace(jsonfigFilename)) if (string.IsNullOrWhiteSpace(_jsonfigFilename))
{ {
jsonfigFilename = Path.ChangeExtension(Application.ExecutablePath, "jsonfig"); _jsonfigFilename = Path.ChangeExtension(Application.ExecutablePath, "jsonfig");
} }
if (System.IO.File.Exists(jsonfigFilename)) if (System.IO.File.Exists(_jsonfigFilename))
{ {
var newSettings = await LoadSettings(jsonfigFilename); this.SavedOptions = await LoadSettings(_jsonfigFilename);
if (newSettings == null)
this.TopMost = this.SavedOptions!.ShowAlwaysOnTop;
this.HighQuality = this.SavedOptions.HighQuality;
this.ZoomFactor = this.SavedOptions.ZoomFactor;
this.UpdateFrequency = this.SavedOptions.UpdateFrequency;
this.CrosshairSize = this.SavedOptions.CrosshairSize;
if (!string.IsNullOrWhiteSpace(this.SavedOptions.CrosshairColour))
{ {
newSettings = new SavedOptions(); this.CrosshairColour = ColorTranslator.FromHtml(this.SavedOptions!.CrosshairColour);
} }
this.TopMost = newSettings.ShowAlwaysOnTop; if (this.SavedOptions!.AutoStart)
this.HighQuality = newSettings.HighQuality; {
this.ZoomFactor = newSettings.ZoomFactor; _timer.Start();
//this.UpdateFrequency = newSettings.UpdateFrequency; }
this.ShowCrosshair = newSettings.ShowCrosshair;
this.CrosshairSize = newSettings.CrosshairSize;
this.CrosshairColour = newSettings.CrosshairColour;
} }
} }
@ -116,7 +120,7 @@ namespace SuzuMagnifier
g.DrawImage(_bitmap, this.ClientRectangle); g.DrawImage(_bitmap, this.ClientRectangle);
// Draw center crosshair // Draw center crosshair
if (this.ShowCrosshair) if (this.CrosshairSize > 0)
{ {
var cx = Divide(this.Width, 2); var cx = Divide(this.Width, 2);
var cy = Divide(this.Height, 2); var cy = Divide(this.Height, 2);
@ -181,10 +185,15 @@ namespace SuzuMagnifier
{ {
base.OnFormClosing(e); base.OnFormClosing(e);
if (this.SavedOptions.ReadOnly)
{
return;
}
var result = MessageBox.Show("Do you want to save settings to file?", "Save Settings?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); var result = MessageBox.Show("Do you want to save settings to file?", "Save Settings?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (result == DialogResult.Yes) if (result == DialogResult.Yes)
{ {
var result2 = await SaveSettings(jsonfigFilename); var result2 = await SaveSettings(_jsonfigFilename);
if (result2) if (result2)
{ {
return; return;
@ -205,58 +214,20 @@ namespace SuzuMagnifier
} }
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public SavedOptions SavedOptions { get => field ?? new SavedOptions(); private set => field = value; }
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool HighQuality { get; set; } = false; public bool HighQuality { get; set; } = false;
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int ZoomFactor public int ZoomFactor { get => field; set => field = Math.Clamp(value, 1, 20); } = 2;
{
get => field;
set
{
if (value < 0)
{
field = 1;
return;
}
if (value > 20)
{
field = 20;
return;
}
field = value;
}
} = 2;
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int UpdateFrequency { get; set; } = 33; public int UpdateFrequency { get; set; } = 33;
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool ShowCrosshair { get; set; } = true; public int CrosshairSize { get => field; set => field = Math.Clamp(value, 0, 200); } = 20;
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int CrosshairSize
{
get => field;
set
{
if (value < 5)
{
field = 5;
return;
}
if (value > 200)
{
field = 200;
return;
}
field = value;
}
} = 20;
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Color CrosshairColour { get; set; } = Color.FromArgb(255, 255, 0); public Color CrosshairColour { get; set; } = Color.FromArgb(255, 255, 0);
@ -269,18 +240,20 @@ namespace SuzuMagnifier
toolStripMenuItem5.Checked = this.TopMost; toolStripMenuItem5.Checked = this.TopMost;
showToolStripMenuItem.Checked = this.ShowCrosshair; toolStripMenuItem11.Checked = (this.CrosshairSize == 0);
smallToolStripMenuItem.Checked = (this.CrosshairSize == 10); smallToolStripMenuItem.Checked = (this.CrosshairSize == 10);
mediumToolStripMenuItem.Checked = (this.CrosshairSize == 20); mediumToolStripMenuItem.Checked = (this.CrosshairSize == 20);
largeToolStripMenuItem.Checked = (this.CrosshairSize == 50); largeToolStripMenuItem.Checked = (this.CrosshairSize == 50);
agentaToolStripMenuItem.Checked = this.CrosshairColour == Color.FromArgb(255, 0, 255); resetToolStripMenuItem.Checked = (this.ZoomFactor == 1);
cyanToolStripMenuItem.Checked = this.CrosshairColour == Color.FromArgb(0, 255, 255);
yellowToolStripMenuItem.Checked = this.CrosshairColour == Color.FromArgb(255, 255, 0); agentaToolStripMenuItem.Checked = (this.CrosshairColour == Color.FromArgb(255, 0, 255));
greenToolStripMenuItem.Checked = this.CrosshairColour == Color.FromArgb(0, 255, 0); cyanToolStripMenuItem.Checked = (this.CrosshairColour == Color.FromArgb(0, 255, 255));
redToolStripMenuItem.Checked = this.CrosshairColour == Color.FromArgb(255, 0, 0); yellowToolStripMenuItem.Checked = (this.CrosshairColour == Color.FromArgb(255, 255, 0));
blackToolStripMenuItem.Checked = this.CrosshairColour == Color.FromArgb(0, 0, 0); greenToolStripMenuItem.Checked = (this.CrosshairColour == Color.FromArgb(0, 255, 0));
whiteToolStripMenuItem.Checked = this.CrosshairColour == Color.FromArgb(255, 255, 255); redToolStripMenuItem.Checked = (this.CrosshairColour == Color.FromArgb(255, 0, 0));
blackToolStripMenuItem.Checked = (this.CrosshairColour == Color.FromArgb(0, 0, 0));
whiteToolStripMenuItem.Checked = (this.CrosshairColour == Color.FromArgb(255, 255, 255));
fasterToolStripMenuItem.Checked = !this.HighQuality; fasterToolStripMenuItem.Checked = !this.HighQuality;
fasterToolStripMenuItem.Enabled = this.HighQuality; fasterToolStripMenuItem.Enabled = this.HighQuality;
@ -525,17 +498,17 @@ namespace SuzuMagnifier
} }
/// <summary> /// <summary>
/// Crosshair, toggle /// Crosshair, size, off
/// </summary> /// </summary>
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
private void showToolStripMenuItem_Click(object sender, EventArgs e) private void toolStripMenuItem11_Click(object sender, EventArgs e)
{ {
this.ShowCrosshair = !this.ShowCrosshair; this.CrosshairSize = 0;
} }
/// <summary> /// <summary>
/// Croisshair, size, small /// Crosshair, size, small
/// </summary> /// </summary>
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
@ -545,7 +518,7 @@ namespace SuzuMagnifier
} }
/// <summary> /// <summary>
/// Croisshair, size, medium /// Crosshair, size, medium
/// </summary> /// </summary>
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
@ -555,7 +528,7 @@ namespace SuzuMagnifier
} }
/// <summary> /// <summary>
/// Croisshair, size, large /// Crosshair, size, large
/// </summary> /// </summary>
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
@ -662,32 +635,38 @@ namespace SuzuMagnifier
return null; return null;
} }
SavedOptions response;
try try
{ {
return System.Text.Json.JsonSerializer.Deserialize<SavedOptions>(sourceCode); response = System.Text.Json.JsonSerializer.Deserialize<SavedOptions>(sourceCode);
} }
catch (Exception) catch (Exception)
{ {
return null; return null;
} }
if (!response!.Format.Equals(Resource1.FileFormat, StringComparison.CurrentCultureIgnoreCase))
{
return null;
}
return response;
} }
private async Task<bool> SaveSettings(string filename) private async Task<bool> SaveSettings(string filename)
{ {
var result = new SavedOptions(); //_savedOptions.AutoStart = false;
result.AutoStart = false; this.SavedOptions.HighQuality = this.HighQuality;
result.HighQuality = this.HighQuality; this.SavedOptions.ZoomFactor = this.ZoomFactor;
result.ZoomFactor = this.ZoomFactor; this.SavedOptions.UpdateFrequency = this.UpdateFrequency;
result.UpdateFrequency = this.UpdateFrequency; this.SavedOptions.CrosshairSize = this.CrosshairSize;
result.ShowCrosshair = this.ShowCrosshair; this.SavedOptions.CrosshairColour = $"#{this.CrosshairColour.R:X2}{this.CrosshairColour.G:X2}{this.CrosshairColour.B:X2}";
result.CrosshairSize = this.CrosshairSize; this.SavedOptions.ShowAlwaysOnTop = this.TopMost;
result.CrosshairColour = this.CrosshairColour;
result.ShowAlwaysOnTop = this.TopMost;
string sourceCode = ""; string sourceCode = "";
try try
{ {
sourceCode = System.Text.Json.JsonSerializer.Serialize(result); sourceCode = System.Text.Json.JsonSerializer.Serialize(this.SavedOptions);
} }
catch (Exception) catch (Exception)
{ {

View File

@ -79,6 +79,15 @@ namespace SuzuMagnifier {
} }
} }
/// <summary>
/// Looks up a localized string similar to suzumagnifier.
/// </summary>
internal static string FileFormat {
get {
return ResourceManager.GetString("FileFormat", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap. /// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary> /// </summary>

View File

@ -124,6 +124,9 @@
<data name="crosshair" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="crosshair" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\crosshair.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>Resources\crosshair.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
<data name="FileFormat" xml:space="preserve">
<value>suzumagnifier</value>
</data>
<data name="fullscreen" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="fullscreen" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\fullscreen.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>Resources\fullscreen.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>

View File

@ -6,7 +6,7 @@
<UseWindowsForms>true</UseWindowsForms> <UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Title>Suzu Magnifier</Title> <Title>Suzu Magnifier</Title>
<Version>0.1.0.148</Version> <Version>0.1.0.202</Version>
<Product>Suzu Magnifier</Product> <Product>Suzu Magnifier</Product>
<Company>Hi, I'm Ray</Company> <Company>Hi, I'm Ray</Company>
<Authors>Ray Lam</Authors> <Authors>Ray Lam</Authors>
@ -15,11 +15,11 @@
<NoWin32Manifest>true</NoWin32Manifest> <NoWin32Manifest>true</NoWin32Manifest>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>none</DebugType> <DebugType>full</DebugType>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DebugType>none</DebugType> <DebugType>full</DebugType>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>