graphical stuff

This commit is contained in:
2026-01-02 17:23:33 +01:00
parent c804695725
commit 1d72d7500a
4 changed files with 254 additions and 59 deletions

View File

@@ -13,10 +13,14 @@ enum ServerStatus {
Loading,
NotConnected,
Connected,
ConnectedHandshake,
}
// --- Main Application Struct ---
pub struct P2PClientApp {
remaining: std::time::Duration, // temps restant
last_update: std::time::Instant, // pour calculer delta
timer_started: bool,
// Communication channels
network_cmd_tx: Sender<NetworkCommand>,
network_event_rx: Receiver<NetworkEvent>,
@@ -34,6 +38,8 @@ pub struct P2PClientApp {
active_peer: Option<String>,
server_status: ServerStatus,
show_network_popup: bool, // gérer selon besoin
}
impl P2PClientApp {
@@ -45,6 +51,9 @@ impl P2PClientApp {
loaded_fs.insert("bob".to_string(), tree);
Self {
remaining: std::time::Duration::from_secs(0),
timer_started: false,
last_update: std::time::Instant::now(),
network_cmd_tx: cmd_tx,
network_event_rx: event_rx,
status_message: "Client Initialized. Awaiting network status...".to_string(),
@@ -53,7 +62,8 @@ impl P2PClientApp {
connect_server_name_input: "jch.irif.fr".to_string(),
loaded_fs,
active_peer: None,
server_status: ServerStatus::Loading,
server_status: ServerStatus::NotConnected,
show_network_popup: false,
}
}
}
@@ -62,6 +72,23 @@ impl P2PClientApp {
impl eframe::App for P2PClientApp {
fn update(&mut self, ctx: &Context, _frame: &mut eframe::Frame) {
if matches!(self.server_status, ServerStatus::Connected) && !self.timer_started {
self.remaining = std::time::Duration::from_secs(30 * 60);
self.last_update = std::time::Instant::now();
self.timer_started = true;
}
// in update (every frame)
let now = std::time::Instant::now();
let delta = now.saturating_duration_since(self.last_update);
self.last_update = now;
if matches!(self.server_status, ServerStatus::Connected)
&& self.remaining > std::time::Duration::ZERO
{
self.remaining = self.remaining.saturating_sub(delta);
}
// 1. Process incoming Network Events
// We poll the channel and update the GUI state for every event received.
while let Ok(event) = self.network_event_rx.try_recv() {
@@ -75,7 +102,7 @@ impl eframe::App for P2PClientApp {
}
}
NetworkEvent::PeerListUpdated(peers) => {
todo!();
//todo!();
self.known_peers = peers;
}
@@ -103,6 +130,9 @@ impl eframe::App for P2PClientApp {
NetworkEvent::Connected() => {
self.server_status = ServerStatus::Connected;
}
NetworkEvent::ConnectedHandshake() => {
self.server_status = ServerStatus::ConnectedHandshake;
}
NetworkEvent::Disconnected() => todo!(),
NetworkEvent::Error() => todo!(),
NetworkEvent::DataReceived(_, merkle_node) => todo!(),
@@ -124,21 +154,78 @@ impl eframe::App for P2PClientApp {
});
ui.menu_button("Network", |ui| {
ui.horizontal(|ui| {
ui.label("Server IP:");
ui.text_edit_singleline(&mut self.connect_address_input);
ui.text_edit_singleline(&mut self.connect_server_name_input);
ui.vertical(|ui| {
ui.horizontal(|ui| {
ui.label("Server IP:");
ui.text_edit_singleline(&mut self.connect_address_input);
});
if ui.button("Connect").clicked() {
let addr = self.connect_address_input.clone();
let serv_name = self.connect_server_name_input.clone();
let _ = self
.network_cmd_tx
.send(NetworkCommand::ConnectToServer(addr, serv_name));
.send(NetworkCommand::ConnectToServerPut(addr));
self.server_status = ServerStatus::Loading;
ui.close();
}
/* ui.horizontal(|ui| {
ui.label("Server peer name:");
ui.text_edit_singleline(&mut self.connect_server_name_input);
if ui.button("Connect").clicked() {
let addr = self.connect_address_input.clone();
let serv_name = self.connect_server_name_input.clone();
let _ = self
.network_cmd_tx
.send(NetworkCommand::ConnectToServer(addr, serv_name));
self.server_status = ServerStatus::Loading;
ui.close();
}
});*/
});
});
// état
/*if ui.button("Network").clicked() {
self.show_network_popup = true;
}*/
/*if self.show_network_popup {
egui::Window::new("Network")
.collapsible(false)
.resizable(false)
.show(ctx, |ui| {
ui.horizontal_wrapped(|ui| {
ui.with_layout(
egui::Layout::right_to_left(egui::Align::TOP),
|ui| {
if ui.button("✕").clicked() {
self.show_network_popup = false;
}
},
);
});
ui.horizontal(|ui| {
ui.label("Server IP:");
ui.text_edit_singleline(&mut self.connect_address_input);
});
ui.horizontal(|ui| {
ui.label("Server peer name:");
ui.text_edit_singleline(&mut self.connect_server_name_input);
if ui.button("Connect").clicked() {
// envoyer commande...
let addr = self.connect_address_input.clone();
let serv_name = self.connect_server_name_input.clone();
let _ = self
.network_cmd_tx
.send(NetworkCommand::ConnectToServer(addr, serv_name));
self.server_status = ServerStatus::Loading;
self.show_network_popup = false;
}
});
});
}*/
});
});
@@ -149,14 +236,21 @@ impl eframe::App for P2PClientApp {
ui.spinner();
}
ServerStatus::Connected => {
ui.label("📡");
ui.label("Registered but no server peer chosen...");
}
ServerStatus::NotConnected => {
ui.label("No connection..");
}
ServerStatus::ConnectedHandshake => {
ui.label("📡");
}
}
ui.add_space(ui.available_width() - 30.0);
ui.label("30:00");
// formater mm:ss
let secs = self.remaining.as_secs();
let minutes = secs / 60;
let seconds = secs % 60;
ui.label(format!("{:02}:{:02}", minutes, seconds));
});
});
@@ -189,11 +283,8 @@ impl eframe::App for P2PClientApp {
for peer in &self.known_peers {
let is_active =
self.active_peer.as_ref().map_or(false, |id| id == peer); // if peer.id == self.active_peer_id
if ui
.selectable_label(is_active, format!("{}", peer))
.clicked()
{
let selectable = ui.selectable_label(is_active, format!("{}", peer));
if selectable.clicked() {
// switch to displaying this peer's tree
self.active_peer = Some(peer.clone());
// Request root content if not loaded
@@ -208,6 +299,23 @@ impl eframe::App for P2PClientApp {
// ));
}
}
selectable.context_menu(|ui| {
// ... action
match self.server_status {
ServerStatus::Connected => {}
_ => {
if ui
.button("Utiliser le peer en tant que serveur")
.clicked()
{}
}
}
if ui.button("Infos").clicked() {
// action 3
ui.close();
}
// ... autres boutons
});
}
}
});