Source code for bauiv1lib.settings.gamepadselect
# Released under the MIT License. See LICENSE for details.
#
"""Settings UI related to gamepad functionality."""
from __future__ import annotations
import logging
from typing import TYPE_CHECKING
import bascenev1 as bs
import bauiv1 as bui
if TYPE_CHECKING:
from typing import Any
[docs]
def gamepad_configure_callback(event: dict[str, Any]) -> None:
"""Respond to a gamepad button press during config selection."""
from bauiv1lib.settings import gamepad
# Ignore all but button-presses.
if event['type'] not in ['BUTTONDOWN', 'HATMOTION']:
return
bs.release_gamepad_input()
assert bui.app.classic is not None
try:
bui.app.ui_v1.clear_main_menu_window(transition='out_left')
except Exception:
logging.exception('Error transitioning out main_menu_window.')
bui.getsound('activateBeep').play()
bui.getsound('swish').play()
device = event['input_device']
assert isinstance(device, bs.InputDevice)
if device.allows_configuring:
bui.app.ui_v1.set_main_menu_window(
gamepad.GamepadSettingsWindow(device).get_root_widget(),
from_window=None,
)
else:
width = 700
height = 200
button_width = 80
uiscale = bui.app.ui_v1.uiscale
dlg = bui.containerwidget(
scale=(
1.7
if uiscale is bui.UIScale.SMALL
else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0
),
size=(width, height),
transition='in_right',
)
bui.app.ui_v1.set_main_menu_window(dlg, from_window=None)
if device.allows_configuring_in_system_settings:
msg = bui.Lstr(
resource='configureDeviceInSystemSettingsText',
subs=[('${DEVICE}', device.name)],
)
elif device.is_controller_app:
msg = bui.Lstr(
resource='bsRemoteConfigureInAppText',
subs=[('${REMOTE_APP_NAME}', bui.get_remote_app_name())],
)
else:
msg = bui.Lstr(
resource='cantConfigureDeviceText',
subs=[('${DEVICE}', device.name)],
)
bui.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 bauiv1lib.settings import controls
# no-op if our underlying widget is dead or on its way out.
if not dlg or dlg.transitioning_out:
return
bui.containerwidget(edit=dlg, transition='out_right')
assert bui.app.classic is not None
bui.app.ui_v1.set_main_menu_window(
controls.ControlsSettingsWindow(
transition='in_left'
).get_root_widget(),
from_window=dlg,
)
bui.buttonwidget(
parent=dlg,
position=((width - button_width) / 2, 20),
size=(button_width, 60),
label=bui.Lstr(resource='okText'),
on_activate_call=_ok,
)
[docs]
class GamepadSelectWindow(bui.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'
assert bui.app.classic is not None
uiscale = bui.app.ui_v1.uiscale
super().__init__(
root_widget=bui.containerwidget(
scale=(
2.3
if uiscale is bui.UIScale.SMALL
else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.0
),
size=(width, height),
transition='in_right',
)
)
btn = bui.buttonwidget(
parent=self._root_widget,
position=(20, height - 60),
size=(130, 60),
label=bui.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.
bui.containerwidget(
edit=self._root_widget,
cancel_button=btn,
selected_child=cast(bui.Widget, 0),
)
bui.textwidget(
parent=self._root_widget,
position=(20, height - 50),
size=(width, 25),
text=bui.Lstr(resource=self._r + '.titleText'),
maxwidth=250,
color=bui.app.ui_v1.title_color,
h_align='center',
v_align='center',
)
bui.buttonwidget(
edit=btn,
button_type='backSmall',
size=(60, 60),
label=bui.charstr(bui.SpecialChar.BACK),
)
v: float = height - 60
v -= spacing
bui.textwidget(
parent=self._root_widget,
position=(15, v),
size=(width - 30, 30),
scale=0.8,
text=bui.Lstr(resource=self._r + '.pressAnyButtonText'),
maxwidth=width * 0.95,
color=bui.app.ui_v1.infotextcolor,
h_align='center',
v_align='top',
)
v -= spacing * 1.24
if bui.app.classic.platform == 'android':
bui.textwidget(
parent=self._root_widget,
position=(15, v),
size=(width - 30, 30),
scale=0.46,
text=bui.Lstr(resource=self._r + '.androidNoteText'),
maxwidth=width * 0.95,
color=(0.7, 0.9, 0.7, 0.5),
h_align='center',
v_align='top',
)
bs.capture_gamepad_input(gamepad_configure_callback)
def _back(self) -> None:
from bauiv1lib.settings import controls
# no-op if our underlying widget is dead or on its way out.
if not self._root_widget or self._root_widget.transitioning_out:
return
bs.release_gamepad_input()
bui.containerwidget(edit=self._root_widget, transition='out_right')
assert bui.app.classic is not None
bui.app.ui_v1.set_main_menu_window(
controls.ControlsSettingsWindow(
transition='in_left'
).get_root_widget(),
from_window=self._root_widget,
)