bauiv1lib.account.unlink

UI functionality for unlinking accounts.

  1# Released under the MIT License. See LICENSE for details.
  2#
  3"""UI functionality for unlinking accounts."""
  4
  5from __future__ import annotations
  6
  7import time
  8from typing import TYPE_CHECKING
  9
 10import bauiv1 as bui
 11
 12if TYPE_CHECKING:
 13    from typing import Any
 14
 15
 16class AccountUnlinkWindow(bui.Window):
 17    """A window to kick off account unlinks."""
 18
 19    def __init__(self, origin_widget: bui.Widget | None = None):
 20        plus = bui.app.plus
 21        assert plus is not None
 22
 23        scale_origin: tuple[float, float] | None
 24        if origin_widget is not None:
 25            self._transition_out = 'out_scale'
 26            scale_origin = origin_widget.get_screen_space_center()
 27            transition = 'in_scale'
 28        else:
 29            self._transition_out = 'out_right'
 30            scale_origin = None
 31            transition = 'in_right'
 32        bg_color = (0.4, 0.4, 0.5)
 33        self._width = 540
 34        self._height = 350
 35        self._scroll_width = 400
 36        self._scroll_height = 200
 37        assert bui.app.classic is not None
 38        uiscale = bui.app.ui_v1.uiscale
 39        base_scale = (
 40            2.0
 41            if uiscale is bui.UIScale.SMALL
 42            else 1.6
 43            if uiscale is bui.UIScale.MEDIUM
 44            else 1.1
 45        )
 46        super().__init__(
 47            root_widget=bui.containerwidget(
 48                size=(self._width, self._height),
 49                transition=transition,
 50                scale=base_scale,
 51                scale_origin_stack_offset=scale_origin,
 52                stack_offset=(0, -10)
 53                if uiscale is bui.UIScale.SMALL
 54                else (0, 0),
 55            )
 56        )
 57        self._cancel_button = bui.buttonwidget(
 58            parent=self._root_widget,
 59            position=(30, self._height - 50),
 60            size=(50, 50),
 61            scale=0.7,
 62            label='',
 63            color=bg_color,
 64            on_activate_call=self._cancel,
 65            autoselect=True,
 66            icon=bui.gettexture('crossOut'),
 67            iconscale=1.2,
 68        )
 69        bui.textwidget(
 70            parent=self._root_widget,
 71            position=(self._width * 0.5, self._height * 0.88),
 72            size=(0, 0),
 73            text=bui.Lstr(
 74                resource='accountSettingsWindow.unlinkAccountsInstructionsText'
 75            ),
 76            maxwidth=self._width * 0.7,
 77            color=bui.app.ui_v1.infotextcolor,
 78            h_align='center',
 79            v_align='center',
 80        )
 81        bui.containerwidget(
 82            edit=self._root_widget, cancel_button=self._cancel_button
 83        )
 84
 85        self._scrollwidget = bui.scrollwidget(
 86            parent=self._root_widget,
 87            highlight=False,
 88            position=(
 89                (self._width - self._scroll_width) * 0.5,
 90                self._height - 85 - self._scroll_height,
 91            ),
 92            size=(self._scroll_width, self._scroll_height),
 93        )
 94        bui.containerwidget(edit=self._scrollwidget, claims_left_right=True)
 95        self._columnwidget = bui.columnwidget(
 96            parent=self._scrollwidget, border=2, margin=0, left_border=10
 97        )
 98
 99        our_login_id = plus.get_v1_account_public_login_id()
