# -*- coding: utf-8 -*-
"""
Curseurs winwii

$Id$
$URL$
"""

import pygame
import os
from eventutils import EventHandlerMixin, event_handler
from events import TIMEOUT
from itertools import cycle

class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin):
    '''
    The class for animating the warping cursor
    '''

    @staticmethod
    def _get_theme_images(name) :
        basePath = os.path.abspath(__file__).split(os.path.sep)[:-1]
        basePath.append('data')
        basePath.append(name)
        basePath = os.path.sep.join(basePath)
        images = [f for f in os.listdir(basePath) if os.path.splitext(f)[1] == '.png']
        return basePath, images

    
    def __init__(self, theme='black', duration=50, blinkMode=True):
        pygame.sprite.Sprite.__init__(self)
        pygame.mouse.set_visible(False)
        imagesPath, images = WarpingCursor._get_theme_images(theme)
        flashImage = images.pop(images.index('flash.png'))
        flashImagePath = os.path.sep.join([imagesPath, flashImage]) 
        self.flashImage = pygame.image.load(flashImagePath).convert_alpha()
        images.sort(lambda a, b : cmp(*[int(os.path.splitext(f)[0]) for f in [a, b]]))
        
        self.images = []
        for img in images :
            imagePath = os.path.sep.join([imagesPath, img])
            img = pygame.image.load(imagePath).convert_alpha()
            self.images.append(img)
        
        # assumes that all images have same dimensions
        self.width = self.images[0].get_width()
        self.height = self.images[0].get_height()
        self.duration = duration
        
        self.image = self.images[0]
        self.rect = pygame.Rect((-self.width/2,-self.height/2), (self.width, self.height))
        
        self.blinkMode = blinkMode
        self._startBlink()
            
    def _startBlink(self) :
        if self.blinkMode :
            self._blinking = True
            pygame.time.set_timer(TIMEOUT, self.duration)
            self.iterator = self.iterImages()
    
    def iterImages(self) :
        for img in cycle(self.images) :
            yield img
    
    @event_handler(TIMEOUT)
    def loadNext(self, event) :
        if self._blinking :
            self.image = self.iterator.next()
    
    @event_handler(pygame.MOUSEBUTTONDOWN)
    def flashOn(self, event) :
        self._blinking = False
        self.image = self.flashImage

    @event_handler(pygame.MOUSEBUTTONUP)
    def flashOff(self, event) :
        if self.blinkMode :
            self._blinking = True
            self.loadNext(event)
        else :
            self.image = self.images[0]
    
    @event_handler(pygame.MOUSEMOTION)
    def move(self, event) :
        self.rect.move_ip(event.rel)
