view skaapsteker/widgets/bubble.py @ 615:e71e13dbd570

Properly copy pos when creating parts of speech bubbles.
author Simon Cross <hodgestar@gmail.com>
date Wed, 04 May 2011 01:28:41 +0200
parents ba66bacbab22
children
line wrap: on
line source

# -*- coding: utf-8 -*-
"""Widget for in-level dialogue / speech bubbles."""

from pygame.locals import (KEYDOWN, K_RETURN, K_SPACE, SRCALPHA)
import pygame.draw
import pygame

from . import Widget
from ..engine import CloseDialog
from .text import Text, TextChoice


class NotificationWidget(Widget):

    def __init__(self, text):
        pos = pygame.Rect((0, 0), (300, 1))
        text += u'\n\n» Leave'
        self._text = Text(text, pos, wrap=True)


    def draw(self, level_surface):
        if self._text:
            self._text.rect.center = level_surface.get_clip().center

            bgrect = self._text.rect.inflate(10, 10)
            bgrect2 = bgrect.move(0, 0) #
            bgrect2.topleft = (0, 0)
            bgsurf = pygame.Surface(bgrect.size, flags=SRCALPHA)
            bgsurf.fill((255, 255, 127, 120))
            pygame.draw.rect(bgsurf, (0, 0, 0, 120), bgrect2, 1)
            level_surface.blit(bgsurf, bgrect)

            self._text.draw(level_surface)

    def close(self):
        pass

    def dispatch(self, ev):
        if ev.type == KEYDOWN and ev.key in [K_RETURN, K_SPACE]:
            CloseDialog.post(None)



class DialogueWidget(Widget):

    def __init__(self, npc):
        self.npc = npc
        self.dsm = npc.dsm
        self._text = None
        self._text_choice = None
        self._state_update()

    def _state_update(self):
        pos = pygame.Rect((0, 0), (300, 1))
        state = self.dsm.get_state()
        if state.text:
            # pos.move(0, 0) copies pos
            self._text = Text(state.text, pos.move(0, 0), wrap=True)
        else:
            self._text = None
        options = [(text, i) for (i, text) in self.dsm.choices()]
        if state.auto_next:
            text = state.auto_next_text if state.auto_next_text else "Next"
            options.append((text, "N"))
        else:
            options.append(("Leave", "L"))
        # pos.move(0, 0) copies pos
        self._text_choice = TextChoice(options, pos.move(0, 0), wrap=True)
        self._text_choice.callbacks.append(self._selected)

    def _selected(self, i, data):
        if data == "L":
            CloseDialog.post(self.npc)
        else:
            if data == "N":
                self.dsm.auto_next()
            else:
                self.dsm.choice(i)
            if self.dsm.has_text():
                self._state_update()
            else:
                CloseDialog.post(self.npc)

    def draw(self, level_surface):
        if self._text:
            self._text.rect.center = level_surface.get_clip().center
            self._text_choice.rect.topleft = self._text.rect.bottomleft
            self._text_choice.rect.move_ip((0, 10))

            bgrect = self._text.rect.union(self._text_choice.rect)
            bgrect.inflate_ip(10, 10)
            bgrect2 = bgrect.move(0, 0) #
            bgrect2.topleft = (0, 0)
            bgsurf = pygame.Surface(bgrect.size, flags=SRCALPHA)
            bgsurf.fill((255, 255, 255, 180))
            pygame.draw.rect(bgsurf, (0, 0, 0, 120), bgrect2, 1)
            level_surface.blit(bgsurf, bgrect)


            self._text.draw(level_surface)
            self._text_choice.draw(level_surface)

    def close(self):
        pass

    def dispatch(self, ev):
        self._text_choice.dispatch(ev)