created basic ui that counts

This commit is contained in:
michael-bailey 2022-02-04 22:22:59 +00:00
parent d320f345c8
commit 8e78bf542c
3 changed files with 99 additions and 1 deletions

View File

@ -7,3 +7,13 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
cursive = "0.17"
uuid = {version = "0.8", features = ["serde", "v4"]}
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
crossbeam = "0.8.0"
crossbeam-channel = "0.5.0"
tokio = { version = "1.9.0", features = ["full"] }
futures = "0.3.16"
foundation = {path = '../foundation'}

View File

@ -1,3 +1,19 @@
mod worker;
mod managers;
use worker::Worker;
use cursive::{Cursive, CursiveExt};
use cursive::traits::Nameable;
use cursive::views::{Dialog, TextView};
fn main() {
println!("Hello, world!");
let mut app = Cursive::default();
let workerStream = Worker::new(app.cb_sink().clone()).start();
app.set_user_data(workerStream);
app.add_layer(Dialog::new()
.content(TextView::new("Hello world").with_name("TextView"))
.button("close", |s| s.quit()));
app.set_fps(30);
app.run();
}

72
client/src/worker.rs Normal file
View File

@ -0,0 +1,72 @@
use std::sync::Arc;
use std::sync::atomic::AtomicUsize;
use std::thread::spawn;
use std::time::Duration;
use crossbeam_channel::Sender as CrossSender;
use cursive::backends::curses::n::ncurses::LcCategory::numeric;
use tokio::runtime::Runtime;
use tokio::sync::mpsc::{channel, Sender as TokioSender};
use tokio::sync::Mutex;
use tokio::time::sleep;
use foundation::ClientDetails;
use crate::{Cursive, TextView};
use crate::managers::NetworkManager;
pub enum WorkerMessage {
Disconnect,
Connect {username: String},
}
pub type CursiveSender = CrossSender<Box<dyn FnOnce(&mut Cursive) + Send>>;
pub struct Worker {
cursive_sender: CursiveSender,
network_manager: NetworkManager,
number: Arc<Mutex<usize>>,
user_details: Mutex<Option<ClientDetails>>,
}
impl Worker {
pub fn new(sender: CursiveSender) -> Worker {
Worker {
cursive_sender: sender,
number: Arc::new(Mutex::new(0)),
user_details: Mutex::new(None)
}
}
pub fn start(self) -> TokioSender<WorkerMessage> {
let (tx,rx) = channel::<WorkerMessage>(16);
spawn(move || {
let sender = self.cursive_sender.clone();
let rt = Runtime::new().unwrap();
let tmp_num = self.number.clone();
rt.block_on(async move {
let a = &tmp_num;
loop {
let num = Arc::clone(&a);
sleep(Duration::new(1,0)).await;
let _ = sender.send(Box::new( move |s| {
let num = &num.clone();
let mut num_lock = num.blocking_lock();
*num_lock += 1;
let a = *num_lock;
s.find_name::<TextView>("TextView").unwrap().set_content(a.to_string());
}));
}
})
});
tx
}
pub async fn sendLoginInfo(&self) {
}
}