mirror of
https://github.com/MathiasLui/CSGO-Projects.git
synced 2025-05-06 22:01:18 +00:00
167 lines
No EOL
5 KiB
C#
167 lines
No EOL
5 KiB
C#
using System.Linq;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media;
|
|
|
|
namespace Damage_Calculator
|
|
{
|
|
public class ZoomBorder : Border
|
|
{
|
|
private UIElement child = null;
|
|
private Point origin;
|
|
private Point start;
|
|
private bool isSpacebarPressed = false;
|
|
|
|
private TranslateTransform GetTranslateTransform(UIElement element)
|
|
{
|
|
return (TranslateTransform)((TransformGroup)element.RenderTransform)
|
|
.Children.First(tr => tr is TranslateTransform);
|
|
}
|
|
|
|
private ScaleTransform GetScaleTransform(UIElement element)
|
|
{
|
|
return (ScaleTransform)((TransformGroup)element.RenderTransform)
|
|
.Children.First(tr => tr is ScaleTransform);
|
|
}
|
|
|
|
public override UIElement Child
|
|
{
|
|
get { return base.Child; }
|
|
set
|
|
{
|
|
if (value != null && value != this.Child)
|
|
this.Initialize(value);
|
|
base.Child = value;
|
|
}
|
|
}
|
|
|
|
public void Initialize(UIElement element)
|
|
{
|
|
this.child = element;
|
|
if (child != null)
|
|
{
|
|
TransformGroup group = new TransformGroup();
|
|
ScaleTransform st = new ScaleTransform();
|
|
group.Children.Add(st);
|
|
TranslateTransform tt = new TranslateTransform();
|
|
group.Children.Add(tt);
|
|
child.RenderTransform = group;
|
|
child.RenderTransformOrigin = new Point(0.0, 0.0);
|
|
this.MouseWheel += child_MouseWheel;
|
|
this.MouseLeftButtonDown += child_MouseLeftButtonDown;
|
|
this.MouseLeftButtonUp += child_MouseLeftButtonUp;
|
|
this.MouseMove += child_MouseMove;
|
|
this.PreviewMouseDown += new MouseButtonEventHandler(
|
|
child_PreviewMouseDown);
|
|
}
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
if (child != null)
|
|
{
|
|
// reset zoom
|
|
var st = GetScaleTransform(child);
|
|
st.ScaleX = 1.0;
|
|
st.ScaleY = 1.0;
|
|
|
|
// reset pan
|
|
var tt = GetTranslateTransform(child);
|
|
tt.X = 0.0;
|
|
tt.Y = 0.0;
|
|
}
|
|
}
|
|
|
|
#region Child Events
|
|
|
|
public void KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
if (e.Key == Key.Space)
|
|
{
|
|
this.isSpacebarPressed = true;
|
|
this.Cursor = Cursors.SizeAll;
|
|
}
|
|
}
|
|
|
|
public void KeyUp(object sender, KeyEventArgs e)
|
|
{
|
|
if (e.Key == Key.Space)
|
|
{
|
|
this.isSpacebarPressed = false;
|
|
this.Cursor = null;
|
|
}
|
|
}
|
|
|
|
private void child_MouseWheel(object sender, MouseWheelEventArgs e)
|
|
{
|
|
if (child != null)
|
|
{
|
|
var st = GetScaleTransform(child);
|
|
var tt = GetTranslateTransform(child);
|
|
|
|
double zoom = e.Delta > 0 ? .2 : -.2;
|
|
if (!(e.Delta > 0) && (st.ScaleX < 1 || st.ScaleY < 1))
|
|
return;
|
|
|
|
Point relative = e.GetPosition(child);
|
|
double absoluteX;
|
|
double absoluteY;
|
|
|
|
absoluteX = relative.X * st.ScaleX + tt.X;
|
|
absoluteY = relative.Y * st.ScaleY + tt.Y;
|
|
|
|
st.ScaleX += zoom;
|
|
st.ScaleY += zoom;
|
|
|
|
tt.X = absoluteX - relative.X * st.ScaleX;
|
|
tt.Y = absoluteY - relative.Y * st.ScaleY;
|
|
}
|
|
}
|
|
|
|
private void child_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (child != null && this.isSpacebarPressed)
|
|
{
|
|
var tt = GetTranslateTransform(child);
|
|
start = e.GetPosition(this);
|
|
origin = new Point(tt.X, tt.Y);
|
|
this.Cursor = Cursors.Hand;
|
|
child.CaptureMouse();
|
|
}
|
|
}
|
|
|
|
private void child_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (child != null)
|
|
{
|
|
child.ReleaseMouseCapture();
|
|
this.Cursor = Cursors.Arrow;
|
|
}
|
|
}
|
|
|
|
void child_PreviewMouseDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (e.ChangedButton == MouseButton.Middle && e.ButtonState == MouseButtonState.Pressed)
|
|
{
|
|
this.Reset();
|
|
}
|
|
}
|
|
|
|
private void child_MouseMove(object sender, MouseEventArgs e)
|
|
{
|
|
if (child != null)
|
|
{
|
|
if (child.IsMouseCaptured)
|
|
{
|
|
var tt = GetTranslateTransform(child);
|
|
Vector v = start - e.GetPosition(this);
|
|
tt.X = origin.X - v.X;
|
|
tt.Y = origin.Y - v.Y;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |