Make region selector shower instead of whole screen )
This commit is contained in:
136
src/Eve-O-Preview/View/Implementation/RegionPickerDialog.cs
Normal file
136
src/Eve-O-Preview/View/Implementation/RegionPickerDialog.cs
Normal file
@@ -0,0 +1,136 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace EveOPreview.View.Implementation {
|
||||
public partial class RegionPickerDialog : Form {
|
||||
private Point _startPoint;
|
||||
private Point _endPoint;
|
||||
private bool _isDrawing;
|
||||
private Rectangle _selectedRegion;
|
||||
|
||||
public Rectangle SelectedRegion => _selectedRegion;
|
||||
|
||||
public RegionPickerDialog() {
|
||||
InitializeComponent();
|
||||
InitializeDialog();
|
||||
}
|
||||
|
||||
private void InitializeDialog() {
|
||||
// Make the form cover all screens
|
||||
Rectangle totalBounds = GetTotalScreenBounds();
|
||||
this.Bounds = totalBounds;
|
||||
this.StartPosition = FormStartPosition.Manual;
|
||||
this.FormBorderStyle = FormBorderStyle.None;
|
||||
this.WindowState = FormWindowState.Maximized;
|
||||
this.TopMost = true;
|
||||
this.ShowInTaskbar = false;
|
||||
this.Cursor = Cursors.Cross;
|
||||
|
||||
// Make the form semi-transparent but not fully transparent
|
||||
this.BackColor = Color.Black;
|
||||
this.Opacity = 0.3;
|
||||
|
||||
// Add event handlers
|
||||
this.MouseDown += RegionPickerDialog_MouseDown;
|
||||
this.MouseMove += RegionPickerDialog_MouseMove;
|
||||
this.MouseUp += RegionPickerDialog_MouseUp;
|
||||
this.KeyDown += RegionPickerDialog_KeyDown;
|
||||
this.Paint += RegionPickerDialog_Paint;
|
||||
|
||||
// Add instructions label
|
||||
var instructionsLabel = new Label { Text = "Click and drag to select a region. Press ESC to cancel.",
|
||||
ForeColor = Color.White,
|
||||
BackColor = Color.Black,
|
||||
Font = new Font("Arial", 12, FontStyle.Bold),
|
||||
AutoSize = true,
|
||||
Location = new Point(10, 10) };
|
||||
this.Controls.Add(instructionsLabel);
|
||||
}
|
||||
|
||||
private Rectangle GetTotalScreenBounds() {
|
||||
Rectangle bounds = Screen.PrimaryScreen.Bounds;
|
||||
foreach (Screen screen in Screen.AllScreens) {
|
||||
bounds = Rectangle.Union(bounds, screen.Bounds);
|
||||
}
|
||||
return bounds;
|
||||
}
|
||||
|
||||
private void RegionPickerDialog_MouseDown(object sender, MouseEventArgs e) {
|
||||
if (e.Button == MouseButtons.Left) {
|
||||
_startPoint = e.Location;
|
||||
_isDrawing = true;
|
||||
this.Capture = true;
|
||||
this.Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
private void RegionPickerDialog_MouseMove(object sender, MouseEventArgs e) {
|
||||
if (_isDrawing) {
|
||||
_endPoint = e.Location;
|
||||
this.Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
private void RegionPickerDialog_MouseUp(object sender, MouseEventArgs e) {
|
||||
if (e.Button == MouseButtons.Left && _isDrawing) {
|
||||
_isDrawing = false;
|
||||
_endPoint = e.Location;
|
||||
this.Capture = false;
|
||||
|
||||
// Calculate the selected region
|
||||
int x = Math.Min(_startPoint.X, _endPoint.X);
|
||||
int y = Math.Min(_startPoint.Y, _endPoint.Y);
|
||||
int width = Math.Abs(_endPoint.X - _startPoint.X);
|
||||
int height = Math.Abs(_endPoint.Y - _startPoint.Y);
|
||||
|
||||
if (width > 10 && height > 10) // Minimum size
|
||||
{
|
||||
_selectedRegion = new Rectangle(x, y, width, height);
|
||||
this.DialogResult = DialogResult.OK;
|
||||
this.Close();
|
||||
} else {
|
||||
// Reset if region is too small
|
||||
_startPoint = Point.Empty;
|
||||
_endPoint = Point.Empty;
|
||||
this.Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void RegionPickerDialog_KeyDown(object sender, KeyEventArgs e) {
|
||||
if (e.KeyCode == Keys.Escape) {
|
||||
this.DialogResult = DialogResult.Cancel;
|
||||
this.Close();
|
||||
}
|
||||
}
|
||||
|
||||
private void RegionPickerDialog_Paint(object sender, PaintEventArgs e) {
|
||||
if (_isDrawing) {
|
||||
// Draw selection rectangle
|
||||
using (Pen pen = new Pen(Color.Red, 2)) {
|
||||
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
|
||||
|
||||
int x = Math.Min(_startPoint.X, _endPoint.X);
|
||||
int y = Math.Min(_startPoint.Y, _endPoint.Y);
|
||||
int width = Math.Abs(_endPoint.X - _startPoint.X);
|
||||
int height = Math.Abs(_endPoint.Y - _startPoint.Y);
|
||||
|
||||
e.Graphics.DrawRectangle(pen, x, y, width, height);
|
||||
}
|
||||
|
||||
// Draw size information
|
||||
if (_startPoint != Point.Empty && _endPoint != Point.Empty) {
|
||||
int width = Math.Abs(_endPoint.X - _startPoint.X);
|
||||
int height = Math.Abs(_endPoint.Y - _startPoint.Y);
|
||||
|
||||
string sizeText = $"{width} x {height}";
|
||||
using (Font font = new Font("Arial", 10, FontStyle.Bold)) using (Brush brush =
|
||||
new SolidBrush(Color.White)) {
|
||||
e.Graphics.DrawString(sizeText, font, brush, _endPoint.X + 5, _endPoint.Y + 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user