diff --git a/Cargo.lock b/Cargo.lock index f7d1147..f2fa182 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -286,6 +286,15 @@ dependencies = [ "cmake", ] +[[package]] +name = "fltk-theme" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3539d27a815514b56af2afa6b8e7c6d6b9274a103239487d5a60daa6340a4868" +dependencies = [ + "fltk", +] + [[package]] name = "fluid-parser" version = "0.1.15" @@ -1127,6 +1136,7 @@ dependencies = [ "chrono", "fl2rust", "fltk", + "fltk-theme", "lazy_static", "libsqlite3-sys", "log", diff --git a/Cargo.toml b/Cargo.toml index 5427552..a79e345 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ edition = "2021" [dependencies] anyhow = "^1.0.86" fltk = { version = "^1.4", features = ["fltk-bundled"] } +fltk-theme = "0.7.2" calamine = "0.25.0" serialport = "4.4.0" rusqlite = "0.25.4" @@ -21,3 +22,8 @@ serde_json="1.0.120" [build-dependencies] fl2rust = "0.5.19" + +[package.metadata.windows] +# For windows subsystem +link-args = ["/SUBSYSTEM:windows", "/ENTRY:mainCRTStartup"] +subsystem = "windows" \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index a3cedd8..aa7326f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,13 @@ use fltk::{*}; - use crate::services::ui_service::UiService; - +use fltk_theme::{WidgetTheme, ThemeType}; mod services; mod models; mod ui; fn main() { let app = app::App::default(); + let widget_theme = WidgetTheme::new(ThemeType::Metro); + widget_theme.apply(); let mut ui_service = UiService::new(); ui_service.init_components(); app.run().unwrap(); diff --git a/src/services/ui_service.rs b/src/services/ui_service.rs index cc3fe1e..24d5d9c 100644 --- a/src/services/ui_service.rs +++ b/src/services/ui_service.rs @@ -2,8 +2,7 @@ use std::cell::RefCell; use std::process; use std::rc::Rc; use std::sync::{Arc, Mutex}; - -use fltk::prelude::{DisplayExt, InputExt, WidgetExt}; +use fltk::prelude::{DisplayExt, InputExt, MenuExt, WidgetExt}; use fltk::text::TextBuffer; use crate::services::log_service::LOGGER; @@ -26,6 +25,10 @@ impl UiService { let work_service_clone = Rc::clone(&work_service_rc); let current_com; let should_current_line; + let comports = WorkService::get_port_names(); + for com in comports { + ui.borrow_mut().com_choice.add_choice(&com); + } { let work_service = work_service_clone.borrow_mut(); @@ -36,7 +39,8 @@ impl UiService { if work_service_rc.borrow().config_model.excel_path != "" { ui.borrow_mut().excel_file_textbox.set_value(&work_service_rc.borrow().config_model.excel_path); ui.borrow_mut().current_line_textbox.set_value(&work_service_rc.borrow().config_model.current_line.to_string()); - ui.borrow_mut().com_textbox.set_value(&*current_com.clone()); + let index = ui.borrow().com_choice.find_index(¤t_com); + ui.borrow_mut().com_choice.set_value(index); work_service_rc.borrow_mut().excel_service.as_mut().unwrap().set_current_line(should_current_line).unwrap(); } @@ -54,13 +58,26 @@ impl UiService { self.init_start_btn(); self.init_set_line_btn(); self.init_log(); - self.init_exit_callback() + self.init_refresh_com_button(); + self.init_exit_callback(); } - fn init_exit_callback(&mut self){ + fn init_refresh_com_button(&mut self) { + let ui_rc = Rc::clone(&self.ui); + let ui_rc_clone = Rc::clone(&ui_rc); + ui_rc.borrow_mut().refresh_com_btn.set_callback(move |_| { + let comports = WorkService::get_port_names(); + let mut ui = ui_rc_clone.borrow_mut(); + ui.com_choice.clear(); + for com in comports { + ui.com_choice.add_choice(&com); + } + }); + } + fn init_exit_callback(&mut self) { let ui_rc = Rc::clone(&self.ui); let work_service_rc = Rc::clone(&self.work_service); - ui_rc.borrow_mut().main_window.set_callback(move |_|{ + ui_rc.borrow_mut().main_window.set_callback(move |_| { let work_service = work_service_rc.borrow_mut(); work_service.save_config(); process::exit(0); @@ -79,7 +96,7 @@ impl UiService { if let Ok(line) = set_dialog.line_textbox.value().parse::() { match work_service_rc_clone.borrow_mut().set_current_line(line) { Ok(_) => { - ui_clone.borrow_mut().current_line_textbox.set_value(&line.to_string()) + ui_clone.borrow_mut().current_line_textbox.set_value(&line.to_string()); } Err(msg) => fltk::dialog::message_default(&msg) } @@ -107,7 +124,7 @@ impl UiService { } Some(_) => {} } - let selected_com = ui.com_textbox.value(); + let selected_com = ui.com_choice.choice().unwrap(); if let Err(msg) = work_service.init_serial_service(selected_com) { fltk::dialog::message_default(&msg); return; @@ -121,7 +138,8 @@ impl UiService { } Err(msg) => { work_service.roll_back(); - fltk::dialog::message_default(&msg) } + fltk::dialog::message_default(&msg) + } } } }); @@ -129,10 +147,6 @@ impl UiService { fn init_log(&mut self) { let ui_rc = Rc::clone(&self.ui); - if self.work_service.borrow_mut().config_model.last_com != ""{ - ui_rc.borrow_mut().com_textbox.set_value(&self.work_service.borrow_mut().config_model.last_com); - } - let text_buffer = TextBuffer::default(); ui_rc.borrow_mut().log_content.set_buffer(text_buffer.clone()); let text_buffer_arc = Arc::new(Mutex::new(text_buffer)); @@ -153,6 +167,7 @@ impl UiService { dialog.show(); let binding = dialog.filename(); let path = binding.to_str().unwrap(); + if path == "" {return;} work_service.init_excel_service(path.to_string()).unwrap(); let current_line = &work_service.get_current_line().to_string(); work_service.config_model.excel_path = path.to_string(); diff --git a/src/ui/main.fl b/src/ui/main.fl index 6f99c7e..f59af52 100644 --- a/src/ui/main.fl +++ b/src/ui/main.fl @@ -2,8 +2,10 @@ version 1.0400 header_name {.h} code_name {.cxx} -class UserInterface {} { - Function {make_window()} {} { +class UserInterface {open +} { + Function {make_window()} {open + } { Fl_Window main_window { label WriteTool_RS open xywh {721 399 693 467} type Double visible @@ -30,24 +32,28 @@ class UserInterface {} { } Fl_Button start_btn { label Start - xywh {445 155 240 35} shortcut 0xff0d color 51 labeltype ENGRAVED_LABEL labelsize 18 + xywh {532 156 138 35} shortcut 0xff0d color 51 labeltype ENGRAVED_LABEL labelsize 18 } - Fl_Text_Display log_content { + Fl_Text_Display log_content {selected xywh {10 210 670 250} } - Fl_Input com_textbox { - label {COM:} - xywh {135 155 285 35} + Fl_Choice com_choice { + label {Com:} open + xywh {135 156 235 35} down_box BORDER_BOX + } {} + Fl_Button refresh_com_btn { + label Refresh + xywh {390 156 120 35} } } } } -class UserInterface1 {open selected +class UserInterface1 {open } { Function {make_set_line_window()} {} { Fl_Window {} {open - xywh {828 554 228 43} type Double visible + xywh {1171 275 228 43} type Double visible } { Fl_Input line_textbox { label {Line:}