This commit is contained in:
Tiago Batista Cardoso
2026-01-24 19:47:15 +01:00
parent 524eaec76d
commit cb2e89b1e9
6 changed files with 268 additions and 58 deletions

View File

@@ -4,8 +4,9 @@ use client_network::{
};
use crossbeam_channel::{Receiver, Sender};
use egui::{
Align, Align2, Button, CentralPanel, CollapsingHeader, Context, Id, LayerId, Layout, Order,
Popup, ScrollArea, SidePanel, TextStyle, TopBottomPanel, Ui, ViewportCommand,
Align, Align2, Button, CentralPanel, CollapsingHeader, Color32, Context, CornerRadius, Frame,
Id, LayerId, Layout, Order, Popup, Response, ScrollArea, SidePanel, Stroke, TextStyle,
TopBottomPanel, Ui, ViewportCommand,
};
use std::{collections::HashMap, fmt::format};
@@ -43,6 +44,7 @@ pub struct P2PClientApp {
show_network_popup: bool, // gérer selon besoin
error_message: Option<String>, // Some(message) -> afficher, None -> rien
success_message: Option<String>, // Some(message) -> afficher, None -> rien
//
active_server: String,
}
@@ -62,7 +64,7 @@ impl P2PClientApp {
network_cmd_tx: cmd_tx,
network_event_rx: event_rx,
status_message: "Client Initialized. Awaiting network status...".to_string(),
known_peers: vec![("bob".to_string(), true)],
known_peers: Vec::new(),
connect_address_input: "https://jch.irif.fr:8443".to_string(),
connected_address: "".to_string(),
loaded_fs,
@@ -70,6 +72,7 @@ impl P2PClientApp {
server_status: ServerStatus::NotConnected,
show_network_popup: false,
error_message: None,
success_message: None,
connect_name_input: "bob".to_string(),
active_server: "".to_string(),
}
@@ -77,9 +80,15 @@ impl P2PClientApp {
pub fn show_error(&mut self, msg: impl Into<String>) {
self.error_message = Some(msg.into());
}
pub fn show_success(&mut self, msg: impl Into<String>) {
self.success_message = Some(msg.into());
}
pub fn clear_error(&mut self) {
self.error_message = None;
}
pub fn clear_success(&mut self) {
self.success_message = None;
}
}
// --- eframe::App Trait Implementation ---
@@ -175,6 +184,9 @@ impl eframe::App for P2PClientApp {
NetworkEvent::Error(err) => {
self.show_error(err);
}
NetworkEvent::Success(msg) => {
self.show_success(msg);
}
NetworkEvent::DataReceived(_, merkle_node) => todo!(),
NetworkEvent::HandshakeFailed() => {}
NetworkEvent::ServerHandshakeFailed(err) => {
@@ -360,13 +372,24 @@ impl eframe::App for P2PClientApp {
let is_active =
self.active_peer.as_ref().map_or(false, |id| id == &peer.0); // if peer.id == self.active_peer_id
let selectable;
let selectable: Response;
if &self.active_server == &peer.0 {
selectable =
ui.selectable_label(is_active, format!("{} 📡 🌀", peer.0))
// Create a frame with green background and render the selectable inside it.
// Adjust rounding, padding and stroke as desired.
let frame = Frame {
fill: Color32::DARK_BLUE,
stroke: Stroke::default(),
corner_radius: CornerRadius::from(0.5),
..Default::default()
};
let internal = frame.show(ui, |ui| {
ui.selectable_label(is_active, format!("{}", peer.0))
});
selectable = internal.response;
} else {
selectable = ui.selectable_label(is_active, format!("{}", peer.0));
}
if selectable.clicked() {
// switch to displaying this peer's tree
self.active_peer = Some(peer.0.clone());
@@ -476,6 +499,20 @@ impl eframe::App for P2PClientApp {
});
ctx.request_repaint();
}
if let Some(msg) = &self.success_message {
let msg = msg.clone();
egui::Window::new("Success")
.collapsible(false)
.resizable(false)
.anchor(egui::Align2::CENTER_CENTER, [0.0, 0.0])
.show(ctx, |ui| {
ui.label(&msg);
if ui.button("OK").clicked() {
self.clear_success();
}
});
ctx.request_repaint();
}
ctx.request_repaint_after(std::time::Duration::from_millis(10));
}