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()