Mercurial > mamba
annotate mamba/widgets/entrybox.py @ 245:0975a995113b
Factor out entry widget a bit
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Thu, 15 Sep 2011 00:20:02 +0200 |
parents | 5b021e8498b3 |
children | feca52afc109 |
rev | line source |
---|---|
228 | 1 import pygame |
245
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
235
diff
changeset
|
2 from pygame.constants import SRCALPHA, K_ESCAPE, K_RETURN, K_UP, K_DOWN |
228 | 3 |
4 from mamba.widgets.base import Container | |
5 from mamba.constants import DELETE_KEYS | |
245
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
235
diff
changeset
|
6 from mamba.widgets.text import TextWidget, TextButton, EntryTextWidget |
228 | 7 |
8 | |
9 class EntryBox(Container): | |
10 | |
11 def __init__(self, rect, text, init_value, accept_callback=None, | |
12 color='white', entry_color='yellow'): | |
13 super(EntryBox, self).__init__(rect) | |
14 self.text = text | |
15 self.accept_callback = accept_callback | |
16 self.color = color | |
17 self.entry_color = entry_color | |
18 self.value = init_value | |
19 self.prepare() | |
20 self.modal = True | |
21 | |
22 def prepare(self): | |
23 message = TextWidget((self.rect.left + 50, self.rect.top + 2), | |
24 self.text, color=self.color) | |
25 self.rect.width = message.rect.width + 100 | |
26 self.add(message) | |
245
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
235
diff
changeset
|
27 self.entry_text = EntryTextWidget((self.rect.left + 5, |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
235
diff
changeset
|
28 self.rect.top + message.rect.height + 5), self.value, |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
235
diff
changeset
|
29 update=self.edit, focus_color=self.entry_color) |
228 | 30 self.add(self.entry_text) |
31 ok_button = TextButton((self.rect.left + 50, | |
32 self.entry_text.rect.bottom), 'Accept') | |
33 ok_button.add_callback('clicked', self.close, True) | |
34 self.add(ok_button) | |
35 cancel_button = ok_button = TextButton( | |
36 (self.entry_text.rect.right + 60, self.entry_text.rect.bottom), | |
37 'Cancel') | |
38 cancel_button.add_callback('clicked', self.close, False) | |
39 self.add(cancel_button) | |
40 | |
41 def draw(self, surface): | |
42 background = pygame.Surface(self.rect.size, SRCALPHA) | |
43 background.fill(pygame.Color('gray')) | |
44 surface.blit(background, self.rect) | |
45 super(EntryBox, self).draw(surface) | |
46 | |
47 def close(self, ev, widget, ok): | |
48 if self.accept_callback and ok: | |
49 if self.accept_callback(self.value): | |
235
5b021e8498b3
Remove debugging print. Add robustness against being removed in accept_callback
Neil Muller <drnlmuller@gmail.com>
parents:
228
diff
changeset
|
50 if self.parent: |
5b021e8498b3
Remove debugging print. Add robustness against being removed in accept_callback
Neil Muller <drnlmuller@gmail.com>
parents:
228
diff
changeset
|
51 self.parent.remove(self) |
228 | 52 # Don't remove if the accept callback failed |
53 return | |
54 self.parent.remove(self) | |
55 | |
56 def edit(self, ev, widget): | |
57 if ev.key == K_ESCAPE: | |
58 self.close(ev, widget, False) | |
59 elif ev.key == K_RETURN: | |
60 self.close(ev, widget, True) | |
61 elif ev.key in DELETE_KEYS: | |
62 if self.value: | |
63 self.value = self.value[:-1] | |
245
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
235
diff
changeset
|
64 self.entry_text.update(self.value) |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
235
diff
changeset
|
65 elif ev.key in (K_UP, K_DOWN): |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
235
diff
changeset
|
66 return False # pass this up to parent |
228 | 67 else: |
68 self.value += ev.unicode | |
245
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
235
diff
changeset
|
69 self.entry_text.update(self.value) |
228 | 70 return True |
71 | |
72 def grab_focus(self): | |
73 self.entry_text.grab_focus() |