annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
190
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
1 import pygame
210
b92f705bd8ea Modal dialogs, and focus stealing bugfixes
Stefano Rivera <stefano@rivera.za.net>
parents: 190
diff changeset
2 from pygame.constants import SRCALPHA
190
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
3
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
4 from mamba.widgets.base import Container
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
5 from mamba.widgets.text import TextWidget, TextButton
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
6
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
7
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
8 class MessageBox(Container):
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
9
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
10 def __init__(self, rect, text, post_callback=None, color='white'):
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
11 super(MessageBox, self).__init__(rect)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
12 self.text = text
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
13 self.post_callback = post_callback
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
14 self.color = color
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
15 self.prepare()
210
b92f705bd8ea Modal dialogs, and focus stealing bugfixes
Stefano Rivera <stefano@rivera.za.net>
parents: 190
diff changeset
16 self.modal = True
190
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
17
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
18 def prepare(self):
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
19 cont = TextWidget((0, 0), "Press [OK] or Enter to continue")
303
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
20 widgets = []
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
21 width = cont.rect.width
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
22 for line in self.text.split('\n'):
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
23 message = TextWidget((0, 0), line, color=self.color)
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
24 widgets.append(message)
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
25 width = max(width, message.rect.width)
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
26 widgets.append(cont)
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
27 top = self.rect.top + 10
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
28 left = self.rect.left + 5
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
29 for widget in widgets:
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
30 pos = (left + width / 2 - widget.rect.width / 2, top)
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
31 widget.rect.topleft = pos
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
32 top += widget.rect.height + 5
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
33 self.add(widget)
210
b92f705bd8ea Modal dialogs, and focus stealing bugfixes
Stefano Rivera <stefano@rivera.za.net>
parents: 190
diff changeset
34 self.ok_button = ok_button = TextButton((0, 0), 'OK')
190
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
35 ok_pos = (self.rect.left + 5 + width / 2 - ok_button.rect.width / 2,
303
af202e15167d Multi-line messages
Neil Muller <drnlmuller@gmail.com>
parents: 227
diff changeset
36 top + 5)
190
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
37 ok_button.rect.topleft = ok_pos
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
38 ok_button.add_callback('clicked', self.close)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
39 self.add(ok_button)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
40
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
41 def draw(self, surface):
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
42 background = pygame.Surface(self.rect.size, SRCALPHA)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
43 background.fill(pygame.Color('gray'))
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
44 surface.blit(background, self.rect)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
45 super(MessageBox, self).draw(surface)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
46
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
47 def close(self, ev, widget):
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
48 self.parent.remove(self)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
49 if self.post_callback:
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
50 self.post_callback()
210
b92f705bd8ea Modal dialogs, and focus stealing bugfixes
Stefano Rivera <stefano@rivera.za.net>
parents: 190
diff changeset
51
b92f705bd8ea Modal dialogs, and focus stealing bugfixes
Stefano Rivera <stefano@rivera.za.net>
parents: 190
diff changeset
52 def grab_focus(self):
b92f705bd8ea Modal dialogs, and focus stealing bugfixes
Stefano Rivera <stefano@rivera.za.net>
parents: 190
diff changeset
53 return self.ok_button.grab_focus()