Commit | Line | Data |
---|---|---|
cb700bcc FC |
1 | # from inspect import getmro |
2 | # from ya2.lib.gui import Btn, Slider, CheckBtn, OptionMenu, Entry | |
3 | # from ya2.engine.vec import Vec2 | |
4 | # from ya2.engine.gui.gui import left, right, up, down | |
5 | # from ya2.gameobject import GameObject, GuiColleague, EventColleague | |
6 | # from ya2.engine.gui.imgbtn import ImgBtn | |
7 | ||
8 | ||
9 | # class PageGui(GuiColleague): | |
10 | ||
11 | # def __init__(self, mediator, menu_props, players=[0]): | |
12 | # GuiColleague.__init__(self, mediator) | |
13 | # self.enable_tsk = None | |
14 | # self._back_btn = None | |
15 | # self.menu_props = menu_props | |
16 | # self.players = players | |
17 | # self.widgets = [] | |
18 | # self.build() | |
19 | # self.translate() | |
20 | # self.curr_wdgs = [] | |
21 | # for player in players: | |
22 | # self.curr_wdgs += [ | |
23 | # self.__next_wdg((-.1, -1), player, Vec2(-3.6, 1))] | |
24 | # if self.curr_wdgs[-1]: | |
25 | # self.curr_wdgs[-1].on_wdg_enter(None, player) | |
26 | ||
27 | # def build(self, back_btn=True, exit_behav=False): | |
28 | # if back_btn: self.__build_back_btn(exit_behav) | |
29 | # self._set_widgets() | |
30 | # self._set_entries() | |
31 | # self.transition_enter() | |
32 | # self.eng.cursor_top() | |
33 | ||
34 | # def add_widgets(self, widgets): self.widgets += widgets | |
35 | ||
36 | # def on_arrow(self, direction, player): | |
37 | # if not self.curr_wdgs[player]: return | |
38 | # if self.curr_wdgs[player].__class__.__name__ == 'P3dEntryWidget' and \ | |
39 | # self.curr_wdgs[player].focused: return | |
40 | # processed_cmd = self.curr_wdgs[player].on_arrow(direction) | |
41 | # # e.g. up/down in a combobox or left/right in a slider | |
42 | # if processed_cmd: return | |
43 | # next_wdg = self.__next_wdg(direction, player) | |
44 | # if not next_wdg: return | |
45 | # self.focus(next_wdg, player) | |
46 | ||
47 | # def on_enter(self, player): | |
48 | # if not self.curr_wdgs[player]: return | |
49 | # arg = player if len(self.players) > 1 else None | |
50 | # if self.curr_wdgs[player].on_enter(arg): self.enable([player]) | |
51 | # # wdg.on_enter returns True when it is an option widget | |
52 | ||
53 | # @property | |
54 | # def buttons(self): | |
55 | # is_btn = lambda wdg: Btn in getmro(wdg.__class__) | |
56 | # return [wdg for wdg in self.widgets if is_btn(wdg)] | |
57 | ||
58 | # def focus(self, wdg, player): | |
59 | # self.curr_wdgs[player].on_wdg_exit(None, player) | |
60 | # self.curr_wdgs[player] = wdg | |
61 | # self.curr_wdgs[player].on_wdg_enter(None, player) | |
62 | ||
63 | # def __direction_dot_dwg(self, wdg, direction, player, start=None): | |
64 | # if start: start_pos = start | |
65 | # else: start_pos = self.curr_wdgs[player].pos | |
66 | # return (wdg.pos - start_pos).normalized.dot(direction) | |
67 | ||
68 | # def __next_weight(self, wdg, direction, player, start=None): | |
69 | # if start: start_pos = start | |
70 | # else: start_pos = self.curr_wdgs[player].global_pos | |
71 | # dot = self.__direction_dot_dwg(wdg, direction, player, start) | |
72 | # if direction in [(-1, 0), (1, 0)]: | |
73 | # proj_dist = abs(wdg.global_pos.x - start_pos.x) | |
74 | # else: proj_dist = abs(wdg.global_pos.y - start_pos.y) | |
75 | # weights = [.5, .5] if direction in [left, right] else [.1, .9] | |
76 | # return weights[0] * (dot * dot) + weights[1] * (1 - proj_dist) | |
77 | ||
78 | # def __next_wdg(self, direction, player, start=None): | |
79 | # # interactive classes | |
80 | # iclss = [Btn, CheckBtn, Slider, OptionMenu, ImgBtn, Entry] | |
81 | # inter = lambda wdg: any(pcl in iclss for pcl in getmro(wdg.__class__)) | |
82 | # allwdgs = [wdg for wdg in self.widgets if inter(wdg)] | |
83 | # wdgs = list(filter(lambda wdg: wdg.is_enabled, allwdgs)) | |
84 | # if player < len(self.curr_wdgs) and self.curr_wdgs[player] \ | |
85 | # and self.curr_wdgs[player] in wdgs: | |
86 | # # the last check for this case: multiple players appear on the | |
87 | # # same button, one player clicks it, another moves from it | |
88 | # wdgs.remove(self.curr_wdgs[player]) | |
89 | # mth = self.__direction_dot_dwg | |
90 | # in_direction = lambda wdg: mth(wdg, direction, player, start) > .1 | |
91 | # dirwdgs = list(filter(in_direction, wdgs)) | |
92 | # if not dirwdgs: return None | |
93 | # nextweight = lambda wdg: \ | |
94 | # self.__next_weight(wdg, direction, player, start) | |
95 | # return max(dirwdgs, key=nextweight) | |
96 | ||
97 | # def _set_widgets(self): | |
98 | # list(map(lambda wdg: wdg.set_widget(), self.widgets)) | |
99 | ||
100 | # def _set_entries(self): | |
101 | # for wdg in self.widgets: | |
102 | # if wdg.__class__.__name__ == 'P3dEntryWidget': | |
103 | # wdg.attach(self.on_entry_enter) | |
104 | # wdg.attach(self.on_entry_exit) | |
105 | ||
106 | # def on_entry_enter(self): | |
107 | # if self.menu_props: # i.e. not destroyed | |
108 | # self.disable_navigation(self.players) | |
109 | ||
110 | # def on_entry_exit(self): | |
111 | # if self.menu_props: # i.e. not destroyed | |
112 | # self.enable_navigation(self.players) | |
113 | ||
114 | # def transition_enter(self): | |
115 | # self.translate() | |
116 | # list(map(lambda wdg: wdg.set_enter_transition(), self.widgets)) | |
117 | # self.enable(self.players) | |
118 | ||
119 | # def translate(self): list(map(lambda wdg: wdg.translate(), self.widgets)) | |
120 | ||
121 | # def enable_navigation(self, players): | |
122 | # if self.enable_tsk: self.eng.rm_do_later(self.enable_tsk) | |
123 | # self.enable_tsk = self.eng.do_later( | |
124 | # .01, self.enable_navigation_aux, [players]) | |
125 | ||
126 | # def update_navigation(self): | |
127 | # self.disable_navigation(self.players) | |
128 | # self.enable_navigation(self.players) | |
129 | ||
130 | # def enable_navigation_aux(self, players): | |
131 | # navs = [] | |
132 | # for player in players: | |
133 | # nav = self.menu_props.nav.navinfo_lst[player] | |
134 | # evts = [ | |
135 | # (self.eng.lib.remap_str(nav.left), self.on_arrow, | |
136 | # [left, player]), | |
137 | # (self.eng.lib.remap_str(nav.right), self.on_arrow, | |
138 | # [right, player]), | |
139 | # (self.eng.lib.remap_str(nav.up), self.on_arrow, [up, player]), | |
140 | # (self.eng.lib.remap_str(nav.down), self.on_arrow, | |
141 | # [down, player]), | |
142 | # (self.eng.lib.remap_str(nav.fire), self.on_enter, [player])] | |
143 | # def append_up(evt): return evt + ('' if evt.endswith('-up') else '-up') | |
144 | # evts = [(append_up(evt[0]), evt[1], evt[2]) for evt in evts] | |
145 | # navs += [nav] | |
146 | # list(map(lambda args: self.mediator.event.accept(*args), evts)) | |
147 | # self.eng.joystick_mgr.bind_keyboard(navs) | |
148 | # if self.eng.cfg.dev_cfg.menu_joypad and self._back_btn: | |
149 | # self.mediator.event.accept('joypad0-face_b-up', self.__back_wrapper) | |
150 | ||
151 | # def __back_wrapper(self): | |
152 | # if not self.eng.joystick_mgr.is_recording: self._back_btn['command']() | |
153 | ||
154 | # def disable_navigation(self, players): | |
155 | # if self.enable_tsk: | |
156 | # self.enable_tsk = self.eng.rm_do_later(self.enable_tsk) | |
157 | # for player in players: | |
158 | # nav = self.menu_props.nav.navinfo_lst[player] | |
159 | # # evts = [nav.left, nav.right, nav.up, nav.down, nav.fire] | |
160 | # evts = [ | |
161 | # self.eng.lib.remap_str(nav.left), | |
162 | # self.eng.lib.remap_str(nav.right), | |
163 | # self.eng.lib.remap_str(nav.up), | |
164 | # self.eng.lib.remap_str(nav.down), | |
165 | # self.eng.lib.remap_str(nav.fire)] | |
166 | # def append_up(evt): return evt + ('' if evt.endswith('-up') else '-up') | |
167 | # evts = [append_up(evt) for evt in evts] | |
168 | # self.eng.joystick_mgr.unbind_keyboard() | |
169 | # list(map(self.mediator.event.ignore, evts)) | |
170 | # self.mediator.event.ignore('joypad0-face_b-up') | |
171 | ||
172 | # def enable(self, players): | |
173 | # self.enable_navigation(players) | |
174 | # list(map(lambda wdg: wdg.enable(), self.widgets)) | |
175 | ||
176 | # def disable(self, players): | |
177 | # if self.enable_tsk: | |
178 | # self.enable_tsk = self.eng.rm_do_later(self.enable_tsk) | |
179 | # self.disable_navigation(players) | |
180 | # list(map(lambda wdg: wdg.disable(), self.widgets)) | |
181 | ||
182 | # def transition_exit(self, destroy=True): | |
183 | # list(map(lambda wdg: wdg.set_exit_transition(destroy), self.widgets)) | |
184 | # self.disable(self.players) | |
185 | ||
186 | # def __build_back_btn(self, exit_behav): | |
187 | # tra_src = 'Quit' if exit_behav else 'Back' | |
188 | # tra_tra = _('Quit') if exit_behav else _('Back') | |
189 | # callback = self._on_quit if exit_behav else self._on_back | |
190 | # btn = Btn(text='', pos=(0, -.85), cmd=callback, | |
191 | # tra_src=tra_src, tra_tra=tra_tra, **self.menu_props.btn_args) | |
192 | # self.widgets += [btn] | |
193 | # self._back_btn = btn | |
194 | ||
195 | # def _on_back(self, player=0): | |
196 | # self.notify('on_back', self.__class__.__name__) | |
197 | ||
198 | # def _on_quit(self): self.notify('on_quit', self.__class__.__name__) | |
199 | ||
200 | # def show(self): | |
201 | # visible_widgets = [wdg for wdg in self.widgets if wdg.was_visible] | |
202 | # list(map(lambda wdg: wdg.show(), visible_widgets)) | |
203 | # self.transition_enter() | |
204 | ||
205 | # def hide(self): | |
206 | # for wdg in self.widgets: wdg.was_visible = not wdg.hidden | |
207 | # self.transition_exit(False) | |
208 | # self.notify('on_hide') | |
209 | ||
210 | # def destroy(self): | |
211 | # self.transition_exit() | |
212 | # self.menu_props = None | |
213 | ||
214 | ||
215 | # class PageEvent(EventColleague): | |
216 | ||
217 | # def on_back(self): pass | |
218 | ||
219 | # def on_quit(self): pass | |
220 | ||
221 | ||
222 | # class PageFacade: | |
223 | ||
224 | # def show(self): return self.gui.show() | |
225 | # def hide(self): return self.gui.hide() | |
226 | # def enable(self, players): return self.gui.enable(players) | |
227 | # def disable(self, players): return self.gui.disable(players) | |
228 | ||
229 | # def enable_navigation(self, players): | |
230 | # return self.gui.enable_navigation(players) | |
231 | ||
232 | # def disable_navigation(self, players): | |
233 | # return self.gui.disable_navigation(players) | |
234 | ||
235 | # def attach_obs(self, obs_meth, sort=10, rename='', args=None): | |
236 | # return self.gui.attach(obs_meth, sort, rename, args or []) | |
237 | ||
238 | # def detach_obs(self, obs_meth, lambda_call=None): | |
239 | # return self.gui.detach(obs_meth, lambda_call) | |
240 | ||
241 | ||
242 | # class Page(GameObject, PageFacade): | |
8ee66edd | 243 | |
cb700bcc FC |
244 | # gui_cls = PageGui |
245 | # event_cls = PageEvent | |
8ee66edd | 246 | |
cb700bcc FC |
247 | # def __init__(self, menu_props, players=[0]): |
248 | # PageFacade.__init__(self) | |
249 | # self.menu_props = menu_props | |
250 | # self.players = players | |
251 | # GameObject.__init__(self) | |
252 | # self._build_event() | |
253 | # self._build_gui() | |
254 | # list(map(self.gui.attach, [self.on_hide, self.on_back, self.on_quit])) | |
8ee66edd | 255 | |
cb700bcc FC |
256 | # def _build_event(self): |
257 | # self.event = self.event_cls(self) | |
8ee66edd | 258 | |
cb700bcc FC |
259 | # def _build_gui(self): |
260 | # self.gui = self.gui_cls(self, self.menu_props, self.players) | |
8ee66edd | 261 | |
cb700bcc | 262 | # def on_hide(self): self.event.ignoreAll() |
8ee66edd | 263 | |
cb700bcc | 264 | # def on_back(self, cls_name, args=None): self.event.on_back() # unused arg |
8ee66edd | 265 | |
cb700bcc | 266 | # def on_quit(self, cls_name): self.event.on_quit() # unused arg |
8ee66edd | 267 | |
cb700bcc FC |
268 | # def destroy(self): |
269 | # self.event.destroy() | |
270 | # self.gui.destroy() | |
271 | # bases = [basecls for basecls in Page.__bases__ | |
272 | # if basecls != PageFacade] | |
273 | # for cls in bases: cls.destroy(self) |