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