100        if our_login_id is None:
101            entries = []
102        else:
103            account_infos = plus.get_v1_account_misc_read_val_2(
104                'linkedAccounts2', []
105            )
106            entries = [
107                {'name': ai['d'], 'id': ai['id']}
108                for ai in account_infos
109                if ai['id'] != our_login_id
110            ]
111
112        # (avoid getting our selection stuck on an empty column widget)
113        if not entries:
114            bui.containerwidget(edit=self._scrollwidget, selectable=False)
115        for i, entry in enumerate(entries):
116            txt = bui.textwidget(
117                parent=self._columnwidget,
118                selectable=True,
119                text=entry['name'],
120                size=(self._scroll_width - 30, 30),
121                autoselect=True,
122                click_activate=True,
123                on_activate_call=bui.Call(self._on_entry_selected, entry),
124            )
125            bui.widget(edit=txt, left_widget=self._cancel_button)
126            if i == 0:
127                bui.widget(edit=txt, up_widget=self._cancel_button)
128
129    def _on_entry_selected(self, entry: dict[str, Any]) -> None:
130        plus = bui.app.plus
131        assert plus is not None
132
133        bui.screenmessage(
134            bui.Lstr(
135                resource='pleaseWaitText', fallback_resource='requestingText'
136            ),
137            color=(0, 1, 0),
138        )
139        plus.add_v1_account_transaction(
140            {
141                'type': 'ACCOUNT_UNLINK_REQUEST',
142                'accountID': entry['id'],
143                'expire_time': time.time() + 5,
144            }
145        )
146        plus.run_v1_account_transactions()
147        bui.containerwidget(
148            edit=self._root_widget, transition=self._transition_out
149        )
150
151    def _cancel(self) -> None:
152        bui.containerwidget(
153            edit=self._root_widget, transition=self._transition_out
154        )
class AccountUnlinkWindow(bauiv1._uitypes.Window):
 17class AccountUnlinkWindow(bui.Window):
 18    """A window to kick off account unlinks."""
 19
 20    def __init__(self, origin_widget: bui.Widget | None = None):
 21        plus = bui.app.plus
 22        assert plus is not None
 23
 24        scale_origin: tuple[float, float] | None
 25        if origin_widget is not None:
 26            self._transition_out = 'out_scale'
 27            scale_origin = origin_widget.get_screen_space_center()
 28            transition = 'in_scale'
 29        else:
 30            self._transition_out = 'out_right'
 31            scale_origin = None
 32            transition = 'in_right'
 33        bg_color = (0.4, 0.4, 0.5)
 34        self._width = 540
 35        self._height = 350
 36        self._scroll_width = 400
 37        self._scroll_height = 200
 38        assert bui.app.classic is not None
 39        uiscale = bui.app.ui_v1.uiscale
 40        base_scale = (
 41            2.0
 42            if uiscale is bui.UIScale.SMALL
 43            else 1.6
 44            if uiscale is bui.UIScale.MEDIUM
 45            else 1.1
 46        )
 47        super().__init__(
 48            root_widget=bui.containerwidget(
 49                size=(self._width, self._height),
 50                transition=transition,
 51                scale=base_scale,
 52                scale_origin_stack_offset=scale_origin,
 53                stack_offset=(0, -10)
 54                if uiscale is bui.UIScale.SMALL
 55                else (0, 0),
 56            )
 57        )
 58        self._cancel_button = bui.buttonwidget(
 59            parent=self._root_widget,
 60            position=(30, self._height - 50),
 61            size=(50, 50),
 62            scale=0.7,
 63            label='',
 64            color=bg_color,
 65            on_activate_call=self._cancel,
 66            autoselect=True,
 67            icon=bui.gettexture('crossOut'),
 68            iconscale=1.2,
 69        )
 70        bui.textwidget(
 71            parent=self._root_widget,
 72            position=(self._width * 0.5, self._height * 0.88),
 73            size=(0, 0),
 74            text=bui.Lstr(
 75                resource='accountSettingsWindow.unlinkAccountsInstructionsText'
 76            ),
 77            maxwidth=self._width * 0.7,
 78            color=bui.app.ui_v1.infotextcolor,
 79            h_align='center',
 80            v_align='center',
 81        )
 82        bui.containerwidget(
 83            edit=self._root_widget, cancel_button=self._cancel_button
 84        )
 85
 86        self._scrollwidget = bui.scrollwidget(
 87            parent=self._root_widget,
 88            highlight=False,
 89            position=(
 90                (self._width - self._scroll_width) * 0.5,
 91                self._height - 85 - self._scroll_height,
 92            ),
 93            size=(self._scroll_width, self._scroll_height),
 94        )
 95        bui.containerwidget(edit=self._scrollwidget, claims_left_right=True)
 96        self._columnwidget = bui.columnwidget(
 97            parent=self._scrollwidget, border=2, margin=0, left_border=10
 98        )
 99
100        our_login_id = plus.get_v1_account_public_login_id()
101        if our_login_id is None:
102            entries = []
103        else:
104            account_infos = plus.get_v1_account_misc_read_val_2(
105                'linkedAccounts2', []
106            )
107            entries = [
108                {'name': ai['d'], 'id': ai['id']}
109                for ai in account_infos
110                if ai['id'] != our_login_id
111            ]
112
113        # (avoid getting our selection stuck on an empty column widget)
114        if not entries:
115            bui.containerwidget(edit=self._scrollwidget, selectable=False)
116        for i, entry in enumerate(entries):
117            txt = bui.textwidget(
118                parent=self._columnwidget,
119                selectable=True,
120                text=entry['name'],
121                size=(self._scroll_width - 30, 30),
122                autoselect=True,
123                click_activate=True,
124                on_activate_call=bui.Call(self._on_entry_selected, entry),
125            )
126            bui.widget(edit=txt, left_widget=self._cancel_button)
127            if i == 0:
128                bui.widget(edit=txt, up_widget=self._cancel_button)
129
130    def _on_entry_selected(self, entry: dict[str, Any]) -> None:
131        plus = bui.app.plus
132        assert plus is not None
133
134        bui.screenmessage(
135            bui.Lstr(
136                resource='pleaseWaitText', fallback_resource='requestingText'
137            ),
138            color=(0, 1, 0),
139        )
140        plus.add_v1_account_transaction(
141            {
142                'type': 'ACCOUNT_UNLINK_REQUEST',
143                'accountID': entry['id'],
144                'expire_time': time.time() + 5,
145            }
146        )
147        plus.run_v1_account_transactions()
148        bui.containerwidget(
149            edit=self._root_widget, transition=self._transition_out
150        )
151
152    def _cancel(self) -> None:
153        bui.containerwidget(
154            edit=self._root_widget, transition=self._transition_out
155        )

