﻿# -*- coding:utf-8

from PyQt4 import QtGui
from PyQt4 import QtCore
import sys

class Lights(QtGui.QWidget):
    def __init__(self, parent=None, color=QtCore.Qt.yellow, diameter=120):
        QtGui.QWidget.__init__(self, parent=parent)
        self.__diameter=diameter
        if color in (QtCore.Qt.green, QtCore.Qt.yellow, QtCore.Qt.red):
           self.__color=color

    def color(self):
        """couleur actuelle"""
        return self.__color

    def setColor(self, color):
        """changer la couleur actuelle"""
        if color in (QtCore.Qt.green, QtCore.Qt.yellow, QtCore.Qt.red):
            self.__color=color
            self.update()
            return True
        else:
            return False

    def diameter(self):
        """diamètre des feux"""
        return self.__diameter

    def setDiameter(self, diameter):
        """changer le diamètre des feux"""
        self.__diameter=diameter
        self.update()
        self.updateGeometry() #La taille du widget a changé

    def sizeHint(self):
        """taille optimale du widget"""
        return QtCore.QSize(self.__diameter,self.__diameter*3)

    def paintEvent(self, event):
        """méthode de mise à jour"""
        key="lights:{}:{}".format(self.__color, self.__diameter) #Clef qui identifie la pixmap

        pixmap=QtGui.QPixmap()
        painter=QtGui.QPainter(self)

        if not QtGui.QPixmapCache.find(key, pixmap):
            pixmap=self.generatePixmap()
            QtGui.QPixmapCache.insert(key, pixmap)

        painter.drawPixmap(QtCore.QPoint(0,0), pixmap)

    def generatePixmap(self):
        """génération de la pixmap du widget"""
        w=self.__diameter
        h=self.__diameter*3

        pixmap=QtGui.QPixmap(w,h)
        painter=QtGui.QPainter(pixmap)

        painter.setRenderHint(QtGui.QPainter.Antialiasing) #Antialiasing

        painter.setPen(QtGui.QPen(0))
        painter.setBrush(QtCore.Qt.darkGray)
        painter.drawRect(0,0,w,h)

        painter.setBrush(QtGui.QColor(self.__color))
        if self.__color==QtCore.Qt.red:
            painter.drawEllipse(0,0,w,w)
        elif self.__color==QtCore.Qt.yellow:
            painter.drawEllipse(0,w,w,w)
        else:
            painter.drawEllipse(0,w*2,w,w)

        return pixmap

    def mousePressEvent(self, event):
        """clique gauche de la souris sur le widget"""
        if event.y()<self.__diameter:
            self.__color=QtCore.Qt.red
        elif event.y()<self.__diameter*2:
            self.__color=QtCore.Qt.yellow
        else:
            self.__color=QtCore.Qt.green

        self.emit(QtCore.SIGNAL("changed(PyQt_PyObject)"), self.__color)
        self.update()

def main():
    app=QtGui.QApplication(sys.argv)
    w=Lights()
    w.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
