Test commit
[couchpytato.git] / gui.py
blobd1a5a54db6876591b7469ffb4f3fbeab8239fc62
1 import pygame, os, random, string, cfg
2 from pygame.locals import *
4 # GuiObject is everything (pictures, labels...) you see on the gui
6 class GuiObject(pygame.sprite.Sprite):
7 def __init__(self, name, xpos, ypos, layer):
8 pygame.sprite.Sprite.__init__(self)
9 self.typ = 'Parent'
10 self.xpos = xpos
11 self.ypos = ypos
12 self.name = name
13 self.layer = layer
14 self.image = None
15 self.rect = xpos,ypos,0,0
16 self.change = None
17 self.fx = None
18 self.fxspeed = 1
19 self.visible = True
20 self.contentkey = None
21 self.contentkeyarg = None
23 def update(self):
24 if self.fx:
25 if self.fx[0] == 's':
26 self.effects()
27 if self.xpos != self.rect[0] or self.ypos != self.rect[1]:
28 if self.fx and cfg.cf['disablefx'] == '0':
29 if self.fx[0] == 'm':
30 self.effects()
31 else:
32 self.rect = self.xpos, self.ypos, self.rect[2], self.rect[3]
33 if self.change:
34 self._changeimage()
36 def _makeimage(self):
37 pass
39 def _changeimage(self):
40 pass
42 def effects(self):
43 if self.fx == 'm_slide':
44 x = self.rect[0]
45 y = self.rect[1]
46 if self.ypos != y:
47 if self.ypos < y:
48 y -= self.fxspeed
50 elif self.ypos > y:
51 y += self.fxspeed
52 self.rect = x, y, self.rect[2], self.rect[3]
54 if self.fx == 's_scroll':
55 text = self.orgtext
56 if text == None:
57 text = ' '
58 if self.font.size(text)[0] > int(self.width):
59 image = self.font.render(text, 1, self.color)
60 w, h = image.get_size()
61 orgwidth = w
62 choprect = 0, h, self.scrollcount, h
63 image = pygame.transform.chop(image, choprect)
64 choprect = self.width, h, int(cfg.th['resolution'][0]), h
65 image = pygame.transform.chop(image, choprect)
66 self.image = image.convert_alpha()
67 w, h = self.image.get_size()
68 self.rect = self.rect[0], self.rect[1], w, h
69 if orgwidth < self.width + self.scrollcount:
70 self.scrollinv = True
71 elif self.scrollcount == 0:
72 self.scrollinv = False
73 if self.scrollinv: self.scrollcount -= self.fxspeed
74 else: self.scrollcount += self.fxspeed
76 class Image(GuiObject):
77 def __init__(self, name, xpos, ypos, layer, imagefile, size=None, alpha=None, hflip=False, vflip=False, degree=None):
78 GuiObject.__init__(self, name, xpos, ypos, layer)
79 self.typ = 'Image'
80 self.alpha = alpha
81 self.size = size
82 self.hflip = hflip
83 self.vflip =vflip
84 self.degree = degree
85 self.imagefile = imagefile
86 self._makeimage()
88 def _makeimage(self):
89 self.image = pygame.image.load(self.imagefile)
90 self.image = pygame.transform.flip(self.image, self.hflip, self.vflip)
91 if self.size: self.image = pygame.transform.scale(self.image, (self.size, self.size))
92 if self.alpha: self.image.set_alpha(self.alpha)
93 if self.degree: self.image = pygame.transform.rotate(self.image, self.degree)
94 self.image = self.image.convert_alpha()
95 w,h = self.image.get_size()
96 self.rect = self.xpos, self.ypos, w, h
98 def _changeimage(self):
99 if self.change:
100 if self.imagefile != self.change:
101 oldimagefile = self.image
102 self.imagefile = self.change
103 try:
104 self._makeimage()
105 except:
106 self.imagefile = oldimagefile
107 self.change = None
109 class ListBar(Image):
110 def __init__(self, name, xpos, ypos, layer, imagefile, xoff, yoff):
111 Image.__init__(self, name, xpos+xoff, ypos+yoff, layer, imagefile)
112 self.xoff = xoff
113 self.yoff = yoff
115 class Label(GuiObject):
116 def __init__(self, name, xpos, ypos, layer, font, (r,g,b), text=' ', width=None, extra=None):
117 GuiObject.__init__(self, name, xpos, ypos, layer)
118 self.typ = 'Label'
119 self.font = font
120 self.orgtext = text
121 self.text = text
122 self.color = (r,g,b)
123 self.width = width
124 self.extra = extra
125 self.scrollcount = 0
126 self.scrollinv = False
127 self._makeimage()
129 def _makeimage(self):
130 if self.width:
131 while self.font.size(self.text)[0] > self.width:
132 self.text = self.text[0:-1]
133 if self.extra and self.text != ' ':
134 self.text = self.text + self.extra
135 self.image = self.font.render(str(self.text), int(cfg.cf['fontaa']), self.color)
136 self.image = self.image.convert_alpha()
138 def _changeimage(self):
139 if self.change:
140 if self.orgtext != self.change:
141 self.orgtext = self.change
142 self.text = self.change
143 self.scrollcount = 0
144 self.scrollinv = False
145 self._makeimage()
147 # self.font = pygame.font.Font(ttf, int(size))
149 class List:
150 def __init__(self, name, xpos, ypos, layer, font, (r,g,b), maxlen, space, width, listbar):
151 self.name = name
152 self.xpos = xpos
153 self.ypos = ypos
154 self.layer = layer
155 self.typ = 'List'
156 self.maxlen = maxlen
157 self.space = space
158 self.font = font
159 self.visible = True
160 self.color = (r,g,b)
161 self.sprites = []
162 self.bar = listbar
163 self.bar.fx = 'm_slide'
164 self.bar.fxspeed = space/2
165 self.selected = 0
166 self.liststart = 0
167 self.list = []
168 self.labels = []
169 self.width = width
170 self.contentkey = None
171 self.contentkeyarg = None
172 for g in range(self.maxlen):
173 y = g*self.space+self.ypos
174 self.labels.append(Label('lbl'+str(g), self.xpos, y, self.layer, self.font, self.color, ' ', self.width))
175 self.curvalue = None
177 def update(self):
178 for label in self.labels:
179 label.update()
180 if self.bar:
181 self.bar.update()
183 def press(self):
184 self.list[self.liststart + self.selected].press()
186 def clear(self):
187 self.liststart = 0
188 self.selected = 0
189 self.list = []
190 #self.makelist()
192 def add(self, text, value, onpress, onselect):
193 self.list.append(ListItem(text, value, onpress, onselect))
195 def makelist(self):
196 if self.selected < 0: self.selected = 0
197 if self.liststart < 0: self.liststart = 0
198 if self.liststart + self.selected > len(self.list)-1:
199 self.liststart = 0
200 self.selected = 0
201 if len(self.list[self.liststart:]) < self.maxlen:
202 for i in range(self.maxlen - len(self.list[self.liststart:])):
203 self.labels[i+len(self.list[self.liststart:])].change = ' '
204 self._updbar(True)
206 i = 0
207 for item in self.list[self.liststart:]:
208 self.labels[i].change = item.text
209 i += 1
210 if i == self.maxlen: break
211 self.list[self.liststart + self.selected].select()
213 def _updbar(self, straight=False):
214 if straight:
215 self.bar.rect = self.bar.rect[0],self.selected * self.space + (self.ypos + self.bar.yoff),self.bar.rect[2],self.bar.rect[3]
216 self.bar.ypos = self.selected * self.space + (self.ypos + self.bar.yoff)
217 for line in self.labels: #!!!!!!
218 line.fx = None
219 self.list[self.liststart + self.selected].select()
220 self.labels[self.selected].fx = 's_scroll'
221 self.labels[self.selected].fxspeed = 2
223 def select_next(self):
224 if self.selected < self.maxlen -1 and self.liststart+self.selected < len(self.list)-1:
225 self.selected += 1
226 self._updbar()
227 else:
228 self.next_page()
230 def select_last(self):
231 if self.selected > 0:
232 self.selected -= 1
233 self._updbar()
234 else:
235 self.last_page()
237 def next_page(self):
238 self.selected = 0
239 if self.liststart > len(self.list) - self.maxlen:
240 self.liststart = 0
241 else:
242 self.liststart += self.maxlen
243 self.makelist()
245 def last_page(self):
246 self.selected = self.maxlen-1
247 if self.liststart == 0:
248 self.liststart = len(self.list)-self.maxlen
249 else:
250 self.liststart -= self.maxlen
251 self.makelist()
255 class ListItem:
256 def __init__(self, text, value, onpress, onselect):
257 self.text = text
258 if os.path.isdir(value):
259 self.text = '[' + text + ']'
260 elif os.path.isfile(value):
261 self.text, ext = os.path.splitext(text)
262 self.value = value
263 self.pressaction = onpress
264 self.selectaction = onselect
266 def press(self):
267 return self.pressaction(self.value)
269 def select(self):
270 return self.selectaction(self.value)