annotate mamba/widgets/messagebox.py @ 210:b92f705bd8ea

Modal dialogs, and focus stealing bugfixes
author Stefano Rivera <stefano@rivera.za.net>
date Wed, 14 Sep 2011 20:49:48 +0200
parents c9cee22934be
children c068190c0b1d
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 fontcache = {}
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
10
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
11 def __init__(self, rect, text, post_callback=None, color='white'):
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
12 super(MessageBox, self).__init__(rect)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
13 self.text = text
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
14 self.post_callback = post_callback
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
15 self.color = color
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
16 self.prepare()
210
b92f705bd8ea Modal dialogs, and focus stealing bugfixes
Stefano Rivera <stefano@rivera.za.net>
parents: 190
diff changeset
17 self.modal = True
190
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
18
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
19 def prepare(self):
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
20 cont = TextWidget((0, 0), "Press [OK] or Enter to continue")
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
21 message = TextWidget((0, 0), self.text, color=self.color)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
22 width = max(cont.rect.width, message.rect.width)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
23 if width > message.rect.width:
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
24 cont_pos = (self.rect.left + 5,
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
25 self.rect.top + 10 + message.rect.height)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
26 message_pos = (self.rect.left + 5 + width / 2
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
27 - message.rect.width / 2, self.rect.top + 5)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
28 else:
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
29 message_pos = (self.rect.left + 5, self.rect.top + 5)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
30 cont_pos = (self.rect.left + 5 + width / 2
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
31 - message.rect.width / 2,
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
32 self.rect.top + 10 + message.rect.height)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
33 message.rect.topleft = message_pos
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
34 cont.rect.topleft = cont_pos
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
35 self.add(message)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
36 self.add(cont)
210
b92f705bd8ea Modal dialogs, and focus stealing bugfixes
Stefano Rivera <stefano@rivera.za.net>
parents: 190
diff changeset
37 self.ok_button = ok_button = TextButton((0, 0), 'OK')
190
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
38 ok_pos = (self.rect.left + 5 + width / 2 - ok_button.rect.width / 2,
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
39 cont_pos[1] + 5 + cont.rect.height)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
40 ok_button.rect.topleft = ok_pos
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
41 ok_button.add_callback('clicked', self.close)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
42 self.add(ok_button)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
43
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
44 def draw(self, surface):
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
45 background = pygame.Surface(self.rect.size, SRCALPHA)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
46 background.fill(pygame.Color('gray'))
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
47 surface.blit(background, self.rect)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
48 super(MessageBox, self).draw(surface)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
49
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
50 def close(self, ev, widget):
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
51 self.parent.remove(self)
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
52 if self.post_callback:
c9cee22934be Add messagebox widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
53 self.post_callback()
210
b92f705bd8ea Modal dialogs, and focus stealing bugfixes
Stefano Rivera <stefano@rivera.za.net>
parents: 190
diff changeset
54
b92f705bd8ea Modal dialogs, and focus stealing bugfixes
Stefano Rivera <stefano@rivera.za.net>
parents: 190
diff changeset
55 def grab_focus(self):
b92f705bd8ea Modal dialogs, and focus stealing bugfixes
Stefano Rivera <stefano@rivera.za.net>
parents: 190
diff changeset
56 return self.ok_button.grab_focus()