Mercurial > boomslang
comparison pyntnclick/widgets/editsprite.py @ 555:c0474fe18b96 pyntnclick
Copy in widgets from mamba (currently unused)
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Sat, 11 Feb 2012 14:09:46 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
554:99a1420097df | 555:c0474fe18b96 |
---|---|
1 from mamba.widgets.base import Box | |
2 from mamba.widgets.text import TextWidget, TextButton, EntryTextWidget | |
3 | |
4 | |
5 class EditSpriteBox(Box): | |
6 """Edit details for a special sprite on the level map""" | |
7 | |
8 def __init__(self, rect, sprite_pos, sprite_info, post_callback=None): | |
9 super(EditSpriteBox, self).__init__(rect) | |
10 self.sprite_pos = sprite_pos | |
11 sprite_cls_name, sprite_cls, sprite_id, args = sprite_info | |
12 self.sprite_cls_name = sprite_cls_name | |
13 self.sprite_cls = sprite_cls | |
14 if sprite_id: | |
15 self.sprite_id = sprite_id | |
16 else: | |
17 self.sprite_id = '' | |
18 self.sprite_parameters = args | |
19 self.new_sprite_parameters = [] | |
20 self.post_callback = post_callback | |
21 self.parameter_widgets = [] | |
22 self.prepare() | |
23 self.modal = True | |
24 | |
25 def prepare(self): | |
26 title = TextWidget(self.rect, "Specify Sprite Details") | |
27 self.add(title) | |
28 height = self.rect.top + title.rect.height + 2 | |
29 self.edit_sprite_name = TextWidget((self.rect.left, height), | |
30 'Sprite Class: %s' % self.sprite_cls.name) | |
31 self.add(self.edit_sprite_name) | |
32 height += self.edit_sprite_name.rect.height + 2 | |
33 self.edit_sprite_id = EntryTextWidget((self.rect.left + 20, height), | |
34 self.sprite_id, prompt='Sprite Id (required):') | |
35 self.add(self.edit_sprite_id) | |
36 height += self.edit_sprite_id.rect.height + 2 | |
37 poss_params = self.sprite_cls.get_sprite_args() | |
38 if not poss_params: | |
39 self.sprite_param = TextWidget((self.rect.left, height), | |
40 'No Parameters') | |
41 self.add(self.sprite_param) | |
42 height += self.sprite_param.rect.height + 2 | |
43 else: | |
44 self.sprite_param = TextWidget((self.rect.left, height), | |
45 'Parameters') | |
46 self.add(self.sprite_param) | |
47 height += self.sprite_param.rect.height + 2 | |
48 for i, param_tuple in enumerate(poss_params): | |
49 if len(self.sprite_parameters) > i: | |
50 value = self.sprite_parameters[i] | |
51 else: | |
52 value = None | |
53 if param_tuple[1] is None: | |
54 # Text Entry Parameter | |
55 if value is None: | |
56 value = '' | |
57 edit_widget = EntryTextWidget( | |
58 (self.rect.left + 20, height), | |
59 value, prompt=param_tuple[0]) | |
60 self.parameter_widgets.append(edit_widget) | |
61 self.add(edit_widget) | |
62 height += edit_widget.rect.height | |
63 elif isinstance(param_tuple[1], tuple): | |
64 # We have a list of possible values | |
65 if value is None: | |
66 value = param_tuple[1][0] # Take the first | |
67 mylist = [] | |
68 list_width = 0 | |
69 list_height = 0 | |
70 for choice in param_tuple[1]: | |
71 list_parameter = TextWidget( | |
72 (self.rect.left + 20, height), | |
73 '%s: %s' % (param_tuple[0], choice)) | |
74 # So we can pull it out of this later | |
75 list_parameter.choice = choice | |
76 list_width = max(list_width, list_parameter.rect.width) | |
77 change_list = TextButton( | |
78 (list_parameter.rect.right + 5, height), | |
79 'Next Option') | |
80 change_list.add_callback('clicked', self.change_list, | |
81 choice, param_tuple[1], mylist) | |
82 mylist.append((list_parameter, change_list)) | |
83 list_height = max(list_height, change_list.rect.height, | |
84 list_parameter.rect.height) | |
85 if choice == value: | |
86 self.add(list_parameter) | |
87 self.add(change_list) | |
88 for x in mylist: | |
89 x[1].rect.left = self.rect.left + list_width + 25 | |
90 if x[0].rect.height < list_height: | |
91 x[0].rect.top += (list_height - | |
92 x[0].rect.height) / 2 | |
93 height += max(list_parameter.rect.height, | |
94 change_list.rect.height) | |
95 self.parameter_widgets.append(mylist) | |
96 # FIXME: Other cases | |
97 height += 20 | |
98 self.ok_button = TextButton((self.rect.left + 10, height), 'OK') | |
99 self.ok_button.add_callback('clicked', self.close, True) | |
100 self.add(self.ok_button) | |
101 cancel_button = TextButton((self.ok_button.rect.right + 10, height), | |
102 'Cancel') | |
103 cancel_button.add_callback('clicked', self.close, False) | |
104 self.add(cancel_button) | |
105 self.rect.width = max(self.rect.width, 400) | |
106 self.rect.height += 5 | |
107 | |
108 def change_list(self, ev, widget, cur_choice, all_choices, widget_list): | |
109 pos = all_choices.index(cur_choice) | |
110 if pos == len(all_choices) - 1: | |
111 next_pos = 0 | |
112 else: | |
113 next_pos = pos + 1 | |
114 self.remove(widget_list[pos][0]) | |
115 self.remove(widget_list[pos][1]) | |
116 self.add(widget_list[next_pos][0]) | |
117 self.add(widget_list[next_pos][1]) | |
118 | |
119 def close(self, ev, widget, do_update): | |
120 if do_update: | |
121 self.new_sprite_parameters = [] | |
122 for param in self.parameter_widgets: | |
123 if hasattr(param, 'value'): | |
124 self.new_sprite_parameters.append(param.value) | |
125 elif isinstance(param, list): | |
126 # Find the selected one | |
127 for choice, _ in param: | |
128 if choice in self.children: | |
129 # Is selected, so we grab this choice | |
130 self.new_sprite_parameters.append(choice.choice) | |
131 break | |
132 self.sprite_id = self.edit_sprite_id.value | |
133 sprite = self.make_sprite() | |
134 if not self.post_callback(sprite): | |
135 return # Call-back failed, so don't remove | |
136 self.parent.paused = False | |
137 self.parent.remove(self) | |
138 return True | |
139 | |
140 def make_sprite(self): | |
141 """Convert values to a sprite line""" | |
142 pos = "%s, %s" % self.sprite_pos | |
143 sprite_string = "%s: %s %s %s" % (pos, self.sprite_cls_name, | |
144 self.sprite_id, " ".join(self.new_sprite_parameters)) | |
145 return sprite_string | |
146 | |
147 def grab_focus(self): | |
148 return self.ok_button.grab_focus() |