""" """ import pygame from pygame.locals import * from const import * import widget class Input(widget.Widget): """A single line text input.
Input(value="",size=20)
value
initial text
size
size for the text box, in characters
Example w = Input(value="Cuzco the Goat",size=20) w = Input("Marbles") """ def __init__(self,value="",size=20,**params): params.setdefault('cls','input') widget.Widget.__init__(self,**params) self.value = value self.pos = len(str(value)) self.vpos = 0 self.font = self.style.font w,h = self.font.size("e"*size) if not self.style.height: self.style.height = h if not self.style.width: self.style.width = w #self.style.height = max(self.style.height,h) #self.style.width = max(self.style.width,w) #self.rect.w=w+self.style.padding_left+self.style.padding_right; #self.rect.h=h+self.style.padding_top+self.style.padding_bottom; def paint(self,s): r = pygame.Rect(0,0,self.rect.w,self.rect.h) cs = 2 #NOTE: should be in a style w,h = self.font.size(self.value[0:self.pos]) x = w-self.vpos if x < 0: self.vpos -= -x if x+cs > s.get_width(): self.vpos += x+cs-s.get_width() s.blit(self.font.render(self.value, 1, self.style.color),(-self.vpos,0)) if self.container.myfocus is self: w,h = self.font.size(self.value[0:self.pos]) r.x = w-self.vpos r.w = cs r.h = h s.fill(self.style.color,r) def _setvalue(self,v): self.__dict__['value'] = v self.send(CHANGE) def event(self,e): used = None if e.type == KEYDOWN: if e.key == K_BACKSPACE: if self.pos: self._setvalue(self.value[:self.pos-1] + self.value[self.pos:]) self.pos -= 1 elif e.key == K_DELETE: if len(self.value) > self.pos: self._setvalue(self.value[:self.pos] + self.value[self.pos+1:]) elif e.key == K_HOME: self.pos = 0 elif e.key == K_END: self.pos = len(self.value) elif e.key == K_LEFT: if self.pos > 0: self.pos -= 1 used = True elif e.key == K_RIGHT: if self.pos < len(self.value): self.pos += 1 used = True elif e.key == K_RETURN: self.next() elif e.key == K_TAB: pass else: #c = str(e.unicode) try: c = (e.unicode).encode('latin-1') if c: self._setvalue(self.value[:self.pos] + c + self.value[self.pos:]) self.pos += 1 except: #ignore weird characters pass self.repaint() elif e.type == FOCUS: self.repaint() elif e.type == BLUR: self.repaint() self.pcls = "" if self.container.myfocus is self: self.pcls = "focus" return used def __setattr__(self,k,v): if k == 'value': if v == None: v = '' v = str(v) self.pos = len(v) _v = self.__dict__.get(k,NOATTR) self.__dict__[k]=v if k == 'value' and _v != NOATTR and _v != v: self.send(CHANGE) self.repaint() class Password(Input): """A password input, text is *-ed out.
Password(value="",size=20)
value
initial text
size
size for the text box, in characters
Example w = Password(value="password",size=20) w = Password("53[r3+") """ def paint(self,s): hidden="*" show=len(self.value)*hidden #print "self.value:",self.value if self.pos == None: self.pos = len(self.value) r = pygame.Rect(0,0,self.rect.w,self.rect.h) cs = 2 #NOTE: should be in a style w,h = self.font.size(show) x = w-self.vpos if x < 0: self.vpos -= -x if x+cs > s.get_width(): self.vpos += x+cs-s.get_width() s.blit(self.font.render(show, 1, self.style.color),(-self.vpos,0)) if self.container.myfocus is self: #w,h = self.font.size(self.value[0:self.pos]) w,h = self.font.size(show[0:self.pos]) r.x = w-self.vpos r.w = cs r.h = h s.fill(self.style.color,r)