ya2 · news · projects · code · about

retrieve test coordinates
[pmachines.git] / gui / menu.py
index 54929d986f73db30473e41163f659476867602f0..335fadec4c061f61e97bccf8d8c3984e17f53db6 100644 (file)
@@ -7,20 +7,21 @@ from inspect import isclass
 from webbrowser import open_new_tab
 from xmlrpc.client import ServerProxy
 from panda3d.core import Texture, TextNode, WindowProperties, LVector2i, \
-    TextProperties, TextPropertiesManager
+    TextProperties, TextPropertiesManager, NodePath
 from direct.gui.DirectGui import DirectButton, DirectCheckButton, \
     DirectOptionMenu, DirectSlider, DirectCheckButton
 from direct.gui.DirectGuiGlobals import FLAT
 from direct.gui.OnscreenText import OnscreenText
 from direct.showbase.DirectObject import DirectObject
 from ya2.utils.cursor import MouseCursor
+from ya2.p3d.p3d import LibP3d
 from logics.scene import Scene
 from panda3d.bullet import BulletWorld
 
 
 class Menu(DirectObject):
 
-    def __init__(self, fsm, lang_mgr, opt_file, music, pipeline, scenes, fun_test):
+    def __init__(self, fsm, lang_mgr, opt_file, music, pipeline, scenes, fun_test, pos_mgr):
         super().__init__()
         self._fsm = fsm
         self._lang_mgr = lang_mgr
@@ -29,6 +30,7 @@ class Menu(DirectObject):
         self._pipeline = pipeline
         self._scenes = scenes
         self._fun_test = fun_test
