Mercurial > pyntnclick
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 |