This commit is contained in:
Tiago Batista Cardoso
2026-01-24 19:47:15 +01:00
parent f8e3e46672
commit a3648c2116
9 changed files with 270 additions and 66 deletions

View File

@@ -5,9 +5,8 @@ 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,
debug_text::print,
CentralPanel, CollapsingHeader, Color32, Context, CornerRadius, Frame, Response, ScrollArea,
SidePanel, Stroke, TopBottomPanel, Ui, ViewportCommand,
};
use std::collections::HashSet;
use std::{collections::HashMap, fmt::format, io::Seek};
@@ -49,6 +48,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,
current_downloading_file_map: MerkleTree,
@@ -72,7 +72,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,
@@ -80,6 +80,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(),
shared_tree: generate_base_tree(),
@@ -91,9 +92,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 ---
@@ -292,6 +299,9 @@ impl eframe::App for P2PClientApp {
println!("bigfile téléchargé");
}
}
NetworkEvent::Success(msg) => {
self.show_success(msg);
}
NetworkEvent::HandshakeFailed() => {}
NetworkEvent::ServerHandshakeFailed(err) => {
self.active_server = "".to_string();
@@ -424,13 +434,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.inner;
} 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());
@@ -540,6 +561,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));
}