1 from logging
import info
2 from lib
.gameobject
import GuiColleague
3 from lib
.engine
.gui
.cursor
import MouseCursor
4 from lib
.engine
.gui
.browser
import Browser
13 class EngineGuiBase(GuiColleague
): # no win: EngineGui strictly manages win
17 return EngineGui
if EngineGuiBase
.eng
.lib
.has_window
else EngineGuiBase
20 def open_browser(url
): Browser
.open(url
)
23 def resolutions(self
):
24 return sorted(list(set(self
.eng
.lib
.resolutions
)))
27 def closest_resolution(self
):
29 curr_res
= self
.eng
.lib
.resolution
30 return abs(res
[0] - curr_res
[0]) + abs(res
[1] - curr_res
[1])
33 return min(self
.resolutions
, key
=distance
)
34 except ValueError: # sometimes we have empty resolutions
35 return self
.eng
.lib
.resolution
37 def set_resolution_check(self
, res
):
38 res_msg
= 'resolutions: {curr} (current), {res} (wanted)'
39 info(res_msg
.format(curr
=self
.eng
.lib
.resolution
, res
=res
))
40 if self
.eng
.lib
.resolution
== res
: return
41 retry
= 'second attempt: {curr} (current) {res} (wanted)'
42 info(retry
.format(curr
=self
.eng
.lib
.resolution
, res
=res
))
43 self
.set_resolution(res
, False)
45 def toggle_fullscreen(self
):
46 self
.set_resolution(self
.closest_resolution
)
47 self
.eng
.lib
.toggle_fullscreen()
50 class EngineGui(EngineGuiBase
):
52 def __init__(self
, mediator
):
53 EngineGuiBase
.__init
__(self
, mediator
)
55 res_strings
= cfg
.gui_cfg
.win_size
.split()
56 res_ints
= tuple(int(size
) for size
in res_strings
)
57 self
.set_resolution(res_ints
, fullscreen
=cfg
.gui_cfg
.fullscreen
)
58 cur_cfg
= cfg
.cursor_cfg
59 self
.cursor
= MouseCursor(
60 cur_cfg
.cursor_path
, cur_cfg
.cursor_scale
, cur_cfg
.cursor_color
,
61 cur_cfg
.cursor_hotspot
)
63 def set_resolution(self
, res
, check
=True, fullscreen
=None):
64 info('setting resolution ' + str(res
))
65 self
.eng
.lib
.set_resolution(res
, fullscreen
)
66 if check
: self
.eng
.do_later(3.0, self
.set_resolution_check
, [res
])