'''
Created on 29 mai 2009

@author: samsam
'''

import os, sys, math

import pygame
from pygame.sprite import Sprite

class WarpingCursor(Sprite):
    '''
    The class for animating the warping cursor
        
        screen:
            the screen on which the WarpingCursor is painted
        images:
            The images constituting the animation of the cursor
        durations:
            The duration of each image in the animation
        centerPosition:
            The Position of the center of the cursor
        _imagePointer:
            A pointer to the current image
        _animationOffset:
            The time elapsed since when the current image should have been displayed
    '''
    screen = None
    images = None
    durations = None
    centerPosition = None
    _imagePointer = None
    _animationOffset = None
    

    def __init__(self, scr, images, durations, initCenterPosition,flashImage):
        '''
        Constructor
        
            scr:
                the screen on which the WarpingCursor is painted
            images:
                The images constituting the animation of the cursor
            durations:
                The duration of each image in the animation
            initCenterPosition:
                The Position of the center of the cursor at the beginning 
        '''
        self.screen = scr
        self.images = images
        self.flashImagePath = flashImage
        self.durations = durations
        self.centerPosition = initCenterPosition
        self.flashLength = 100
        self.flashing = False
        self.image = pygame.image.load(self.images[0]).convert_alpha()
        self._imagePointer = 0
        self._animationOffset = 0
        self._flashTimer = 0        
    
    def update(self, elapsedTime, centerPosition):
        '''
        Update the cursor's look and position
        
            elapsedTime:
                The time passed since the previous update
            centerPosition:
                the new position of the creep
        '''
        self._updateImage(elapsedTime)
        self.centerPosition = centerPosition
        if self.flashing :
            self._flashTimer += elapsedTime
            if self._flashTimer > self.flashLength:
                self.flashing = False
    
    def _updateImage(self, elapsedTime):
        '''
        Update the cursor's image
        
            elapsedTime:
                The time passed since the previous update
        '''
        self._animationOffset += elapsedTime
        
        if self._animationOffset > self.durations[self._imagePointer]:
            #New animation offset is computed first, before updating the pointer
            self._animationOffset -= self.durations[self._imagePointer]
            #point to the next image (restarts from the beginning when it reaches the end)
            self._imagePointer = (self._imagePointer + 1) % len(self.images)
            
        if self.flashing:
            self.image = pygame.image.load(self.flashImagePath).convert_alpha()                       
        else :    
            self.image = pygame.image.load(self.images[self._imagePointer]).convert_alpha()
        
    def flash(self,flashLength = None):
        self._flashTimer = 0
        self.flashing = True
        if flashLength:
            self.flashlength = flashLength
    
    def blit(self,surface):
        '''
        Draw the circle on surface
        '''
        
        newPos = (self.centerPosition[0] - self.image.get_width() / 2, self.centerPosition[1] - self.image.get_height() / 2)
        surface.blit(self.image, newPos)

def createImageListFromPath(path, imageCount):
    '''
    Create a list of images for a cursor (the concatenation of the original and reversed lists of images).
    Images must be stored as path/imageNumber.png
    
        path:
            The folder where the images for that cursor are stored
        imageCount:
            The number of images in the folder
    '''
    
    tempImages = [''.join([path, '/', str(i), '.png']) for i in range(imageCount)]
    #tempImagesReversed = tempImages[:]
    #tempImagesReversed.reverse()
    #return(tempImages+tempImagesReversed)
    return(tempImages)  

#testing
if __name__ == "__main__" :
    window = pygame.display.set_mode((1680, 1050), pygame.FULLSCREEN)
    screen = pygame.display.get_surface()
    clock = pygame.time.Clock()
    
    images = createImageListFromPath('cursorImages/black',11)
    durations = [50 for i in range(22)]
    position = (400, 300)
    cursor = WarpingCursor(screen, images, durations, position)
    
    while True:
        # Limit frame speed to 50 FPS
        #
        timePassed = clock.tick(50)
        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            if event.type == pygame.MOUSEMOTION:
                position = event.pos
        
        cursor.update(timePassed, position)
        cursor.blit(screen)
        pygame.display.flip()
    
    
