Source code for bauiv1lib.docuitestitems

# Released under the MIT License. See LICENSE for details.
#
"""The doc-ui display-items test page.

A display-item stays what it always was -- *show this thing in this
style*. What changes is what that turns into: the depiction now comes
as a :class:`~bacommon.docui.v2.Frame` rather than being derived
client-side from the item type.

This page began as an A/B of the two, which is how their equivalence
was established. The client no longer draws the legacy decoration at
all, so what is left is a renderer regression check -- every item type
and style, drawable with no server and no account.

See ``docs/initiatives/docui-frames.md``.
"""

from __future__ import annotations  # Docs-generation hack.

from typing import TYPE_CHECKING

from bacommon.langstr import LangStrSpecValue
import bacommon.legacydisplayitem as lditm
import bacommon.docui.v2 as dui2

if TYPE_CHECKING:
    import bacommon.docui.v2


#: Each (style, bounds, x-offset) slot on a test button, paired with the
#: y-offsets below. The left of each pair shows the item normally; the
#: right shows it with its type stripped, exercising the display-item
#: path's baked-description fallback.
_SLOTS: list[tuple[dui2.DisplayItemStyle, tuple[float, float], float]] = [
    (dui2.DisplayItemStyle.FULL, (120, 120), 62),
    (dui2.DisplayItemStyle.COMPACT, (80, 80), 55),
    (dui2.DisplayItemStyle.ICON, (100, 80), 55),
]
_SLOT_YS = [100.0, -20.0, -120.0]


[docs] def test_page_display_items( request: bacommon.docui.v2.Request, ) -> bacommon.docui.v2.Response: """Testing display-items (v2 mirror of '/displayitems').""" import copy from bacommon.classic import ClassicChestAppearance, ClassicChestDisplayItem # pylint: disable=cyclic-import # Safe up-call: baclassic is fully imported by the time a doc-ui # page is being authored. from baclassic import display_item_frame from bauiv1 import _docuiv2testassets strs = _docuiv2testassets.strings # Show some specific debug bits if they ask us to. debug = bool(request.args.get('debug', False)) def _make_test_button( scale: float, wrapper: lditm.Wrapper, ) -> bacommon.docui.v2.Button: # See how this looks when unrecognized (relying on wrapper info # only). uwrapper = copy.deepcopy(wrapper) uwrapper.item = lditm.Unknown() decorations: list[dui2.Decoration] = [] for (style, size, xoffs), yoffs in zip(_SLOTS, _SLOT_YS): for wrp, xsign in ((wrapper, -1.0), (uwrapper, 1.0)): if wrp is uwrapper: # Skip the fallback copy: it is the *same* item with # its type stripped, and a frame depicts an # unrecognized item exactly as it depicts a known # one, so it would just render twice. continue decorations.append( display_item_frame( wrp, position=(xoffs * xsign, yoffs), size=size, style=style, debug=debug, ) ) return dui2.Button( size=(300, 400), scale=scale, decorations=decorations, ) return dui2.Response( page=dui2.Page( padding_left=20, padding_right=20, title=strs.items.display_items.spec, rows=[ dui2.ButtonRow( debug=debug, padding_left=-10, title=strs.items.display_item_tests.spec, subtitle=LangStrSpecValue.literal( 'top=FULL, center=COMPACT, bottom=ICON' ), buttons=[ _make_test_button( 1.0, lditm.Wrapper.for_item(lditm.Tickets(count=213)), ), _make_test_button( 0.47, lditm.Wrapper.for_item(lditm.Tickets(count=213)), ), _make_test_button( 1.0, lditm.Wrapper.for_item( ClassicChestDisplayItem( appearance=ClassicChestAppearance.L3 ) ), ), _make_test_button( 1.0, lditm.Wrapper.for_item(lditm.Tokens(count=3)), ), _make_test_button( 1.0, lditm.Wrapper.for_item(lditm.Tokens(count=1414287)), ), _make_test_button( 1.0, lditm.Wrapper.for_item(lditm.Test()), ), ], ), dui2.ButtonRow( buttons=[ dui2.Button( label=( strs.common.hide_debug.spec if debug else strs.common.show_debug.spec ), style=dui2.ButtonStyle.MEDIUM, size=(240, 60), color=(0.6, 0.4, 0.8, 1.0), action=dui2.Replace( dui2.Request( request.path, args={'debug': not debug}, ) ), ), ], ), ], ) )
# 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