-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathtextfield.py
More file actions
83 lines (74 loc) · 3.17 KB
/
textfield.py
File metadata and controls
83 lines (74 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import pygame
class Textfield:
allowed_ascii = list(range(ord('A'), ord('Z')+1)) + \
list(range(ord('a'), ord('z')+1)) + \
list(range(ord('0'), ord('9') + 1)) + \
[ord('#')]
def __init__(self,pos,text,uneditable=[],length=None,allowed=None):
if length == None: length = len(text)
text=text.replace('\x00','').upper()
#pad spaced to text to match length (if given)
self.text=("{:<" + str(length) + "}").format(text)
self.color=(255,0,255)
self.startpos=pos
self.endpos=(pos[0]+length-1,pos[1])
self.border=None
if uneditable==True:
uneditable=[i for i in range(len(text))]
self.readonly=True
else:
self.readonly=False
self.uneditable=uneditable
#make allowed chars
if allowed==None:
self.allowed_chars=[self.allowed_ascii]*length
else:
self.allowed_chars=[]
for all in allowed:
all_arr=[ord(c) for c in all]
self.allowed_chars.append(all_arr)
def is_selected(self,mpos):
if not mpos[1] == self.startpos[1]: return False
if mpos[0] < self.startpos[0] or mpos[0] > self.endpos[0]: return False
return True
def is_editable(self,mpos):
if not mpos[1] == self.startpos[1]: return False
if mpos[0] < self.startpos[0] or mpos[0] > self.endpos[0]: return False
charpos = mpos[0] - self.startpos[0]
if charpos in self.uneditable: return False
#print ("Textfield:",self.text)
#print(" charpos:", charpos)
return True
def next_editable(self, mpos):
if self.is_editable(mpos):
charpos = mpos[0] - self.startpos[0]
for cp in range(charpos+1,len(self.text)):
if cp not in self.uneditable: return (self.startpos[0]+cp,mpos[1])
return False
def prev_editable(self, mpos):
if self.is_editable(mpos):
charpos = mpos[0] - self.startpos[0]
for cp in range(charpos-1,-1,-1):
if cp not in self.uneditable: return (self.startpos[0]+cp,mpos[1])
return False
def char_nr(self,mpos):
return (mpos[0] - self.startpos[0])
def edit(self,char,mpos):
if self.is_editable(mpos):
charpos=mpos[0]-self.startpos[0]
if char not in self.allowed_chars[charpos]: return False
chars=list(self.text)
if charpos<len(chars):
chars[charpos]=chr(char).upper()
self.text="".join(chars)
return True
return False
def draw(self,myfont,screen,charsize=(8,8)):
rtext = myfont.render(self.text, False, self.color)
rpos=self.startpos[0]*charsize[0],self.startpos[1]*charsize[1]
bpos = self.startpos[0] * charsize[0]-1, self.startpos[1] * charsize[1]-2
bsize = (len(self.text)*charsize[0]+2,charsize[1]+3)
screen.blit(rtext,rpos)
if self.border:
pygame.draw.rect(screen, self.border, pygame.Rect(bpos,bsize),1)
return