+        self._pos_mgr = pos_mgr
         self._enforced_res = ''
         self._cursor = MouseCursor(
             'assets/images/buttons/arrowUpLeft.dds', (.04, 1, .04), (.5, .5, .5, 1),
@@ -76,16 +78,20 @@ class Menu(DirectObject):
         info('enforced resolution: ' + val)
 
     def _set_main(self):
+        self._pos_mgr.reset()
         self._widgets = []
         self._widgets += [DirectButton(
             text=_('Play'), pos=(0, 1, .6), command=self.on_play,
             **self._common_btn)]
+        self._pos_mgr.register('play', LibP3d.wdg_pos(self._widgets[-1]))
         self._widgets += [DirectButton(
             text=_('Options'), pos=(0, 1, .2), command=self.on_options,
             **self._common_btn)]
+        self._pos_mgr.register('options', LibP3d.wdg_pos(self._widgets[-1]))
         self._widgets += [DirectButton(
             text=_('Credits'), pos=(0, 1, -.2), command=self.on_credits,
             **self._common_btn)]
+        self._pos_mgr.register('credits', LibP3d.wdg_pos(self._widgets[-1]))
         def btn_exit():
             if self._fun_test:
                 ServerProxy('http://localhost:6000').destroy()
@@ -93,10 +99,12 @@ class Menu(DirectObject):
         self._widgets += [DirectButton(
             text=_('Exit'), pos=(0, 1, -.6), command=lambda: btn_exit(),
             **self._common_btn)]
+        self._pos_mgr.register('exit', LibP3d.wdg_pos(self._widgets[-1]))
         self._rearrange_width()
         self.accept('enforce_resolution', self.enforce_res)
 
     def _set_options(self):
+        self._pos_mgr.reset()
         self._widgets = []
         self._lang_funcs = [lambda: _('English'), lambda: _('Italian')]
         items = [fnc() for fnc in self._lang_funcs]
@@ -110,6 +118,12 @@ class Menu(DirectObject):
         btn.popupMenu['frameColor'] = self._common_btn['frameColor']
         btn.popupMenu['relief'] = self._common_btn['relief']
         self._widgets += [btn]
+        pos_lang = LibP3d.wdg_pos(self._widgets[-1])
+        self._pos_mgr.register('languages', pos_lang)
+        pos_eng = pos_lang[0] + 300, pos_lang[1] - 57
+        pos_it = pos_lang[0] + 300, pos_lang[1] + 33
+        self._pos_mgr.register('english', pos_eng)
+        self._pos_mgr.register('italian', pos_it)
         self._widgets += [OnscreenText(
             _('Volume'), pos=(-.1, .55), font=self._common['text_font'],
             scale=self._common['scale'], fg=self._common['text_fg'],
@@ -119,6 +133,9 @@ class Menu(DirectObject):
             value=self._opt_file['settings']['volume'],
             command=self.on_volume,
             **self._common_slider)]
+        vol_pos = LibP3d.wdg_pos(self._widgets[-1])
+        self._pos_mgr.register('volume', vol_pos)
+        self._pos_mgr.register('volume_0', [vol_pos[0] - 153, vol_pos[1]])
         self._slider = self._widgets[-1]
         self._widgets += [DirectCheckButton(
             text=_('Fullscreen'), pos=(0, 1, .3), command=self.on_fullscreen,
@@ -126,6 +143,7 @@ class Menu(DirectObject):
             indicator_relief=self._common_btn['relief'],
             indicatorValue=self._opt_file['settings']['fullscreen'],
             **self._common_btn)]
+        self._pos_mgr.register('fullscreen', LibP3d.wdg_pos(self._widgets[-1]))
         res = self._opt_file['settings']['resolution']
         d_i = base.pipe.get_display_information()
         def _res(idx):
@@ -145,24 +163,32 @@ class Menu(DirectObject):
         btn.popupMenu['frameColor'] = self._common_btn['frameColor']
         btn.popupMenu['relief'] = self._common_btn['relief']
         self._widgets += [btn]
+        pos_res = LibP3d.wdg_pos(self._widgets[-1])
+        self._pos_mgr.register('resolutions', pos_res)  # 680 365
+        self._pos_mgr.register('res_1440x900', [pos_res[0] + 320, pos_res[1] + 75])
+        self._pos_mgr.register('res_1360x768', [pos_res[0] + 430, pos_res[1] -285])
         self._widgets += [DirectCheckButton(
             text=_('Antialiasing'), pos=(0, 1, -.2), command=self.on_aa,
             indicator_frameColor=self._common_opt['highlightColor'],
             indicator_relief=self._common_btn['relief'],
             indicatorValue=self._opt_file['settings']['antialiasing'],
             **self._common_btn)]
+        self._pos_mgr.register('aa', LibP3d.wdg_pos(self._widgets[-1]))
         self._widgets += [DirectCheckButton(
             text=_('Shadows'), pos=(0, 1, -.45), command=self.on_shadows,
             indicator_frameColor=self._common_opt['highlightColor'],
             indicator_relief=self._common_btn['relief'],
             indicatorValue=self._opt_file['settings']['shadows'],
             **self._common_btn)]
+        self._pos_mgr.register('shadows', LibP3d.wdg_pos(self._widgets[-1]))
         self._widgets += [DirectButton(
             text=_('Back'), pos=(0, 1, -.8), command=self.on_back,
             **self._common_btn)]
+        self._pos_mgr.register('back', LibP3d.wdg_pos(self._widgets[-1]))
         self.accept('enforce_resolution', self.enforce_res)
 
     def _set_credits(self):
+        self._pos_mgr.reset()
         self._widgets = []
         tp_scale = TextProperties()
         tp_scale.set_text_scale(.64)
@@ -183,9 +209,11 @@ class Menu(DirectObject):
         self._widgets += [DirectButton(
             text=_('Back'), pos=(0, 1, -.8), command=self.on_back,
             **self._common_btn)]
+        self._pos_mgr.register('back', LibP3d.wdg_pos(self._widgets[-1]))
         self.accept('enforce_resolution', self.enforce_res)
 
     def on_play(self):
+        self._pos_mgr.reset()
         self.destroy()
         self._cursor = MouseCursor(
             'assets/images/buttons/arrowUpLeft.dds', (.04, 1, .04), (.5, .5, .5, 1),
@@ -204,6 +232,8 @@ class Menu(DirectObject):
                 command=self.start, extraArgs=[cls], text_wordwrap=6,
                 frameTexture='assets/images/scenes/%s.dds' % cls.__name__,
                 **cmn)]
+            name = cls.__name__[5:].lower()
+            self._pos_mgr.register(name, LibP3d.wdg_pos(self._widgets[-1]))
             for j in range(4):
                 tnode = self._widgets[-1].component('text%s' % j).textNode
                 height = - tnode.getLineHeight() / 2
@@ -212,6 +242,7 @@ class Menu(DirectObject):
         self._widgets += [DirectButton(
             text=_('Back'), pos=(0, 1, -.8), command=self.on_back,
             **self._common_btn)]
+        self._pos_mgr.register('back', LibP3d.wdg_pos(self._widgets[-1]))
 
     def start(self, cls):
         self._fsm.demand('Scene', cls)