From 121c1b4a4e1d7d47fcf1da4aa3a68c6fdc932665 Mon Sep 17 00:00:00 2001 From: Penwing Date: Sun, 21 Jan 2024 10:24:16 +0100 Subject: [PATCH] added icon --- Cargo.lock | 166 +++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + assets/icon.png | Bin 0 -> 31233 bytes src/main.rs | 21 ++++-- src/tools/mod.rs | 19 ++++++ 5 files changed, 202 insertions(+), 5 deletions(-) create mode 100644 assets/icon.png diff --git a/Cargo.lock b/Cargo.lock index 08ca034..e9a89a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -433,6 +433,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + [[package]] name = "bitflags" version = "1.3.2" @@ -570,6 +576,7 @@ dependencies = [ "egui_code_editor", "egui_extras", "env_logger", + "image", "rfd", ] @@ -770,12 +777,37 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto-common" version = "0.1.6" @@ -942,6 +974,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + [[package]] name = "emath" version = "0.25.0" @@ -1098,6 +1136,22 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "exr" +version = "1.71.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "832a761f35ab3e6664babfbdc6cef35a4860e816ec3916dcfd0882954e98a8a8" +dependencies = [ + "bit_field", + "flume", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + [[package]] name = "fastrand" version = "1.9.0" @@ -1132,6 +1186,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "spin", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -1307,6 +1370,16 @@ dependencies = [ "wasi", ] +[[package]] +name = "gif" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gio-sys" version = "0.18.1" @@ -1447,6 +1520,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "half" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +dependencies = [ + "crunchy", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -1516,8 +1598,13 @@ dependencies = [ "bytemuck", "byteorder", "color_quant", + "exr", + "gif", + "jpeg-decoder", "num-traits", "png", + "qoi", + "tiff", ] [[package]] @@ -1592,6 +1679,15 @@ dependencies = [ "libc", ] +[[package]] +name = "jpeg-decoder" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" +dependencies = [ + "rayon", +] + [[package]] name = "js-sys" version = "0.3.67" @@ -1607,6 +1703,12 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + [[package]] name = "libc" version = "0.2.152" @@ -2079,6 +2181,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + [[package]] name = "quick-xml" version = "0.30.0" @@ -2139,6 +2250,26 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544" +[[package]] +name = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.3.5" @@ -2415,6 +2546,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -2516,6 +2656,17 @@ dependencies = [ "syn 2.0.48", ] +[[package]] +name = "tiff" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + [[package]] name = "tiny-skia" version = "0.11.3" @@ -2948,6 +3099,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "weezl" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" + [[package]] name = "winapi" version = "0.3.9" @@ -3458,6 +3615,15 @@ dependencies = [ "syn 2.0.48", ] +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + [[package]] name = "zvariant" version = "3.15.0" diff --git a/Cargo.toml b/Cargo.toml index f60cafe..fbda00b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,4 +14,5 @@ env_logger = { version = "0.10.1", default-features = false, features = [ rfd = "0.12.1" egui_extras = { version = "0.25.0" } egui_code_editor = "0.2.3" +image = "0.24.8" #syntect = "4.6" diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6e78cc8e1308680b2c260a916d506c6c29113392 GIT binary patch literal 31233 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끖V@fV+G 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 literal 0 HcmV?d00001 diff --git a/src/main.rs b/src/main.rs index a5f01b1..032d3e5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,7 @@ mod tools; use eframe::egui; use egui_code_editor::{CodeEditor, ColorTheme}; -use std::{path::Path, path::PathBuf, fs, io, env, cmp::max, cmp::min}; +use std::{path::Path, path::PathBuf, fs, io, env, cmp::max, cmp::min, sync::Arc}; const TERMINAL_HEIGHT : f32 = 200.0; const RED : egui::Color32 = egui::Color32::from_rgb(235, 108, 99); @@ -12,11 +12,14 @@ const HISTORY_LENGTH : usize = 2; fn main() -> Result<(), eframe::Error> { tools::loaded(); + + let icon_data = tools::load_icon(); + env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`). let options = eframe::NativeOptions { viewport: egui::ViewportBuilder::default() .with_inner_size([1200.0, 800.0]) - .with_drag_and_drop(true), + .with_icon(Arc::new(icon_data)), ..Default::default() }; eframe::run_native( @@ -55,6 +58,7 @@ impl eframe::App for Calcifer { if let Some(path) = self.save_tab() { println!("File saved successfully at: {:?}", path); self.tabs[self.selected_tab.to_n()].path = path; + self.tabs[self.selected_tab.to_n()].saved = true; } else { println!("File save failed."); } @@ -64,6 +68,7 @@ impl eframe::App for Calcifer { if let Some(path) = self.save_tab_as() { println!("File saved successfully at: {:?}", path); self.tabs[self.selected_tab.to_n()].path = path; + self.tabs[self.selected_tab.to_n()].saved = true; } else { println!("File save failed."); } @@ -128,7 +133,7 @@ impl Calcifer { ui.with_layout(egui::Layout::bottom_up(egui::Align::LEFT), |ui| { ui.label(""); ui.horizontal(|ui| { - ui.style_mut().visuals.extreme_bg_color = egui::Color32::from_hex("#101010").expect("Could not convert color"); + ui.style_mut().visuals.extreme_bg_color = egui::Color32::from_hex(self.theme.bg).expect("Could not convert color"); let Self { command, .. } = self; ui.label(format!("{}>", env::current_dir().expect("Could not find Shell Environnment").file_name().expect("Could not get Shell Environnment Name").to_string_lossy().to_string())); let response = ui.add(egui::TextEdit::singleline(command).desired_width(f32::INFINITY).lock_focus(true)); @@ -169,14 +174,20 @@ impl Calcifer { .resizable(false) .show(ctx, |ui| { ui.horizontal(|ui| { - ui.style_mut().visuals.selection.bg_fill = egui::Color32::from_hex("#b56524").expect("Could not convert color"); - ui.style_mut().visuals.hyperlink_color = egui::Color32::from_hex("#ffad69").expect("Could not convert color"); + ui.style_mut().visuals.selection.bg_fill = egui::Color32::from_hex(self.theme.functions).expect("Could not convert color"); + ui.style_mut().visuals.hyperlink_color = egui::Color32::from_hex(self.theme.functions).expect("Could not convert color"); for (index, tab) in self.tabs.clone().iter().enumerate() { let mut title = tab.get_name(); if !tab.saved { title += " ~"; } + if self.selected_tab == tools::TabNumber::from_n(index) { + ui.style_mut().visuals.override_text_color = Some(egui::Color32::from_hex(self.theme.bg).expect("Could not convert color")); + } ui.selectable_value(&mut self.selected_tab, tools::TabNumber::from_n(index), title); + + ui.style_mut().visuals.override_text_color = None; + if ui.link("X").clicked() { self.selected_tab = self.delete_tab(index); } diff --git a/src/tools/mod.rs b/src/tools/mod.rs index 7cf93bf..7470d0a 100644 --- a/src/tools/mod.rs +++ b/src/tools/mod.rs @@ -2,6 +2,7 @@ //use std::io; use std::{process::Command, cmp::Ordering, env, path::PathBuf}; use egui_code_editor::Syntax; +use eframe::egui::IconData; //use std::fs; pub mod themes; @@ -103,6 +104,24 @@ pub fn loaded() { println!("Tools loaded"); } +pub fn load_icon() -> IconData { + let (icon_rgba, icon_width, icon_height) = { + let icon = include_bytes!("../../assets/icon.png"); + let image = image::load_from_memory(icon) + .expect("Failed to open icon path") + .into_rgba8(); + let (width, height) = image.dimensions(); + let rgba = image.into_raw(); + (rgba, width, height) + }; + + IconData { + rgba: icon_rgba, + width: icon_width, + height: icon_height, + } +} + pub fn to_syntax(language : &str) -> Syntax { match language {