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