view mamba/widgets/levelbutton.py @ 322:86c5c6afdac0

Thumbnails on the level screen
author Stefano Rivera <stefano@rivera.za.net>
date Fri, 16 Sep 2011 20:01:13 +0200
parents fba74abad7b7
children cbbba6ddc77d
line wrap: on
line source

import pygame
from pygame.locals import SRCALPHA

from mamba.constants import COLOR, FOCUS_COLOR
from mamba.data import load_image
from mamba.widgets.base import Button
from mamba.widgets.text import TextWidget


class LevelButton(Button):

    def __init__(self, rect, level, done=False):
        super(LevelButton, self).__init__(rect)
        self.level = level
        self.text = level.name
        self.done = done
        self.focussable = True
        self.border = 2
        self.rect.width = 100
        self.rect.height = 100
        self.prepare()

    def prepare(self):
        self.surface = pygame.Surface(self.rect.size, SRCALPHA)
        self.surface.fill(0)

        # Level Thumbnail
        level_surface = pygame.Surface(self.level.get_size(), SRCALPHA)
        self.level.draw(level_surface)
        dest_rect = pygame.Rect((self.border, self.border),
                                (self.rect.width - self.border,
                                 self.rect.height - self.border))
        size = level_surface.get_rect().fit(dest_rect).size
        level_thumbnail = pygame.transform.scale(level_surface, size)
        self.surface.blit(level_thumbnail, dest_rect)

        if self.done:
            image = load_image('menus/tick.png')
            self.surface.blit(image, image.get_rect())

        self._text = TextWidget((0, 0), self.text, fontsize=12)
        self._text.prepare()
        text_rect = pygame.Rect((0, 0), self.rect.size).inflate(
                self._text.rect.width - self.rect.width,
                self._text.rect.height - self.rect.height)
        text_rect.top = self.rect.height - self._text.rect.height - self.border
        self.surface.blit(self._text.surface, text_rect)

        color = pygame.Color(FOCUS_COLOR if self.focussed else COLOR)
        pygame.draw.rect(self.surface, color, self.surface.get_rect(),
                         self.border + 1)
        self._state = (self.done, self.focussed)

    def draw(self, surface):
        if self._state != (self.done, self.focussed):
            self.prepare()
        surface.blit(self.surface, self.rect)