Skip to content

Commit

Permalink
Add middle click and drag to scroll (implements dsharlet#209)
Browse files Browse the repository at this point in the history
  • Loading branch information
dsharlet committed Dec 3, 2023
1 parent 2dafc08 commit f7d81c9
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 9 deletions.
30 changes: 21 additions & 9 deletions LiveSPICE/Controls/SchematicControl.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -250,28 +250,35 @@ protected override void OnKeyUp(KeyEventArgs e)
// Mouse events.
protected override void OnMouseDown(MouseButtonEventArgs e)
{
Focus();
Keyboard.Focus(this);
Circuit.Coord at = SnapToGrid(e.GetPosition(root));
if (e.ChangedButton == MouseButton.Left)
{
Focus();
Keyboard.Focus(this);
CaptureMouse();
if (Tool != null)
{
Circuit.Coord at = SnapToGrid(e.GetPosition(root));
if (e.ClickCount == 2)
Tool.MouseDoubleClick(at);
else
Tool.MouseDown(at);
}
e.Handled = true;
}
else
else if (e.ChangedButton == MouseButton.Middle)
{
Focus();
Keyboard.Focus(this);
CaptureMouse();
e.Handled = true;
}
else if (e.ChangedButton == MouseButton.Right)
{
ReleaseMouseCapture();
if (Tool != null)
Tool.Cancel();
e.Handled = true;
}

e.Handled = true;
}
protected override void OnMouseUp(MouseButtonEventArgs e)
{
Expand All @@ -281,6 +288,12 @@ protected override void OnMouseUp(MouseButtonEventArgs e)
if (Tool != null)
Tool.MouseUp(at);
ReleaseMouseCapture();
e.Handled = true;
}
else if (e.ChangedButton == MouseButton.Middle)
{
ReleaseMouseCapture();
e.Handled = true;
}
else if (e.ChangedButton == MouseButton.Right && e.ClickCount == 1)
{
Expand All @@ -290,22 +303,21 @@ protected override void OnMouseUp(MouseButtonEventArgs e)
if (ContextMenu != null)
ContextMenu.IsOpen = true;
}
e.Handled = true;
}
e.Handled = true;
}
private Circuit.Coord? mouse = null;
protected override void OnMouseMove(MouseEventArgs e)
{
Point x = e.GetPosition(root);
if (IsMouseCaptured)
if (IsMouseCaptured && e.LeftButton == MouseButtonState.Pressed)
BringIntoView(new Rect(x - AutoScrollBorder, x + AutoScrollBorder));
Circuit.Coord at = SnapToGrid(x);
if (!mouse.HasValue || mouse.Value != at)
{
mouse = at;
if (Tool != null)
Tool.MouseMove(at);
e.Handled = true;
}
}

Expand Down
22 changes: 22 additions & 0 deletions LiveSPICE/Controls/SchematicViewer.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ public SchematicViewer()
};
scroll.PreviewMouseMove += (o, e) => mouse = e.GetPosition(this);
scroll.MouseLeave += (o, e) => mouse = null;
scroll.MouseMove += scroll_MouseMove;

SizeChanged += SchematicViewer_SizeChanged;

Expand Down Expand Up @@ -137,5 +138,26 @@ public void FocusCenter()
}
FocusRect(a, b, true);
}

Point? mouse_scroll = null;
private void scroll_MouseMove(object o, System.Windows.Input.MouseEventArgs e)
{
if (IsMouseCaptureWithin && e.MiddleButton == MouseButtonState.Pressed)
{
Point x = e.GetPosition(this);
if (mouse_scroll.HasValue)
{
Vector dx = x - mouse_scroll.Value;
scroll.ScrollToHorizontalOffset(scroll.HorizontalOffset + dx.X * Zoom);
scroll.ScrollToVerticalOffset(scroll.VerticalOffset + dx.Y * Zoom);
}
mouse_scroll = x;
e.Handled = true;
}
else
{
mouse_scroll = null;
}
}
}
}

0 comments on commit f7d81c9

Please sign in to comment.