system/ui: performance optimizations for WiFi Manager with cached network data (#35170)

Performance optimizations for WiFi Manager with cached network data
This commit is contained in:
Dean Lee
2025-05-11 15:26:25 +08:00
committed by GitHub
parent eaa595958c
commit f1760e63d3
2 changed files with 24 additions and 13 deletions
+14 -8
View File
@@ -48,13 +48,15 @@ class WifiManagerUI:
self.scroll_panel = GuiScrollPanel()
self.keyboard = Keyboard()
self._networks: list[NetworkInfo] = []
self.wifi_manager = wifi_manager
self.wifi_manager.set_callbacks(WifiManagerCallbacks(self._on_need_auth, self._on_activated, self._on_forgotten))
self.wifi_manager.set_callbacks(WifiManagerCallbacks(self._on_need_auth, self._on_activated, self._on_forgotten, self._on_network_updated))
self.wifi_manager.start()
self.wifi_manager.connect()
def render(self, rect: rl.Rectangle):
if not self.wifi_manager.networks:
if not self._networks:
gui_label(rect, "Scanning Wi-Fi networks...", 72, alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER)
return
@@ -77,19 +79,19 @@ class WifiManagerUI:
self._draw_network_list(rect)
def _draw_network_list(self, rect: rl.Rectangle):
content_rect = rl.Rectangle(rect.x, rect.y, rect.width, len(self.wifi_manager.networks) * ITEM_HEIGHT)
content_rect = rl.Rectangle(rect.x, rect.y, rect.width, len(self._networks) * ITEM_HEIGHT)
offset = self.scroll_panel.handle_scroll(rect, content_rect)
clicked = self.scroll_panel.is_click_valid()
rl.begin_scissor_mode(int(rect.x), int(rect.y), int(rect.width), int(rect.height))
for i, network in enumerate(self.wifi_manager.networks):
for i, network in enumerate(self._networks):
y_offset = rect.y + i * ITEM_HEIGHT + offset.y
item_rect = rl.Rectangle(rect.x, y_offset, rect.width, ITEM_HEIGHT)
if not rl.check_collision_recs(item_rect, rect):
continue
self._draw_network_item(item_rect, network, clicked)
if i < len(self.wifi_manager.networks) - 1:
if i < len(self._networks) - 1:
line_y = int(item_rect.y + item_rect.height - 1)
rl.draw_line(int(item_rect.x), int(line_y), int(item_rect.x + item_rect.width), line_y, rl.LIGHTGRAY)
@@ -115,7 +117,7 @@ class WifiManagerUI:
rl.gui_label(state_rect, status_text)
# If the network is saved, show the "Forget" button
if self.wifi_manager.is_saved(network.ssid):
if network.is_saved:
forget_btn_rect = rl.Rectangle(
rect.x + rect.width - self.btn_width,
rect.y + (ITEM_HEIGHT - 80) / 2,
@@ -126,22 +128,26 @@ class WifiManagerUI:
self.state = StateShowForgetConfirm(network)
if isinstance(self.state, StateIdle) and rl.check_collision_point_rec(rl.get_mouse_position(), label_rect) and clicked:
if not self.wifi_manager.is_saved(network.ssid):
if not network.is_saved:
self.state = StateNeedsAuth(network)
else:
self.connect_to_network(network)
def connect_to_network(self, network: NetworkInfo, password=''):
self.state = StateConnecting(network)
if self.wifi_manager.is_saved(network.ssid) and not password:
if network.is_saved and not password:
self.wifi_manager.activate_connection(network.ssid)
else:
self.wifi_manager.connect_to_network(network.ssid, password)
def forget_network(self, network: NetworkInfo):
self.state = StateForgetting(network)
network.is_saved = False
self.wifi_manager.forget_connection(network.ssid)
def _on_network_updated(self, networks: list[NetworkInfo]):
self._networks = networks
def _on_need_auth(self, ssid):
match self.state:
case StateConnecting(ssid):