@ -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 ,
@ -71,21 +69,22 @@ class WifiManagerUI(Widget):
gui_app . texture ( icon , ICON_SIZE , ICON_SIZE )
gui_app . texture ( icon , ICON_SIZE , ICON_SIZE )
def _render ( self , rect : rl . Rectangle ) :
def _render ( self , rect : rl . Rectangle ) :
with self . _lock :
self . wifi_manager . process_callbacks ( )
if not self . _networks :
gui_label ( rect , " Scanning Wi-Fi networks... " , 72 , alignment = rl . GuiTextAlignment . TEXT_ALIGN_CENTER )
if not self . _networks :
return
gui_label ( rect , " Scanning Wi-Fi networks... " , 72 , alignment = rl . GuiTextAlignment . TEXT_ALIGN_CENTER )
return
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 } " )
if self . state == UIState . NEEDS_AUTH and self . _state_network :
self . keyboard . reset ( )
self . keyboard . set_title ( " Wrong password " if self . _password_retry else " Enter password " , f " for { self . _state_network . ssid } " )
gui_app . set_modal_overlay ( self . keyboard , lambda result : self . _on_password_entered ( cast ( Network , self . _state_network ) , result ) )
self . keyboard . reset ( )
elif self . state == UIState . SHOW_FORGET_CONFIRM and self . _state_network :
gui_app . set_modal_overlay ( self . keyboard , lambda result : self . _on_password_entered ( cast ( Network , self . _state_network ) , result ) )
self . _confirm_dialog . set_text ( f ' Forget Wi-Fi Network " { self . _state_network . ssid } " ? ' )
elif self . state == UIState . SHOW_FORGET_CONFIRM and self . _state_network :
self . _confirm_dialog . reset ( )
self . _confirm_dialog . set_text ( f ' Forget Wi-Fi Network " { self . _state_network . ssid } " ? ' )
gui_app . set_modal_overlay ( self . _confirm_dialog , callback = lambda result : self . on_forgot_confirm_finished ( self . _state_network , result ) )
self . _confirm_dialog . reset ( )
else :
gui_app . set_modal_overlay ( self . _confirm_dialog , callback = lambda result : self . on_forgot_confirm_finished ( self . _state_network , result ) )
self . _draw_network_list ( rect )
else :
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 :
@ -211,36 +210,31 @@ 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 :
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 ) :
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 :
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 :
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 ( ) :