diff --git a/src/main.rs b/src/main.rs index 0c66d4d..3f26065 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +#![feature(in_band_lifetimes)] + mod client_api; mod commands; mod server; @@ -7,21 +9,28 @@ use cursive::{ Cursive, menu::*, event::Key, - views::{ Dialog, TextView, LinearLayout, ListView, ResizedView, Panel, Menubar }, CursiveExt, align::Align, view::SizeConstraint, + event::Event, + XY, +}; + +use std::{ + time::Duration, + sync::{ + Arc, + Mutex + } }; -//use std::sync::Arc; -use std::time::Duration; -use std::sync::Arc; -use std::sync::Weak; -use std::sync::Mutex; use crossterm::ErrorKind; use log::info; use clap::{App, Arg}; -use crate::server::server_profile::Server; + +use crate::server::ServerV3::Server; +use cursive::views::{Dialog, TextView, Menubar, LinearLayout, ResizedView, ListView, Panel}; +use crate::server::ui::server_view::ServerControlView; fn main() -> Result<(), ErrorKind> { let args = App::new("--rust chat server--") @@ -35,44 +44,70 @@ fn main() -> Result<(), ErrorKind> { .get_matches(); if args.is_present("graphical") { - let mut server = Server::new("Server-01", "0.0.0.0:6000", "noreply@email.com"); - let server_arc = Arc::new(Mutex::new(server)); - let s1 = server_arc.clone(); - let s2 = s1.clone(); - cursive::logger::init(); + let server = Server::new("server-001", "0.0.0.0:6000", "michael bailey"); - info!("Main: init display"); - let mut display = Cursive::default(); - - info!("Main: setting up callbacks"); - display.add_global_callback(Key::Backspace, |s| s.quit()); - display.add_global_callback(Key::Tab, |s| s.toggle_debug_console()); - display.add_global_callback(Key::Esc, |s| s.select_menubar()); - - info!("Main: setting up menu bar"); - // setup menu bar - menu_bar(display.menubar(), &server_arc); - - println!("Main: entering loop"); - display.add_layer(control_panel(server_arc)); - display.add_layer(launch_screen()); - display.set_autohide_menu(false); - display.run(); + ServerControlView::new(server.unwrap()); Ok(()) } else { - let mut server = Server::new("Server-01", "0.0.0.0:6000", "noreply@email.com"); + let mut server = crate::server::server_profile::Server::new("Server-01", "0.0.0.0:6000", "noreply@email.com"); server.start()?; loop { std::thread::sleep(Duration::from_secs(1)); } } } + +fn gen_ui() { + // MARK: - setup the server. + info!("Main: init Server"); + let server = Server::new("Server-01", "0.0.0.0:6000", "noreply@email.com"); + let server_arc = Arc::new(Mutex::new(server)); + + info!("Main: init display"); + let mut display = Cursive::default(); + + info!("Main: init cursive logger"); + cursive::logger::init(); + + info!("Main: setting user data"); + display.set_user_data(server_arc); + + // MARK: - setup callbacks + info!("Main: setting up callbacks"); + display.add_global_callback(Key::Backspace, |s| s.quit()); + display.add_global_callback(Key::Tab, |s| s.toggle_debug_console()); + display.add_global_callback(Key::Esc, |s| s.select_menubar()); + display.set_autohide_menu(false); + display.add_global_callback(Event::WindowResize, |s| { + info!("Display: resized!"); + std::process::Command::new("open").args(&["-a","Terminal"]).output().expect("not on mac os"); + let _ = s.pop_layer(); + let p = control_panel(s.screen_size(), s.user_data::>>().unwrap().clone()); + s.add_layer(p); + s.refresh(); + }); + display.set_autorefresh(true); + + + info!("Main: getting sender and pushing events"); + let mut sender = display.cb_sink(); + sender.send(Box::new(|s| { + menu_bar(s.menubar()); + s.add_layer(launch_screen()); + })); + + info!("Main: entering loop"); + display.run(); +} + fn about() -> Dialog { Dialog::new() .content(TextView::new("Rust-Chat-Server\nmade by\n Mitchell Hardie\nMichael Bailey\nMit Licence") .align(Align::center())) - .button("Close", |s| {let _ = s.pop_layer();} ) + .button("Close", |s| { + let _ = s.pop_layer(); + }) } #[allow(dead_code)] @@ -86,14 +121,14 @@ fn launch_screen() -> Dialog { * press for debug (FIXME) * press to exit. ").align(Align::top_left())) - .button("ok", |s| {s.pop_layer();}) + .button("ok", |s| { + s.pop_layer(); + let p = control_panel(s.screen_size(), s.user_data::>>().unwrap().clone()); + s.add_layer(p); + }) } -fn menu_bar(bar: &mut Menubar, server_arc: &Arc>) { - - let s1 = Arc::downgrade(server_arc); - let s2 = Arc::downgrade(server_arc); - +fn menu_bar(bar: &mut Menubar) { bar.add_subtree("Server", MenuTree::new() .leaf("about", @@ -102,24 +137,41 @@ fn menu_bar(bar: &mut Menubar, server_arc: &Arc>) { .leaf("quit", |s| s.quit())) .add_subtree("File", MenuTree::new() - .leaf("Start", move |s| { - let arc = s2.upgrade().unwrap(); - let _ = arc.lock().unwrap().start(); - let _ = s.pop_layer(); - s.add_layer(control_panel(arc)); + .leaf("Start", |s| { + + let user_data_option = s.user_data::>>(); + + if let Some(user_data) = user_data_option { + let arc = user_data.clone(); + let lock_result = arc.lock(); + if let Ok(mut server) = lock_result { + let _ = server.start(); + let _ = s.pop_layer(); + let p = control_panel(s.screen_size(), s.user_data::>>().unwrap().clone()); + s.add_layer(p); + } + } }) - .leaf("Stop", move |s| { - let arc = s1.upgrade().unwrap(); - let _ = arc.lock().unwrap().stop(); - let _ = s.pop_layer(); - s.add_layer(control_panel(arc)); + .leaf("Stop", |s| { + let user_data_option = s.user_data::>>(); + + if let Some(user_data) = user_data_option { + let arc = user_data.clone(); + let lock_result = arc.lock(); + if let Ok(mut server) = lock_result { + let _ = server.stop(); + let _ = s.pop_layer(); + let p = control_panel(s.screen_size(), s.user_data::>>().unwrap().clone()); + s.add_layer(p); + } + } }) .delimiter() // TODO: - create custom debug console .leaf("Debug", |s| {s.toggle_debug_console();})); } -fn control_panel(server_arc: Arc>) -> ResizedView> { +fn control_panel(screen_size: XY, server_arc: Arc>) -> ResizedView> { let mut root = LinearLayout::horizontal(); let mut left = LinearLayout::vertical(); let mut right = ListView::new(); @@ -129,12 +181,16 @@ fn control_panel(server_arc: Arc>) -> ResizedView