Skip to content
This repository has been archived by the owner on Apr 10, 2024. It is now read-only.

Commit

Permalink
Added disconnect information dialog.
Browse files Browse the repository at this point in the history
Fixes #70
  • Loading branch information
mkrueger committed Jan 20, 2024
1 parent 4cc48c3 commit c060ab7
Show file tree
Hide file tree
Showing 7 changed files with 114 additions and 30 deletions.
5 changes: 4 additions & 1 deletion i18n/de/icy_term.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -148,4 +148,7 @@ show-iemsi-dialog-id=Id:
delete-bbs-title=BBS Löschen
delete-bbs-question=Sind Sie sicher, dass '{ $system }' gelöscht werden soll?
delete-bbs-delete-button=Löschen
delete-bbs-delete-button=Löschen
show-disconnected-heading=NO CARRIER
show-disconnected-message=Verbindung beendet zu { $system } nach { $time }
5 changes: 4 additions & 1 deletion i18n/en/icy_term.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -149,4 +149,7 @@ show-iemsi-dialog-id=Id:
delete-bbs-title=Delete BBS
delete-bbs-question=Are you sure to you want to delete '{ $system }'?
delete-bbs-delete-button=Delete
delete-bbs-delete-button=Delete
show-disconnected-heading=NO CARRIER
show-disconnected-message=Disconnected from { $system } at { $time }
11 changes: 9 additions & 2 deletions src/ui/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ impl MainWindow {
last_pos: Position::default(),
buffer_update_thread,
update_thread_handle: Some(update_thread_handle),

is_disconnected: true,
show_find_dialog: false,
find_dialog: dialogs::find_dialog::DialogState::default(),
shift_pressed_during_selection: false,
Expand Down Expand Up @@ -165,7 +165,6 @@ impl eframe::App for MainWindow {
fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
#[cfg(not(target_arch = "wasm32"))]
self.update_title(ctx);

match self.get_mode() {
MainWindowMode::ShowTerminal => {
let res = self.update_state(ctx);
Expand Down Expand Up @@ -255,6 +254,14 @@ impl eframe::App for MainWindow {
dialogs::show_iemsi::show_iemsi(self, ctx);
ctx.request_repaint_after(Duration::from_millis(150));
} // MainWindowMode::AskDeleteEntry => todo!(),

MainWindowMode::ShowDisconnectedMessage(time, system) => {
let res = self.update_state(ctx);
self.update_terminal_window(ctx, frame, false);
check_error!(self, res, false);
dialogs::show_disconnected_message::show_disconnected(self, ctx, time, system);
ctx.request_repaint_after(Duration::from_millis(150));
}
}
}

Expand Down
26 changes: 16 additions & 10 deletions src/ui/com_thread.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,24 @@ impl ConnectionThreadData {

fn read_data(&mut self) -> bool {
if self.data_buffer.is_empty() {
if let Ok(Some(data)) = self.com.read_data() {
if self.baud_rate == 0 {
if let Err(err) = self.tx.send(SendData::Data(data)) {
log::error!("connection_thread::read_data: {err}");
self.thread_is_running &= self.tx.send(SendData::Disconnect).is_ok();
match self.com.read_data() {
Ok(Some(data)) => {
if self.baud_rate == 0 {
if let Err(err) = self.tx.send(SendData::Data(data)) {
log::error!("connection_thread::read_data: {err}");
self.thread_is_running &= self.tx.send(SendData::Disconnect).is_ok();
}
} else {
self.data_buffer.extend(data);
}
// ctx.request_repaint();
} else {
self.data_buffer.extend(data);
}
} else {
return false;
Ok(None) => return false,

Err(err) => {
log::error!("connection_thread::read_data: {err}");
self.disconnect();
return false;
}
}
} else if self.baud_rate == 0 {
if let Err(err) = self.tx.send(SendData::Data(self.data_buffer.drain(..).collect())) {
Expand Down
1 change: 1 addition & 0 deletions src/ui/dialogs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ pub mod upload_dialog;

pub mod find_dialog;
pub mod show_delete_address_confirmation;
pub mod show_disconnected_message;
48 changes: 48 additions & 0 deletions src/ui/dialogs/show_disconnected_message.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
use eframe::egui::{self, RichText};
use egui::{Align2, Vec2};
use i18n_embed_fl::fl;

use crate::ui::{MainWindow, MainWindowMode};

pub fn show_disconnected(window: &mut MainWindow, ctx: &egui::Context, system: String, time: String) {
use egui::{Frame, Layout};

let mut open = true;
let mut close_dialog = false;
if ctx.input(|i| i.key_down(egui::Key::Escape)) {
open = false;
}
let window_frame = Frame::window(&ctx.style());

egui::Window::new("")
.open(&mut open)
.title_bar(false)
.frame(window_frame)
.fixed_size(Vec2::new(400., 300.))
.resizable(false)
.anchor(Align2::CENTER_CENTER, Vec2::ZERO)
.show(ctx, |ui| {
ui.label(RichText::new(fl!(crate::LANGUAGE_LOADER, "show-disconnected-heading")));
ui.separator();
ui.label(RichText::new(fl!(
crate::LANGUAGE_LOADER,
"show-disconnected-message",
system = system,
time = time
)));

ui.add_space(8.);
ui.separator();
ui.add_space(4.0);

ui.with_layout(Layout::right_to_left(egui::Align::TOP), |ui| {
if ui.button(fl!(crate::LANGUAGE_LOADER, "dialing_directory-ok-button")).clicked() {
close_dialog = true;
}
});
});

if !open || close_dialog {
window.set_mode(MainWindowMode::ShowTerminal);
}
}
48 changes: 32 additions & 16 deletions src/ui/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ macro_rules! check_error {
}};
}

#[derive(Clone, Copy, PartialEq, Eq, Default)]
#[derive(Clone, PartialEq, Eq, Default)]
pub enum MainWindowMode {
ShowTerminal,
#[default]
Expand All @@ -67,6 +67,7 @@ pub enum MainWindowMode {
ShowExportDialog,
ShowUploadDialog,
ShowIEMSI,
ShowDisconnectedMessage(String, String),
}

#[derive(Default)]
Expand Down Expand Up @@ -106,6 +107,7 @@ pub struct MainWindow {
drag_start: Option<Vec2>,
last_pos: Position,
shift_pressed_during_selection: bool,
is_disconnected: bool,

buffer_update_thread: Arc<egui::mutex::Mutex<BufferUpdateThread>>,
update_thread_handle: Option<JoinHandle<()>>,
Expand All @@ -130,8 +132,9 @@ impl MainWindow {
}

pub fn get_mode(&self) -> MainWindowMode {
self.state.mode
self.state.mode.clone()
}

pub fn set_mode(&mut self, mode: MainWindowMode) {
self.state.mode = mode;
}
Expand Down Expand Up @@ -403,32 +406,45 @@ impl MainWindow {
if self.connection.lock().is_none() {
return;
}

let mut show_disconnect = false;
let mut connection_time = String::new();
let mut system_name = String::new();
if let Some(con) = self.connection.lock().as_mut() {
let title = if con.is_connected() {
let d = Instant::now().duration_since(con.get_connection_time());
let sec = d.as_secs();
let minutes = sec / 60;
let hours = minutes / 60;
let cur = &self.dialing_directory_dialog.addresses.addresses[self.dialing_directory_dialog.cur_addr];
let t = format!("{:02}:{:02}:{:02}", hours, minutes % 60, sec % 60);
let s = if cur.system_name.is_empty() {
cur.address.clone()
} else {
cur.system_name.clone()
};
let d = Instant::now().duration_since(con.get_connection_time());
let sec = d.as_secs();
let minutes = sec / 60;
let hours = minutes / 60;
let cur = &self.dialing_directory_dialog.addresses.addresses[self.dialing_directory_dialog.cur_addr];
connection_time = format!("{:02}:{:02}:{:02}", hours, minutes % 60, sec % 60);
system_name = if cur.system_name.is_empty() {
cur.address.clone()
} else {
cur.system_name.clone()
};

let title = if con.is_connected() {
self.is_disconnected = false;
fl!(
crate::LANGUAGE_LOADER,
"title-connected",
version = crate::VERSION.to_string(),
time = t,
name = s
time = connection_time.clone(),
name = system_name.clone()
)
} else {
if self.is_disconnected {
return;
}
self.is_disconnected = true;
show_disconnect = true;
fl!(crate::LANGUAGE_LOADER, "title-offline", version = crate::VERSION.to_string())
};
ctx.send_viewport_cmd(egui::ViewportCommand::Title(title));
}
if show_disconnect {
self.set_mode(MainWindowMode::ShowDisconnectedMessage(system_name.clone(), connection_time.clone()));
}
}
}

Expand Down

0 comments on commit c060ab7

Please sign in to comment.