annotate mamba/widgets/entrybox.py @ 235:5b021e8498b3

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