311 lines
11 KiB
C#
311 lines
11 KiB
C#
using System;
|
||
using System.CodeDom.Compiler;
|
||
using System.ComponentModel;
|
||
using System.Diagnostics;
|
||
using System.Drawing;
|
||
using System.Drawing.Imaging;
|
||
using System.IO;
|
||
using System.Windows;
|
||
using System.Windows.Controls;
|
||
using System.Windows.Input;
|
||
using System.Windows.Markup;
|
||
using System.Windows.Media;
|
||
using System.Windows.Media.Imaging;
|
||
using System.Windows.Shapes;
|
||
|
||
namespace AxCopilot.Views;
|
||
|
||
public class RegionSelectWindow : Window, IComponentConnector
|
||
{
|
||
private readonly System.Drawing.Rectangle _screenBounds;
|
||
|
||
private Point _startPoint;
|
||
|
||
private Point _endPoint;
|
||
|
||
private bool _isDragging;
|
||
|
||
internal Canvas RootCanvas;
|
||
|
||
internal System.Windows.Shapes.Rectangle OverlayTop;
|
||
|
||
internal System.Windows.Shapes.Rectangle OverlayBottom;
|
||
|
||
internal System.Windows.Shapes.Rectangle OverlayLeft;
|
||
|
||
internal System.Windows.Shapes.Rectangle OverlayRight;
|
||
|
||
internal System.Windows.Shapes.Rectangle SelectionBorder;
|
||
|
||
internal Border GuideText;
|
||
|
||
internal Border SizeLabel;
|
||
|
||
internal TextBlock SizeLabelText;
|
||
|
||
private bool _contentLoaded;
|
||
|
||
public System.Drawing.Rectangle? SelectedRect { get; private set; }
|
||
|
||
public RegionSelectWindow(Bitmap fullScreenshot, System.Drawing.Rectangle screenBounds)
|
||
{
|
||
InitializeComponent();
|
||
_screenBounds = screenBounds;
|
||
base.Left = screenBounds.X;
|
||
base.Top = screenBounds.Y;
|
||
base.Width = screenBounds.Width;
|
||
base.Height = screenBounds.Height;
|
||
RootCanvas.Background = CreateFrozenBrush(fullScreenshot);
|
||
OverlayTop.Width = screenBounds.Width;
|
||
OverlayTop.Height = screenBounds.Height;
|
||
OverlayBottom.Width = screenBounds.Width;
|
||
OverlayLeft.Width = 0.0;
|
||
OverlayRight.Width = 0.0;
|
||
base.Loaded += delegate
|
||
{
|
||
Canvas.SetLeft(GuideText, (base.Width - GuideText.ActualWidth) / 2.0);
|
||
Canvas.SetTop(GuideText, (base.Height - GuideText.ActualHeight) / 2.0);
|
||
};
|
||
}
|
||
|
||
private static ImageBrush CreateFrozenBrush(Bitmap bmp)
|
||
{
|
||
using MemoryStream memoryStream = new MemoryStream();
|
||
bmp.Save(memoryStream, ImageFormat.Bmp);
|
||
memoryStream.Position = 0L;
|
||
BitmapImage bitmapImage = new BitmapImage();
|
||
bitmapImage.BeginInit();
|
||
bitmapImage.StreamSource = memoryStream;
|
||
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
|
||
bitmapImage.EndInit();
|
||
((Freezable)bitmapImage).Freeze();
|
||
ImageBrush imageBrush = new ImageBrush(bitmapImage)
|
||
{
|
||
Stretch = Stretch.None,
|
||
AlignmentX = AlignmentX.Left,
|
||
AlignmentY = AlignmentY.Top
|
||
};
|
||
((Freezable)imageBrush).Freeze();
|
||
return imageBrush;
|
||
}
|
||
|
||
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
|
||
{
|
||
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
|
||
if (e.ChangedButton == MouseButton.Left)
|
||
{
|
||
_startPoint = e.GetPosition(RootCanvas);
|
||
_isDragging = true;
|
||
GuideText.Visibility = Visibility.Collapsed;
|
||
SelectionBorder.Visibility = Visibility.Visible;
|
||
SizeLabel.Visibility = Visibility.Visible;
|
||
CaptureMouse();
|
||
}
|
||
}
|
||
|
||
private void Window_MouseMove(object sender, MouseEventArgs e)
|
||
{
|
||
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
|
||
if (_isDragging)
|
||
{
|
||
Point position = e.GetPosition(RootCanvas);
|
||
UpdateSelection(_startPoint, position);
|
||
}
|
||
}
|
||
|
||
private void Window_MouseUp(object sender, MouseButtonEventArgs e)
|
||
{
|
||
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
|
||
if (_isDragging && e.ChangedButton == MouseButton.Left)
|
||
{
|
||
_isDragging = false;
|
||
ReleaseMouseCapture();
|
||
Rect val = MakeRect(b: _endPoint = e.GetPosition(RootCanvas), a: _startPoint);
|
||
if (!(((Rect)(ref val)).Width < 4.0) && !(((Rect)(ref val)).Height < 4.0))
|
||
{
|
||
SizeLabelText.Text += " · ↑↓←→ 미세조정 · Enter 확정";
|
||
}
|
||
}
|
||
}
|
||
|
||
private void Window_KeyDown(object sender, KeyEventArgs e)
|
||
{
|
||
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0009: Invalid comparison between Unknown and I4
|
||
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0094: Invalid comparison between Unknown and I4
|
||
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_00b2: Expected I4, but got Unknown
|
||
//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
|
||
if ((int)e.Key == 13)
|
||
{
|
||
SelectedRect = null;
|
||
Close();
|
||
}
|
||
else
|
||
{
|
||
if (_isDragging || SelectionBorder.Visibility != Visibility.Visible)
|
||
{
|
||
return;
|
||
}
|
||
double num = 0.0;
|
||
double num2 = 0.0;
|
||
double num3 = ((!((Enum)Keyboard.Modifiers).HasFlag((Enum)(object)(ModifierKeys)4)) ? 1 : 10);
|
||
Key key = e.Key;
|
||
Key val = key;
|
||
if ((int)val != 6)
|
||
{
|
||
switch (val - 23)
|
||
{
|
||
default:
|
||
return;
|
||
case 0:
|
||
num = 0.0 - num3;
|
||
break;
|
||
case 2:
|
||
num = num3;
|
||
break;
|
||
case 1:
|
||
num2 = 0.0 - num3;
|
||
break;
|
||
case 3:
|
||
num2 = num3;
|
||
break;
|
||
}
|
||
_endPoint = new Point(((Point)(ref _endPoint)).X + num, ((Point)(ref _endPoint)).Y + num2);
|
||
UpdateSelection(_startPoint, _endPoint);
|
||
e.Handled = true;
|
||
}
|
||
else
|
||
{
|
||
Rect val2 = MakeRect(_startPoint, _endPoint);
|
||
if (((Rect)(ref val2)).Width >= 4.0 && ((Rect)(ref val2)).Height >= 4.0)
|
||
{
|
||
DpiScale dpi = VisualTreeHelper.GetDpi(this);
|
||
SelectedRect = new System.Drawing.Rectangle((int)(((Rect)(ref val2)).X * dpi.DpiScaleX) + _screenBounds.X, (int)(((Rect)(ref val2)).Y * dpi.DpiScaleY) + _screenBounds.Y, (int)(((Rect)(ref val2)).Width * dpi.DpiScaleX), (int)(((Rect)(ref val2)).Height * dpi.DpiScaleY));
|
||
}
|
||
Close();
|
||
}
|
||
}
|
||
}
|
||
|
||
private void UpdateSelection(Point a, Point b)
|
||
{
|
||
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
|
||
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
|
||
Rect val = MakeRect(a, b);
|
||
Canvas.SetLeft(SelectionBorder, ((Rect)(ref val)).X);
|
||
Canvas.SetTop(SelectionBorder, ((Rect)(ref val)).Y);
|
||
SelectionBorder.Width = ((Rect)(ref val)).Width;
|
||
SelectionBorder.Height = ((Rect)(ref val)).Height;
|
||
OverlayTop.Width = base.Width;
|
||
OverlayTop.Height = ((Rect)(ref val)).Y;
|
||
OverlayBottom.Width = base.Width;
|
||
OverlayBottom.Height = base.Height - ((Rect)(ref val)).Y - ((Rect)(ref val)).Height;
|
||
Canvas.SetTop(OverlayBottom, ((Rect)(ref val)).Y + ((Rect)(ref val)).Height);
|
||
OverlayLeft.Width = ((Rect)(ref val)).X;
|
||
OverlayLeft.Height = ((Rect)(ref val)).Height;
|
||
Canvas.SetTop(OverlayLeft, ((Rect)(ref val)).Y);
|
||
OverlayRight.Width = base.Width - ((Rect)(ref val)).X - ((Rect)(ref val)).Width;
|
||
OverlayRight.Height = ((Rect)(ref val)).Height;
|
||
Canvas.SetLeft(OverlayRight, ((Rect)(ref val)).X + ((Rect)(ref val)).Width);
|
||
Canvas.SetTop(OverlayRight, ((Rect)(ref val)).Y);
|
||
DpiScale dpi = VisualTreeHelper.GetDpi(this);
|
||
int value = (int)(((Rect)(ref val)).Width * dpi.DpiScaleX);
|
||
int value2 = (int)(((Rect)(ref val)).Height * dpi.DpiScaleY);
|
||
SizeLabelText.Text = $"{value} × {value2}";
|
||
Canvas.SetLeft(SizeLabel, ((Rect)(ref val)).X + ((Rect)(ref val)).Width + 8.0);
|
||
Canvas.SetTop(SizeLabel, ((Rect)(ref val)).Y + ((Rect)(ref val)).Height + 4.0);
|
||
}
|
||
|
||
private static Rect MakeRect(Point a, Point b)
|
||
{
|
||
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
|
||
return new Rect(Math.Min(((Point)(ref a)).X, ((Point)(ref b)).X), Math.Min(((Point)(ref a)).Y, ((Point)(ref b)).Y), Math.Abs(((Point)(ref b)).X - ((Point)(ref a)).X), Math.Abs(((Point)(ref b)).Y - ((Point)(ref a)).Y));
|
||
}
|
||
|
||
[DebuggerNonUserCode]
|
||
[GeneratedCode("PresentationBuildTasks", "10.0.5.0")]
|
||
public void InitializeComponent()
|
||
{
|
||
if (!_contentLoaded)
|
||
{
|
||
_contentLoaded = true;
|
||
Uri resourceLocator = new Uri("/AxCopilot;component/views/regionselectwindow.xaml", UriKind.Relative);
|
||
Application.LoadComponent(this, resourceLocator);
|
||
}
|
||
}
|
||
|
||
[DebuggerNonUserCode]
|
||
[GeneratedCode("PresentationBuildTasks", "10.0.5.0")]
|
||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||
void IComponentConnector.Connect(int connectionId, object target)
|
||
{
|
||
switch (connectionId)
|
||
{
|
||
case 1:
|
||
((RegionSelectWindow)target).MouseDown += Window_MouseDown;
|
||
((RegionSelectWindow)target).MouseMove += Window_MouseMove;
|
||
((RegionSelectWindow)target).MouseUp += Window_MouseUp;
|
||
((RegionSelectWindow)target).KeyDown += Window_KeyDown;
|
||
break;
|
||
case 2:
|
||
RootCanvas = (Canvas)target;
|
||
break;
|
||
case 3:
|
||
OverlayTop = (System.Windows.Shapes.Rectangle)target;
|
||
break;
|
||
case 4:
|
||
OverlayBottom = (System.Windows.Shapes.Rectangle)target;
|
||
break;
|
||
case 5:
|
||
OverlayLeft = (System.Windows.Shapes.Rectangle)target;
|
||
break;
|
||
case 6:
|
||
OverlayRight = (System.Windows.Shapes.Rectangle)target;
|
||
break;
|
||
case 7:
|
||
SelectionBorder = (System.Windows.Shapes.Rectangle)target;
|
||
break;
|
||
case 8:
|
||
GuideText = (Border)target;
|
||
break;
|
||
case 9:
|
||
SizeLabel = (Border)target;
|
||
break;
|
||
case 10:
|
||
SizeLabelText = (TextBlock)target;
|
||
break;
|
||
default:
|
||
_contentLoaded = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|