228
|
1 import pygame
|
|
2 from pygame.constants import SRCALPHA, KEYDOWN, K_ESCAPE, K_RETURN
|
|
3
|
|
4 from mamba.widgets.base import Container
|
|
5 from mamba.constants import DELETE_KEYS
|
|
6 from mamba.widgets.text import TextWidget, TextButton
|
|
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 self.focussable = True
|
|
22
|
|
23 def prepare(self):
|
|
24 message = TextWidget((self.rect.left + 50, self.rect.top + 2),
|
|
25 self.text, color=self.color)
|
|
26 self.rect.width = message.rect.width + 100
|
|
27 self.add(message)
|
|
28 self.entry_text = TextWidget((self.rect.left + 5,
|
|
29 self.rect.top + message.rect.height + 5), 'Entry: %s' % self.value,
|
|
30 color=self.entry_color)
|
|
31 self.add(self.entry_text)
|
|
32 self.entry_text.add_callback(KEYDOWN, self.edit)
|
|
33 self.entry_text.focussable = True
|
|
34 ok_button = TextButton((self.rect.left + 50,
|
|
35 self.entry_text.rect.bottom), 'Accept')
|
|
36 ok_button.add_callback('clicked', self.close, True)
|
|
37 self.add(ok_button)
|
|
38 cancel_button = ok_button = TextButton(
|
|
39 (self.entry_text.rect.right + 60, self.entry_text.rect.bottom),
|
|
40 'Cancel')
|
|
41 cancel_button.add_callback('clicked', self.close, False)
|
|
42 self.add(cancel_button)
|
|
43
|
|
44 def draw(self, surface):
|
|
45 background = pygame.Surface(self.rect.size, SRCALPHA)
|
|
46 background.fill(pygame.Color('gray'))
|
|
47 surface.blit(background, self.rect)
|
|
48 super(EntryBox, self).draw(surface)
|
|
49
|
|
50 def close(self, ev, widget, ok):
|
|
51 if self.accept_callback and ok:
|
|
52 if self.accept_callback(self.value):
|
|
53 self.parent.remove(self)
|
|
54 # Don't remove if the accept callback failed
|
|
55 return
|
|
56 self.parent.remove(self)
|
|
57
|
|
58 def edit(self, ev, widget):
|
|
59 if ev.key == K_ESCAPE:
|
|
60 self.close(ev, widget, False)
|
|
61 elif ev.key == K_RETURN:
|
|
62 self.close(ev, widget, True)
|
|
63 elif ev.key in DELETE_KEYS:
|
|
64 if self.value:
|
|
65 self.value = self.value[:-1]
|
|
66 self.entry_text.text = 'Entry: %s' % self.value
|
|
67 self.entry_text.prepare()
|
|
68 else:
|
|
69 self.value += ev.unicode
|
|
70 self.entry_text.text = 'Entry: %s' % self.value
|
|
71 self.entry_text.prepare()
|
|
72 print self.value
|
|
73 return True
|
|
74
|
|
75 def grab_focus(self):
|
|
76 self.entry_text.grab_focus()
|