CSQL/src/ui/db_login_window.rs

154 lines
5.8 KiB
Rust
Raw Normal View History

2023-04-15 17:02:23 +00:00
use super::window_manager::{CSQLWindow, ExitStatus};
2023-03-20 19:48:43 +00:00
use crate::backend::backend_manager::Communication;
use crate::backend::database_handler::DBLoginData;
use egui::{Context, Ui, Vec2};
use tokio::sync::mpsc::Sender;
use tokio::sync::oneshot;
pub struct DBLoginWindow {
db_login_data: DBLoginData,
sender: Sender<Communication>,
are_creditentials_verified_receiver:
Option<oneshot::Receiver<Result<(), Box<dyn std::error::Error + Send>>>>,
2023-04-15 17:02:23 +00:00
are_creditentials_verified: Option<Result<(), Box<dyn std::error::Error + Send>>>,
debug_autoconnect_sent: bool,
2023-03-20 19:48:43 +00:00
}
impl DBLoginWindow {
pub fn default(sender: Sender<Communication>) -> DBLoginWindow {
DBLoginWindow {
db_login_data: DBLoginData {
user_name: "root".to_string(),
database: "quotes".to_string(),
host: "127.0.0.1".to_string(),
port: "4307".to_string(),
password: "mauFJcuf5dhRMQrjj".to_string(),
should_remember: true,
..Default::default()
},
sender,
are_creditentials_verified_receiver: None,
2023-04-15 17:02:23 +00:00
are_creditentials_verified: None,
debug_autoconnect_sent: false,
2023-03-20 19:48:43 +00:00
}
}
}
2023-04-15 17:02:23 +00:00
impl CSQLWindow for DBLoginWindow {
fn refresh(
&mut self,
ctx: &egui::Context,
_ui: &mut egui::Ui,
_frame: &mut eframe::Frame,
) -> Option<ExitStatus> {
2023-03-20 19:48:43 +00:00
egui::Window::new("MySQL Login")
.id(egui::Id::new("MySQL Login"))
.resizable(false)
.collapsible(true)
.title_bar(true)
.scroll2([false, false])
.enabled(true)
2023-04-15 17:02:23 +00:00
.anchor(egui::Align2::CENTER_CENTER, Vec2::ZERO)
2023-03-20 19:48:43 +00:00
.show(ctx, |ui| {
self.ui(ctx, ui);
});
2023-04-15 17:02:23 +00:00
if let Some(result) = &self.are_creditentials_verified {
match result {
Ok(_) => return Some(ExitStatus::Ok),
Err(e) => {
return Some(ExitStatus::Err(Box::from(<String as Into<
Box<dyn std::error::Error>,
>>::into(
e.to_string()
))))
}
}
} else {
return None;
}
2023-03-20 19:48:43 +00:00
}
2023-04-15 17:02:23 +00:00
}
impl DBLoginWindow {
2023-03-20 19:48:43 +00:00
fn ui(&mut self, ctx: &Context, ui: &mut Ui) {
ui.heading("Log into the database:");
ui.group(|ui| {
ui.horizontal(|ui| {
let host_label = ui.label("Host:");
ui.text_edit_singleline(&mut self.db_login_data.host)
.labelled_by(host_label.id);
});
ui.horizontal(|ui| {
let port_label = ui.label("Port:");
ui.text_edit_singleline(&mut self.db_login_data.port)
.labelled_by(port_label.id);
});
ui.horizontal(|ui| {
let database_label = ui.label("Database:");
ui.text_edit_singleline(&mut self.db_login_data.database)
.labelled_by(database_label.id);
});
ui.horizontal(|ui| {
let user_name_label = ui.label("User name:");
ui.text_edit_singleline(&mut self.db_login_data.user_name)
.labelled_by(user_name_label.id);
});
ui.horizontal(|ui| {
let password_label = ui.label("Password:");
ui.text_edit_singleline(&mut self.db_login_data.password)
.labelled_by(password_label.id);
});
});
ui.horizontal(|ui| {
ui.checkbox(&mut self.db_login_data.should_remember, "Remember");
2023-04-15 17:02:23 +00:00
/* Autoconnects in debug mode */
if cfg!(debug_assertions) && !self.debug_autoconnect_sent {
println!(" * pre-connecting to \"{:?}\"...", &self.db_login_data);
let (sender, receiver) = oneshot::channel();
self.are_creditentials_verified_receiver = Some(receiver);
self.sender
.try_send(Communication::ValidateCreditentials(
self.db_login_data.clone(),
sender,
))
.unwrap_or_else(|e| {
println!("Failed to send authenticator... {}", e);
});
self.debug_autoconnect_sent = true
}
2023-03-20 19:48:43 +00:00
if ui.button("Connect").clicked() {
let (sender, receiver) = oneshot::channel();
self.are_creditentials_verified_receiver = Some(receiver);
self.sender
.try_send(Communication::ValidateCreditentials(
self.db_login_data.clone(),
sender,
))
.unwrap_or_else(|e| {
println!("Failed to send authenticator... {}", e);
})
}
});
/* If db login bad, return sqlx error to UI */
2023-04-15 17:02:23 +00:00
if let Some(Err(err)) = &mut self.are_creditentials_verified {
2023-03-20 19:48:43 +00:00
ui.style_mut().visuals.override_text_color = Some(egui::Color32::RED);
ui.label(format!("{}", err));
2023-04-15 17:02:23 +00:00
} else if let Some(Ok(_)) = &self.are_creditentials_verified {
ui.style_mut().visuals.override_text_color = Some(egui::Color32::GREEN);
ui.label("Connected");
2023-03-20 19:48:43 +00:00
}
if let Some(receiver) = &mut self.are_creditentials_verified_receiver {
if let Ok(response) = receiver.try_recv() {
match response {
2023-04-15 17:02:23 +00:00
Ok(_) => self.are_creditentials_verified = Some(Ok(())),
Err(err) => self.are_creditentials_verified = Some(Err(err)),
2023-03-20 19:48:43 +00:00
}
self.are_creditentials_verified_receiver = None;
}
}
}
}