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 string Format { get; set; } = "suzumagnifier";
public bool ReadOnly { get; set; } = false;
public bool AutoStart { get; set; }
public bool HighQuality { get; set; }
@ -16,10 +21,9 @@
public int CrosshairSize { get; set; }
public Color CrosshairColour { get; set; }
public string? CrosshairColour { get; set; }
public bool ShowAlwaysOnTop { get; set; }
}
}

View File

@ -44,8 +44,6 @@
toolStripSeparator3 = new ToolStripSeparator();
resetToolStripMenuItem = new ToolStripMenuItem();
toolStripMenuItem9 = new ToolStripMenuItem();
showToolStripMenuItem = new ToolStripMenuItem();
toolStripSeparator5 = new ToolStripSeparator();
sizeToolStripMenuItem = new ToolStripMenuItem();
smallToolStripMenuItem = new ToolStripMenuItem();
mediumToolStripMenuItem = new ToolStripMenuItem();
@ -67,6 +65,8 @@
aboutToolStripMenuItem = new ToolStripMenuItem();
toolStripSeparator6 = new ToolStripSeparator();
exitiToolStripMenuItem = new ToolStripMenuItem();
toolStripMenuItem11 = new ToolStripMenuItem();
toolStripSeparator7 = new ToolStripSeparator();
contextMenuStrip1.SuspendLayout();
SuspendLayout();
//
@ -115,14 +115,14 @@
// fasterToolStripMenuItem
//
fasterToolStripMenuItem.Name = "fasterToolStripMenuItem";
fasterToolStripMenuItem.Size = new Size(180, 22);
fasterToolStripMenuItem.Size = new Size(100, 22);
fasterToolStripMenuItem.Text = "&Fast";
fasterToolStripMenuItem.Click += fastToolStripMenuItem_Click;
//
// highToolStripMenuItem
//
highToolStripMenuItem.Name = "highToolStripMenuItem";
highToolStripMenuItem.Size = new Size(180, 22);
highToolStripMenuItem.Size = new Size(100, 22);
highToolStripMenuItem.Text = "&High";
highToolStripMenuItem.Click += highToolStripMenuItem_Click;
//
@ -165,27 +165,15 @@
//
// toolStripMenuItem9
//
toolStripMenuItem9.DropDownItems.AddRange(new ToolStripItem[] { showToolStripMenuItem, toolStripSeparator5, sizeToolStripMenuItem, colourToolStripMenuItem });
toolStripMenuItem9.DropDownItems.AddRange(new ToolStripItem[] { sizeToolStripMenuItem, colourToolStripMenuItem });
toolStripMenuItem9.Image = Resource1.crosshair;
toolStripMenuItem9.Name = "toolStripMenuItem9";
toolStripMenuItem9.Size = new Size(204, 22);
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.DropDownItems.AddRange(new ToolStripItem[] { smallToolStripMenuItem, mediumToolStripMenuItem, largeToolStripMenuItem });
sizeToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { toolStripMenuItem11, toolStripSeparator7, smallToolStripMenuItem, mediumToolStripMenuItem, largeToolStripMenuItem });
sizeToolStripMenuItem.Name = "sizeToolStripMenuItem";
sizeToolStripMenuItem.Size = new Size(180, 22);
sizeToolStripMenuItem.Text = "Size";
@ -329,6 +317,18 @@
exitiToolStripMenuItem.Text = "E&xit";
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
//
AutoScaleDimensions = new SizeF(96F, 96F);
@ -364,10 +364,8 @@
private ToolStripMenuItem resetToolStripMenuItem;
private ToolStripSeparator toolStripSeparator4;
private ToolStripMenuItem toolStripMenuItem9;
private ToolStripMenuItem showToolStripMenuItem;
private ToolStripMenuItem sizeToolStripMenuItem;
private ToolStripMenuItem colourToolStripMenuItem;
private ToolStripSeparator toolStripSeparator5;
private ToolStripMenuItem smallToolStripMenuItem;
private ToolStripMenuItem mediumToolStripMenuItem;
private ToolStripMenuItem largeToolStripMenuItem;
@ -382,5 +380,7 @@
private ToolStripMenuItem viewHelpToolStripMenuItem;
private ToolStripMenuItem aboutToolStripMenuItem;
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 Bitmap? _bitmap;
private string jsonfigFilename;
private string _jsonfigFilename;
public Form1()
@ -53,27 +53,31 @@ namespace SuzuMagnifier
var args = GetCommandLine()!;
jsonfigFilename = args.Where(x => (x.Key.Equals("o") || x.Key.Equals("open"))).Select(x => x.Value).FirstOrDefault();
if (string.IsNullOrWhiteSpace(jsonfigFilename))
_jsonfigFilename = args.Where(x => (x.Key.Equals("o") || x.Key.Equals("open"))).Select(x => x.Value).FirstOrDefault();
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);
if (newSettings == null)
this.SavedOptions = await LoadSettings(_jsonfigFilename);
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;
this.HighQuality = newSettings.HighQuality;
this.ZoomFactor = newSettings.ZoomFactor;
//this.UpdateFrequency = newSettings.UpdateFrequency;
this.ShowCrosshair = newSettings.ShowCrosshair;
this.CrosshairSize = newSettings.CrosshairSize;
this.CrosshairColour = newSettings.CrosshairColour;
if (this.SavedOptions!.AutoStart)
{
_timer.Start();
}
}
}
@ -116,7 +120,7 @@ namespace SuzuMagnifier
g.DrawImage(_bitmap, this.ClientRectangle);
// Draw center crosshair
if (this.ShowCrosshair)
if (this.CrosshairSize > 0)
{
var cx = Divide(this.Width, 2);
var cy = Divide(this.Height, 2);
@ -181,10 +185,15 @@ namespace SuzuMagnifier
{
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);
if (result == DialogResult.Yes)
{
var result2 = await SaveSettings(jsonfigFilename);
var result2 = await SaveSettings(_jsonfigFilename);
if (result2)
{
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)]
public bool HighQuality { get; set; } = false;
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int ZoomFactor
{
get => field;
set
{
if (value < 0)
{
field = 1;
return;
}
if (value > 20)
{
field = 20;
return;
}
field = value;
}
} = 2;
public int ZoomFactor { get => field; set => field = Math.Clamp(value, 1, 20); } = 2;
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int UpdateFrequency { get; set; } = 33;
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool ShowCrosshair { get; set; } = true;
[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;
public int CrosshairSize { get => field; set => field = Math.Clamp(value, 0, 200); } = 20;
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Color CrosshairColour { get; set; } = Color.FromArgb(255, 255, 0);
@ -269,18 +240,20 @@ namespace SuzuMagnifier
toolStripMenuItem5.Checked = this.TopMost;
showToolStripMenuItem.Checked = this.ShowCrosshair;
toolStripMenuItem11.Checked = (this.CrosshairSize == 0);
smallToolStripMenuItem.Checked = (this.CrosshairSize == 10);
mediumToolStripMenuItem.Checked = (this.CrosshairSize == 20);
largeToolStripMenuItem.Checked = (this.CrosshairSize == 50);
agentaToolStripMenuItem.Checked = this.CrosshairColour == Color.FromArgb(255, 0, 255);
cyanToolStripMenuItem.Checked = this.CrosshairColour == Color.FromArgb(0, 255, 255);
yellowToolStripMenuItem.Checked = this.CrosshairColour == Color.FromArgb(255, 255, 0);
greenToolStripMenuItem.Checked = this.CrosshairColour == Color.FromArgb(0, 255, 0);
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);
resetToolStripMenuItem.Checked = (this.ZoomFactor == 1);
agentaToolStripMenuItem.Checked = (this.CrosshairColour == Color.FromArgb(255, 0, 255));
cyanToolStripMenuItem.Checked = (this.CrosshairColour == Color.FromArgb(0, 255, 255));
yellowToolStripMenuItem.Checked = (this.CrosshairColour == Color.FromArgb(255, 255, 0));
greenToolStripMenuItem.Checked = (this.CrosshairColour == Color.FromArgb(0, 255, 0));
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.Enabled = this.HighQuality;
@ -525,17 +498,17 @@ namespace SuzuMagnifier
}
/// <summary>
/// Crosshair, toggle
/// Crosshair, size, off
/// </summary>
/// <param name="sender"></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>
/// Croisshair, size, small
/// Crosshair, size, small
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
@ -545,7 +518,7 @@ namespace SuzuMagnifier
}
/// <summary>
/// Croisshair, size, medium
/// Crosshair, size, medium
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
@ -555,7 +528,7 @@ namespace SuzuMagnifier
}
/// <summary>
/// Croisshair, size, large
/// Crosshair, size, large
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
@ -662,32 +635,38 @@ namespace SuzuMagnifier
return null;
}
SavedOptions response;
try
{
return System.Text.Json.JsonSerializer.Deserialize<SavedOptions>(sourceCode);
response = System.Text.Json.JsonSerializer.Deserialize<SavedOptions>(sourceCode);
}
catch (Exception)
{
return null;
}
if (!response!.Format.Equals(Resource1.FileFormat, StringComparison.CurrentCultureIgnoreCase))
{
return null;
}
return response;
}
private async Task<bool> SaveSettings(string filename)
{
var result = new SavedOptions();
result.AutoStart = false;
result.HighQuality = this.HighQuality;
result.ZoomFactor = this.ZoomFactor;
result.UpdateFrequency = this.UpdateFrequency;
result.ShowCrosshair = this.ShowCrosshair;
result.CrosshairSize = this.CrosshairSize;
result.CrosshairColour = this.CrosshairColour;
result.ShowAlwaysOnTop = this.TopMost;
//_savedOptions.AutoStart = false;
this.SavedOptions.HighQuality = this.HighQuality;
this.SavedOptions.ZoomFactor = this.ZoomFactor;
this.SavedOptions.UpdateFrequency = this.UpdateFrequency;
this.SavedOptions.CrosshairSize = this.CrosshairSize;
this.SavedOptions.CrosshairColour = $"#{this.CrosshairColour.R:X2}{this.CrosshairColour.G:X2}{this.CrosshairColour.B:X2}";
this.SavedOptions.ShowAlwaysOnTop = this.TopMost;
string sourceCode = "";
try
{
sourceCode = System.Text.Json.JsonSerializer.Serialize(result);
sourceCode = System.Text.Json.JsonSerializer.Serialize(this.SavedOptions);
}
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>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>

View File

@ -124,6 +124,9 @@
<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>
</data>
<data name="FileFormat" xml:space="preserve">
<value>suzumagnifier</value>
</data>
<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>
</data>

View File

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