Mercurial > mamba
annotate mamba/widgets/entrybox.py @ 381:8b9cfc4f0f01
Use right edge of OK button to place cancel buttons
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Sat, 17 Sep 2011 01:02:52 +0200 |
parents | 170d4a43c00e |
children | 08a84134ccbf |
rev | line source |
---|---|
228 | 1 import pygame |
292
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
245
diff
changeset
|
2 from pygame.constants import SRCALPHA, K_ESCAPE, K_RETURN, KEYDOWN |
228 | 3 |
4 from mamba.widgets.base import Container | |
245
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
235
diff
changeset
|
5 from mamba.widgets.text import TextWidget, TextButton, EntryTextWidget |
228 | 6 |
7 | |
8 class EntryBox(Container): | |
9 | |
10 def __init__(self, rect, text, init_value, accept_callback=None, | |
11 color='white', entry_color='yellow'): | |
12 super(EntryBox, self).__init__(rect) | |
13 self.text = text | |
14 self.accept_callback = accept_callback | |
15 self.color = color | |
16 self.entry_color = entry_color | |
17 self.value = init_value | |
18 self.prepare() | |
19 self.modal = True | |
20 | |
21 def prepare(self): | |
22 message = TextWidget((self.rect.left + 50, self.rect.top + 2), | |
23 self.text, color=self.color) | |
24 self.rect.width = message.rect.width + 100 | |
25 self.add(message) | |
245
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
235
diff
changeset
|
26 self.entry_text = EntryTextWidget((self.rect.left + 5, |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
235
diff
changeset
|
27 self.rect.top + message.rect.height + 5), self.value, |
292
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
245
diff
changeset
|
28 focus_color=self.entry_color) |
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
245
diff
changeset
|
29 self.add_callback(KEYDOWN, self.edit) |
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( | |
381
8b9cfc4f0f01
Use right edge of OK button to place cancel buttons
Neil Muller <drnlmuller@gmail.com>
parents:
337
diff
changeset
|
36 (ok_button.rect.right + 10, self.entry_text.rect.bottom), |
228 | 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: | |
292
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
245
diff
changeset
|
49 self.value = self.entry_text.value |
228 | 50 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
|
51 if self.parent: |
337
170d4a43c00e
Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents:
292
diff
changeset
|
52 if hasattr(self.parent, 'paused'): |
170d4a43c00e
Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents:
292
diff
changeset
|
53 self.parent.paused = False |
235
5b021e8498b3
Remove debugging print. Add robustness against being removed in accept_callback
Neil Muller <drnlmuller@gmail.com>
parents:
228
diff
changeset
|
54 self.parent.remove(self) |
228 | 55 # Don't remove if the accept callback failed |
56 return | |
337
170d4a43c00e
Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents:
292
diff
changeset
|
57 if hasattr(self.parent, 'paused'): |
170d4a43c00e
Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents:
292
diff
changeset
|
58 self.parent.paused = False |
228 | 59 self.parent.remove(self) |
381
8b9cfc4f0f01
Use right edge of OK button to place cancel buttons
Neil Muller <drnlmuller@gmail.com>
parents:
337
diff
changeset
|
60 return True |
228 | 61 |
62 def edit(self, ev, widget): | |
63 if ev.key == K_ESCAPE: | |
64 self.close(ev, widget, False) | |
292
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
245
diff
changeset
|
65 return True |
228 | 66 elif ev.key == K_RETURN: |
67 self.close(ev, widget, True) | |
292
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
245
diff
changeset
|
68 return True |
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
245
diff
changeset
|
69 return False # pass this up to parent |
228 | 70 |
71 def grab_focus(self): | |
72 self.entry_text.grab_focus() |