7 from xml
.dom
.minidom
import parse
, parseString
25 FONT_COLOR
= (255, 255, 255)
32 def __init__(self
, gui_def
, theme
):
34 assert is_zipfile(theme
)
35 assert exists(gui_def
)
37 self
.zipfile
= ZipFile(theme
)
39 self
.definitions
= self
.parse_gui_def(gui_def
)
43 assert pygame
.font
.get_init()
45 self
.the_font
= pygame
.font
.SysFont(FONT_NAME
, FONT_SIZE
)
49 assert self
.getImages()
58 def parse_gui_def(self
, gui_def
):
63 if dom
.childNodes
[0].nodeName
== 'widgets':
67 for node
in dom
.childNodes
[0].childNodes
:
71 if node
.nodeName
== 'images':
73 for sub_node
in node
.childNodes
:
74 if sub_node
.nodeName
== 'image':
76 image
= {'filename': '', name
: ''}
78 for sub_sub_node
in sub_node
.childNodes
:
80 if sub_sub_node
.nodeName
== 'filename':
81 image
['filename'] = sub_sub_node
.childNodes
[0].nodeValue
82 if sub_sub_node
.nodeName
== 'name':
83 image
['name'] = sub_sub_node
.childNodes
[0].nodeValue
87 image_list
.append(image
)
89 results
['image_list'] = image_list
91 if node
.nodeName
== 'widget':
95 widget
['parameters'] = {'direct': 0}
97 widget
['behaviors'] = {}
99 for sub_node
in node
.childNodes
:
100 if sub_node
.nodeName
== 'name' and len(sub_node
.childNodes
):
101 widget
['name'] = sub_node
.childNodes
[0].nodeValue
103 if sub_node
.nodeName
== 'parameter':
106 parameter
['name'] = sub_node
.attributes
['name'].value
108 if sub_node
.attributes
.has_key('type'):
109 if sub_node
.attributes
['type'].value
== 'int':
111 widget
['parameters'][parameter
['name']] = int(sub_node
.attributes
['default'].value
)
113 widget
['parameters'][parameter
['name']] = sub_node
.attributes
['default'].value
116 widget
['parameters'][parameter
['name']] = sub_node
.attributes
['default'].value
118 if sub_node
.nodeName
== 'part':
120 part_name
= sub_node
.getElementsByTagName('name')[0].childNodes
[0].nodeValue
121 widget
['parts'][part_name
] = {}
123 for sub_sub_node
in sub_node
.childNodes
:
125 if sub_sub_node
.nodeName
== 'type':
126 widget
['parts'][part_name
]['type'] = sub_sub_node
.childNodes
[0].nodeValue
.encode()
127 if widget
['parts'][part_name
]['type'].find(':direct') != -1:
128 widget
['parameters']['direct'] = 1
129 if widget
['parts'][part_name
]['type'] == 'text':
130 widget
['parts'][part_name
]['prerender'] = ''
131 widget
['parts'][part_name
]['old_text'] = ''
133 if sub_sub_node
.nodeName
== 'source':
134 widget
['parts'][part_name
]['source'] = sub_sub_node
.childNodes
[0].nodeValue
.encode()
136 if sub_sub_node
.nodeName
== 'position':
137 widget
['parts'][part_name
]['position'] = sub_sub_node
.childNodes
[0].nodeValue
.encode()
139 if sub_sub_node
.nodeName
== 'size':
140 widget
['parts'][part_name
]['size'] = sub_sub_node
.childNodes
[0].nodeValue
.encode()
142 if sub_sub_node
.nodeName
== 'zindex':
143 widget
['parts'][part_name
]['zindex'] = int(sub_sub_node
.childNodes
[0].nodeValue
.encode())
145 if not widget
['parts'][part_name
].has_key('zindex'):
146 widget
['parts'][part_name
]['zindex'] = 1
148 if sub_node
.nodeName
== 'behavior':
150 event_type
= sub_node
.getElementsByTagName('on_event')[0].childNodes
[0].nodeValue
151 the_do
= sub_node
.getElementsByTagName('do')[0].childNodes
[0].nodeValue
153 widget
['behaviors'][event_type
] = the_do
155 widgets
[widget
['name']] = widget
157 results
['widgets'] = widgets
163 image_list
= self
.definitions
['image_list']
166 name_list
= self
.zipfile
.namelist()
168 for image
in image_list
:
170 if image
['filename'] not in name_list
:
174 the_string_io
= StringIO
.StringIO()
175 print >>the_string_io
, self
.zipfile
.read(image
['filename'])
176 the_string_io
.seek(0)
178 self
.images
[image
['name']] = pygame
.image
.load(the_string_io
).convert_alpha()
182 def event(self
, the_event
):
184 if not len(self
.widgets
):
187 new_event
= self
.convertEvent(the_event
)
190 if new_event
['type'] == 'NOEVENT':
192 if self
.last_time
== -1:
193 self
.last_time
= time
.time()
197 temp_time
= time
.time()
199 for key
in self
.keys
:
201 if not self
.keys
[key
].has_key('first_time'):
202 if temp_time
- BLINK_SPEED
> self
.last_time
:
203 self
.last_time
= temp_time
204 self
.focus
.event({'type': 'KEYSTILLDOWN', 'data': self
.keys
[key
]})
207 if temp_time
- (BLINK_SPEED
+ BLINK_DELAY
) > self
.last_time
:
209 self
.last_time
= temp_time
210 del self
.keys
[key
]['first_time']
211 self
.focus
.event({'type': 'KEYSTILLDOWN', 'data': self
.keys
[key
]})
214 if not new_event
['type'].find('MOUSE') == -1:
216 for widget
in self
.widgets
:
218 widget_rect
= widget
.getRect()
219 if new_event
['type'] != 'MOUSEBUTTONUP':
220 if widget_rect
.collidepoint(new_event
['data']['pos']):
221 if new_event
['type'] != 'MOUSEMOTION' and widget
.is_visible():
223 self
.focus
.event(new_event
)
228 self
.focus
.event(new_event
)
232 if new_event
['type'] == 'KEYDOWN':
233 self
.keys
[new_event
['data']['key']] = new_event
['data']
234 self
.keys
[new_event
['data']['key']]['first_time'] = 1
236 if new_event
['type'] == 'KEYUP' and self
.keys
.has_key(new_event
['data']['key']):
237 del self
.keys
[new_event
['data']['key']]
239 self
.focus
.event(new_event
)
243 def convertEvent(self
, e
):
250 if e
.type == ACTIVEEVENT
:
251 data
['gain'] = e
.gain
252 data
['state'] = e
.state
254 if e
.type == KEYDOWN
:
255 data
['unicode'] = e
.unicode
263 if e
.type == MOUSEMOTION
:
266 data
['buttons'] = e
.buttons
268 if e
.type == MOUSEBUTTONUP
:
270 data
['button'] = e
.button
272 if e
.type == MOUSEBUTTONDOWN
:
274 data
['button'] = e
.button
276 if e
.type == JOYAXISMOTION
:
278 data
['axis'] = e
.axis
279 data
['value'] = e
.value
281 if e
.type == JOYBALLMOTION
:
283 data
['ball'] = e
.ball
286 if e
.type == JOYHATMOTION
:
289 data
['value'] = e
.value
291 if e
.type == JOYBUTTONUP
:
293 data
['button'] = e
.button
295 if e
.type == JOYBUTTONDOWN
:
297 data
['button'] = e
.button
299 if e
.type == VIDEORESIZE
:
300 data
['size'] = e
.size
304 if e
.type == VIDEOEXPOSE
:
307 if e
.type == USEREVENT
:
308 data
['code'] = e
.code
312 if e
.type == QUIT
: type = "QUIT"
313 if e
.type == NOEVENT
: type = "NOEVENT"
314 if e
.type == ACTIVEEVENT
: type = "ACTIVEEVENT"
315 if e
.type == KEYDOWN
: type = "KEYDOWN"
316 if e
.type == KEYUP
: type = "KEYUP"
317 if e
.type == MOUSEMOTION
: type = "MOUSEMOTION"
318 if e
.type == MOUSEBUTTONUP
: type = "MOUSEBUTTONUP"
319 if e
.type == MOUSEBUTTONDOWN
: type = "MOUSEBUTTONDOWN"
320 if e
.type == JOYAXISMOTION
: type = "JOYAXISMOTION"
321 if e
.type == JOYBALLMOTION
: type = "JOYBALLMOTION"
322 if e
.type == JOYHATMOTION
: type = "JOYHATMOTION"
323 if e
.type == JOYBUTTONUP
: type = "JOYBUTTONUP"
324 if e
.type == JOYBUTTONDOWN
: type = "JOYBUTTONDOWN"
325 if e
.type == VIDEORESIZE
: type = "VIDEORESIZE"
326 if e
.type == VIDEOEXPOSE
: type = "VIDEOEXPOSE"
327 if e
.type == USEREVENT
: type = "USEREVENT"
331 new_event
['type'] = type
332 new_event
['data'] = data
336 def draw(self
, dest_surface
):
338 for widget
in self
.widgets
:
340 if widget
.params
['parameters']['visible']:
341 widget
.draw(dest_surface
)
345 def makeWidget(self
, widget_name
, nparams
):
347 params
= copy
.deepcopy(nparams
)
349 if self
.definitions
['widgets'].has_key(widget_name
):
351 for param
in self
.definitions
['widgets'][widget_name
]['parameters']:
352 if not params
.has_key(param
):
353 if self
.definitions
['widgets'][widget_name
]['parameters'][param
] == 'kill':
354 print "GUISystem.makeWidget() Not all required parameters were passed."
357 params
[param
] = self
.definitions
['widgets'][widget_name
]['parameters'][param
]
359 new_params
= copy
.deepcopy(self
.definitions
['widgets'][widget_name
])
360 new_params
['parameters'] = params
362 the_widget
= Widget(self
, widget_name
, new_params
)
364 self
.widgets
.append(the_widget
)
366 if len(self
.widgets
) == 1:
367 self
.focus
= the_widget
373 def __init__(self
, the_gui_system
, widget_name
, params
):
375 self
.name
= widget_name
377 self
.the_gui_system
= the_gui_system
379 assert self
.params
['parameters'].has_key('x')
380 assert self
.params
['parameters'].has_key('y')
381 assert self
.params
['parameters'].has_key('width')
382 assert self
.params
['parameters'].has_key('height')
384 if not self
.params
['parameters'].has_key('visible'):
385 self
.params
['parameters']['visible'] = 1
387 self
.surf
= pygame
.Surface((int(self
.params
['parameters']['width']), int(self
.params
['parameters']['height'])), SRCALPHA
)
388 self
.surf
.convert_alpha()
394 def move(self
, (new_x
, new_y
)):
396 self
.params
['parameters']['x'], self
.params
['parameters']['y'] = new_x
, new_y
402 self
.params
['parameters']['visible'] = 0
408 self
.params
['parameters']['visible'] = 1
412 def is_visible(self
):
414 return self
.params
['parameters']['visible']
416 def connect(self
, event
, function
, params
={}):
418 self
.callbacks
[event
] = {'function': function
, 'params': params
}
424 coords
= (self
.params
['parameters']['x'], self
.params
['parameters']['y'])
425 dimensions
= (self
.params
['parameters']['width'], self
.params
['parameters']['height'])
427 return pygame
.Rect(coords
, dimensions
)
429 def event(self
, the_event
):
431 if self
.params
['behaviors'].has_key(the_event
['type']):
433 the_value
= self
.params
['behaviors'][the_event
['type']]
438 #print "Widget.event(): Error running behavior."
442 def setPart(self
, old_part
, new_part
):
444 self
.params
['parts'][old_part
]['source'] = new_part
447 def raiseEvent(self
, the_event
, parameters
={}):
449 if not self
.callbacks
.has_key(the_event
):
452 the_function
= self
.callbacks
[the_event
]['function']
455 the_function(self
.callbacks
[the_event
]['params'], parameters
)
457 # print "Widget.raiseEvent(): Error in callback."
461 def draw(self
, dest_surface
):
465 for image
in self
.the_gui_system
.images
:
466 code
= ''.join([code
, '\n', image
, ' = self.the_gui_system.images["', image
,'"]'])
473 width
= self
.params
['parameters']['width']
474 height
= self
.params
['parameters']['height']
477 for part
in self
.params
['parts']:
478 if not self
.params
['parts'][part
]['zindex'] in zindex_list
:
479 zindex_list
.append(self
.params
['parts'][part
]['zindex'])
481 if not self
.params
['parts'][part
].has_key('old_text'):
482 self
.params
['parts'][part
]['old_text'] = ''
486 #self.surf.fill(pygame.color.Color('0x00000000'))
488 for zindex
in zindex_list
:
489 for part
in self
.params
['parts']:
491 cur_part
= self
.params
['parts'][part
]
494 if cur_part
['type'].find('text') != -1:
496 exec(''.join(['if self.params["parts"][part]["old_text"] != self.params["parameters"][self.params["parts"][part]["source"]]:\n ', part
, ' = self.the_gui_system.the_font.render(self.params["parameters"][self.params["parts"][part]["source"]], True, FONT_COLOR).convert_alpha(self.surf)\n the_source = ', part
, '\n self.params["parts"][part]["prerender"] = ', part
, '\n self.params["parts"][part]["old_text"] = self.params["parameters"][self.params["parts"][part]["source"]]\nelse:\n the_source = self.params["parts"][part]["prerender"]\n', part
, ' = the_source']))
500 position
= list(eval(cur_part
['position']))
501 size
= list(eval(cur_part
['size']))
504 size
[size
.index(i
)] = int(i
)
506 position
= [position
[0], position
[1]]
508 if cur_part
['zindex'] == zindex
:
510 if cur_part
['type'] == 'image':
511 the_source
= pygame
.transform
.scale(self
.the_gui_system
.images
[cur_part
['source']], size
)
512 self
.surf
.blit(the_source
, position
)
514 if cur_part
['type'] == 'text':
515 the_source
.convert_alpha(dest_surface
)
516 self
.surf
.blit(the_source
, position
)
518 if cur_part
['type'] == 'text:direct':
519 position
= [position
[0] + self
.params
['parameters']['x'],
520 position
[1] + self
.params
['parameters']['y']]
521 dest_surface
.blit(the_source
, position
)
523 if cur_part
['type'] == 'widget':
526 if self
.params
['parameters'].has_key('direct') and self
.params
['parameters']['direct']:
529 dest_surface
.blit(self
.surf
, (self
.params
['parameters']['x'], self
.params
['parameters']['y']))