7 from xml
.dom
.minidom
import parse
, parseString
20 FONT_COLOR
= (255, 255, 255)
24 def __init__(self
, gui_def
, theme
):
26 assert is_zipfile(theme
)
27 assert exists(gui_def
)
29 self
.zipfile
= ZipFile(theme
)
31 self
.definitions
= self
.parse_gui_def(gui_def
)
35 assert pygame
.font
.get_init()
37 self
.the_font
= pygame
.font
.SysFont(FONT_NAME
, FONT_SIZE
)
41 assert self
.getImages()
45 def parse_gui_def(self
, gui_def
):
50 if dom
.childNodes
[0].nodeName
== 'widgets':
54 for node
in dom
.childNodes
[0].childNodes
:
58 if node
.nodeName
== 'images':
60 for sub_node
in node
.childNodes
:
61 if sub_node
.nodeName
== 'image':
63 image
= {'filename': '', name
: ''}
65 for sub_sub_node
in sub_node
.childNodes
:
67 if sub_sub_node
.nodeName
== 'filename':
68 image
['filename'] = sub_sub_node
.childNodes
[0].nodeValue
69 if sub_sub_node
.nodeName
== 'name':
70 image
['name'] = sub_sub_node
.childNodes
[0].nodeValue
74 image_list
.append(image
)
76 results
['image_list'] = image_list
78 if node
.nodeName
== 'widget':
82 widget
['parameters'] = {}
84 widget
['behaviors'] = {}
86 for sub_node
in node
.childNodes
:
87 if sub_node
.nodeName
== 'name' and len(sub_node
.childNodes
):
88 widget
['name'] = sub_node
.childNodes
[0].nodeValue
90 if sub_node
.nodeName
== 'parameter':
93 parameter
['name'] = sub_node
.attributes
['name'].value
95 widget
['parameters'][parameter
['name']] = ''
97 if sub_node
.nodeName
== 'part':
99 part_name
= sub_node
.getElementsByTagName('name')[0].childNodes
[0].nodeValue
100 widget
['parts'][part_name
] = {}
102 for sub_sub_node
in sub_node
.childNodes
:
104 if sub_sub_node
.nodeName
== 'type':
105 widget
['parts'][part_name
]['type'] = sub_sub_node
.childNodes
[0].nodeValue
.encode()
107 if sub_sub_node
.nodeName
== 'source':
108 widget
['parts'][part_name
]['source'] = sub_sub_node
.childNodes
[0].nodeValue
.encode()
110 if sub_sub_node
.nodeName
== 'position':
111 widget
['parts'][part_name
]['position'] = sub_sub_node
.childNodes
[0].nodeValue
.encode()
113 if sub_sub_node
.nodeName
== 'size':
114 widget
['parts'][part_name
]['size'] = sub_sub_node
.childNodes
[0].nodeValue
.encode()
116 if sub_node
.nodeName
== 'behavior':
118 event_type
= sub_node
.getElementsByTagName('on_event')[0].childNodes
[0].nodeValue
119 the_do
= sub_node
.getElementsByTagName('do')[0].childNodes
[0].nodeValue
121 widget
['behaviors'][event_type
] = the_do
123 widgets
[widget
['name']] = widget
125 results
['widgets'] = widgets
131 image_list
= self
.definitions
['image_list']
134 name_list
= self
.zipfile
.namelist()
136 for image
in image_list
:
138 if image
['filename'] not in name_list
:
142 the_string_io
= StringIO
.StringIO()
143 print >>the_string_io
, self
.zipfile
.read(image
['filename'])
144 the_string_io
.seek(0)
146 self
.images
[image
['name']] = pygame
.image
.load(the_string_io
).convert_alpha()
150 def event(self
, the_event
):
152 new_event
= self
.convertEvent(the_event
)
154 if not new_event
['type'].find('MOUSE') == -1:
156 for widget
in self
.widgets
:
158 widget_rect
= widget
.getRect()
159 if widget_rect
.collidepoint(new_event
['data']['pos']):
160 if new_event
['type'] != 'MOUSEMOTION':
163 self
.focus
.event(new_event
)
167 def convertEvent(self
, e
):
174 if e
.type == ACTIVEEVENT
:
175 data
['gain'] = e
.gain
176 data
['state'] = e
.state
178 if e
.type == KEYDOWN
:
179 data
['unicode'] = e
.unicode
187 if e
.type == MOUSEMOTION
:
190 data
['buttons'] = e
.buttons
192 if e
.type == MOUSEBUTTONUP
:
194 data
['button'] = e
.button
196 if e
.type == MOUSEBUTTONDOWN
:
198 data
['button'] = e
.button
200 if e
.type == JOYAXISMOTION
:
202 data
['axis'] = e
.axis
203 data
['value'] = e
.value
205 if e
.type == JOYBALLMOTION
:
207 data
['ball'] = e
.ball
210 if e
.type == JOYHATMOTION
:
213 data
['value'] = e
.value
215 if e
.type == JOYBUTTONUP
:
217 data
['button'] = e
.button
219 if e
.type == JOYBUTTONDOWN
:
221 data
['button'] = e
.button
223 if e
.type == VIDEORESIZE
:
224 data
['size'] = e
.size
228 if e
.type == VIDEOEXPOSE
:
231 if e
.type == USEREVENT
:
232 data
['code'] = e
.code
236 if e
.type == QUIT
: type = "QUIT"
237 if e
.type == ACTIVEEVENT
: type = "ACTIVEEVENT"
238 if e
.type == KEYDOWN
: type = "KEYDOWN"
239 if e
.type == KEYUP
: type = "KEYUP"
240 if e
.type == MOUSEMOTION
: type = "MOUSEMOTION"
241 if e
.type == MOUSEBUTTONUP
: type = "MOUSEBUTTONUP"
242 if e
.type == MOUSEBUTTONDOWN
: type = "MOUSEBUTTONDOWN"
243 if e
.type == JOYAXISMOTION
: type = "JOYAXISMOTION"
244 if e
.type == JOYBALLMOTION
: type = "JOYBALLMOTION"
245 if e
.type == JOYHATMOTION
: type = "JOYHATMOTION"
246 if e
.type == JOYBUTTONUP
: type = "JOYBUTTONUP"
247 if e
.type == JOYBUTTONDOWN
: type = "JOYBUTTONDOWN"
248 if e
.type == VIDEORESIZE
: type = "VIDEORESIZE"
249 if e
.type == VIDEOEXPOSE
: type = "VIDEOEXPOSE"
250 if e
.type == USEREVENT
: type = "USEREVENT"
254 new_event
['type'] = type
255 new_event
['data'] = data
259 def draw(self
, dest_surface
):
261 for widget
in self
.widgets
:
263 if widget
.params
['parameters']['visible']:
264 widget
.draw(dest_surface
)
268 def makeWidget(self
, widget_name
, params
):
270 if self
.definitions
['widgets'].has_key(widget_name
):
272 new_params
= copy
.copy(self
.definitions
['widgets'][widget_name
])
273 new_params
['parameters'] = params
275 the_widget
= Widget(self
, widget_name
, new_params
)
277 self
.widgets
.append(the_widget
)
279 if len(self
.widgets
) == 1:
280 self
.focus
= the_widget
286 def __init__(self
, the_gui_system
, widget_name
, params
):
288 self
.name
= widget_name
290 self
.the_gui_system
= the_gui_system
292 assert self
.params
['parameters'].has_key('x')
293 assert self
.params
['parameters'].has_key('y')
295 if not self
.params
['parameters'].has_key('visible'):
296 self
.params
['parameters']['visible'] = 1
300 def move(self
, (new_x
, new_y
)):
302 self
.params
['parameters']['x'], self
.params
['parameters']['y'] = new_x
, new_y
308 self
.params
['parameters']['visible'] = 0
314 self
.params
['parameters']['visible'] = 1
320 coords
= (self
.params
['parameters']['x'], self
.params
['parameters']['y'])
321 dimensions
= (self
.params
['parameters']['width'], self
.params
['parameters']['height'])
323 return pygame
.Rect(coords
, dimensions
)
325 def event(self
, the_event
):
327 if self
.params
['behaviors'].has_key(the_event
['type']):
329 the_value
= self
.params
['behaviors'][the_event
['type']]
335 def setPart(self
, old_part
, new_part
):
337 self
.params
['parts'][old_part
]['source'] = new_part
340 def raiseEvent(self
, the_event
, parameters
={}):
342 print "raiseEvent(): Not implemented"
346 def draw(self
, dest_surface
):
350 for image
in self
.the_gui_system
.images
:
352 code
= ''.join([code
, '\n', image
, ' = self.the_gui_system.images["', image
, '"]'])
359 for part
in self
.params
['parts']:
361 if self
.params
['parts'][part
]['type'] == 'text':
365 exec(''.join([part
, ' = self.the_gui_system.the_font.render(self.params["parameters"][self.params["parts"][part]["source"]], FONT_SIZE, FONT_COLOR)\nthe_source =', part
]))
369 width
= self
.params
['parameters']['width']
370 height
= self
.params
['parameters']['height']
372 position
= eval(self
.params
['parts'][part
]['position'])
373 size
= eval(self
.params
['parts'][part
]['size'])
375 position
= [position
[0], position
[1]]
377 position
[0] += self
.params
['parameters']['x']
378 position
[1] += self
.params
['parameters']['y']
380 if self
.params
['parts'][part
]['type'] == 'image':
382 if size
[0] > 0 and size
[1] > 0:
383 the_source
= pygame
.transform
.scale(self
.the_gui_system
.images
[self
.params
['parts'][part
]['source']], size
)
384 dest_surface
.blit(the_source
, position
)
386 if self
.params
['parts'][part
]['type'] == 'text':
388 dest_surface
.blit(the_source
, position
, pygame
.Rect((0, 0), size
))
390 if self
.params
['parts'][part
]['type'] == 'widget':
392 pass # implement nested widgets