comparison tools/area_editor.py @ 262:521f73061872

Better reporting of object errors. Fix incorrect assumption about ordering
author Neil Muller <drnlmuller@gmail.com>
date Thu, 05 Sep 2013 00:37:23 +0200
parents d4928d4a661a
children 2abb61878bb1
comparison
equal deleted inserted replaced
261:db7c8e74efb4 262:521f73061872
195 mod = modules[modname] 195 mod = modules[modname]
196 if mod is None: 196 if mod is None:
197 mod = ngo 197 mod = ngo
198 return getattr(mod, classname) 198 return getattr(mod, classname)
199 199
200 def try_new_object(self, target, new, old=None): 200 def try_new_object(self, classname, target, new, old=None):
201 if old in target: 201 if old in target:
202 target.remove(old) 202 target.remove(old)
203 try: 203 try:
204 target.append(new) 204 target.append(new)
205 self.reset_objs() 205 self.reset_objs()
206 return True 206 return True
207 except Exception: 207 except Exception as e:
208 target.remove(new) 208 target.remove(new)
209 if old is not None: 209 if old is not None:
210 target.append(old) 210 target.append(old)
211 self.reset_objs() 211 self.reset_objs()
212 alert("Failed to update object %s: %s" % (classname, e))
212 return False 213 return False
213 214
214 215
215 class ObjectTable(TableView): 216 class ObjectTable(TableView):
216 217
249 self.classname = classname 250 self.classname = classname
250 self.rect = pygame.rect.Rect(0, 0, 800, 550) 251 self.rect = pygame.rect.Rect(0, 0, 800, 550)
251 title = Label("Editing %s" % classname) 252 title = Label("Editing %s" % classname)
252 title.rect = pygame.rect.Rect(100, 10, 600, 25) 253 title.rect = pygame.rect.Rect(100, 10, 600, 25)
253 self.add(title) 254 self.add(title)
254 requires = cls.requires() 255 self.requires = cls.requires()
255 y = 40 256 y = 40
256 self.fields = {} 257 self.fields = {}
257 index = 0 258 index = 0
258 for requirement, hint in requires: 259 for requirement, hint in self.requires:
259 label = Label(requirement) 260 label = Label(requirement)
260 label.rect = pygame.rect.Rect(40, y, 200, 25) 261 label.rect = pygame.rect.Rect(40, y, 200, 25)
261 self.add(label) 262 self.add(label)
262 field = TextField() 263 field = TextField()
263 field.rect = pygame.rect.Rect(220, y, 400, 25) 264 field.rect = pygame.rect.Rect(220, y, 400, 25)
291 result = {} 292 result = {}
292 result['classname'] = self.classname 293 result['classname'] = self.classname
293 args = [] 294 args = []
294 # We arrange to bounce this through yaml'ish to convert 295 # We arrange to bounce this through yaml'ish to convert
295 # stuff to the expected type 296 # stuff to the expected type
296 for val in self.fields: 297 for val, _ in self.requires:
297 text = self.fields[val].get_text() 298 text = self.fields[val].get_text()
298 if not text: 299 if not text:
299 # skip empty fields 300 # skip empty fields
300 continue 301 continue
301 if val == 'name': 302 if val == 'name':
501 return 502 return
502 if res == 'OK': 503 if res == 'OK':
503 cls = self.level.get_class(choice['classname']) 504 cls = self.level.get_class(choice['classname'])
504 edited = self._edit_class(choice['classname'], cls, choice) 505 edited = self._edit_class(choice['classname'], cls, choice)
505 if edited is not None: 506 if edited is not None:
506 if not self.level.try_new_object(self.level._game_objects, 507 self.level.try_new_object(choice["classname"],
507 edited, choice): 508 self.level._game_objects,
508 alert('Failed to update GameObject %s' 509 edited, choice)
509 % choice['classname'])
510 elif res == 'Delete': 510 elif res == 'Delete':
511 self.level._game_objects.remove(choice) 511 self.level._game_objects.remove(choice)
512 self.level.reset_objs() 512 self.level.reset_objs()
513 513
514 def edit_enemies(self): 514 def edit_enemies(self):
519 return 519 return
520 if res == 'OK': 520 if res == 'OK':
521 cls = self.level.get_class(choice['classname'], ne) 521 cls = self.level.get_class(choice['classname'], ne)
522 edited = self._edit_class(choice['classname'], cls, choice) 522 edited = self._edit_class(choice['classname'], cls, choice)
523 if edited is not None: 523 if edited is not None:
524 if not self.level.try_new_object(self.level._enemies, 524 self.level.try_new_object(choice["classname"],
525 edited, choice): 525 self.level._enemies, edited, choice)
526 alert('Failed to update Enemy %s'
527 % choice['classname'])
528 elif res == 'Delete': 526 elif res == 'Delete':
529 self.level._enemies.remove(choice) 527 self.level._enemies.remove(choice)
530 self.level.reset_objs() 528 self.level.reset_objs()
531 529
532 def _make_choice_dialog(self, classes): 530 def _make_choice_dialog(self, classes):
556 if res == 'OK' and choice is not None: 554 if res == 'OK' and choice is not None:
557 classname = choice['classname'] 555 classname = choice['classname']
558 cls = choice['class'] 556 cls = choice['class']
559 new_cls = self._edit_class(classname, cls, None) 557 new_cls = self._edit_class(classname, cls, None)
560 if new_cls is not None: 558 if new_cls is not None:
561 if not self.level.try_new_object(self.level._game_objects, 559 self.level.try_new_object(classname, self.level._game_objects,
562 new_cls, None): 560 new_cls, None)
563 alert('Failed to add GameObject %s' % classname)
564 561
565 def add_enemy(self): 562 def add_enemy(self):
566 classes = ne.get_editable_enemies() 563 classes = ne.get_editable_enemies()
567 choose = self._make_choice_dialog(classes) 564 choose = self._make_choice_dialog(classes)
568 res = choose.present() 565 res = choose.present()
570 if res == 'OK' and choice is not None: 567 if res == 'OK' and choice is not None:
571 classname = choice['classname'] 568 classname = choice['classname']
572 cls = choice['class'] 569 cls = choice['class']
573 new_cls = self._edit_class(classname, cls, None) 570 new_cls = self._edit_class(classname, cls, None)
574 if new_cls is not None: 571 if new_cls is not None:
575 if not self.level.try_new_object(self.level._enemies, 572 self.level.try_new_object(classname, self.level._enemies,
576 new_cls, None): 573 new_cls, None)
577 alert('Failed to add Enemy %s' % classname)
578 574
579 def add_puzzler(self): 575 def add_puzzler(self):
580 classes = np.get_editable_puzzlers() 576 classes = np.get_editable_puzzlers()
581 choose = self._make_choice_dialog(classes) 577 choose = self._make_choice_dialog(classes)
582 res = choose.present() 578 res = choose.present()
584 if res == 'OK' and choice is not None: 580 if res == 'OK' and choice is not None:
585 classname = choice['classname'] 581 classname = choice['classname']
586 cls = choice['class'] 582 cls = choice['class']
587 new_cls = self._edit_class(classname, cls, None) 583 new_cls = self._edit_class(classname, cls, None)
588 if new_cls is not None: 584 if new_cls is not None:
589 if not self.level.try_new_object(self.level._game_objects, 585 self.level.try_new_object(classname, self.level._game_objects,
590 new_cls, None): 586 new_cls, None)
591 alert('Failed to add Puzzler %s' % classname)
592 587
593 588
594 class PolyButton(Button): 589 class PolyButton(Button):
595 """Button for coosing the correct polygon""" 590 """Button for coosing the correct polygon"""
596 591