Source code for bauiv1lib.account.unlink

# 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 bauiv1 as bui

if TYPE_CHECKING:
    from typing import Any


[docs] class AccountUnlinkWindow(bui.Window): """A window to kick off account unlinks.""" 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 = 540 self._height = 350 self._scroll_width = 400 self._scroll_height = 200 assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale base_scale = ( 2.0 if uiscale is bui.UIScale.SMALL else 1.6 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=(30, self._height - 50), size=(50, 50), scale=0.7, label='', color=bg_color, on_activate_call=self._cancel, autoselect=True, icon=bui.gettexture('crossOut'), iconscale=1.2, ) bui.textwidget( parent=self._root_widget, position=(self._width * 0.5, self._height * 0.88), size=(0, 0), text=bui.Lstr( resource='accountSettingsWindow.unlinkAccountsInstructionsText' ), maxwidth=self._width * 0.7, color=bui.app.ui_v1.infotextcolor, h_align='center', v_align='center', ) bui.containerwidget( edit=self._root_widget, cancel_button=self._cancel_button ) self._scrollwidget = bui.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), ) bui.containerwidget(edit=self._scrollwidget, claims_left_right=True) self._columnwidget = bui.columnwidget( parent=self._scrollwidget, border=2, margin=0, left_border=10 ) our_login_id = plus.get_v1_account_public_login_id() if our_login_id is None: entries = [] else: account_infos = plus.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: bui.containerwidget(edit=self._scrollwidget, selectable=False) for i, entry in enumerate(entries): txt = bui.textwidget( parent=self._columnwidget, selectable=True, text=entry['name'], size=(self._scroll_width - 30, 30), autoselect=True, click_activate=True, on_activate_call=bui.Call(self._on_entry_selected, entry), ) bui.widget(edit=txt, left_widget=self._cancel_button) if i == 0: bui.widget(edit=txt, up_widget=self._cancel_button) def _on_entry_selected(self, entry: dict[str, Any]) -> None: plus = bui.app.plus assert plus is not None bui.screenmessage( bui.Lstr( resource='pleaseWaitText', fallback_resource='requestingText' ), color=(0, 1, 0), ) plus.add_v1_account_transaction( { 'type': 'ACCOUNT_UNLINK_REQUEST', 'accountID': entry['id'], 'expire_time': time.time() + 5, } ) plus.run_v1_account_transactions() 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-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