Mercurial > boomslang
comparison pyntnclick/tools/rect_drawer.py @ 697:4bf13af26d6a pyntnclick
Fix detail loading. Clear display on state changes
author | Neil Muller <neil@dip.sun.ac.za> |
---|---|
date | Tue, 14 Feb 2012 17:10:21 +0200 |
parents | 60bf20849231 |
children | 1e54c6966666 |
comparison
equal
deleted
inserted
replaced
696:b773e9f42ba3 | 697:4bf13af26d6a |
---|---|
67 class AppImage(Container): | 67 class AppImage(Container): |
68 | 68 |
69 rect_thick = 3 | 69 rect_thick = 3 |
70 draw_thick = 1 | 70 draw_thick = 1 |
71 | 71 |
72 def __init__(self, gd, state): | 72 def __init__(self, gd, state, scene, detail): |
73 self.state = state | 73 self.state = state |
74 super(AppImage, self).__init__(pygame.rect.Rect(0, 0, | 74 super(AppImage, self).__init__(pygame.rect.Rect(0, 0, |
75 constants.screen[0], constants.screen[1]), gd) | 75 constants.screen[0], constants.screen[1]), gd) |
76 self.mode = 'draw' | 76 self.mode = 'draw' |
77 self._scene = scene | |
78 self._detail = detail | |
77 self.rects = [] | 79 self.rects = [] |
78 self.images = [] | 80 self.images = [] |
79 self.start_pos = None | 81 self.start_pos = None |
80 self.end_pos = None | 82 self.end_pos = None |
81 self.rect_color = pygame.color.Color('white') | 83 self.rect_color = pygame.color.Color('white') |
92 self.draw_toolbar = True | 94 self.draw_toolbar = True |
93 self.old_mouse_pos = None | 95 self.old_mouse_pos = None |
94 self.zoom_display = False | 96 self.zoom_display = False |
95 self.draw_anim = False | 97 self.draw_anim = False |
96 self.zoom_offset = (600, 600) | 98 self.zoom_offset = (600, 600) |
97 if self.state.current_detail: | 99 self.clear_display = False |
98 w, h = self.state.current_detail.get_detail_size() | 100 if self._detail: |
101 w, h = self._scene.get_detail_size() | |
99 rect = pygame.rect.Rect(0, 0, w, h) | 102 rect = pygame.rect.Rect(0, 0, w, h) |
100 self.close_button.rect.midbottom = rect.midbottom | 103 self.close_button.rect.midbottom = rect.midbottom |
101 self.offset = (0, 0) | 104 self.offset = (0, 0) |
102 else: | 105 else: |
103 self.offset = (-self.state.current_scene.OFFSET[0], | 106 self.offset = (-self._scene.OFFSET[0], |
104 -self.state.current_scene.OFFSET[1]) | 107 -self._scene.OFFSET[1]) |
105 self.find_existing_intersects() | 108 self.find_existing_intersects() |
106 self.add_callback(MOUSEBUTTONDOWN, self.mouse_down) | 109 self.add_callback(MOUSEBUTTONDOWN, self.mouse_down) |
107 self.add_callback(MOUSEBUTTONUP, self.mouse_up) | 110 self.add_callback(MOUSEBUTTONUP, self.mouse_up) |
108 self.add_callback(MOUSEMOTION, self.mouse_move) | 111 self.add_callback(MOUSEMOTION, self.mouse_move) |
109 | 112 |
110 def _get_scene(self): | |
111 if self.state.current_detail: | |
112 return self.state.current_detail | |
113 else: | |
114 return self.state.current_scene | |
115 | |
116 def find_existing_intersects(self): | 113 def find_existing_intersects(self): |
117 """Parse the things in the scene for overlaps""" | 114 """Parse the things in the scene for overlaps""" |
118 scene = self._get_scene() | 115 scene = self._scene |
119 # Pylint hates this function | 116 # Pylint hates this function |
120 for thing in scene.things.itervalues(): | 117 for thing in scene.things.itervalues(): |
121 for interact_name in thing.interacts: | 118 for interact_name in thing.interacts: |
122 thing.set_interact(interact_name) | 119 thing.set_interact(interact_name) |
123 if hasattr(thing.rect, 'collidepoint'): | 120 if hasattr(thing.rect, 'collidepoint'): |
145 print | 142 print |
146 | 143 |
147 def find_intersecting_rects(self, d): | 144 def find_intersecting_rects(self, d): |
148 """Find if any rect collections intersect""" | 145 """Find if any rect collections intersect""" |
149 # I loath N^X brute search algorithm's, but whatever, hey | 146 # I loath N^X brute search algorithm's, but whatever, hey |
150 scene = self._get_scene() | 147 scene = self._scene |
151 for (num, col) in enumerate(d): | 148 for (num, col) in enumerate(d): |
152 rect_list = d[col] | 149 rect_list = d[col] |
153 for thing in scene.things.itervalues(): | 150 for thing in scene.things.itervalues(): |
154 for interact_name in thing.interacts: | 151 for interact_name in thing.interacts: |
155 thing.set_interact(interact_name) | 152 thing.set_interact(interact_name) |
184 def toggle_things(self, ev, widget): | 181 def toggle_things(self, ev, widget): |
185 self.draw_things = not self.draw_things | 182 self.draw_things = not self.draw_things |
186 | 183 |
187 def toggle_thing_rects(self, ev, widget): | 184 def toggle_thing_rects(self, ev, widget): |
188 self.draw_thing_rects = not self.draw_thing_rects | 185 self.draw_thing_rects = not self.draw_thing_rects |
189 scene = self._get_scene() | 186 scene = self._scene |
190 for thing in scene.things.itervalues(): | 187 for thing in scene.things.itervalues(): |
191 if not self.draw_thing_rects: | 188 if not self.draw_thing_rects: |
192 if not hasattr(thing, 'old_colour'): | 189 if not hasattr(thing, 'old_colour'): |
193 thing.old_colour = thing._interact_hilight_color | 190 thing.old_colour = thing._interact_hilight_color |
194 thing._interact_hilight_color = None | 191 thing._interact_hilight_color = None |
208 def toggle_toolbar(self, ev, widget): | 205 def toggle_toolbar(self, ev, widget): |
209 self.draw_toolbar = not self.draw_toolbar | 206 self.draw_toolbar = not self.draw_toolbar |
210 | 207 |
211 def toggle_zoom(self, ev, widget): | 208 def toggle_zoom(self, ev, widget): |
212 self.zoom_display = not self.zoom_display | 209 self.zoom_display = not self.zoom_display |
210 self.invalidate() | |
213 | 211 |
214 def toggle_anim(self, ev, widget): | 212 def toggle_anim(self, ev, widget): |
215 self.draw_anim = not self.draw_anim | 213 self.draw_anim = not self.draw_anim |
216 | 214 |
217 def draw_mode(self, ev, widget): | 215 def draw_mode(self, ev, widget): |
236 surf.blit(imsurf, r, None, BLEND_RGBA_MIN) | 234 surf.blit(imsurf, r, None, BLEND_RGBA_MIN) |
237 else: | 235 else: |
238 surf.blit(imsurf, r, None) | 236 surf.blit(imsurf, r, None) |
239 surface.blit(surf, cropped_rect) | 237 surface.blit(surf, cropped_rect) |
240 | 238 |
239 def invalidate(self): | |
240 self.clear_display = True | |
241 | |
241 def draw(self, surface): | 242 def draw(self, surface): |
243 if self.clear_display: | |
244 surface.fill(pygame.color.Color(0, 0, 0)) | |
245 self.clear_display = False | |
246 | |
242 if self.zoom_display: | 247 if self.zoom_display: |
243 base_surface = surface.copy() | 248 base_surface = surface.copy() |
244 self.do_unzoomed_draw(base_surface) | 249 self.do_unzoomed_draw(base_surface) |
245 zoomed = pygame.transform.scale(base_surface, | 250 zoomed = pygame.transform.scale(base_surface, |
246 (constants.zoom * constants.screen[0], | 251 (constants.zoom * constants.screen[0], |
251 surface.blit(zoomed, (0, 0), area) | 256 surface.blit(zoomed, (0, 0), area) |
252 else: | 257 else: |
253 self.do_unzoomed_draw(surface) | 258 self.do_unzoomed_draw(surface) |
254 | 259 |
255 def do_unzoomed_draw(self, surface): | 260 def do_unzoomed_draw(self, surface): |
256 if self.state.current_detail: | 261 if self.draw_things: |
257 if self.draw_things: | 262 self._scene.draw(surface) |
258 self.state.current_detail.draw(surface) | 263 else: |
259 else: | 264 self._scene.draw_background(surface) |
260 self.state.current_detail.draw_background(surface) | 265 if self._detail: |
261 # We duplicate Albow's draw logic here, so we zoom the close | 266 # We duplicate draw logic here, so we zoom the close |
262 # button correctly | 267 # button correctly |
263 self.close_button.draw(surface) | 268 self.close_button.draw(surface) |
264 else: | |
265 if self.draw_things: | |
266 self.state.current_scene.draw(surface) | |
267 else: | |
268 self.state.current_scene.draw_background(surface) | |
269 if self.mode == 'draw' and self.start_pos and self.draw_rects: | 269 if self.mode == 'draw' and self.start_pos and self.draw_rects: |
270 rect = pygame.rect.Rect(self.start_pos[0], self.start_pos[1], | 270 rect = pygame.rect.Rect(self.start_pos[0], self.start_pos[1], |
271 self.end_pos[0] - self.start_pos[0], | 271 self.end_pos[0] - self.start_pos[0], |
272 self.end_pos[1] - self.start_pos[1]) | 272 self.end_pos[1] - self.start_pos[1]) |
273 rect.normalize() | 273 rect.normalize() |
455 break | 455 break |
456 if cand: | 456 if cand: |
457 self.rects.remove(cand) | 457 self.rects.remove(cand) |
458 self.invalidate() | 458 self.invalidate() |
459 elif self.mode == 'cycle': | 459 elif self.mode == 'cycle': |
460 scene = self._get_scene() | 460 scene = self._scene |
461 cand = None | 461 cand = None |
462 for thing in scene.things.itervalues(): | 462 for thing in scene.things.itervalues(): |
463 if thing.contains(pos): | 463 if thing.contains(pos): |
464 cand = thing | 464 cand = thing |
465 break | 465 break |
545 def __init__(self, rect, gd, detail): | 545 def __init__(self, rect, gd, detail): |
546 super(RectApp, self).__init__(rect, gd) | 546 super(RectApp, self).__init__(rect, gd) |
547 | 547 |
548 try: | 548 try: |
549 state = gd.initial_state() | 549 state = gd.initial_state() |
550 scene = state.scenes[gd._initial_scene] | |
550 except KeyError: | 551 except KeyError: |
551 raise RectDrawerError('Invalid scene: %s' % gd._initial_scene) | 552 raise RectDrawerError('Invalid scene: %s' % gd._initial_scene) |
552 gd.sound.disable_sound() # No sound here | 553 gd.sound.disable_sound() # No sound here |
553 | 554 |
554 if detail: | 555 if detail: |
555 try: | 556 try: |
556 state.set_current_detail(detail) | 557 scene = state.detail_views[detail] |
557 except KeyError: | 558 except KeyError: |
558 raise RectDrawerError('Invalid detail: %s' % detail) | 559 raise RectDrawerError('Invalid detail: %s' % detail) |
559 | 560 |
560 # Handle any setup that needs to happen | 561 self.image = AppImage(gd, state, scene, detail is not None) |
561 # We start in leave, so do this twice | |
562 # FIXME: Screen parameter to check_enter_leave | |
563 # should go away | |
564 state.check_enter_leave(None) | |
565 state.check_enter_leave(None) | |
566 | |
567 self.image = AppImage(gd, state) | |
568 self.add(self.image) | 562 self.add(self.image) |
569 mode_label = ModeLabel(pygame.Rect((805, 0), (200, 25)), | 563 mode_label = ModeLabel(pygame.Rect((805, 0), (200, 25)), |
570 self.gd, self.image) | 564 self.gd, self.image) |
571 self.add(mode_label) | 565 self.add(mode_label) |
572 y = mode_label.rect.height | 566 y = mode_label.rect.height |