vh-bombsquad-modded-server-.../dist/ba_data/python/bastd/ui/settings/gamepadselect.py
2024-06-06 19:50:58 +05:30

192 lines
5.8 KiB
Python

# Released under the MIT License. See LICENSE for details.
#
"""Settings UI related to gamepad functionality."""
from __future__ import annotations
from typing import TYPE_CHECKING
import ba
import ba.internal
if TYPE_CHECKING:
from typing import Any
def gamepad_configure_callback(event: dict[str, Any]) -> None:
"""Respond to a gamepad button press during config selection."""
from ba.internal import get_remote_app_name
from bastd.ui.settings import gamepad
# Ignore all but button-presses.
if event['type'] not in ['BUTTONDOWN', 'HATMOTION']:
return
ba.internal.release_gamepad_input()
try:
ba.app.ui.clear_main_menu_window(transition='out_left')
except Exception:
ba.print_exception('Error transitioning out main_menu_window.')
ba.playsound(ba.getsound('activateBeep'))
ba.playsound(ba.getsound('swish'))
inputdevice = event['input_device']
assert isinstance(inputdevice, ba.InputDevice)
if inputdevice.allows_configuring:
ba.app.ui.set_main_menu_window(
gamepad.GamepadSettingsWindow(inputdevice).get_root_widget()
)
else:
width = 700
height = 200
button_width = 100
uiscale = ba.app.ui.uiscale
dlg = ba.containerwidget(
scale=(
1.7
if uiscale is ba.UIScale.SMALL
else 1.4
if uiscale is ba.UIScale.MEDIUM
else 1.0
),
size=(width, height),
transition='in_right',
)
ba.app.ui.set_main_menu_window(dlg)
device_name = inputdevice.name
if device_name == 'iDevice':
msg = ba.Lstr(
resource='bsRemoteConfigureInAppText',
subs=[('${REMOTE_APP_NAME}', get_remote_app_name())],
)
else:
msg = ba.Lstr(
resource='cantConfigureDeviceText',
subs=[('${DEVICE}', device_name)],
)
ba.textwidget(
parent=dlg,
position=(0, height - 80),
size=(width, 25),
text=msg,
scale=0.8,
h_align='center',
v_align='top',
)
def _ok() -> None:
from bastd.ui.settings import controls
ba.containerwidget(edit=dlg, transition='out_right')
ba.app.ui.set_main_menu_window(
controls.ControlsSettingsWindow(
transition='in_left'
).get_root_widget()
)
ba.buttonwidget(
parent=dlg,
position=((width - button_width) / 2, 20),
size=(button_width, 60),
label=ba.Lstr(resource='okText'),
on_activate_call=_ok,
)
class GamepadSelectWindow(ba.Window):
"""Window for selecting a gamepad to configure."""
def __init__(self) -> None:
from typing import cast
width = 480
height = 170
spacing = 40
self._r = 'configGamepadSelectWindow'
uiscale = ba.app.ui.uiscale
super().__init__(
root_widget=ba.containerwidget(
scale=(
2.3
if uiscale is ba.UIScale.SMALL
else 1.5
if uiscale is ba.UIScale.MEDIUM
else 1.0
),
size=(width, height),
transition='in_right',
)
)
btn = ba.buttonwidget(
parent=self._root_widget,
position=(20, height - 60),
size=(130, 60),
label=ba.Lstr(resource='backText'),
button_type='back',
scale=0.8,
on_activate_call=self._back,
)
# Let's not have anything selected by default; its misleading looking
# for the controller getting configured.
ba.containerwidget(
edit=self._root_widget,
cancel_button=btn,
selected_child=cast(ba.Widget, 0),
)
ba.textwidget(
parent=self._root_widget,
position=(20, height - 50),
size=(width, 25),
text=ba.Lstr(resource=self._r + '.titleText'),
maxwidth=250,
color=ba.app.ui.title_color,
h_align='center',
v_align='center',
)
ba.buttonwidget(
edit=btn,
button_type='backSmall',
size=(60, 60),
label=ba.charstr(ba.SpecialChar.BACK),
)
v: float = height - 60
v -= spacing
ba.textwidget(
parent=self._root_widget,
position=(15, v),
size=(width - 30, 30),
scale=0.8,
text=ba.Lstr(resource=self._r + '.pressAnyButtonText'),
maxwidth=width * 0.95,
color=ba.app.ui.infotextcolor,
h_align='center',
v_align='top',
)
v -= spacing * 1.24
if ba.app.platform == 'android':
ba.textwidget(
parent=self._root_widget,
position=(15, v),
size=(width - 30, 30),
scale=0.46,
text=ba.Lstr(resource=self._r + '.androidNoteText'),
maxwidth=width * 0.95,
color=(0.7, 0.9, 0.7, 0.5),
h_align='center',
v_align='top',
)
ba.internal.capture_gamepad_input(gamepad_configure_callback)
def _back(self) -> None:
from bastd.ui.settings import controls
ba.internal.release_gamepad_input()
ba.containerwidget(edit=self._root_widget, transition='out_right')
ba.app.ui.set_main_menu_window(
controls.ControlsSettingsWindow(
transition='in_left'
).get_root_widget()
)