From ecaa5537a2794887c6cc6efba55f34c8fc3a3d20 Mon Sep 17 00:00:00 2001 From: Sofia Date: Wed, 15 Jul 2026 21:16:44 +0300 Subject: [PATCH] Bind host and join to NetworkManager via signals --- rust/src/lib.rs | 4 ++-- rust/src/network_manager.rs | 25 ++++++++++++++++++++++--- rust/src/ui/cli.rs | 22 ++++++++++++---------- rust/src/ui/mod.rs | 2 +- 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 58f25de..60be319 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -2,8 +2,8 @@ use std::net::SocketAddr; use godot::prelude::*; -mod network_manager; -mod ui; +pub mod network_manager; +pub mod ui; struct MyExtension; diff --git a/rust/src/network_manager.rs b/rust/src/network_manager.rs index d60499e..7eb9803 100644 --- a/rust/src/network_manager.rs +++ b/rust/src/network_manager.rs @@ -1,6 +1,8 @@ use std::net::SocketAddr; -use godot::prelude::*; +use godot::{prelude::*, tools::get_autoload_by_name}; + +use crate::ui::cli::{CLI_GLOBAL_NAME, CliColor, CommandLinePanel}; #[derive(GodotClass)] #[class(base=Node)] @@ -15,14 +17,31 @@ impl INode for NetworkManager { fn init(base: Base) -> Self { NetworkManager { base } } + + fn ready(&mut self) { + let mut cli = get_autoload_by_name::(CLI_GLOBAL_NAME); + + cli.bind_mut() + .signals() + .on_host() + .connect_other(self, |s, port| s.host(port)); + cli.bind_mut() + .signals() + .on_join() + .connect_other(self, |s, addr| s.join(addr.parse().unwrap())); + } } impl NetworkManager { pub fn host(&mut self, port: u32) { - godot_print!("Hosting server at {}", port); + get_autoload_by_name::(CLI_GLOBAL_NAME) + .bind_mut() + .publish_message(format!("Hosting server at {}", port), CliColor::Info); } pub fn join(&mut self, addr: SocketAddr) { - godot_print!("Joining server at {:?}", addr); + get_autoload_by_name::(CLI_GLOBAL_NAME) + .bind_mut() + .publish_message(format!("Joining server at {}", addr), CliColor::Info); } } diff --git a/rust/src/ui/cli.rs b/rust/src/ui/cli.rs index 8815734..a7e05af 100644 --- a/rust/src/ui/cli.rs +++ b/rust/src/ui/cli.rs @@ -27,9 +27,11 @@ impl CliColor { } } +pub const CLI_GLOBAL_NAME: &str = "CommandLinePanelGlobal"; + #[derive(GodotClass)] #[class(base=Panel)] -struct CommandLinePanel { +pub struct CommandLinePanel { #[export] pub input_field: Option>, #[export] @@ -80,7 +82,13 @@ impl IPanel for CommandLinePanel { } } +#[godot_api] impl CommandLinePanel { + #[signal] + pub fn on_host(port: u32); + #[signal] + pub fn on_join(port: String); + pub fn input_command(&mut self, command: String) { self.publish_message(format!("> {}", command), CliColor::Command); if let Some(input) = &mut self.input_field { @@ -150,10 +158,7 @@ impl Command for HostCommand { fn execute(&self, cli: &mut CommandLinePanel, params: &[&str]) { if let Some(port_str) = params.first() { if let Ok(port) = u32::from_str_radix(*port_str, 10) { - cli.publish_message(format!("Server hosted at {}", port), CliColor::Info); - get_autoload_by_name::(NETWORK_SINGLETON_NAME) - .bind_mut() - .host(port); + cli.signals().on_host().emit(port); } else { cli.publish_message(format!("Invalid port: {}", port_str), CliColor::Error); } @@ -172,11 +177,8 @@ struct JoinCommand; impl Command for JoinCommand { fn execute(&self, cli: &mut CommandLinePanel, params: &[&str]) { if let Some(address_str) = params.first() { - if let Ok(address) = address_str.parse::() { - cli.publish_message(format!("Joining server at {}", address), CliColor::Info); - get_autoload_by_name::(NETWORK_SINGLETON_NAME) - .bind_mut() - .join(address); + if let Ok(_) = address_str.parse::() { + cli.signals().on_join().emit(address_str.to_string()); } else { cli.publish_message(format!("Invalid address: {}", address_str), CliColor::Error); } diff --git a/rust/src/ui/mod.rs b/rust/src/ui/mod.rs index 26710c1..4f77372 100644 --- a/rust/src/ui/mod.rs +++ b/rust/src/ui/mod.rs @@ -1 +1 @@ -mod cli; +pub mod cli;