diff --git a/Base/Forms/GraphForm.cs b/Base/Forms/GraphForm.cs index e4d22f5..211ea2c 100644 --- a/Base/Forms/GraphForm.cs +++ b/Base/Forms/GraphForm.cs @@ -35,6 +35,8 @@ public partial class GraphForm : Form { _zoomLevel = new(Math.Clamp(value.x, 1e-5, 1e3), Math.Clamp(value.y, 1e-5, 1e3)); + OnZoomLevelChanged(this, new()); + Invalidate(false); } } private Float2 _zoomLevel; @@ -49,6 +51,8 @@ public partial class GraphForm : Form private readonly List ables; + public event EventHandler OnZoomLevelChanged = delegate { }; + public GraphForm(string title) { SetStyle(ControlStyles.OptimizedDoubleBuffer, true); @@ -390,9 +394,7 @@ public partial class GraphForm : Form private void ResetViewportButton_Click(object? sender, EventArgs e) { - ScreenCenter = new Float2(0, 0); - ZoomLevel = new(1, 1); - Invalidate(false); + ResetAllViewport(); } private void GraphColorPickerButton_Click(Graphable able) { @@ -549,6 +551,16 @@ public partial class GraphForm : Form WindowState = FormWindowState.Normal; } + public void ResetAllViewport() + { + ScreenCenter = new Float2(0, 0); + ZoomLevel = new(1, 1); + Location = initialWindowPos; + Size = initialWindowSize; + WindowState = FormWindowState.Normal; + Invalidate(false); + } + private ViewCacheForm? cacheForm; private void MenuMiscCaches_Click(object? sender, EventArgs e) { diff --git a/Base/Forms/SetZoomForm.Designer.cs b/Base/Forms/SetZoomForm.Designer.cs index d3324cd..c8d464b 100644 --- a/Base/Forms/SetZoomForm.Designer.cs +++ b/Base/Forms/SetZoomForm.Designer.cs @@ -29,6 +29,9 @@ private void InitializeComponent() { EnableBoxSelect = new System.Windows.Forms.Button(); + MatchAspectButton = new System.Windows.Forms.Button(); + ResetButton = new System.Windows.Forms.Button(); + NormalizeButton = new System.Windows.Forms.Button(); SuspendLayout(); // // EnableBoxSelect @@ -41,11 +44,44 @@ EnableBoxSelect.UseVisualStyleBackColor = true; EnableBoxSelect.Click += EnableBoxSelect_Click; // + // MatchAspectButton + // + MatchAspectButton.Location = new System.Drawing.Point(168, 12); + MatchAspectButton.Name = "MatchAspectButton"; + MatchAspectButton.Size = new System.Drawing.Size(187, 46); + MatchAspectButton.TabIndex = 1; + MatchAspectButton.Text = "Match Aspect"; + MatchAspectButton.UseVisualStyleBackColor = true; + MatchAspectButton.Click += MatchAspectButton_Click; + // + // ResetButton + // + ResetButton.Location = new System.Drawing.Point(517, 12); + ResetButton.Name = "ResetButton"; + ResetButton.Size = new System.Drawing.Size(150, 46); + ResetButton.TabIndex = 2; + ResetButton.Text = "Reset"; + ResetButton.UseVisualStyleBackColor = true; + ResetButton.Click += ResetButton_Click; + // + // NormalizeButton + // + NormalizeButton.Location = new System.Drawing.Point(361, 12); + NormalizeButton.Name = "NormalizeButton"; + NormalizeButton.Size = new System.Drawing.Size(150, 46); + NormalizeButton.TabIndex = 3; + NormalizeButton.Text = "Normalize"; + NormalizeButton.UseVisualStyleBackColor = true; + NormalizeButton.Click += NormalizeButton_Click; + // // SetZoomForm // AutoScaleDimensions = new System.Drawing.SizeF(13F, 32F); AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; ClientSize = new System.Drawing.Size(800, 450); + Controls.Add(NormalizeButton); + Controls.Add(ResetButton); + Controls.Add(MatchAspectButton); Controls.Add(EnableBoxSelect); FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; Name = "SetZoomForm"; @@ -56,5 +92,8 @@ #endregion private System.Windows.Forms.Button EnableBoxSelect; + private System.Windows.Forms.Button MatchAspectButton; + private System.Windows.Forms.Button ResetButton; + private System.Windows.Forms.Button NormalizeButton; } } \ No newline at end of file diff --git a/Base/Forms/SetZoomForm.cs b/Base/Forms/SetZoomForm.cs index 3a8c499..d13e6af 100644 --- a/Base/Forms/SetZoomForm.cs +++ b/Base/Forms/SetZoomForm.cs @@ -13,6 +13,8 @@ public partial class SetZoomForm : Form { InitializeComponent(); this.refForm = refForm; + + refForm.OnZoomLevelChanged += (o, e) => RedeclareValues(); } private void EnableBoxSelect_Click(object? sender, EventArgs e) @@ -30,9 +32,46 @@ public partial class SetZoomForm : Form 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 ResetButton_Click(object? sender, EventArgs e) + { + refForm.ResetAllViewport(); + } + + private void RedeclareValues() + { + Invalidate(false); + } internal void CompleteBoxSelection() { if (boxSelectEnabled) EnableBoxSelect_Click(null, new()); } + + 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); + } }