view mamba/widgets/messagebox.py @ 303:af202e15167d

Multi-line messages
author Neil Muller <drnlmuller@gmail.com>
date Fri, 16 Sep 2011 17:35:50 +0200
parents c068190c0b1d
children 170d4a43c00e
line wrap: on
line source

import pygame
from pygame.constants import SRCALPHA

from mamba.widgets.base import Container
from mamba.widgets.text import TextWidget, TextButton


class MessageBox(Container):

    def __init__(self, rect, text, post_callback=None, color='white'):
        super(MessageBox, self).__init__(rect)
        self.text = text
        self.post_callback = post_callback
        self.color = color
        self.prepare()
        self.modal = True

    def prepare(self):
        cont = TextWidget((0, 0), "Press [OK] or Enter to continue")
        widgets = []
        width = cont.rect.width
        for line in self.text.split('\n'):
            message = TextWidget((0, 0), line, color=self.color)
            widgets.append(message)
            width = max(width, message.rect.width)
        widgets.append(cont)
        top = self.rect.top + 10
        left = self.rect.left + 5
        for widget in widgets:
            pos = (left + width / 2 - widget.rect.width / 2, top)
            widget.rect.topleft = pos
            top += widget.rect.height + 5
            self.add(widget)
        self.ok_button = ok_button = TextButton((0, 0), 'OK')
        ok_pos = (self.rect.left + 5 + width / 2 - ok_button.rect.width / 2,
                top + 5)
        ok_button.rect.topleft = ok_pos
        ok_button.add_callback('clicked', self.close)
        self.add(ok_button)

    def draw(self, surface):
        background = pygame.Surface(self.rect.size, SRCALPHA)
        background.fill(pygame.Color('gray'))
        surface.blit(background, self.rect)
        super(MessageBox, self).draw(surface)

    def close(self, ev, widget):
        self.parent.remove(self)
        if self.post_callback:
            self.post_callback()

    def grab_focus(self):
        return self.ok_button.grab_focus()