|
|
@ -1,6 +1,5 @@ |
|
|
|
from enum import IntEnum |
|
|
|
from enum import IntEnum |
|
|
|
from functools import partial |
|
|
|
from functools import partial |
|
|
|
from threading import Lock |
|
|
|
|
|
|
|
from typing import cast |
|
|
|
from typing import cast |
|
|
|
|
|
|
|
|
|
|
|
import pyray as rl |
|
|
|
import pyray as rl |
|
|
@ -50,7 +49,6 @@ class WifiManagerUI(Widget): |
|
|
|
self._networks: list[Network] = [] |
|
|
|
self._networks: list[Network] = [] |
|
|
|
self._networks_buttons: dict[str, Button] = {} |
|
|
|
self._networks_buttons: dict[str, Button] = {} |
|
|
|
self._forget_networks_buttons: dict[str, Button] = {} |
|
|
|
self._forget_networks_buttons: dict[str, Button] = {} |
|
|
|
self._lock = Lock() |
|
|
|
|
|
|
|
self._confirm_dialog = ConfirmDialog("", "Forget", "Cancel") |
|
|
|
self._confirm_dialog = ConfirmDialog("", "Forget", "Cancel") |
|
|
|
|
|
|
|
|
|
|
|
self.wifi_manager.set_callbacks(need_auth=self._on_need_auth, |
|
|
|
self.wifi_manager.set_callbacks(need_auth=self._on_need_auth, |
|
|
@ -73,21 +71,20 @@ class WifiManagerUI(Widget): |
|
|
|
def _render(self, rect: rl.Rectangle): |
|
|
|
def _render(self, rect: rl.Rectangle): |
|
|
|
self.wifi_manager.process_callbacks() |
|
|
|
self.wifi_manager.process_callbacks() |
|
|
|
|
|
|
|
|
|
|
|
with self._lock: |
|
|
|
if not self._networks: |
|
|
|
if not self._networks: |
|
|
|
gui_label(rect, "Scanning Wi-Fi networks...", 72, alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) |
|
|
|
gui_label(rect, "Scanning Wi-Fi networks...", 72, alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) |
|
|
|
return |
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
if self.state == UIState.NEEDS_AUTH and self._state_network: |
|
|
|
if self.state == UIState.NEEDS_AUTH and self._state_network: |
|
|
|
self.keyboard.set_title("Wrong password" if self._password_retry else "Enter password", f"for {self._state_network.ssid}") |
|
|
|
self.keyboard.set_title("Wrong password" if self._password_retry else "Enter password", f"for {self._state_network.ssid}") |
|
|
|
self.keyboard.reset() |
|
|
|
self.keyboard.reset() |
|
|
|
gui_app.set_modal_overlay(self.keyboard, lambda result: self._on_password_entered(cast(Network, self._state_network), result)) |
|
|
|
gui_app.set_modal_overlay(self.keyboard, lambda result: self._on_password_entered(cast(Network, self._state_network), result)) |
|
|
|
elif self.state == UIState.SHOW_FORGET_CONFIRM and self._state_network: |
|
|
|
elif self.state == UIState.SHOW_FORGET_CONFIRM and self._state_network: |
|
|
|
self._confirm_dialog.set_text(f'Forget Wi-Fi Network "{self._state_network.ssid}"?') |
|
|
|
self._confirm_dialog.set_text(f'Forget Wi-Fi Network "{self._state_network.ssid}"?') |
|
|
|
self._confirm_dialog.reset() |
|
|
|
self._confirm_dialog.reset() |
|
|
|
gui_app.set_modal_overlay(self._confirm_dialog, callback=lambda result: self.on_forgot_confirm_finished(self._state_network, result)) |
|
|
|
gui_app.set_modal_overlay(self._confirm_dialog, callback=lambda result: self.on_forgot_confirm_finished(self._state_network, result)) |
|
|
|
else: |
|
|
|
else: |
|
|
|
self._draw_network_list(rect) |
|
|
|
self._draw_network_list(rect) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _on_password_entered(self, network: Network, result: int): |
|
|
|
def _on_password_entered(self, network: Network, result: int): |
|
|
|
if result == 1: |
|
|
|
if result == 1: |
|
|
@ -213,37 +210,35 @@ class WifiManagerUI(Widget): |
|
|
|
self.wifi_manager.forget_connection(network.ssid) |
|
|
|
self.wifi_manager.forget_connection(network.ssid) |
|
|
|
|
|
|
|
|
|
|
|
def _on_network_updated(self, networks: list[Network]): |
|
|
|
def _on_network_updated(self, networks: list[Network]): |
|
|
|
with self._lock: |
|
|
|
print('networks updated', [n.ssid for n in networks]) |
|
|
|
self._networks = networks |
|
|
|
self._networks = networks |
|
|
|
for n in self._networks: |
|
|
|
for n in self._networks: |
|
|
|
self._networks_buttons[n.ssid] = Button(n.ssid, partial(self._networks_buttons_callback, n), font_size=55, text_alignment=TextAlignment.LEFT, |
|
|
|
self._networks_buttons[n.ssid] = Button(n.ssid, partial(self._networks_buttons_callback, n), font_size=55, text_alignment=TextAlignment.LEFT, |
|
|
|
button_style=ButtonStyle.NO_EFFECT) |
|
|
|
button_style=ButtonStyle.NO_EFFECT) |
|
|
|
self._forget_networks_buttons[n.ssid] = Button("Forget", partial(self._forget_networks_buttons_callback, n), button_style=ButtonStyle.FORGET_WIFI, |
|
|
|
self._forget_networks_buttons[n.ssid] = Button("Forget", partial(self._forget_networks_buttons_callback, n), button_style=ButtonStyle.FORGET_WIFI, |
|
|
|
font_size=45) |
|
|
|
font_size=45) |
|
|
|
|
|
|
|
|
|
|
|
def _on_need_auth(self, ssid): |
|
|
|
def _on_need_auth(self, ssid): |
|
|
|
print('need auth for', ssid) |
|
|
|
print('need auth for', ssid) |
|
|
|
with self._lock: |
|
|
|
network = next((n for n in self._networks if n.ssid == ssid), None) |
|
|
|
network = next((n for n in self._networks if n.ssid == ssid), None) |
|
|
|
if network: |
|
|
|
if network: |
|
|
|
self.state = UIState.NEEDS_AUTH |
|
|
|
self.state = UIState.NEEDS_AUTH |
|
|
|
self._state_network = network |
|
|
|
self._state_network = network |
|
|
|
self._password_retry = True |
|
|
|
self._password_retry = True |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _on_activated(self): |
|
|
|
def _on_activated(self): |
|
|
|
with self._lock: |
|
|
|
print('_on_activated') |
|
|
|
if self.state == UIState.CONNECTING: |
|
|
|
if self.state == UIState.CONNECTING: |
|
|
|
self.state = UIState.IDLE |
|
|
|
self.state = UIState.IDLE |
|
|
|
|
|
|
|
|
|
|
|
def _on_forgotten(self, ssid): |
|
|
|
def _on_forgotten(self): |
|
|
|
with self._lock: |
|
|
|
print('_on_forgotten') |
|
|
|
if self.state == UIState.FORGETTING: |
|
|
|
if self.state == UIState.FORGETTING: |
|
|
|
self.state = UIState.IDLE |
|
|
|
self.state = UIState.IDLE |
|
|
|
|
|
|
|
|
|
|
|
def _on_disconnected(self): |
|
|
|
def _on_disconnected(self): |
|
|
|
with self._lock: |
|
|
|
if self.state == UIState.CONNECTING: |
|
|
|
if self.state == UIState.CONNECTING: |
|
|
|
self.state = UIState.IDLE |
|
|
|
self.state = UIState.IDLE |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main(): |
|
|
|
def main(): |
|
|
|