# Released under the MIT License. See LICENSE for details.
#
"""UI functionality related to URLs."""
from __future__ import annotations
import bauiv1 as bui
[docs]
class ShowURLWindow(bui.Window):
"""A window presenting a URL to the user visually."""
def __init__(self, address: str):
# in some cases we might want to show it as a qr code
# (for long URLs especially)
app = bui.app
assert app.classic is not None
uiscale = app.ui_v1.uiscale
self._address = address
self._width = 800
self._height = 450
super().__init__(
root_widget=bui.containerwidget(
size=(self._width, self._height + 40),
transition='in_right',
scale=(
1.25
if uiscale is bui.UIScale.SMALL
else 1.25 if uiscale is bui.UIScale.MEDIUM else 1.25
),
)
)
bui.textwidget(
parent=self._root_widget,
position=(self._width * 0.5, self._height - 10),
size=(0, 0),
color=app.ui_v1.title_color,
h_align='center',
v_align='center',
text=bui.Lstr(resource='directBrowserToURLText'),
maxwidth=self._width * 0.95,
)
bui.textwidget(
parent=self._root_widget,
position=(self._width * 0.5, self._height - 60),
size=(0, 0),
scale=1.3,
color=app.ui_v1.infotextcolor,
h_align='center',
v_align='center',
text=address,
maxwidth=self._width * 0.95,
)
button_width = 200
qr_size = 220
bui.imagewidget(
parent=self._root_widget,
position=(
self._width * 0.5 - qr_size * 0.5,
self._height * 0.5 - qr_size * 0.5 + 10,
),
size=(qr_size, qr_size),
texture=bui.get_qrcode_texture(address),
)
xoffs = 0
if bui.clipboard_is_supported():
xoffs = -150
btn = bui.buttonwidget(
parent=self._root_widget,
position=(
self._width * 0.5 - button_width * 0.5 + xoffs,
20,
),
size=(button_width, 65),
autoselect=True,
label=bui.Lstr(resource='copyText'),
on_activate_call=self._copy,
)
xoffs = 150
btn = bui.buttonwidget(
parent=self._root_widget,
position=(self._width * 0.5 - button_width * 0.5 + xoffs, 20),
size=(button_width, 65),
autoselect=True,
label=bui.Lstr(resource='doneText'),
on_activate_call=self._done,
)
# we have no 'cancel' button but still want to be able to
# hit back/escape/etc to leave..
bui.containerwidget(
edit=self._root_widget,
selected_child=btn,
start_button=btn,
on_cancel_call=btn.activate,
)
def _copy(self) -> None:
bui.clipboard_set_text(self._address)
bui.screenmessage(bui.Lstr(resource='copyConfirmText'), color=(0, 1, 0))
def _done(self) -> None:
bui.containerwidget(edit=self._root_widget, transition='out_left')
# 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