﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TP7
{
    internal class ZoneDessin : Control
    {
        //Le modèle du MVC
        Modele modele;
        //La forme sélectionnée pour être déplacée
        FormeGeo forme_select = null; 
        //Les précédentes coordonnées de la souris lors d'un déplacement
        int x_souris_pre, y_souris_pre; 
        public ZoneDessin()
        {
            this.DoubleBuffered = true;//pour éviter les scintillements
            modele = new Modele();
            //On ajoute dans le modèle 3 formes pré-définis pour tester
            FRectangle rect1 = new FRectangle(40, 20, 50, 60);
            FRectangle rect2 = new FRectangle(100, 20, 40, 30);
            Disque disque1 = new Disque(100, 100, 25);
            modele.add(rect1 );
            modele.add(rect2);
            modele.add(disque1);
        }
        protected override void OnPaintBackground(PaintEventArgs e)
        //Repeint le widget
        {
            //On commence par tout effacer
            e.Graphics.Clear(Color.White);

            SolidBrush myBrush = new SolidBrush(Color.Black);

            //On affiche chacune des formes de la liste du modèle
            for (int i = 0; i < modele.getSize(); i++)
            {
                FormeGeo forme = modele.get(i);
                //La méthode de Graphics à invoquer dépend du type de forme
                if (forme.GetTypeForme() == Type_Forme.Rectangle)
                {
                    FRectangle rect = (FRectangle)forme;
                    e.Graphics.FillRectangle(myBrush, rect.getX(), rect.getY(), rect.getLargeur(), rect.getHauteur());
                }
                if (forme.GetTypeForme() == Type_Forme.Disque)
                {
                    Disque disque = (Disque)forme;
                    //Pour afficher un disque, il faut donner les coordonnées du point en haut à gauche
                    //et la taille du carré dans lequel s'inscrit le disque.
                    e.Graphics.FillEllipse(myBrush, disque.getX(), disque.getY(), 2*disque.getRayon(), 2*disque.getRayon());
                }
            }
        }

        /* Quand on appuie sur le bouton souris, la méthode ci-dessous
         * parcourt toutes les formes du modèle et s'arrête dès qu'elle
         * en trouve une qui se trouve sur l'emplacement du curseur souris
         * */
        protected override void OnMouseDown(MouseEventArgs e)
        {
            int i = 0;
            bool trouve_forme = false;
            while (i < modele.getSize() && !trouve_forme)
            {
                if (modele.get(i).estDedans(e.X, e.Y))
                {
                    forme_select = modele.get(i);
                    trouve_forme = true;
                    x_souris_pre = e.X;
                    y_souris_pre = e.Y;
                }
                i++;
            }
        }

        /* Quand on relâche la souris, on arrête le déplacement de forme */
        protected override void OnMouseUp(MouseEventArgs e)
        {
            forme_select = null;
        }

        /* Quand la souris bouge et qu'une forme est sélectionnée pour 
         * être déplacée, on calcule le delta de déplacement de la souris
         * et on déplace d'autant la forme
         */
        protected override void OnMouseMove(MouseEventArgs e)
        {
            if (forme_select != null)
            {
                int dx = e.X - x_souris_pre;
                int dy = e.Y - y_souris_pre;
                forme_select.deplace(dx, dy);
                x_souris_pre = e.X;
                y_souris_pre = e.Y;
            }
            this.Invalidate();
        }

    }
}
