comparison tools/rect_drawer.py @ 510:d274cc414178

Add show animate & cycle interact options
author Neil Muller <neil@dip.sun.ac.za>
date Fri, 03 Sep 2010 17:04:38 +0200
parents 616334ea5e8c
children d143947690d9
comparison
equal deleted inserted replaced
509:616334ea5e8c 510:d274cc414178
13 from albow.controls import Button, Image, Label 13 from albow.controls import Button, Image, Label
14 from albow.palette_view import PaletteView 14 from albow.palette_view import PaletteView
15 from albow.file_dialogs import request_old_filename 15 from albow.file_dialogs import request_old_filename
16 from albow.resource import get_font 16 from albow.resource import get_font
17 from pygame.locals import SWSURFACE, K_LEFT, K_RIGHT, K_UP, K_DOWN, \ 17 from pygame.locals import SWSURFACE, K_LEFT, K_RIGHT, K_UP, K_DOWN, \
18 K_t, K_d, K_i, K_r, K_o, K_b, K_z, \ 18 K_a, K_t, K_d, K_i, K_r, K_o, K_b, K_z, \
19 BLEND_RGBA_MIN, SRCALPHA 19 BLEND_RGBA_MIN, SRCALPHA
20 import pygame 20 import pygame
21 from pygame.colordict import THECOLORS 21 from pygame.colordict import THECOLORS
22 22
23 from gamelib import constants 23 from gamelib import constants
24 constants.DEBUG = True 24 constants.DEBUG = True
25 MENU_WIDTH = 200 25 MENU_WIDTH = 200
26 MENU_BUTTON_HEIGHT = 30 26 MENU_BUTTON_HEIGHT = 25
27 ZOOM = 4 27 ZOOM = 4
28 ZOOM_STEP = 100 28 ZOOM_STEP = 100
29 29
30 from gamelib import state 30 from gamelib import state
31 state.DEBUG_RECTS = True 31 state.DEBUG_RECTS = True
98 self.draw_images = True 98 self.draw_images = True
99 self.trans_images = False 99 self.trans_images = False
100 self.draw_toolbar = True 100 self.draw_toolbar = True
101 self.old_mouse_pos = None 101 self.old_mouse_pos = None
102 self.zoom_display = False 102 self.zoom_display = False
103 self.draw_anim = False
103 self.zoom_offset = (600, 600) 104 self.zoom_offset = (600, 600)
104 self.find_existing_intersects() 105 self.find_existing_intersects()
105 106
107 def _get_scene(self):
108 if self.state.current_detail:
109 return self.state.current_detail
110 else:
111 return self.state.current_scene
112
106 def find_existing_intersects(self): 113 def find_existing_intersects(self):
107 """Parse the things in the scene for overlaps""" 114 """Parse the things in the scene for overlaps"""
108 if self.state.current_detail: 115 scene = self._get_scene()
109 scene = self.state.current_detail
110 else:
111 scene = self.state.current_scene
112 # Pylint hates this function 116 # Pylint hates this function
113 for thing in scene.things.itervalues(): 117 for thing in scene.things.itervalues():
114 for interact_name in thing.interacts: 118 for interact_name in thing.interacts:
115 thing.set_interact(interact_name) 119 thing.set_interact(interact_name)
116 if hasattr(thing.rect, 'collidepoint'): 120 if hasattr(thing.rect, 'collidepoint'):
136 print 140 print
137 141
138 def find_intersecting_rects(self, d): 142 def find_intersecting_rects(self, d):
139 """Find if any rect collections intersect""" 143 """Find if any rect collections intersect"""
140 # I loath N^X brute search algorithm's, but whatever, hey 144 # I loath N^X brute search algorithm's, but whatever, hey
141 if self.state.current_detail: 145 scene = self._get_scene()
142 scene = self.state.current_detail
143 else:
144 scene = self.state.current_scene
145 for (num, col) in enumerate(d): 146 for (num, col) in enumerate(d):
146 rect_list = d[col] 147 rect_list = d[col]
147 for thing in scene.things.itervalues(): 148 for thing in scene.things.itervalues():
148 for interact_name in thing.interacts: 149 for interact_name in thing.interacts:
149 thing.set_interact(interact_name) 150 thing.set_interact(interact_name)
177 def toggle_things(self): 178 def toggle_things(self):
178 self.draw_things = not self.draw_things 179 self.draw_things = not self.draw_things
179 180
180 def toggle_thing_rects(self): 181 def toggle_thing_rects(self):
181 self.draw_thing_rects = not self.draw_thing_rects 182 self.draw_thing_rects = not self.draw_thing_rects
182 if self.state.current_detail: 183 scene = self._get_scene()
183 scene = self.state.current_detail
184 else:
185 scene = self.state.current_scene
186 for thing in scene.things.itervalues(): 184 for thing in scene.things.itervalues():
187 if not self.draw_thing_rects: 185 if not self.draw_thing_rects:
188 if not hasattr(thing, 'old_colour'): 186 if not hasattr(thing, 'old_colour'):
189 thing.old_colour = thing._interact_hilight_color 187 thing.old_colour = thing._interact_hilight_color
190 thing._interact_hilight_color = None 188 thing._interact_hilight_color = None
204 def toggle_toolbar(self): 202 def toggle_toolbar(self):
205 self.draw_toolbar = not self.draw_toolbar 203 self.draw_toolbar = not self.draw_toolbar
206 204
207 def toggle_zoom(self): 205 def toggle_zoom(self):
208 self.zoom_display = not self.zoom_display 206 self.zoom_display = not self.zoom_display
207
208 def toggle_anim(self):
209 self.draw_anim = not self.draw_anim
209 210
210 def draw_mode(self): 211 def draw_mode(self):
211 self.mode = 'draw' 212 self.mode = 'draw'
212 213
213 def del_mode(self): 214 def del_mode(self):
320 self.start_pos = None 321 self.start_pos = None
321 self.end_pos = None 322 self.end_pos = None
322 # So we do the right thing for off screen images 323 # So we do the right thing for off screen images
323 self.old_mouse_pos = None 324 self.old_mouse_pos = None
324 325
326 def cycle_mode(self):
327 self.mode = 'cycle'
328
325 def _conv_pos(self, mouse_pos): 329 def _conv_pos(self, mouse_pos):
326 if self.zoom_display: 330 if self.zoom_display:
327 pos = ((mouse_pos[0] + self.zoom_offset[0]) / ZOOM, (mouse_pos[1] + self.zoom_offset[1]) / ZOOM) 331 pos = ((mouse_pos[0] + self.zoom_offset[0]) / ZOOM, (mouse_pos[1] + self.zoom_offset[1]) / ZOOM)
328 else: 332 else:
329 pos = mouse_pos 333 pos = mouse_pos
401 self.toggle_rects() 405 self.toggle_rects()
402 elif e.key == K_b: 406 elif e.key == K_b:
403 self.toggle_toolbar() 407 self.toggle_toolbar()
404 elif e.key == K_z: 408 elif e.key == K_z:
405 self.toggle_zoom() 409 self.toggle_zoom()
410 elif e.key == K_a:
411 self.toggle_anim()
406 412
407 def mouse_down(self, e): 413 def mouse_down(self, e):
408 pos = self._conv_pos(e.pos) 414 pos = self._conv_pos(e.pos)
409 if self.mode == 'del': 415 if self.mode == 'del':
410 cand = None 416 cand = None
422 cand = (col, rect) 428 cand = (col, rect)
423 break 429 break
424 if cand: 430 if cand:
425 self.rects.remove(cand) 431 self.rects.remove(cand)
426 self.invalidate() 432 self.invalidate()
433 elif self.mode == 'cycle':
434 scene = self._get_scene()
435 cand = None
436 for thing in scene.things.itervalues():
437 if thing.contains(pos):
438 cand = thing
439 break
440 if cand:
441 # Find current interacts in this thing
442 cur_interact = cand.current_interact
443 j = cand.interacts.values().index(cur_interact)
444 if j + 1< len(cand.interacts):
445 next_name = cand.interacts.keys()[j+1]
446 else:
447 next_name = cand.interacts.keys()[0]
448 if cand.interacts[next_name] != cur_interact:
449 cand.set_interact(next_name)
427 elif self.mode == 'draw': 450 elif self.mode == 'draw':
428 self.start_pos = pos 451 self.start_pos = pos
429 self.end_pos = pos 452 self.end_pos = pos
430 elif self.mode == 'image': 453 elif self.mode == 'image':
431 if self.current_image: 454 if self.current_image:
458 def mouse_drag(self, e): 481 def mouse_drag(self, e):
459 if self.mode == 'draw': 482 if self.mode == 'draw':
460 self.end_pos = self._conv_pos(e.pos) 483 self.end_pos = self._conv_pos(e.pos)
461 self.invalidate() 484 self.invalidate()
462 485
486 def animate(self):
487 if self.draw_anim:
488 if self.state.animate():
489 self.invalidate()
490
463 491
464 class ModeLabel(BoomLabel): 492 class ModeLabel(BoomLabel):
465 493
466 def __init__(self, app_image): 494 def __init__(self, app_image):
467 self.app_image = app_image 495 self.app_image = app_image
502 add_image = make_button("Place/Move images", self.image.image_mode, y) 530 add_image = make_button("Place/Move images", self.image.image_mode, y)
503 add_image.enabled = False 531 add_image.enabled = False
504 self.add(add_image) 532 self.add(add_image)
505 self.image.place_image_menu = add_image 533 self.image.place_image_menu = add_image
506 y += add_image.get_rect().h 534 y += add_image.get_rect().h
535 cycle = make_button("Cycle interacts", self.image.cycle_mode, y)
536 self.add(cycle)
537 y += cycle.get_rect().h
507 delete = make_button('Delete Objects', self.image.del_mode, y) 538 delete = make_button('Delete Objects', self.image.del_mode, y)
508 self.add(delete) 539 self.add(delete)
509 y += delete.get_rect().h 540 y += delete.get_rect().h
510 palette = AppPalette(self.image) 541 palette = AppPalette(self.image)
511 palette.rect.move_ip(810, y) 542 palette.rect.move_ip(810, y)
530 self.add(toggle_rects) 561 self.add(toggle_rects)
531 y += toggle_rects.get_rect().h 562 y += toggle_rects.get_rect().h
532 toggle_toolbar = make_button("Show Toolbar (b)", self.image.toggle_toolbar, y) 563 toggle_toolbar = make_button("Show Toolbar (b)", self.image.toggle_toolbar, y)
533 self.add(toggle_toolbar) 564 self.add(toggle_toolbar)
534 y += toggle_toolbar.get_rect().h 565 y += toggle_toolbar.get_rect().h
566 toggle_anim = make_button("Show Animations (a)", self.image.toggle_anim, y)
567 self.add(toggle_anim)
568 y += toggle_anim.get_rect().h
535 toggle_zoom = make_button("Zoom (z)", self.image.toggle_zoom, y) 569 toggle_zoom = make_button("Zoom (z)", self.image.toggle_zoom, y)
536 self.add(toggle_zoom) 570 self.add(toggle_zoom)
537 y += toggle_zoom.get_rect().h 571 y += toggle_zoom.get_rect().h
538 quit_but = make_button("Quit", self.quit, 570) 572 quit_but = make_button("Quit", self.quit, 570)
539 self.add(quit_but) 573 self.add(quit_but)
574 self.set_timer(constants.FRAME_RATE)
540 575
541 def key_down(self, event): 576 def key_down(self, event):
542 # Dispatch to image widget 577 # Dispatch to image widget
543 self.image.key_down(event) 578 self.image.key_down(event)
544 579
545 def mouse_delta(self, event): 580 def mouse_delta(self, event):
546 # We propogate mouse move from here to draw region, so images move 581 # We propogate mouse move from here to draw region, so images move
547 # off-screen 582 # off-screen
548 self.image.do_mouse_move(event) 583 self.image.do_mouse_move(event)
584
585 def begin_frame(self):
586 self.image.animate()
549 587
550 588
551 if __name__ == "__main__": 589 if __name__ == "__main__":
552 # FIXME: should load an actual scene with current things, not just a 590 # FIXME: should load an actual scene with current things, not just a
553 # background image 591 # background image