from tkinter import *
from tkinter import colorchooser # doit être importé manuellement
from formes import *

class ZoneAffichage(Canvas):
    def __init__(self, master, largeur, hauteur):
        Canvas.__init__(self, master, width=largeur, height=hauteur)
        self.__formes = []
        self.__type_forme = 'rectangle'
        self.__couleur = 'brown'
        self.__forme_deplacee = None
    
    def selection_rectangle(self):
        self.__type_forme = 'rectangle'
    
    def selection_ellipse(self):
        self.__type_forme = 'ellipse'
    
    def selection_couleur(self):
        self.__couleur = colorchooser.askcolor()[1]
    
    def ajout_forme(self, x, y):
        # Notez qu'on aurait aussi pu ajouter ce code en méthodes de Rectangle/Ellipse.
        if self.__type_forme == 'rectangle':
            f = Rectangle(self, x-5, y-10, 10, 20, self.__couleur)
        elif self.__type_forme == 'ellipse':
            f = Ellipse(self, x, y, 5, 10, self.__couleur)
        self.__formes.append(f)
    
    def suppression_forme(self, x, y):
        try:
            i = next(i for i in range(len(self.__formes)-1, -1, -1)
                       if self.__formes[i].contient_point(x, y))
            f = self.__formes.pop(i) # on retire la forme de la liste
            f.effacer() # puis on l'efface du canevas
        except:
            pass
    
    def deplacement_forme(self, x0, y0, x1, y1):
        try:
            if self.__forme_deplacee == None:
                self.__forme_deplacee = next(f for f in reversed(self.__formes)
                                               if f.contient_point(x0, y0))
            self.__forme_deplacee.deplacement(x1 - x0, y1 - y0)
        except:
            pass
    
    def fin_deplacement(self):
        self.__forme_deplacee = None


class FenPrincipale(Tk):
    def __init__(self):
        Tk.__init__(self)
        
        # arbre de scène
        self.configure(bg="grey")
        barreOutils = Frame(self)
        barreOutils.pack(side=TOP)
        boutonRectangle = Button(barreOutils, text="Rectangle")
        boutonRectangle.pack(side=LEFT, padx=5, pady=5)
        boutonEllipse = Button(barreOutils, text="Ellipse")
        boutonEllipse.pack(side=LEFT, padx=5, pady=5)
        boutonCouleur = Button(barreOutils, text="Couleur")
        boutonCouleur.pack(side=LEFT, padx=5, pady=5)
        boutonQuitter = Button(barreOutils, text="Quitter")
        boutonQuitter.pack(side=LEFT, padx=5, pady=5)
        self.__canevas = ZoneAffichage(self, 600, 400)
        self.__canevas.pack(side=TOP, padx=10, pady=10)
        
        # commandes
        boutonRectangle.config(command=self.__canevas.selection_rectangle)
        boutonEllipse.config(command=self.__canevas.selection_ellipse)
        boutonCouleur.config(command=self.__canevas.selection_couleur)
        boutonQuitter.config(command=self.destroy)
        self.__canevas.bind("<Button-1>", self.clic_canevas)
        self.__canevas.bind("<Control-ButtonRelease-1>", self.control_clic_canevas)
        self.__deplacement_en_cours = False
        self.__dernier_x = 0
        self.__dernier_y = 0
        self.__canevas.bind("<ButtonRelease-1>", self.release_canevas)
        self.__canevas.bind("<B1-Motion>", self.drag_canevas)
    
    def clic_canevas(self, event):
        self.__dernier_x = event.x
        self.__dernier_y = event.y
    
    def control_clic_canevas(self, event):
        self.__canevas.suppression_forme(event.x, event.y)
    
    def release_canevas(self, event):
        if not self.__deplacement_en_cours:
            self.__canevas.ajout_forme(event.x, event.y)
        else:
            self.__canevas.fin_deplacement()
        self.__deplacement_en_cours = False
    
    def drag_canevas(self, event):
        self.__canevas.deplacement_forme(self.__dernier_x, self.__dernier_y, event.x, event.y)
        self.__deplacement_en_cours = True
        self.__dernier_x = event.x
        self.__dernier_y = event.y


if __name__ == '__main__':
    fen = FenPrincipale()
    fen.mainloop()