# Released under the MIT License. See LICENSE for details.
#
"""UI functionality for linking accounts."""
from __future__ import annotations
import copy
import time
from typing import TYPE_CHECKING
import bauiv1 as bui
if TYPE_CHECKING:
from typing import Any
[docs]
class AccountLinkWindow(bui.Window):
"""Window for linking accounts."""
def __init__(self, origin_widget: bui.Widget | None = None):
plus = bui.app.plus
assert plus is not None
scale_origin: tuple[float, float] | None
if origin_widget is not None:
self._transition_out = 'out_scale'
scale_origin = origin_widget.get_screen_space_center()
transition = 'in_scale'
else:
self._transition_out = 'out_right'
scale_origin = None
transition = 'in_right'
bg_color = (0.4, 0.4, 0.5)
self._width = 560
self._height = 420
assert bui.app.classic is not None
uiscale = bui.app.ui_v1.uiscale
base_scale = (
1.65
if uiscale is bui.UIScale.SMALL
else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.1
)
super().__init__(
root_widget=bui.containerwidget(
size=(self._width, self._height),
transition=transition,
scale=base_scale,
scale_origin_stack_offset=scale_origin,
stack_offset=(
(0, -10) if uiscale is bui.UIScale.SMALL else (0, 0)
),
)
)
self._cancel_button = bui.buttonwidget(
parent=self._root_widget,
position=(40, self._height - 45),
size=(50, 50),
scale=0.7,
label='',
color=bg_color,
on_activate_call=self._cancel,
autoselect=True,
icon=bui.gettexture('crossOut'),
iconscale=1.2,
)
maxlinks = plus.get_v1_account_misc_read_val('maxLinkAccounts', 5)
bui.textwidget(
parent=self._root_widget,
position=(self._width * 0.5, self._height * 0.56),
size=(0, 0),
text=bui.Lstr(
resource=(
'accountSettingsWindow.linkAccountsInstructionsNewText'
),
subs=[('${COUNT}', str(maxlinks))],
),
maxwidth=self._width * 0.9,
color=bui.app.ui_v1.infotextcolor,
max_height=self._height * 0.6,
h_align='center',
v_align='center',
)
bui.containerwidget(
edit=self._root_widget, cancel_button=self._cancel_button
)
bui.buttonwidget(
parent=self._root_widget,
position=(40, 30),
size=(200, 60),
label=bui.Lstr(
resource='accountSettingsWindow.linkAccountsGenerateCodeText'
),
autoselect=True,
on_activate_call=self._generate_press,
)
self._enter_code_button = bui.buttonwidget(
parent=self._root_widget,
position=(self._width - 240, 30),
size=(200, 60),
label=bui.Lstr(
resource='accountSettingsWindow.linkAccountsEnterCodeText'
),
autoselect=True,
on_activate_call=self._enter_code_press,
)
def _generate_press(self) -> None:
from bauiv1lib.account.signin import show_sign_in_prompt
plus = bui.app.plus
assert plus is not None
if plus.get_v1_account_state() != 'signed_in':
show_sign_in_prompt()
return
bui.screenmessage(
bui.Lstr(resource='gatherWindow.requestingAPromoCodeText'),
color=(0, 1, 0),
)
plus.add_v1_account_transaction(
{
'type': 'ACCOUNT_LINK_CODE_REQUEST',
'expire_time': time.time() + 5,
}
)
plus.run_v1_account_transactions()
def _enter_code_press(self) -> None:
from bauiv1lib.sendinfo import SendInfoWindow
SendInfoWindow(
modal=True,
legacy_code_mode=True,
origin_widget=self._enter_code_button,
)
bui.containerwidget(
edit=self._root_widget, transition=self._transition_out
)
def _cancel(self) -> None:
bui.containerwidget(
edit=self._root_widget, transition=self._transition_out
)
[docs]
class AccountLinkCodeWindow(bui.Window):
"""Window showing code for account-linking."""
def __init__(self, data: dict[str, Any]):
self._width = 350
self._height = 200
assert bui.app.classic is not None
uiscale = bui.app.ui_v1.uiscale
super().__init__(
root_widget=bui.containerwidget(
size=(self._width, self._height),
color=(0.45, 0.63, 0.15),
transition='in_scale',
scale=(
1.8
if uiscale is bui.UIScale.SMALL
else 1.35 if uiscale is bui.UIScale.MEDIUM else 1.0
),
)
)
self._data = copy.deepcopy(data)
bui.getsound('cashRegister').play()
bui.getsound('swish').play()
self._cancel_button = bui.buttonwidget(
parent=self._root_widget,
scale=0.5,
position=(40, self._height - 40),
size=(50, 50),
label='',
on_activate_call=self.close,
autoselect=True,
color=(0.45, 0.63, 0.15),
icon=bui.gettexture('crossOut'),
iconscale=1.2,
)
bui.containerwidget(
edit=self._root_widget, cancel_button=self._cancel_button
)
bui.textwidget(
parent=self._root_widget,
position=(self._width * 0.5, self._height * 0.5),
size=(0, 0),
color=(1.0, 3.0, 1.0),
scale=2.0,
h_align='center',
v_align='center',
text=data['code'],
maxwidth=self._width * 0.85,
)
[docs]
def close(self) -> None:
"""close the window"""
bui.containerwidget(edit=self._root_widget, transition='out_scale')