diff --git a/Cargo.lock b/Cargo.lock index 23cd241..dbf8e0a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,6 +30,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitvec" version = "1.0.1" @@ -51,6 +57,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + [[package]] name = "byteorder" version = "1.5.0" @@ -244,6 +256,30 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -282,12 +318,36 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "js-sys" +version = "0.3.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "libc" version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +[[package]] +name = "libm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" + [[package]] name = "libsvld" version = "0.1.0" @@ -332,6 +392,43 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "native-windows-derive" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76134ae81020d89d154f619fd2495a2cecad204276b1dc21174b55e4d0975edd" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "native-windows-gui" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f7003a669f68deb6b7c57d74fff4f8e533c44a3f0b297492440ef4ff5a28454" +dependencies = [ + "bitflags", + "lazy_static", + "newline-converter", + "plotters", + "plotters-backend", + "stretch", + "winapi", + "winapi-build", +] + +[[package]] +name = "newline-converter" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f71d09d5c87634207f894c6b31b6a2b2c64ea3bdcf71bd5599fdbbe1600c00f" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "nom" version = "7.1.3" @@ -360,6 +457,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + [[package]] name = "page_size" version = "0.6.0" @@ -413,6 +516,30 @@ dependencies = [ "sha2", ] +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + [[package]] name = "positioned-io" version = "0.3.5" @@ -424,6 +551,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + [[package]] name = "proc-macro2" version = "1.0.106" @@ -515,6 +651,22 @@ dependencies = [ "digest", ] +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "stretch" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b0dc6d20ce137f302edf90f9cd3d278866fd7fb139efca6f246161222ad6d87" +dependencies = [ + "lazy_static", + "libm", +] + [[package]] name = "svldcli" version = "0.1.0" @@ -523,6 +675,16 @@ dependencies = [ "libsvld", ] +[[package]] +name = "svldgui" +version = "0.1.0" +dependencies = [ + "can-dbc 9.1.0", + "libsvld", + "native-windows-derive", + "native-windows-gui", +] + [[package]] name = "syn" version = "1.0.109" @@ -571,6 +733,15 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + [[package]] name = "typenum" version = "1.20.0" @@ -589,6 +760,12 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + [[package]] name = "version_check" version = "0.9.5" @@ -604,6 +781,61 @@ dependencies = [ "rayon", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "winapi" version = "0.3.9" @@ -614,6 +846,12 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index 1641b98..e8002e0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ [workspace] resolver = "3" -members = ["libsvld", "svldcli"] +members = ["libsvld", "svldcli", "svldgui"] [profile.release] lto = "fat" @@ -15,7 +15,8 @@ panic = "abort" [profile.release-dbg] inherits = "release" -lto = "thin" +# lto = "thin" +lto = false opt-level = 3 debug = true diff --git a/svldgui/Cargo.toml b/svldgui/Cargo.toml new file mode 100644 index 0000000..6c450d0 --- /dev/null +++ b/svldgui/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "svldgui" +version = "0.1.0" +edition = "2024" + +[[bin]] +name = "svldgui" +test = false +bench = false + +[dependencies] +libsvld = { path = "../libsvld" } +native-windows-gui = { version = "1.0.13", features = ["file-dialog"] } +native-windows-derive = "1.0.5" +can-dbc = "9.1.0" diff --git a/svldgui/src/main.rs b/svldgui/src/main.rs new file mode 100644 index 0000000..e9248ad --- /dev/null +++ b/svldgui/src/main.rs @@ -0,0 +1,131 @@ +#![windows_subsystem = "windows"] + +extern crate native_windows_gui as nwg; +extern crate native_windows_derive as nwd; + +use std::{cell::RefCell, ffi::OsStr, fs, path::PathBuf}; + +use can_dbc::Dbc; +use nwd::NwgUi; +use nwg::NativeUi; + +#[derive(Default, NwgUi)] +pub struct BasicApp { + #[nwg_control(size: (800, 200), title: "Sane Vector Log Decoder", flags: "WINDOW|VISIBLE")] + #[nwg_events( OnWindowClose: [BasicApp::say_goodbye] )] + window: nwg::Window, + + #[nwg_layout(parent: window, spacing: 1)] + grid: nwg::GridLayout, + + #[nwg_resource(title: "Select DBC", action: nwg::FileDialogAction::Open, filters: "DBC(*.dbc)|Any(*.*)")] + dbc_dialog: nwg::FileDialog, + + #[nwg_resource(title: "Select ASC(s)", action: nwg::FileDialogAction::Open, multiselect: true, filters: "ASC(*.asc)|Any(*.*)")] + asc_dialog: nwg::FileDialog, + + #[nwg_resource(title: "Select output directory", action: nwg::FileDialogAction::OpenDirectory)] + out_dialog: nwg::FileDialog, + + #[nwg_control(readonly: true)] + #[nwg_layout_item(layout: grid, col: 1, row: 0, col_span: 2)] + dbc_file_name: nwg::TextInput, + + #[nwg_control(readonly: true)] + #[nwg_layout_item(layout: grid, col: 1, row: 1, col_span: 2)] + asc_file_names: nwg::TextInput, + + #[nwg_control(readonly: true)] + #[nwg_layout_item(layout: grid, col: 1, row: 2, col_span: 2)] + out_directory: nwg::TextInput, + + #[nwg_control(text: "Select DBC")] + #[nwg_layout_item(layout: grid, col: 0, row: 0)] + #[nwg_events( OnButtonClick: [BasicApp::pick_dbc] )] + dbc_button: nwg::Button, + + #[nwg_control(text: "Select ASC(s)")] + #[nwg_layout_item(layout: grid, col: 0, row: 1)] + #[nwg_events( OnButtonClick: [BasicApp::pick_asc] )] + asc_button: nwg::Button, + + #[nwg_control(text: "Select output dir")] + #[nwg_layout_item(layout: grid, col: 0, row: 2)] + #[nwg_events( OnButtonClick: [BasicApp::pick_out] )] + outdir_button: nwg::Button, + + #[nwg_control(text: "Zrób fikołka")] + #[nwg_layout_item(layout: grid, col: 0, row: 3, col_span: 3)] + #[nwg_events( OnButtonClick: [BasicApp::action] )] + action_button: nwg::Button, + + dbc_path: RefCell>, + asc_paths: RefCell>>, + out_path: RefCell>, +} + +impl BasicApp { + fn action(&self) { + let dbc_path = self.dbc_path.borrow(); + let asc_paths = self.asc_paths.borrow(); + let out_path = self.out_path.borrow(); + + if let Some(dbc_path) = dbc_path.as_ref() && + let Some(asc_paths) = asc_paths.as_ref() && + let Some(out_path) = out_path.as_ref() { + let dbc_data = fs::read_to_string(dbc_path).unwrap(); + let dbc = Dbc::try_from(dbc_data.as_str()).unwrap(); + for asc_path in asc_paths { + libsvld::decode(&dbc, asc_path, out_path.as_path()); + } + nwg::modal_info_message(&self.window, + "Okej", + "Finished!"); + } else { + nwg::modal_error_message(&self.window, + "ERROR", + "Select all the paths first, you idiot"); + } + } + + fn pick_dbc(&self) { + if self.dbc_dialog.run(Some(&self.window)) && + let Ok(file) = self.dbc_dialog.get_selected_item() { + *self.dbc_path.borrow_mut() = Some(file.clone().try_into().unwrap()); + self.dbc_file_name.set_text(&file.into_string().unwrap()); + } + } + + fn pick_asc(&self) { + println!("here"); + if self.asc_dialog.run(Some(&self.window)) && + let Ok(files) = self.asc_dialog.get_selected_items() { + *self.asc_paths.borrow_mut() = Some(files + .clone() + .iter() + .map(|x| x.try_into().unwrap()) + .collect()); + self.asc_file_names.set_text(&files.join(OsStr::new("; ")).into_string().unwrap()); + } + } + + fn pick_out(&self) { + if self.out_dialog.run(Some(&self.window)) && + let Ok(path) = self.out_dialog.get_selected_item() { + *self.out_path.borrow_mut() = Some(path.clone().try_into().unwrap()); + self.out_directory.set_text(&path.into_string().unwrap()); + } + } + + fn say_goodbye(&self) { + nwg::stop_thread_dispatch(); + } +} + +fn main() { + nwg::init().expect("Failed to init Native Windows GUI"); + nwg::Font::set_global_family("Segoe UI").expect("Failed to set default font"); + let _app = BasicApp::build_ui(Default::default()).expect("Failed to build UI"); + nwg::dispatch_thread_events(); +} +