graphical stuff
This commit is contained in:
@@ -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
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use crate::gui_app::P2PClientApp;
|
||||
use client_network::{NetworkCommand, NetworkEvent, start_p2p_executor};
|
||||
use client_network::{NetworkCommand, NetworkEvent, P2PSharedData, start_p2p_executor};
|
||||
|
||||
mod gui_app;
|
||||
|
||||
@@ -11,7 +11,10 @@ async fn main() -> eframe::Result<()> {
|
||||
|
||||
// 2. Start the P2P Network Executor in a separate Tokio task
|
||||
// The executor runs in the background of our main async runtime.
|
||||
let _network_handle = start_p2p_executor(network_cmd_rx, network_event_tx);
|
||||
|
||||
let shared_data: Option<P2PSharedData> = None;
|
||||
|
||||
let _network_handle = start_p2p_executor(network_cmd_rx, network_event_tx, shared_data);
|
||||
|
||||
// 3. Configure and Run the Eframe/Egui GUI
|
||||
let options = eframe::NativeOptions {
|
||||
|
||||
Reference in New Issue
Block a user