From f9bea05bbb27704b5bfe0197517e488afbfd872e Mon Sep 17 00:00:00 2001 From: Lucy Date: Wed, 2 Feb 2022 16:54:08 -0500 Subject: [PATCH] This should maybe work? --- .../src/ui/available_wifi.rs | 49 +++++++++++++++++-- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/applets/cosmic-applet-network/src/ui/available_wifi.rs b/applets/cosmic-applet-network/src/ui/available_wifi.rs index 6732bec5..f880b67e 100644 --- a/applets/cosmic-applet-network/src/ui/available_wifi.rs +++ b/applets/cosmic-applet-network/src/ui/available_wifi.rs @@ -1,22 +1,58 @@ // SPDX-License-Identifier: LGPL-3.0-or-later -use crate::task; +use crate::{task, widgets::SettingsEntry}; use cosmic_dbus_networkmanager::{ device::{wireless::WirelessDevice, SpecificDevice}, nm::NetworkManager, }; use futures_util::StreamExt; use gtk4::{ - glib::{source::PRIORITY_DEFAULT, MainContext, Sender}, + glib::{self, clone, source::PRIORITY_DEFAULT, MainContext, Sender}, prelude::*, + Align, Image, }; -use tokio::sync::mpsc::UnboundedSender; +use std::{cell::RefCell, rc::Rc}; use zbus::Connection; pub fn add_available_wifi(target: >k4::Box) { + let ap_entries = Rc::>>::default(); let (tx, rx) = MainContext::channel::>(PRIORITY_DEFAULT); - task::spawn(scan_for_wifi(tx)); - rx.attach(None, |aps| Continue(true)); + task::spawn(async move { + if let Err(err) = scan_for_wifi(tx).await { + eprintln!("scan_for_wifi failed: {}", err); + } + }); + rx.attach( + None, + clone!(@strong ap_entries, @weak target => @default-return Continue(true), move |aps| { + build_aps_list(ap_entries.clone(), target, dbg!(aps)); + Continue(true) + }), + ); +} + +fn build_aps_list( + ap_entries: Rc>>, + target: gtk4::Box, + aps: Vec, +) { + let mut ap_entries = ap_entries.borrow_mut(); + for old_ap_box in ap_entries.drain(..) { + target.remove(&old_ap_box); + } + for ap in aps { + view! { + ap_entry = SettingsEntry { + align_child: Align::Start, + set_title: &ap.ssid, + set_child: ap_icon = &Image { + set_icon_name: Some("network-wireless-symbolic"), + } + } + } + target.append(&ap_entry); + ap_entries.push(ap_entry); + } } async fn scan_for_wifi(tx: Sender>) -> zbus::Result<()> { @@ -45,6 +81,7 @@ async fn handle_wireless_device( let mut scan_changed = device.receive_last_scan_changed().await; if let Some(t) = scan_changed.next().await { if let Ok(-1) = t.get().await { + eprintln!("scan errored"); return Ok(()); } } @@ -56,9 +93,11 @@ async fn handle_wireless_device( strength: ap.strength().await?, }); } + tx.send(aps).expect("failed to send back to main thread"); Ok(()) } +#[derive(Debug)] struct AccessPoint { ssid: String, strength: u8,