comparison tools/area_editor.py @ 280:7bb6296024c4

Add current mode hints
author Neil Muller <drnlmuller@gmail.com>
date Thu, 05 Sep 2013 14:12:55 +0200
parents 56e42c00da25
children 78bc8c873f7f
comparison
equal deleted inserted replaced
279:9f68e22c1e58 280:7bb6296024c4
329 return result 329 return result
330 330
331 331
332 class LevelWidget(Widget): 332 class LevelWidget(Widget):
333 333
334 def __init__(self, level): 334 def __init__(self, level, parent):
335 super(LevelWidget, self).__init__(pygame.rect.Rect(0, 0, 335 super(LevelWidget, self).__init__(pygame.rect.Rect(0, 0,
336 SCREEN[0], SCREEN[1])) 336 SCREEN[0], SCREEN[1]))
337 self.level = level 337 self.level = level
338 self.pos = (0, 0) 338 self.pos = (0, 0)
339 self.filled_mode = False 339 self.filled_mode = False
343 self._draw_objects = False 343 self._draw_objects = False
344 self._draw_enemies = False 344 self._draw_enemies = False
345 self._draw_lines = False 345 self._draw_lines = False
346 self.sel_mode = False 346 self.sel_mode = False
347 self._start_pos = None 347 self._start_pos = None
348 self._parent = parent
348 349
349 def _level_coordinates(self, pos): 350 def _level_coordinates(self, pos):
350 # Move positions to level values 351 # Move positions to level values
351 if not pos: 352 if not pos:
352 return (0, 0) 353 return (0, 0)
399 400
400 def change_poly(self, new_poly): 401 def change_poly(self, new_poly):
401 self.cur_poly = new_poly 402 self.cur_poly = new_poly
402 self._draw_lines = False 403 self._draw_lines = False
403 if self.cur_poly is not None: 404 if self.cur_poly is not None:
405 self._parent.reset_lit_buttons()
404 self.filled_mode = False 406 self.filled_mode = False
405 407
406 def line_mode(self): 408 def line_mode(self):
407 self.cur_poly = None 409 self.cur_poly = None
410 self._parent.reset_lit_buttons()
408 self._draw_lines = True 411 self._draw_lines = True
409 self.filled_mode = False 412 self.filled_mode = False
410 self._start_pos = None 413 self._start_pos = None
411 414
412 def key_down(self, ev): 415 def key_down(self, ev):
431 434
432 def set_filled(self): 435 def set_filled(self):
433 closed, _ = self.level.all_closed() 436 closed, _ = self.level.all_closed()
434 if closed: 437 if closed:
435 self.cur_poly = None 438 self.cur_poly = None
439 self._parent.reset_lit_buttons()
436 self.filled_mode = True 440 self.filled_mode = True
437 self._draw_lines = False 441 self._draw_lines = False
438 else: 442 else:
439 alert('Not all polygons closed, so not filling') 443 alert('Not all polygons closed, so not filling')
440 444
632 if new_cls is not None: 636 if new_cls is not None:
633 self.level.try_new_object(classname, self.level._game_objects, 637 self.level.try_new_object(classname, self.level._game_objects,
634 new_cls, None) 638 new_cls, None)
635 639
636 640
637 class PolyButton(Button): 641 class HighLightButton(Button):
642 """Button with highlight support"""
643 def __init__(self, text, parent, **kwds):
644 super(HighLightButton, self).__init__(text, **kwds)
645 self._parent = parent
646
647 def highlight(self):
648 self.border_color = pygame.color.Color('red')
649
650 def reset(self):
651 self.border_color = self.fg_color
652
653
654 class PolyButton(HighLightButton):
638 """Button for coosing the correct polygon""" 655 """Button for coosing the correct polygon"""
639 656
640 def __init__(self, index, level_widget): 657 def __init__(self, index, level_widget, parent):
641 if index is not None: 658 if index is not None:
642 text = "Draw: %s" % index 659 text = "Draw: %s" % index
643 else: 660 else:
644 text = 'Exit Draw Mode' 661 text = 'Exit Draw Mode'
645 super(PolyButton, self).__init__(text) 662 super(PolyButton, self).__init__(text, parent)
646 self.index = index 663 self.index = index
647 self.level_widget = level_widget 664 self.level_widget = level_widget
648 665
649 def action(self): 666 def action(self):
650 self.level_widget.change_poly(self.index) 667 self.level_widget.change_poly(self.index)
668 self._parent.reset_lit_buttons()
669 if self.index is not None:
670 self.highlight()
651 671
652 672
653 class EditorApp(RootWidget): 673 class EditorApp(RootWidget):
654 674
655 def __init__(self, level, surface): 675 def __init__(self, level, surface):
656 super(EditorApp, self).__init__(surface) 676 super(EditorApp, self).__init__(surface)
657 self.level = level 677 self.level = level
658 self.level_widget = LevelWidget(self.level) 678 self.level_widget = LevelWidget(self.level, self)
659 self.add(self.level_widget) 679 self.add(self.level_widget)
660 680
661 self._dMenus = {} 681 self._dMenus = {}
682
683 self._light_buttons = []
662 684
663 self._make_draw_menu() 685 self._make_draw_menu()
664 self._make_objects_menu() 686 self._make_objects_menu()
665 687
666 self._menu_mode = 'drawing' 688 self._menu_mode = 'drawing'
670 widgets = [] 692 widgets = []
671 693
672 # Add poly buttons 694 # Add poly buttons
673 y = 15 695 y = 15
674 for poly in range(1, 7): 696 for poly in range(1, 7):
675 but = PolyButton(poly, self.level_widget) 697 but = PolyButton(poly, self.level_widget, self)
676 but.rect = pygame.rect.Rect(0, 0, MENU_WIDTH // 2 - MENU_PAD, 698 but.rect = pygame.rect.Rect(0, 0, MENU_WIDTH // 2 - MENU_PAD,
677 MENU_BUTTON_HEIGHT) 699 MENU_BUTTON_HEIGHT)
678 if poly % 2: 700 if poly % 2:
679 but.rect.move_ip(MENU_LEFT, y) 701 but.rect.move_ip(MENU_LEFT, y)
680 else: 702 else:
681 but.rect.move_ip(MENU_LEFT + MENU_WIDTH // 2 - MENU_HALF_PAD, 703 but.rect.move_ip(MENU_LEFT + MENU_WIDTH // 2 - MENU_HALF_PAD,
682 y) 704 y)
683 y += MENU_BUTTON_HEIGHT + MENU_PAD 705 y += MENU_BUTTON_HEIGHT + MENU_PAD
706 self._light_buttons.append(but)
684 widgets.append(but) 707 widgets.append(but)
685 708
686 end_poly_but = PolyButton(None, self.level_widget) 709 end_poly_but = PolyButton(None, self.level_widget, self)
687 end_poly_but.rect = BUTTON_RECT.copy() 710 end_poly_but.rect = BUTTON_RECT.copy()
688 end_poly_but.rect.move_ip(MENU_LEFT, y) 711 end_poly_but.rect.move_ip(MENU_LEFT, y)
689 widgets.append(end_poly_but) 712 widgets.append(end_poly_but)
690 y += MENU_BUTTON_HEIGHT + MENU_PAD 713 y += MENU_BUTTON_HEIGHT + MENU_PAD
691 714
692 draw_line = Button("Draw interior wall", self.level_widget.line_mode) 715 self.draw_line_but = HighLightButton("Draw interior wall", self,
693 draw_line.rect = BUTTON_RECT.copy() 716 action=self.set_line_mode)
694 draw_line.rect.move_ip(MENU_LEFT, y) 717 self.draw_line_but.rect = BUTTON_RECT.copy()
695 widgets.append(draw_line) 718 self.draw_line_but.rect.move_ip(MENU_LEFT, y)
719 widgets.append(self.draw_line_but)
720 self._light_buttons.append(self.draw_line_but)
696 y += MENU_BUTTON_HEIGHT + MENU_PAD 721 y += MENU_BUTTON_HEIGHT + MENU_PAD
697 722
698 fill_but = Button('Fill exterior', action=self.level_widget.set_filled) 723 fill_but = Button('Fill exterior', action=self.level_widget.set_filled)
699 fill_but.rect = BUTTON_RECT.copy() 724 fill_but.rect = BUTTON_RECT.copy()
700 fill_but.rect.move_ip(MENU_LEFT, y) 725 fill_but.rect.move_ip(MENU_LEFT, y)
788 add_enemy_but.rect.move_ip(MENU_LEFT, y) 813 add_enemy_but.rect.move_ip(MENU_LEFT, y)
789 widgets.append(add_enemy_but) 814 widgets.append(add_enemy_but)
790 y += MENU_BUTTON_HEIGHT + MENU_PAD 815 y += MENU_BUTTON_HEIGHT + MENU_PAD
791 816
792 y += MENU_PAD 817 y += MENU_PAD
793 sel_mode_but = Button('Select Object', 818 self.sel_mode_but = HighLightButton('Select Object', self,
794 action=self.sel_mode) 819 action=self.sel_mode)
795 sel_mode_but.rect = BUTTON_RECT.copy() 820 self.sel_mode_but.rect = BUTTON_RECT.copy()
796 sel_mode_but.rect.move_ip(MENU_LEFT, y) 821 self.sel_mode_but.rect.move_ip(MENU_LEFT, y)
797 widgets.append(sel_mode_but) 822 widgets.append(self.sel_mode_but)
823 self._light_buttons.append(self.sel_mode_but)
798 y += MENU_BUTTON_HEIGHT + MENU_PAD 824 y += MENU_BUTTON_HEIGHT + MENU_PAD
799 825
800 y += MENU_PAD 826 y += MENU_PAD
801 switch_but = Button('Switch to Drawing', action=self.switch_to_draw) 827 switch_but = Button('Switch to Drawing', action=self.switch_to_draw)
802 switch_but.rect = BUTTON_RECT.copy() 828 switch_but.rect = BUTTON_RECT.copy()
850 876
851 def _clear_menu(self): 877 def _clear_menu(self):
852 for widget in self._dMenus[self._menu_mode]: 878 for widget in self._dMenus[self._menu_mode]:
853 self.remove(widget) 879 self.remove(widget)
854 880
881 def reset_lit_buttons(self):
882 for but in self._light_buttons:
883 but.reset()
884
855 def _populate_menu(self): 885 def _populate_menu(self):
856 self.level_widget.change_poly(None) 886 self.level_widget.change_poly(None)
857 self.level_widget.sel_mode = False 887 self.level_widget.sel_mode = False
858 for widget in self._dMenus[self._menu_mode]: 888 for widget in self._dMenus[self._menu_mode]:
859 self.add(widget) 889 self.add(widget)
860 self.invalidate() 890 self.invalidate()
861 891
892 def set_line_mode(self):
893 self.level_widget.line_mode()
894 self.draw_line_but.highlight()
895
862 def sel_mode(self): 896 def sel_mode(self):
863 self.level_widget.sel_mode = not self.level_widget.sel_mode 897 self.level_widget.sel_mode = not self.level_widget.sel_mode
898 if self.level_widget.sel_mode:
899 self.sel_mode_but.highlight()
900 else:
901 self.sel_mode_but.reset()
864 902
865 def mouse_move(self, ev): 903 def mouse_move(self, ev):
866 self.level_widget.mouse_move(ev) 904 self.level_widget.mouse_move(ev)
867 905
868 def draw(self, surface): 906 def draw(self, surface):