Graphing/Base/Forms/SetZoomForm.cs

102 lines
3.0 KiB
C#

using System;
using System.Windows.Forms;
namespace Graphing.Forms;
public partial class SetZoomForm : Form
{
private readonly GraphForm refForm;
private bool boxSelectEnabled;
public SetZoomForm(GraphForm refForm)
{
InitializeComponent();
this.refForm = refForm;
refForm.Paint += (o, e) => RedeclareValues();
RedeclareValues();
}
private void EnableBoxSelect_Click(object? sender, EventArgs e)
{
boxSelectEnabled = !boxSelectEnabled;
refForm.canBoxSelect = boxSelectEnabled;
if (boxSelectEnabled)
{
EnableBoxSelect.Text = $"Cancel ...";
refForm.Focus();
}
else
{
EnableBoxSelect.Text = "Box Select";
}
}
private void MatchAspectButton_Click(object? sender, EventArgs e)
{
double zoomXFactor = refForm.ZoomLevel.x / refForm.ZoomLevel.y;
double actualXFactor = refForm.ClientRectangle.Width / refForm.ClientRectangle.Height;
double diff = actualXFactor / zoomXFactor;
int newWidth = (int)(refForm.Width / diff);
refForm.ZoomLevel = new(refForm.ZoomLevel.x * diff, refForm.ZoomLevel.y);
int maxScreenWidth = Screen.FromControl(refForm).WorkingArea.Width;
if (newWidth >= maxScreenWidth)
{
refForm.Location = new(0, refForm.Location.Y);
double xScaleFactor = (double)maxScreenWidth / newWidth;
newWidth = maxScreenWidth;
refForm.Height = (int)(refForm.Height * xScaleFactor);
refForm.ZoomLevel = new(refForm.ZoomLevel.x * xScaleFactor, refForm.ZoomLevel.y * xScaleFactor);
}
refForm.Width = newWidth;
}
private void NormalizeButton_Click(object? sender, EventArgs e)
{
double factor = 1 / Math.Min(refForm.ZoomLevel.x, refForm.ZoomLevel.y);
refForm.ZoomLevel = new(factor * refForm.ZoomLevel.x, factor * refForm.ZoomLevel.y);
}
private void ResetButton_Click(object? sender, EventArgs e)
{
refForm.ResetAllViewport();
}
private void RedeclareValues()
{
bool enabled = !refForm.ViewportLocked;
Float2 minGraph = refForm.MinVisibleGraph,
maxGraph = refForm.MaxVisibleGraph;
MinBoxX.Text = $"{minGraph.x:0.000}";
MaxBoxX.Text = $"{maxGraph.x:0.000}";
MinBoxY.Text = $"{minGraph.y:0.000}";
MaxBoxY.Text = $"{maxGraph.y:0.000}";
ViewportLock.Checked = !enabled;
EnableBoxSelect.Enabled = enabled;
MatchAspectButton.Enabled = enabled;
NormalizeButton.Enabled = enabled;
ResetButton.Enabled = enabled;
MinBoxX.Enabled = enabled;
MaxBoxX.Enabled = enabled;
MinBoxY.Enabled = enabled;
MaxBoxY.Enabled = enabled;
}
internal void CompleteBoxSelection()
{
if (boxSelectEnabled) EnableBoxSelect_Click(null, new());
}
private void ViewportLock_CheckedChanged(object? sender, EventArgs e)
{
refForm.ViewportLocked = ViewportLock.Checked;
RedeclareValues();
}
}