From 0dc61c4b16ee1b36d39b0283f3f00d910c92edfe Mon Sep 17 00:00:00 2001 From: Carl Date: Tue, 15 Aug 2023 20:56:42 +1200 Subject: [PATCH] Minimum working version This I would say is a minimum working version. It pretty much does what I want. I may not make a lot of other changes. I will cut a release and if I get not other suggestions, and don't find any bugs I'll probably bump this to 1.0 Updated release workflow to build for mac, and arm linux Added in an app icon (although it's crude, might want to get a better one) Added the ability add files and update the model accordingly --- .github/workflows/release.yml | 2 +- Cargo.toml | 3 +- assets/icons/logo.ico | Bin 0 -> 6833 bytes assets/icons/logo.png | Bin 0 -> 7256 bytes assets/icons/logo.svg | 273 ++++++++++++++++++++++++++++++++++ build.rs | 2 +- pv-unlocker.rc | 4 +- src/main.rs | 78 ++++++---- ui/appwindow.slint | 37 +---- 9 files changed, 334 insertions(+), 65 deletions(-) create mode 100644 assets/icons/logo.ico create mode 100644 assets/icons/logo.png create mode 100644 assets/icons/logo.svg diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 69f4d0e..a7ad591 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,7 +11,7 @@ jobs: strategy: fail-fast: false matrix: - target: [x86_64-pc-windows-gnu, x86_64-unknown-linux-musl] + target: [x86_64-pc-windows-gnu, x86_64-unknown-linux-musl, aarch64-unknown-linug-gnu, x86_64-apple-darwin] steps: - uses: actions/checkout@master - name: Compile and release diff --git a/Cargo.toml b/Cargo.toml index e56903b..f9c3144 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pv-unlocker" -version = "0.1.0" +version = "0.6.0" authors = ["Carl "] edition = "2021" build = "build.rs" @@ -13,6 +13,7 @@ ab_versions = {git = "https://github.com/Vadoola/ab_versions_rs.git"} clap = { version = "4.3", features = ["derive"] } rayon = "1.5" wild = "2.1" +rfd = { version = "0.11.4", default-features = false, features = ["xdg-portal"]} [build-dependencies] slint-build = "1.1" diff --git a/assets/icons/logo.ico b/assets/icons/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..f621446f867006358bb57264ad0c1abf22209aec GIT binary patch literal 6833 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 literal 0 HcmV?d00001 diff --git a/assets/icons/logo.png b/assets/icons/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5431e5aa31c42fb891e62c7d772fa4a6802f81be GIT binary patch literal 7256 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 O05v6T#Y%bWxBmuwG{E`* literal 0 HcmV?d00001 diff --git a/assets/icons/logo.svg b/assets/icons/logo.svg new file mode 100644 index 0000000..36b192d --- /dev/null +++ b/assets/icons/logo.svg @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Openclipart + + + Logic Controller HMI + 2012-12-05T10:48:18 + AN HMI Screen for a Programmable Logic Controller + https://openclipart.org/detail/173565/logic-controller-hmi-by-deusinvictus-173565 + + + deusinvictus + + + + + Automation + HMI + Ladder Logic + Logic Controller + PLC + + + + + + + + + + + diff --git a/build.rs b/build.rs index 5e083e0..2de477c 100644 --- a/build.rs +++ b/build.rs @@ -1,6 +1,6 @@ fn main() { #[cfg(windows)] windres::Build::new().compile("pv-unlocker.rc").unwrap(); - + slint_build::compile("ui/appwindow.slint").unwrap(); } diff --git a/pv-unlocker.rc b/pv-unlocker.rc index e6424b5..e0ead1f 100644 --- a/pv-unlocker.rc +++ b/pv-unlocker.rc @@ -1,2 +1,2 @@ -//exe-icon ICON "assets/icons/logo.ico" -//logo-icon ICON "assets/icons/logo.ico" \ No newline at end of file +exe-icon ICON "assets/icons/logo.ico" +logo-icon ICON "assets/icons/logo.ico" \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 4991a4a..d146557 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,52 +5,38 @@ //#![deny(clippy::cargo)] //#![deny(missing_docs)] -use std::borrow::BorrowMut; -use std::path::PathBuf; +use ab_versions::{get_version, is_protected, strip_protection}; use clap::Parser; use rayon::prelude::{IntoParallelRefIterator, ParallelIterator}; -use ab_versions::{get_version, is_protected, strip_protection}; -use slint::{ModelRc, VecModel, Model}; -use std::rc::Rc; -use std::collections::HashMap; +use rfd::FileDialog; +use slint::{Model, ModelRc, VecModel}; +use std::{borrow::BorrowMut, cell::RefCell, collections::HashMap, path::PathBuf, rc::Rc}; #[derive(Parser)] #[command(author, version, about, long_about = None)] struct Args { - files: Vec + files: Vec, } slint::include_modules!(); fn main() -> Result<(), slint::PlatformError> { let args = Args::parse_from(wild::args()); - let files: HashMap = args.files.into_iter().map(|pb| { - let name = pb.file_name().map(|name| name.to_string_lossy()).unwrap().to_string(); - (name, pb) - }).collect(); + let files = Rc::new(RefCell::new(process_paths(args.files))); let ui = AppWindow::new()?; let mut file_model = Rc::new(VecModel::default()); //if files were passed on the command line process them and add them to the UI model - if !files.is_empty() { - let info: Vec = files.par_iter().map(|(name, file)| { - file_info { - locked: is_protected(&file).unwrap(), - file_name: name.into(), - file_ver: get_version(&file).unwrap().to_string().into(), - } - }).collect(); - file_model.borrow_mut().extend(info.into_iter()); - } - + let info = get_file_info(&files.borrow()); + file_model.borrow_mut().extend(info.into_iter()); ui.set_files(ModelRc::from(file_model.clone())); let unlock_file_model = file_model.clone(); + let unlock_files = files.clone(); ui.on_unlock(move |file, idx| { - - if let Some(path) = files.get(&file.to_string()) { + if let Some(path) = unlock_files.borrow().get(&file.to_string()) { strip_protection(path).unwrap(); //After attempting to unlock it update the model with the new protected status @@ -59,9 +45,47 @@ fn main() -> Result<(), slint::PlatformError> { if let Some(mut row_data) = unlock_file_model.row_data(idx as usize) { row_data.locked = is_protected(&path).unwrap(); unlock_file_model.set_row_data(idx as usize, row_data); - }//else...hmm error updating the model?...what to do? - }//else display some sort of toast message with the error? + } //else...hmm error updating the model?...what to do? + } //else display some sort of toast message with the error? + }); + + let sel_file_model = file_model.clone(); + let mut sel_files = files.clone(); + ui.on_select_files(move || { + if let Some(new_files) = FileDialog::new() + .add_filter("FT View Files", &["mer", "MER", "apa", "APA"]) + .pick_files() + { + sel_files.borrow_mut().replace(process_paths(new_files)); + + sel_file_model.set_vec(get_file_info(&sel_files.borrow())); + } }); ui.run() -} \ No newline at end of file +} + +fn process_paths(files: Vec) -> HashMap { + files + .into_iter() + .map(|pb| { + let name = pb + .file_name() + .map(std::ffi::OsStr::to_string_lossy) + .unwrap() + .to_string(); + (name, pb) + }) + .collect() +} + +fn get_file_info(files: &HashMap) -> Vec { + files + .par_iter() + .map(|(name, file)| file_info { + locked: is_protected(&file).unwrap(), + file_name: name.into(), + file_ver: get_version(&file).unwrap().to_string().into(), + }) + .collect() +} diff --git a/ui/appwindow.slint b/ui/appwindow.slint index e236f72..6bc76cb 100644 --- a/ui/appwindow.slint +++ b/ui/appwindow.slint @@ -65,41 +65,11 @@ component FileInfo inherits HorizontalLayout { export component AppWindow inherits Window { min-height: 320px; min-width: 480px; - //in property<[file_info]> files; - in property<[file_info]> files : [ - { - locked: true, - file_name: "My File1.mer", - file_ver: "8.0", - }, - { - locked: true, - file_name: "My File2.mer", - file_ver: "12.0", - }, - { - locked: false, - file_name: "My File3.mer", - file_ver: "13.0", - }, - { - locked: false, - file_name: "My File4.mer", - file_ver: "8.12", - }, - { - locked: true, - file_name: "My File5.mer", - file_ver: "12.0", - }, - { - locked: false, - file_name: "My File6.mer", - file_ver: "12.0", - }, - ]; + icon: @image-url("../assets/icons/logo.png"); + in property<[file_info]> files; callback unlock(string, int); + callback select_files(); vl := VerticalLayout { ListView { @@ -110,6 +80,7 @@ export component AppWindow inherits Window { } Button { text: "Select Files"; + clicked => { select_files(); } } } }