A window to kick off account unlinks.

AccountUnlinkWindow(origin_widget: _bauiv1.Widget | None = None)
 20    def __init__(self, origin_widget: bui.Widget | None = None):
 21        plus = bui.app.plus
 22        assert plus is not None
 23
 24        scale_origin: tuple[float, float] | None
 25        if origin_widget is not None:
 26            self._transition_out = 'out_scale'
 27            scale_origin = origin_widget.get_screen_space_center()
 28            transition = 'in_scale'
 29        else:
 30            self._transition_out = 'out_right'
 31            scale_origin = None
 32            transition = 'in_right'
 33        bg_color = (0.4, 0.4, 0.5)
 34        self._width = 540
 35        self._height = 350
 36        self._scroll_width = 400
 37        self._scroll_height = 200
 38        assert bui.app.classic is not None
 39        uiscale = bui.app.ui_v1.uiscale
 40        base_scale = (
 41            2.0
 42            if uiscale is bui.UIScale.SMALL
 43            else 1.6
 44            if uiscale is bui.UIScale.MEDIUM
 45            else 1.1
 46        )
 47        super().__init__(
 48            root_widget=bui.containerwidget(
 49                size=(self._width, self._height),
 50                transition=transition,
 51                scale=base_scale,
 52                scale_origin_stack_offset=scale_origin,
 53                stack_offset=(0, -10)
 54                if uiscale is bui.UIScale.SMALL
 55                else (0, 0),
 56            )
 57        )
 58        self._cancel_button = bui.buttonwidget(
 59            parent=self._root_widget,
 60            position=(30, self._height - 50),
 61            size=(50, 50),
 62            scale=0.7,
 63            label='',
 64            color=bg_color,
 65            on_activate_call=self._cancel,
 66            autoselect=True,
 67            icon=bui.gettexture('crossOut'),
 68            iconscale=1.2,
 69        )
 70        bui.textwidget(
 71            parent=self._root_widget,
 72            position=(self._width * 0.5, self._height * 0.88),
 73            size=(0, 0),
 74            text=bui.Lstr(
 75                resource='accountSettingsWindow.unlinkAccountsInstructionsText'
 76            ),
 77            maxwidth=self._width * 0.7,
 78            color=bui.app.ui_v1.infotextcolor,
 79            h_align='center',
 80            v_align='center',
 81        )
 82        bui.containerwidget(
 83            edit=self._root_widget, cancel_button=self._cancel_button
 84        )
 85
 86        self._scrollwidget = bui.scrollwidget(
 87            parent=self._root_widget,
 88            highlight=False,
 89            position=(
 90                (self._width - self._scroll_width) * 0.5,
 91                self._height - 85 - self._scroll_height,
 92            ),
 93            size=(self._scroll_width, self._scroll_height),
 94        )
 95        bui.containerwidget(edit=self._scrollwidget, claims_left_right=True)
 96        self._columnwidget = bui.columnwidget(
 97            parent=self._scrollwidget, border=2, margin=0, left_border=10
 98        )
 99
100        our_login_id = plus.get_v1_account_public_login_id()
101        if our_login_id is None:
102            entries = []
103        else:
104            account_infos = plus.get_v1_account_misc_read_val_2(
105                'linkedAccounts2', []
106            )
107            entries = [
108                {'name': ai['d'], 'id': ai['id']}
109                for ai in account_infos
110                if ai['id'] != our_login_id
111            ]
112
113        # (avoid getting our selection stuck on an empty column widget)
114        if not entries:
115            bui.containerwidget(edit=self._scrollwidget, selectable=False)
116        for i, entry in enumerate(entries):
117            txt = bui.textwidget(
118                parent=self._columnwidget,
119                selectable=True,
120                text=entry['name'],
121                size=(self._scroll_width - 30, 30),
122                autoselect=True,
123                click_activate=True,
124                on_activate_call=bui.Call(self._on_entry_selected, entry),
125            )
126            bui.widget(edit=txt, left_widget=self._cancel_button)
127            if i == 0:
128                bui.widget(edit=txt, up_widget=self._cancel_button)
Inherited Members
bauiv1._uitypes.Window
get_root_widget