# Released under the MIT License. See LICENSE for details.
#
"""Provides a popup window for viewing trophies."""
from __future__ import annotations
from typing import TYPE_CHECKING, override
from bauiv1lib import popup
import bauiv1 as bui
if TYPE_CHECKING:
from typing import Any
[docs]
class TrophiesWindow(popup.PopupWindow):
"""Popup window for viewing trophies."""
def __init__(
self,
position: tuple[float, float],
data: dict[str, Any],
scale: float | None = None,
):
self._data = data
assert bui.app.classic is not None
uiscale = bui.app.ui_v1.uiscale
if scale is None:
scale = (
2.3
if uiscale is bui.UIScale.SMALL
else 1.65 if uiscale is bui.UIScale.MEDIUM else 1.23
)
self._transitioning_out = False
self._width = 310
self._height = 310
bg_color = (0.5, 0.4, 0.6)
super().__init__(
position=position,
size=(self._width, self._height),
scale=scale,
bg_color=bg_color,
)
self._cancel_button = bui.buttonwidget(
parent=self.root_widget,
position=(50, self._height - 30),
size=(50, 50),
scale=0.5,
label='',
color=bg_color,
on_activate_call=self._on_cancel_press,
autoselect=True,
icon=bui.gettexture('crossOut'),
iconscale=1.2,
)
self._title_text = bui.textwidget(
parent=self.root_widget,
position=(self._width * 0.5, self._height - 20),
size=(0, 0),
h_align='center',
v_align='center',
scale=0.6,
text=bui.Lstr(resource='trophiesText'),
maxwidth=200,
# color=(1, 1, 1, 0.4),
color=bui.app.ui_v1.title_color,
)
self._scrollwidget = bui.scrollwidget(
parent=self.root_widget,
size=(self._width - 60, self._height - 70),
position=(30, 30),
capture_arrows=True,
border_opacity=0.4,
)
bui.widget(edit=self._scrollwidget, autoselect=True)
bui.containerwidget(
edit=self.root_widget, cancel_button=self._cancel_button
)
incr = 31
sub_width = self._width - 90
trophy_types = [['0a'], ['0b'], ['1'], ['2'], ['3'], ['4']]
sub_height = 40 + len(trophy_types) * incr
eq_text = bui.Lstr(
resource='coopSelectWindow.powerRankingPointsEqualsText'
).evaluate()
self._subcontainer = bui.containerwidget(
parent=self._scrollwidget,
size=(sub_width, sub_height),
background=False,
)
total_pts = 0
multi_txt = bui.Lstr(
resource='coopSelectWindow.powerRankingPointsMultText'
).evaluate()
total_pts += self._create_trophy_type_widgets(
eq_text, incr, multi_txt, sub_height, sub_width, trophy_types
)
bui.textwidget(
parent=self._subcontainer,
position=(
sub_width * 1.0,
sub_height - 20 - incr * len(trophy_types),
),
maxwidth=sub_width * 0.5,
scale=0.7,
color=(0.7, 0.8, 1.0),
flatness=1.0,
shadow=0.0,
text=bui.Lstr(resource='coopSelectWindow.totalText').evaluate()
+ ' '
+ eq_text.replace('${NUMBER}', str(total_pts)),
size=(0, 0),
h_align='right',
v_align='center',
)
def _create_trophy_type_widgets(
self,
eq_text: str,
incr: int,
multi_txt: str,
sub_height: int,
sub_width: int,
trophy_types: list[list[str]],
) -> int:
# pylint: disable=too-many-positional-arguments
from bascenev1 import get_trophy_string
total_pts = 0
for i, trophy_type in enumerate(trophy_types):
t_count = self._data['t' + trophy_type[0]]
t_mult = self._data['t' + trophy_type[0] + 'm']
bui.textwidget(
parent=self._subcontainer,
position=(sub_width * 0.15, sub_height - 20 - incr * i),
scale=0.7,
flatness=1.0,
shadow=0.7,
color=(1, 1, 1),
text=get_trophy_string(trophy_type[0]),
size=(0, 0),
h_align='center',
v_align='center',
)
bui.textwidget(
parent=self._subcontainer,
position=(sub_width * 0.31, sub_height - 20 - incr * i),
maxwidth=sub_width * 0.2,
scale=0.8,
flatness=1.0,
shadow=0.0,
color=(0, 1, 0) if (t_count > 0) else (0.6, 0.6, 0.6, 0.5),
text=str(t_count),
size=(0, 0),
h_align='center',
v_align='center',
)
txt = multi_txt.replace('${NUMBER}', str(t_mult))
bui.textwidget(
parent=self._subcontainer,
position=(sub_width * 0.57, sub_height - 20 - incr * i),
maxwidth=sub_width * 0.3,
scale=0.4,
flatness=1.0,
shadow=0.0,
color=(
(0.63, 0.6, 0.75) if (t_count > 0) else (0.6, 0.6, 0.6, 0.4)
),
text=txt,
size=(0, 0),
h_align='center',
v_align='center',
)
this_pts = t_count * t_mult
bui.textwidget(
parent=self._subcontainer,
position=(sub_width * 0.88, sub_height - 20 - incr * i),
maxwidth=sub_width * 0.3,
color=(
(0.7, 0.8, 1.0) if (t_count > 0) else (0.9, 0.9, 1.0, 0.3)
),
flatness=1.0,
shadow=0.0,
scale=0.5,
text=eq_text.replace('${NUMBER}', str(this_pts)),
size=(0, 0),
h_align='center',
v_align='center',
)
total_pts += this_pts
return total_pts
def _on_cancel_press(self) -> None:
self._transition_out()
def _transition_out(self) -> None:
if not self._transitioning_out:
self._transitioning_out = True
bui.containerwidget(edit=self.root_widget, transition='out_scale')
# 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