Blame mono/Assistance/MainWindow.cs

ebcc4f
using System;
ebcc4f
using System.Drawing;
ebcc4f
using System.Drawing.Imaging;
ebcc4f
using System.Windows.Forms;
ebcc4f
using System.Collections.Generic;
ebcc4f
ebcc4f
namespace Assistance {
ebcc4f
    public class MainWindow : Form {
ebcc4f
        static public void Main() { Application.Run(new MainWindow()); }
ebcc4f
ebcc4f
		Bitmap bitmap = new Bitmap(1, 1);
ebcc4f
		Canvas canvas = new Canvas();
ebcc4f
		bool dragging = false;
ebcc4f
		ActivePoint activePoint;
ebcc4f
		Point offset;
ebcc4f
		Point cursor;
ebcc4f
ebcc4f
		public MainWindow() {
ebcc4f
			Paint += onPaint;
ebcc4f
			MouseMove += onMouseMove;
ebcc4f
			MouseDown += onMouseDown;
ebcc4f
			MouseUp += onMouseUp;
ebcc4f
			KeyDown += onKeyDown;
ebcc4f
            WindowState = FormWindowState.Maximized;
ebcc4f
        }
ebcc4f
ebcc4f
		protected override void OnPaintBackground(PaintEventArgs e) { }
ebcc4f
ebcc4f
        public void onPaint(Object sender, PaintEventArgs e) {
ebcc4f
			if (bitmap.Size != ClientSize)
ebcc4f
				bitmap = new Bitmap(ClientSize.Width, ClientSize.Height);
ebcc4f
			Graphics g = Graphics.FromImage(bitmap);
ebcc4f
			g.Clear(Color.White);
ebcc4f
            draw(g);
ebcc4f
			g.Flush();
ebcc4f
			e.Graphics.DrawImageUnscaled(bitmap, new Rectangle(0, 0, ClientSize.Width, ClientSize.Height));
ebcc4f
        }
ebcc4f
ebcc4f
		public Point windowToCanvas(Point p) {
ebcc4f
			return new Point(p.x - ClientSize.Width/2.0, p.y - ClientSize.Height/2.0);
ebcc4f
		}
ebcc4f
ebcc4f
		public Point canvasToWindow(Point p) {
ebcc4f
			return new Point(p.x + ClientSize.Width/2.0, p.y + ClientSize.Height/2.0);
ebcc4f
		}
ebcc4f
ebcc4f
		private void beginDrag() {
ebcc4f
			dragging = true;
ebcc4f
			offset = activePoint.position - cursor;
ebcc4f
			activePoint.bringToFront();
ebcc4f
		}
ebcc4f
ebcc4f
		private void endDrag() {
ebcc4f
			dragging = false;
ebcc4f
			offset = new Point();
ebcc4f
		}
ebcc4f
ebcc4f
		public void onKeyDown(Object sender, KeyEventArgs e) {
ebcc4f
			switch(e.KeyCode) {
ebcc4f
			case Keys.D1:
ebcc4f
				new VanishingPoint(canvas, cursor);
ebcc4f
				break;
ebcc4f
			case Keys.D2:
ebcc4f
				new Grid(canvas, cursor);
ebcc4f
				break;
ebcc4f
			case Keys.Delete:
ebcc4f
				if (activePoint != null)
ebcc4f
					activePoint.assistant.remove();
ebcc4f
				endDrag();
ebcc4f
				break;
ebcc4f
			}
ebcc4f
			endDrag();
ebcc4f
			Invalidate();
ebcc4f
		}
ebcc4f
ebcc4f
		public void onMouseDown(Object sender, MouseEventArgs e) {
ebcc4f
			cursor = windowToCanvas(new Point(e.Location.X, e.Location.Y));
ebcc4f
			if (e.Button == MouseButtons.Left) {
ebcc4f
				activePoint = canvas.findPoint(cursor);
ebcc4f
				if (activePoint != null)
ebcc4f
					beginDrag();
ebcc4f
			}
ebcc4f
			Invalidate();
ebcc4f
		}
ebcc4f
ebcc4f
		public void onMouseUp(Object sender, MouseEventArgs e) {
ebcc4f
			cursor = windowToCanvas(new Point(e.X, e.Y));
ebcc4f
			if (e.Button == MouseButtons.Left)
ebcc4f
				endDrag();
ebcc4f
			if (!dragging)
ebcc4f
				activePoint = canvas.findPoint(cursor);
ebcc4f
			Invalidate();
ebcc4f
		}
ebcc4f
ebcc4f
		public void onMouseMove(Object sender, MouseEventArgs e) {
ebcc4f
			cursor = windowToCanvas(new Point(e.Location.X, e.Location.Y));
ebcc4f
			if (dragging) {
ebcc4f
				activePoint.assistant.onMovePoint(activePoint, cursor + offset);
ebcc4f
			} else {
ebcc4f
				activePoint = canvas.findPoint(cursor);
ebcc4f
			}
ebcc4f
			Invalidate();
ebcc4f
        }
ebcc4f
ebcc4f
        public void draw(Graphics g) {
ebcc4f
			g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
ebcc4f
			g.TranslateTransform(0.5f*ClientSize.Width, 0.5f*ClientSize.Height);
ebcc4f
			canvas.draw(g, activePoint, cursor + offset);
ebcc4f
        }
ebcc4f
    }
ebcc4f
}
ebcc4f