mirror of
https://github.com/hypervortex/VH-Bombsquad-Modded-Server-Files
synced 2026-08-15 13:04:50 +00:00
148 lines
4.8 KiB
Python
148 lines
4.8 KiB
Python
# Released under the MIT License. See LICENSE for details.
|
|
#
|
|
"""UI functionality for unlinking accounts."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import time
|
|
from typing import TYPE_CHECKING
|
|
|
|
import ba
|
|
import ba.internal
|
|
|
|
if TYPE_CHECKING:
|
|
from typing import Any
|
|
|
|
|
|
class AccountUnlinkWindow(ba.Window):
|
|
"""A window to kick off account unlinks."""
|
|
|
|
def __init__(self, origin_widget: ba.Widget | None = 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 = 540
|
|
self._height = 350
|
|
self._scroll_width = 400
|
|
self._scroll_height = 200
|
|
uiscale = ba.app.ui.uiscale
|
|
base_scale = (
|
|
2.0
|
|
if uiscale is ba.UIScale.SMALL
|
|
else 1.6
|
|
if uiscale is ba.UIScale.MEDIUM
|
|
else 1.1
|
|
)
|
|
super().__init__(
|
|
root_widget=ba.containerwidget(
|
|
size=(self._width, self._height),
|
|
transition=transition,
|
|
scale=base_scale,
|
|
scale_origin_stack_offset=scale_origin,
|
|
stack_offset=(0, -10)
|
|
if uiscale is ba.UIScale.SMALL
|
|
else (0, 0),
|
|
)
|
|
)
|
|
self._cancel_button = ba.buttonwidget(
|
|
parent=self._root_widget,
|
|
position=(30, self._height - 50),
|
|
size=(50, 50),
|
|
scale=0.7,
|
|
label='',
|
|
color=bg_color,
|
|
on_activate_call=self._cancel,
|
|
autoselect=True,
|
|
icon=ba.gettexture('crossOut'),
|
|
iconscale=1.2,
|
|
)
|
|
ba.textwidget(
|
|
parent=self._root_widget,
|
|
position=(self._width * 0.5, self._height * 0.88),
|
|
size=(0, 0),
|
|
text=ba.Lstr(
|
|
resource='accountSettingsWindow.unlinkAccountsInstructionsText'
|
|
),
|
|
maxwidth=self._width * 0.7,
|
|
color=ba.app.ui.infotextcolor,
|
|
h_align='center',
|
|
v_align='center',
|
|
)
|
|
ba.containerwidget(
|
|
edit=self._root_widget, cancel_button=self._cancel_button
|
|
)
|
|
|
|
self._scrollwidget = ba.scrollwidget(
|
|
parent=self._root_widget,
|
|
highlight=False,
|
|
position=(
|
|
(self._width - self._scroll_width) * 0.5,
|
|
self._height - 85 - self._scroll_height,
|
|
),
|
|
size=(self._scroll_width, self._scroll_height),
|
|
)
|
|
ba.containerwidget(edit=self._scrollwidget, claims_left_right=True)
|
|
self._columnwidget = ba.columnwidget(
|
|
parent=self._scrollwidget, border=2, margin=0, left_border=10
|
|
)
|
|
|
|
our_login_id = ba.internal.get_public_login_id()
|
|
if our_login_id is None:
|
|
entries = []
|
|
else:
|
|
account_infos = ba.internal.get_v1_account_misc_read_val_2(
|
|
'linkedAccounts2', []
|
|
)
|
|
entries = [
|
|
{'name': ai['d'], 'id': ai['id']}
|
|
for ai in account_infos
|
|
if ai['id'] != our_login_id
|
|
]
|
|
|
|
# (avoid getting our selection stuck on an empty column widget)
|
|
if not entries:
|
|
ba.containerwidget(edit=self._scrollwidget, selectable=False)
|
|
for i, entry in enumerate(entries):
|
|
txt = ba.textwidget(
|
|
parent=self._columnwidget,
|
|
selectable=True,
|
|
text=entry['name'],
|
|
size=(self._scroll_width - 30, 30),
|
|
autoselect=True,
|
|
click_activate=True,
|
|
on_activate_call=ba.Call(self._on_entry_selected, entry),
|
|
)
|
|
ba.widget(edit=txt, left_widget=self._cancel_button)
|
|
if i == 0:
|
|
ba.widget(edit=txt, up_widget=self._cancel_button)
|
|
|
|
def _on_entry_selected(self, entry: dict[str, Any]) -> None:
|
|
ba.screenmessage(
|
|
ba.Lstr(
|
|
resource='pleaseWaitText', fallback_resource='requestingText'
|
|
),
|
|
color=(0, 1, 0),
|
|
)
|
|
ba.internal.add_transaction(
|
|
{
|
|
'type': 'ACCOUNT_UNLINK_REQUEST',
|
|
'accountID': entry['id'],
|
|
'expire_time': time.time() + 5,
|
|
}
|
|
)
|
|
ba.internal.run_transactions()
|
|
ba.containerwidget(
|
|
edit=self._root_widget, transition=self._transition_out
|
|
)
|
|
|
|
def _cancel(self) -> None:
|
|
ba.containerwidget(
|
|
edit=self._root_widget, transition=self._transition_out
|
|
)
|