Source code for bauiv1lib.clouduitest
# Released under the MIT License. See LICENSE for details.
#
"""UIs provided by the cloud (similar-ish to html in concept)."""
from __future__ import annotations
import time
from typing import TYPE_CHECKING, override
from efro.error import CleanError
import bauiv1 as bui
from bauiv1lib.cloudui import CloudUIWindow, CloudUIController
if TYPE_CHECKING:
from bacommon.cloudui import CloudUIRequest, CloudUIResponse
import bacommon.cloudui.v1
from bauiv1lib.cloudui import CloudUILocalAction
[docs]
def show_test_cloud_ui_window() -> None:
"""Bust out a cloud-ui window."""
import bacommon.cloudui.v1 as clui
# Pop up an auxiliary window wherever we are in the nav stack.
bui.app.ui_v1.auxiliary_window_activate(
win_type=CloudUIWindow,
win_create_call=bui.CallStrict(
TestCloudUIController().create_window, clui.Request('/')
),
)
[docs]
class TestCloudUIController(CloudUIController):
"""Provides various tests/demonstrations of cloudui functionality."""
[docs]
@override
def fulfill_request(self, request: CloudUIRequest) -> CloudUIResponse:
"""Fulfill a request.
Will be called in a background thread.
"""
import bacommon.bs
import bacommon.cloudui.v1 as clui
# We currently support v1 requests only.
if isinstance(request, clui.Request):
if request.path == '/':
return clui.Response(
_test_page_root(),
effects=(
[
bacommon.bs.ClientEffectScreenMessage(
'Hello From Response Client Effects',
color=(0, 1, 0),
),
bacommon.bs.ClientEffectSound(
sound=(
bacommon.bs.ClientEffectSound
).Sound.CASH_REGISTER
),
bacommon.bs.ClientEffectDelay(1.0),
bacommon.bs.ClientEffectScreenMessage(
'{"r":"successText"}',
is_lstr=True,
color=(0, 1, 0),
),
bacommon.bs.ClientEffectSound(
sound=(
bacommon.bs.ClientEffectSound
).Sound.CASH_REGISTER
),
]
if request.params.get('test_effects', False)
else []
),
)
if request.path == '/test2':
return clui.Response(_test_page_2())
if request.path == '/slow':
return clui.Response(_test_page_long())
raise CleanError('Invalid request.')
[docs]
@override
def local_action(self, action: CloudUILocalAction) -> None:
bui.screenmessage(
f'Would do {action.name!r} with params {action.params!r}.'
)
def _test_page_long() -> bacommon.cloudui.v1.Page:
"""Testing a page that takes a bit of time to load."""
import bacommon.cloudui.v1 as clui
# Simulate a slow connection or whatnot.
time.sleep(3.0)
return clui.Page(
title='Test',
center_vertically=True,
rows=[
clui.Row(
title='That took a while',
center_title=True,
center_content=True,
buttons=[
clui.Button(
'Sure Did',
size=(120, 80),
action=clui.Browse(clui.Request('/')),
),
],
),
],
)
def _test_page_effects() -> bacommon.cloudui.v1.Page:
"""Testing effects after a page load."""
import bacommon.cloudui.v1 as clui
return clui.Page(
title='Effects',
center_vertically=True,
rows=[
clui.Row(
title='Have some lovely effects',
center_title=True,
center_content=True,
buttons=[
clui.Button(
'Nice!',
size=(120, 80),
action=clui.Local(close_window=True),
),
],
),
],
)
def _test_page_2() -> bacommon.cloudui.v1.Page:
"""More testing."""
import bacommon.cloudui.v1 as clui
return clui.Page(
title='Test 2',
rows=[
clui.Row(
title='More Action Tests',
buttons=[
clui.Button(
'Browse',
size=(120, 80),
action=clui.Browse(clui.Request('/')),
),
clui.Button(
'Replace',
size=(120, 80),
action=clui.Replace(clui.Request('/')),
),
clui.Button(
'Close',
size=(120, 80),
action=clui.Local(close_window=True),
),
],
),
],
)
def _test_page_root() -> bacommon.cloudui.v1.Page:
"""Return test page."""
import bacommon.bs
import bacommon.cloudui.v1 as clui
return clui.Page(
title='Test Root',
rows=[
clui.Row(
title='Action Tests',
buttons=[
clui.Button(
'Browse',
size=(120, 80),
action=clui.Browse(clui.Request('/test2')),
),
clui.Button(
'Replace',
size=(120, 80),
action=clui.Replace(clui.Request('/test2')),
),
clui.Button(
'Close',
size=(120, 80),
action=clui.Local(close_window=True),
),
clui.Button(
'Invalid\nRequest',
size=(120, 80),
action=clui.Browse(clui.Request('/invalidrequest')),
),
clui.Button(
'Local\nEffects',
size=(120, 80),
action=clui.Local(
effects=[
bacommon.bs.ClientEffectScreenMessage(
'Hello From Local Client Effects',
color=(0, 1, 0),
),
bacommon.bs.ClientEffectSound(
sound=(
bacommon.bs.ClientEffectSound
).Sound.CASH_REGISTER
),
bacommon.bs.ClientEffectDelay(1.0),
bacommon.bs.ClientEffectScreenMessage(
'{"r":"successText"}',
is_lstr=True,
color=(0, 1, 0),
),
bacommon.bs.ClientEffectSound(
sound=(
bacommon.bs.ClientEffectSound
).Sound.CASH_REGISTER
),
]
),
),
clui.Button(
'Response\nEffects',
size=(120, 80),
action=clui.Replace(
clui.Request('/', params={'test_effects': True})
),
),
clui.Button(
'Local\nActions',
size=(120, 80),
action=clui.Local(
action='testaction',
action_params={'testparam': 123},
),
),
],
),
clui.Row(
title='More Action Tests',
buttons=[
clui.Button(
'Slow\nBrowse',
size=(120, 80),
action=clui.Browse(clui.Request('/slow')),
),
clui.Button(
'Slow\nReplace',
size=(120, 80),
action=clui.Replace(clui.Request('/slow')),
),
],
),
clui.Row(
title='Layout Tests',
debug=True,
padding_left=5.0,
buttons=[
clui.Button(
label='Test',
size=(180, 200),
decorations=[
clui.Image(
'powerupPunch',
position=(-70, 0),
size=(40, 40),
h_align=clui.HAlign.LEFT,
),
clui.Image(
'powerupSpeed',
position=(0, 75),
size=(35, 35),
v_align=clui.VAlign.TOP,
),
clui.Text(
'TL',
position=(-70, 75),
size=(50, 50),
h_align=clui.HAlign.LEFT,
v_align=clui.VAlign.TOP,
debug=True,
),
clui.Text(
'TR',
position=(70, 75),
size=(50, 50),
h_align=clui.HAlign.RIGHT,
v_align=clui.VAlign.TOP,
debug=True,
),
clui.Text(
'BL',
position=(-70, -75),
size=(50, 50),
h_align=clui.HAlign.LEFT,
v_align=clui.VAlign.BOTTOM,
debug=True,
),
clui.Text(
'BR',
position=(70, -75),
size=(50, 50),
h_align=clui.HAlign.RIGHT,
v_align=clui.VAlign.BOTTOM,
debug=True,
),
],
),
clui.Button(
label='Test2',
size=(100, 100),
color=(1, 0, 0),
text_color=(1, 1, 1, 1),
padding_right=4,
),
# Should look like the first button but
# scaled down.
clui.Button(
label='Test',
size=(180, 200),
scale=0.6,
padding_bottom=30, # Should nudge us up.
debug=True, # Show bounds.
decorations=[
clui.Image(
'powerupPunch',
position=(-70, 0),
size=(40, 40),
h_align=clui.HAlign.LEFT,
),
clui.Image(
'powerupSpeed',
position=(0, 75),
size=(35, 35),
v_align=clui.VAlign.TOP,
),
clui.Text(
'TL',
position=(-70, 75),
size=(50, 50),
h_align=clui.HAlign.LEFT,
v_align=clui.VAlign.TOP,
debug=True,
),
clui.Text(
'TR',
position=(70, 75),
size=(50, 50),
h_align=clui.HAlign.RIGHT,
v_align=clui.VAlign.TOP,
debug=True,
),
clui.Text(
'BL',
position=(-70, -75),
size=(50, 50),
h_align=clui.HAlign.LEFT,
v_align=clui.VAlign.BOTTOM,
debug=True,
),
clui.Text(
'BR',
position=(70, -75),
size=(50, 50),
h_align=clui.HAlign.RIGHT,
v_align=clui.VAlign.BOTTOM,
debug=True,
),
],
),
# Testing custom button images and opacity.
clui.Button(
label='Test3',
texture='buttonSquareWide',
padding_left=10.0,
padding_right=10.0,
color=(1, 1, 1),
opacity=0.3,
size=(200, 100),
),
],
),
clui.Row(
title='Long Row Test',
subtitle='Look - a subtitle!',
buttons=[
clui.Button(
size=(150, 100),
decorations=[
clui.Text(
'MaxWidthTest',
position=(0, 25),
size=(150 * 0.8, 32.0),
flatness=1.0,
shadow=0.0,
debug=True,
),
clui.Text(
'MaxHeightTest\nSecondLine',
position=(0, -20),
size=(150 * 0.8, 40),
flatness=1.0,
shadow=0.0,
debug=True,
),
],
),
clui.Button(
size=(150, 100),
decorations=[
clui.Image(
'zoeIcon',
position=(0, 0),
size=(70, 70),
tint_texture='zoeIconColorMask',
tint_color=(1, 0, 0),
tint2_color=(0, 1, 0),
mask_texture='characterIconMask',
),
],
),
clui.Button(
size=(150, 100),
decorations=[
clui.Image(
'bridgitPreview',
position=(0, 10),
size=(120, 60),
mask_texture='mapPreviewMask',
mesh_opaque='level_select_button_opaque',
mesh_transparent=(
'level_select_button_transparent'
),
),
],
),
clui.Button(size=(150, 100)),
clui.Button(size=(150, 100)),
clui.Button(size=(150, 100)),
clui.Button(size=(150, 100)),
clui.Button(size=(150, 100)),
],
),
clui.Row(
buttons=[
clui.Button(
'Row-With-No-Title Test',
size=(300, 80),
style=clui.ButtonStyle.MEDIUM,
color=(0.8, 0.8, 0.8),
icon='buttonPunch',
icon_color=(0.5, 0.3, 1.0, 1.0),
icon_scale=1.2,
),
],
),
clui.Row(
title='Centered Content / Faded Title',
title_color=(0.6, 0.6, 1.0, 0.3),
title_flatness=1.0,
title_shadow=1.0,
subtitle='Testing Centered Title/Content',
subtitle_color=(1.0, 0.5, 1.0, 0.5),
subtitle_flatness=1.0,
subtitle_shadow=0.0,
center_content=True,
center_title=True,
buttons=[
clui.Button(
'Hello There!',
size=(200, 120),
color=(0.7, 0.7, 0.9),
),
],
),
],
)
# Docs-generation hack; import some stuff that we likely only forward-declared
# in our actual source code so that docs tools can find it.
from typing import (Coroutine, Any, Literal, Callable,
Generator, Awaitable, Sequence, Self)
import asyncio
from concurrent.futures import Future
from pathlib import Path
from enum import Enum