Blame mono/Contours/MainForm.cs

Ivan Mahonin d33d2a
using System;
Ivan Mahonin d33d2a
using System.Windows.Forms;
Ivan Mahonin d33d2a
using System.Collections.Generic;
Ivan Mahonin d33d2a
using System.Linq;
Ivan Mahonin d33d2a
using System.Drawing;
Ivan Mahonin d33d2a
Ivan Mahonin d33d2a
namespace Contours {
Ivan Mahonin d33d2a
    public class MainForm: Form {
Ivan Mahonin 7c6265
        Button bTest;
Ivan Mahonin 7c6265
        ComboBox cbTests;
Ivan Mahonin 7c6265
        ComboBox cbViews;
Ivan Mahonin 7c6265
    
Ivan Mahonin d33d2a
        public MainForm() {
Ivan Mahonin 05068e
            Width = 800;
Ivan Mahonin 05068e
            Height = 600;
Ivan Mahonin 05068e
        
Ivan Mahonin 7c6265
            bTest = new Button();
Ivan Mahonin 7c6265
            bTest.Left = 20;
Ivan Mahonin 7c6265
            bTest.Top = 20;
Ivan Mahonin 7c6265
            bTest.Text = "test";
Ivan Mahonin 7c6265
            bTest.Click += bTestClicked;
Ivan Mahonin 7c6265
            Controls.Add(bTest);
Ivan Mahonin 7c6265
Ivan Mahonin 7c6265
            cbTests = new ComboBox();
Ivan Mahonin 7c6265
            cbTests.Left = bTest.Right + 20;
Ivan Mahonin 7c6265
            cbTests.Top = 20;
Ivan Mahonin 7c6265
            cbTests.SelectedIndexChanged += cbTestsChanged;
Ivan Mahonin 7c6265
            Controls.Add(cbTests);
Ivan Mahonin 7c6265
Ivan Mahonin 7c6265
            cbViews = new ComboBox();
Ivan Mahonin 7c6265
            cbViews.Left = cbTests.Right + 20;
Ivan Mahonin 7c6265
            cbViews.Top = 20;
Ivan Mahonin 7c6265
            cbViews.SelectedIndexChanged += cbViewsChanged;
Ivan Mahonin 7c6265
            Controls.Add(cbViews);
Ivan Mahonin 7c6265
                        
Ivan Mahonin d33d2a
            MouseDown += mouseDown;
Ivan Mahonin d33d2a
            MouseMove += mouseMove;
Ivan Mahonin d33d2a
            MouseUp += mouseUp;
Ivan Mahonin d33d2a
            Paint += paint;
Ivan Mahonin d33d2a
        }
Ivan Mahonin d33d2a
Ivan Mahonin d33d2a
        bool drawing = false;
Ivan Mahonin f6cc12
        List<List<PointF>> contours = new List<List<PointF>>();
Ivan Mahonin d33d2a
Ivan Mahonin 7c6265
        void bTestClicked(object sender, EventArgs e) {
Ivan Mahonin 7c6265
            Test.loadTestsFromFile("tests.txt");
Ivan Mahonin 7c6265
            bool success = Test.runAll();
Ivan Mahonin 7c6265
            Test.saveReport("report.txt");
Ivan Mahonin 7c6265
            
Ivan Mahonin 7c6265
            foreach(Test test in Test.tests)
Ivan Mahonin 7c6265
                cbTests.Items.Add(test.name);
Ivan Mahonin 7c6265
            
Ivan Mahonin 7c6265
            if (!success) MessageBox.Show("Tests failed");
Ivan Mahonin 7c6265
        }
Ivan Mahonin 7c6265
Ivan Mahonin 7c6265
        void cbTestsChanged(object sender, EventArgs e) {
Ivan Mahonin 7c6265
            cbViews.Items.Clear();
Ivan Mahonin 7c6265
            foreach(Test test in Test.tests) {
Ivan Mahonin 7c6265
                if (cbTests.Text == test.name) {
Ivan Mahonin 7c6265
                    foreach(string name in test.input.Keys)
Ivan Mahonin 7c6265
                        cbViews.Items.Add("i: " + name);
Ivan Mahonin 7c6265
                    foreach(string name in test.output.Keys)
Ivan Mahonin 7c6265
                        cbViews.Items.Add("o: " + name);
Ivan Mahonin 7c6265
                }
Ivan Mahonin 7c6265
            }
Ivan Mahonin 7c6265
        }
Ivan Mahonin 7c6265
Ivan Mahonin 7c6265
        void cbViewsChanged(object sender, EventArgs e) {
Ivan Mahonin 7c6265
            Refresh();
Ivan Mahonin 7c6265
        }
Ivan Mahonin 7c6265
Ivan Mahonin d33d2a
        private void mouseDown(object sender, MouseEventArgs e) {
Ivan Mahonin d33d2a
            if (e.Button == MouseButtons.Left) {
Ivan Mahonin f6cc12
                contours.Add(new List<PointF>());
Ivan Mahonin d33d2a
                drawing = true;
Ivan Mahonin d33d2a
                mouseMove(sender, e);
Ivan Mahonin d33d2a
            }
Ivan Mahonin d33d2a
        }
Ivan Mahonin d33d2a
Ivan Mahonin d33d2a
        private void mouseMove(object sender, MouseEventArgs e) {
Ivan Mahonin d33d2a
            if (drawing) {
Ivan Mahonin f6cc12
                contours.Last().Add(new PointF(e.Location.X, e.Location.Y));
Ivan Mahonin d33d2a
                Refresh();
Ivan Mahonin d33d2a
            }
Ivan Mahonin d33d2a
        }
Ivan Mahonin d33d2a
Ivan Mahonin d33d2a
        private void mouseUp(object sender, MouseEventArgs e) {
Ivan Mahonin d33d2a
            if (e.Button == MouseButtons.Left) {
Ivan Mahonin d33d2a
                mouseMove(sender, e);
Ivan Mahonin d33d2a
                drawing = false;
Ivan Mahonin d33d2a
            }
Ivan Mahonin d33d2a
            if (e.Button == MouseButtons.Right) {
Ivan Mahonin d33d2a
                drawing = false;
Ivan Mahonin f6cc12
                contours.Clear();
Ivan Mahonin d33d2a
                Refresh();
Ivan Mahonin d33d2a
            }
Ivan Mahonin d33d2a
        }
Ivan Mahonin d33d2a
Ivan Mahonin 7c6265
        void drawContour(Graphics g, Color color, List<PointF> c) {
Ivan Mahonin 7c6265
            if (c != null && c.Count >= 3) {
Ivan Mahonin 7c6265
                g.DrawLines(new Pen(new SolidBrush(color)), c.ToArray());
Ivan Mahonin 7c6265
                g.DrawLine(new Pen(new SolidBrush(color)), c.First(), c.Last());
Ivan Mahonin 7c6265
            }
Ivan Mahonin 7c6265
        }
Ivan Mahonin 7c6265
Ivan Mahonin 7c6265
        void drawContour(Graphics g, Color color, List<Point> c) {
Ivan Mahonin 7c6265
            if (c != null && c.Count >= 3) {
Ivan Mahonin 7c6265
                g.DrawLines(new Pen(new SolidBrush(color)), c.ToArray());
Ivan Mahonin 7c6265
                g.DrawLine(new Pen(new SolidBrush(color)), c.First(), c.Last());
Ivan Mahonin 7c6265
            }
Ivan Mahonin 7c6265
        }
Ivan Mahonin 7c6265
Ivan Mahonin d33d2a
        private void paint(object sender, PaintEventArgs e) {
Ivan Mahonin d33d2a
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
Ivan Mahonin 7c6265
            foreach(List<PointF> c in contours)
Ivan Mahonin 7c6265
                drawContour(e.Graphics, Color.Gray, c);
Ivan Mahonin 7c6265
            
Ivan Mahonin 7c6265
            List<List<List<Point>>> testContours = null;
Ivan Mahonin 7c6265
            foreach(Test test in Test.tests) {
Ivan Mahonin 7c6265
                if (cbTests.Text == test.name) {
Ivan Mahonin 7c6265
                    foreach(KeyValuePair<string, List<List<List<Point>>>> pair in test.input)
Ivan Mahonin 7c6265
                        if (cbViews.Text == "i: " + pair.Key)
Ivan Mahonin 7c6265
                            testContours = pair.Value;
Ivan Mahonin 7c6265
                    foreach(KeyValuePair<string, List<List<List<Point>>>> pair in test.output)
Ivan Mahonin 7c6265
                        if (cbViews.Text == "o: " + pair.Key)
Ivan Mahonin 7c6265
                            testContours = pair.Value;
Ivan Mahonin 7c6265
                }
Ivan Mahonin 7c6265
            }
Ivan Mahonin 7c6265
            
Ivan Mahonin 05068e
            System.Drawing.Drawing2D.Matrix m = e.Graphics.Transform;
Ivan Mahonin 05068e
            e.Graphics.TranslateTransform(50, 100);
Ivan Mahonin 7c6265
            if (testContours != null) {
Ivan Mahonin 7c6265
                foreach(List<List<Point>> group in testContours) {
Ivan Mahonin 7c6265
                    Color color = Color.Black;
Ivan Mahonin 7c6265
                    foreach(List<Point> c in group) {
Ivan Mahonin 7c6265
                        drawContour(e.Graphics, color, c);
Ivan Mahonin 7c6265
                        color = Color.Blue;
Ivan Mahonin 7c6265
                    }
Ivan Mahonin d33d2a
                }
Ivan Mahonin d33d2a
            }
Ivan Mahonin 05068e
            e.Graphics.Transform = m;
Ivan Mahonin d33d2a
        }
Ivan Mahonin d33d2a
    }
Ivan Mahonin d33d2a
}
Ivan Mahonin d33d2a