From 75455843ee4ca50e41e1b8cea194cb3fc387202e Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Fri, 24 Jan 2025 15:17:20 +0100 Subject: [PATCH] chore: add app icon --- installer.nsi | 1 + resources/icon.ico | Bin 0 -> 137750 bytes src/lib.rs | 5 +++-- ui/Cargo.toml | 8 ++++++-- ui/build.rs | 26 ++++++++++++++++++++++++++ ui/src/main.rs | 31 +++++++++++++++++++++++++++++-- 6 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 resources/icon.ico create mode 100644 ui/build.rs diff --git a/installer.nsi b/installer.nsi index 31c4d0d..fffd9c0 100644 --- a/installer.nsi +++ b/installer.nsi @@ -2,6 +2,7 @@ !define APP_NAME "Cert Tools" !define APP_EXE "cert-tools-ui.exe" +!define MUI_ICON "resources\icon.ico" !define UNINSTALLER_EXE "uninstaller.exe" !define INSTALL_DIR "$LocalAppData\Programs\${APP_NAME}" diff --git a/resources/icon.ico b/resources/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..624634b177d124aa4deb28c2113b1bff377eb6ca GIT binary patch literal 137750 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 TwP(Il95WaHSn++A6LawYSVm#g literal 0 HcmV?d00001 diff --git a/src/lib.rs b/src/lib.rs index 3381309..d9e254f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,18 +16,19 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -use std::cmp::Ordering; + +use itertools::Itertools; use openssl::asn1::Asn1Time; use openssl::hash::MessageDigest; use openssl::nid::Nid; use openssl::pkey::{PKey, PKeyRef, Public}; use openssl::x509::X509; +use std::cmp::Ordering; use std::fmt::Display; use std::fs; use std::hash::{Hash, Hasher}; use std::path::Path; use std::time::{SystemTime, UNIX_EPOCH}; -use itertools::Itertools; pub fn hex_encode>(s: T) -> String { s.as_ref() diff --git a/ui/Cargo.toml b/ui/Cargo.toml index 3b53ce1..7bd2235 100644 --- a/ui/Cargo.toml +++ b/ui/Cargo.toml @@ -5,6 +5,10 @@ edition = "2021" [dependencies] cert-tools = { path = "..", version = "*" } -iced = { version = "0.13", features = ["wgpu", "tiny-skia", "tokio", "web-colors"], default-features = false } +iced = { version = "0.13", features = ["wgpu", "tiny-skia", "tokio", "web-colors", "image"], default-features = false } rfd = "0.15" -itertools = "0.14" \ No newline at end of file +itertools = "0.14" +image = {version = "0.25", features = ["ico"], default-features = false } + +[build-dependencies] +winresource = "0.1" \ No newline at end of file diff --git a/ui/build.rs b/ui/build.rs new file mode 100644 index 0000000..bd85825 --- /dev/null +++ b/ui/build.rs @@ -0,0 +1,26 @@ +/* + * This file is part of cert-tools + * + * Copyright (C) 2025 the original author or authors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +fn main() { + if std::env::var_os("CARGO_CFG_WINDOWS").is_some() { + let mut res = winresource::WindowsResource::new(); + res.set_icon("../resources/icon.ico"); + res.compile().unwrap(); + } +} diff --git a/ui/src/main.rs b/ui/src/main.rs index d8545dc..4514c91 100644 --- a/ui/src/main.rs +++ b/ui/src/main.rs @@ -1,3 +1,22 @@ +/* + * This file is part of cert-tools + * + * Copyright (C) 2025 the original author or authors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #![windows_subsystem = "windows"] use cert_tools::{Chain, PrivateKey}; @@ -7,9 +26,10 @@ use iced::widget::{ self, button, column, container, horizontal_rule, horizontal_space, row, text, text_editor, text_input, Container, Scrollable, }; +use iced::window::icon; use iced::{ - alignment, application, clipboard, color, Background, Border, Color, Element, Font, Length, - Pixels, Settings, Size, Task, + alignment, application, clipboard, color, window, Background, Border, Color, Element, Font, + Length, Pixels, Settings, Size, Task, }; use std::fs; use std::path::PathBuf; @@ -21,6 +41,13 @@ fn main() -> iced::Result { default_text_size: Pixels::from(13), ..Settings::default() }) + .window(window::Settings { + icon: match image::load_from_memory(include_bytes!("../../resources/icon.ico")) { + Ok(image) => icon::from_rgba(image.as_bytes().to_vec(), 128, 128).ok(), + _ => None, + }, + ..window::Settings::default() + }) .resizable(false) .window_size(Size::new(1020.0, 800.0)) .run_with(Ui::new)