f43fd2ed67b4754bd35ae24758af3c4e87675247
[matches/honours.git] / research / transmission_spectroscopy / simulator / pgu-0.18 / pgu / gui / input.py
1 """
2 """
3 import pygame
4 from pygame.locals import *
5
6 from .const import *
7 from . import widget
8
9 class Input(widget.Widget):
10     """A single line text input.
11     
12     Example:
13         w = Input(value="Cuzco the Goat",size=20)
14         w = Input("Marbles")
15     
16     """
17
18     _value = None
19
20     def __init__(self,value="",size=20,**params):
21         """Create a new Input widget.
22
23         Keyword arguments:
24             value -- initial text
25             size -- size for the text box, in characters
26
27         """
28         params.setdefault('cls','input')
29         widget.Widget.__init__(self,**params)
30         self.value = value
31         self.pos = len(str(value))
32         self.vpos = 0
33         self.font = self.style.font
34         w,h = self.font.size("e"*size)
35         if not self.style.height: self.style.height = h
36         if not self.style.width: self.style.width = w
37         #self.style.height = max(self.style.height,h)
38         #self.style.width = max(self.style.width,w)
39         #self.rect.w=w+self.style.padding_left+self.style.padding_right;
40         #self.rect.h=h+self.style.padding_top+self.style.padding_bottom;
41     
42     def paint(self,s):
43         r = pygame.Rect(0,0,self.rect.w,self.rect.h)
44         
45         cs = 2 #NOTE: should be in a style
46         
47         w,h = self.font.size(self.value[0:self.pos])
48         x = w-self.vpos
49         if x < 0: self.vpos -= -x
50         if x+cs > s.get_width(): self.vpos += x+cs-s.get_width()
51         
52         s.blit(self.font.render(self.value, 1, self.style.color),(-self.vpos,0))
53         
54         if self.container.myfocus is self:
55             w,h = self.font.size(self.value[0:self.pos])
56             r.x = w-self.vpos
57             r.w = cs
58             r.h = h
59             s.fill(self.style.color,r)
60     
61     def _setvalue(self,v):
62         #self.__dict__['value'] = v
63         self._value = v
64         self.send(CHANGE)
65     
66     def event(self,e):
67         used = None
68         if e.type == KEYDOWN:
69             if e.key == K_BACKSPACE:
70                 if self.pos:
71                     self._setvalue(self.value[:self.pos-1] + self.value[self.pos:])
72                     self.pos -= 1
73             elif e.key == K_DELETE:
74                 if len(self.value) > self.pos:
75                     self._setvalue(self.value[:self.pos] + self.value[self.pos+1:])
76             elif e.key == K_HOME: 
77                 self.pos = 0
78             elif e.key == K_END:
79                 self.pos = len(self.value)
80             elif e.key == K_LEFT:
81                 if self.pos > 0: self.pos -= 1
82                 used = True
83             elif e.key == K_RIGHT:
84                 if self.pos < len(self.value): self.pos += 1
85                 used = True
86             elif e.key == K_RETURN:
87                 self.send(ACTIVATE)
88             elif e.key == K_TAB:
89                 pass
90             else:
91                 #c = str(e.unicode)
92                 if (type(e.unicode) == str):
93                     c = e.unicode
94                 else:
95                     c = (e.unicode).encode('latin-1')
96
97                 try:
98                     if c:
99                         self._setvalue(self.value[:self.pos] + c + self.value[self.pos:])
100                         self.pos += 1
101                 except: #ignore weird characters
102                     pass
103             self.repaint()
104         elif e.type == FOCUS:
105             self.repaint()
106         elif e.type == BLUR:
107             self.repaint()
108         
109         self.pcls = ""
110         if self.container.myfocus is self: self.pcls = "focus"
111         
112         return used
113     
114     @property
115     def value(self):
116         return self._value
117
118     @value.setter
119     def value(self, val):
120         if (val == None): 
121             val = ""
122         val = str(val)
123         self.pos = len(val)
124         oldval = self._value
125         self._value = val
126         if (oldval != val):
127             self.send(CHANGE)
128             self.repaint()
129
130
131 class Password(Input):
132     """A password input, in which text is rendered with '*' characters."""
133
134     def paint(self,s):
135         hidden="*"
136         show=len(self.value)*hidden
137         
138         #print "self.value:",self.value
139
140         if self.pos == None: self.pos = len(self.value)
141         
142         r = pygame.Rect(0,0,self.rect.w,self.rect.h)
143         
144         cs = 2 #NOTE: should be in a style
145         
146         w,h = self.font.size(show)
147         x = w-self.vpos
148         if x < 0: self.vpos -= -x
149         if x+cs > s.get_width(): self.vpos += x+cs-s.get_width()
150         
151         s.blit(self.font.render(show, 1, self.style.color),(-self.vpos,0))
152         
153         if self.container.myfocus is self:
154             #w,h = self.font.size(self.value[0:self.pos])            
155             w,h = self.font.size(show[0:self.pos])
156             r.x = w-self.vpos
157             r.w = cs
158             r.h = h
159             s.fill(self.style.color,r)
160

UCC git Repository :: git.ucc.asn.au