From 2c503c992d4bb27f92059646c402571878b1c715 Mon Sep 17 00:00:00 2001 From: Dukantic Date: Sun, 13 Apr 2025 16:11:27 +0200 Subject: [PATCH] open file bu bug with 8 chars --- fonts/atwriter.ttf | Bin 44128 -> 0 bytes src/gui.rs | 67 +++++++++++++++++++----------- src/main.rs | 92 +++++++----------------------------------- src/read_and_write.rs | 90 +++++++++++++++++++++++++++++++++++++---- 4 files changed, 141 insertions(+), 108 deletions(-) delete mode 100644 fonts/atwriter.ttf diff --git a/fonts/atwriter.ttf b/fonts/atwriter.ttf deleted file mode 100644 index 41f9c33b4d932c11abb477826cefa5e34cc378b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44128 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 E3s&Fjy#N3J diff --git a/src/gui.rs b/src/gui.rs index 2d1fb60..327e824 100644 --- a/src/gui.rs +++ b/src/gui.rs @@ -1,7 +1,8 @@ use eframe::egui::{self}; -use eframe::epaint::text::{FontInsert, InsertFontFamily}; use std::fs::File; -use std::io::prelude::*; + +use crate::read_and_write; +use read_and_write::{is_valid_file, save_action, string_translate}; pub struct Omelt { file_name: String, @@ -11,42 +12,43 @@ pub struct Omelt { impl Omelt { pub fn new(file_name: &str, file: File) -> Self { - Self { + let mut out = Self { file_name: file_name.to_owned(), text: "".to_owned(), file: file, - } + }; + out.update_txt(); + out } pub fn update_txt(&mut self) { - let _ = self.file.read_to_string(&mut self.text); + if is_valid_file(&mut self.file) { + self.text = string_translate(&mut self.file); + } else { + println!("File is not valid"); + } } } -fn add_font(ctx: &egui::Context) { - ctx.add_font(FontInsert::new( - "atwriter", - egui::FontData::from_static(include_bytes!("../fonts/atwriter.ttf")), - vec![ - InsertFontFamily { - family: egui::FontFamily::Proportional, - priority: egui::epaint::text::FontPriority::Highest, - }, - InsertFontFamily { - family: egui::FontFamily::Monospace, - priority: egui::epaint::text::FontPriority::Lowest, - }, - ], - )) -} - impl eframe::App for Omelt { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { - self.update_txt(); - add_font(ctx); + let save = KeyboardShortcut::new(egui::Key::S, Modifiers::CTRL); ctx.set_zoom_factor(2.0); + ctx.input(|i| { + //eprintln!("i = {:?}", i); + if save.matches(i) { + let _ = save_action(&self.text, &mut self.file); + println!("save"); + } + }); egui::CentralPanel::default().show(ctx, |ui| { ui.heading(&self.file_name); + if ui.add(egui::Button::new("Click me")).clicked() { + let _ = self.file.set_len(0); + let _ = save_action(&self.text, &mut self.file); + eprintln!("self.text = {:?}", self.text); + } egui::ScrollArea::vertical().show(ui, |ui| { + //let visible_text = self.text.lines().take(100).collect::>().join("\n"); ui.add_sized( ui.available_size(), egui::TextEdit::multiline(&mut self.text), @@ -55,3 +57,20 @@ impl eframe::App for Omelt { }); } } +use egui::Modifiers; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +struct KeyboardShortcut { + key: egui::Key, + modifiers: Modifiers, +} + +impl KeyboardShortcut { + fn new(key: egui::Key, modifiers: Modifiers) -> Self { + Self { key, modifiers } + } + + fn matches(&self, input: &egui::InputState) -> bool { + input.key_down(self.key) && input.modifiers == self.modifiers + } +} diff --git a/src/main.rs b/src/main.rs index 416e5a4..6569777 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,20 +3,17 @@ use eframe::egui; use std::env; use std::fs::File; +use std::fs::OpenOptions; +use std::io::Write; use std::io::prelude::*; -use std::io::{Seek, SeekFrom}; mod byte_writer; mod gui; mod node; mod read_and_write; -use byte_writer::{binary_to_string, string_to_binary}; use gui::Omelt; -use node::{Node, create_tree, nodes_at_vec, read_tree, tree_to_map, tree_to_string}; -use read_and_write::{body_to_bin, get_map_file, is_valid_file, read_n_bytes}; - -const MAGIC_NUMBER: u8 = 128; +use read_and_write::{is_valid_file, save_action, string_translate}; fn main() -> std::io::Result<()> { let args: Vec = env::args().collect(); @@ -37,25 +34,11 @@ fn main() -> std::io::Result<()> { } else { after_compression = File::create(f + ".oeuf")?; } - let map = get_map_file(&to_compress)?; - let nodes = nodes_at_vec(map); - let mut tree = create_tree(nodes); - let (str_bin, chars) = tree_to_string(&mut tree); - let binary = string_to_binary(&str_bin); - let len_tree: u32 = str_bin.len() as u32; - let string: String = chars.iter().collect(); - after_compression.write_all(&MAGIC_NUMBER.to_be_bytes())?; - after_compression.write_all(&len_tree.to_be_bytes())?; - after_compression.write_all(&(string.len() as u32).to_be_bytes())?; - after_compression.write_all(&binary)?; - after_compression.write_all(string.as_bytes())?; - to_compress.seek(SeekFrom::Start(0))?; - let map = tree_to_map(&mut tree, true); - let trad = body_to_bin(&mut to_compress, map); - let trad_bin = string_to_binary(&trad); - let len_body = trad.len() as u32; - after_compression.write_all(&len_body.to_be_bytes())?; - after_compression.write_all(&trad_bin)?; + let mut txt = "".to_owned(); + to_compress.read_to_string(&mut txt)?; + eprintln!("txt = {:?}", txt); + save_action(&txt, &mut after_compression)?; + println!("Done.") } None => { println!("No file name!"); @@ -111,7 +94,12 @@ fn main() -> std::io::Result<()> { let _ = eframe::run_native( "Omelt", options, - Box::new(|_| Ok(Box::new(Omelt::new(&r, File::open(&r)?)))), + Box::new(|_| { + Ok(Box::new(Omelt::new( + &r, + OpenOptions::new().read(true).write(true).open(&r)?, + ))) + }), ); } } @@ -127,7 +115,7 @@ fn main() -> std::io::Result<()> { Box::new(|_| { Ok(Box::new(Omelt::new( "new_file.oeuf", - File::create("new_file.oeuf")?, + File::create_new("new_file.oeuf")?, ))) }), ); @@ -142,53 +130,3 @@ fn display_options() { println!("--uncompress, -u [] To uncompress a file."); println!("--print ,-p To print a file compressed."); } - -fn string_translate(file: &mut File) -> String { - let mut buffer = [0u8; 4]; - let _ = file.read_exact(&mut buffer); - let len_tree = u32::from_be_bytes(buffer); - let _ = file.read_exact(&mut buffer); - let len_chars = u32::from_be_bytes(buffer) * 8; - - let tree_bin = read_n_bytes(file, len_tree); - let tree_str = binary_to_string(tree_bin, len_tree); - - let chars_bin = read_n_bytes(file, len_chars); - let chars_str = String::from_utf8(chars_bin).unwrap(); - let root = read_tree(&tree_str, &chars_str.chars().collect()); - let _ = file.read_exact(&mut buffer); - let len_body = u32::from_be_bytes(buffer); - translate_bin_char(file, root, len_body) -} - -fn translate_bin_char(file: &mut File, root: Node, len: u32) -> String { - let mut txt = Vec::new(); - let mut translate = String::new(); - let mut current = &root; - - let _ = file.read_to_end(&mut txt); - let txt_str = binary_to_string(txt, len); - for b in txt_str.chars() { - match b { - '1' => { - if let Some(r) = ¤t.r { - current = r; - } - } - '0' => { - if let Some(l) = ¤t.l { - current = l; - } - } - _ => { - println!("Error !"); - return String::new(); - } - } - if let Some(v) = current.val { - translate.push(v); - current = &root; - } - } - translate -} diff --git a/src/read_and_write.rs b/src/read_and_write.rs index 9a740b3..3658d09 100644 --- a/src/read_and_write.rs +++ b/src/read_and_write.rs @@ -1,7 +1,15 @@ +use crate::byte_writer; use std::collections::HashMap; use std::fs::File; use std::io::prelude::*; +use std::io::{Seek, SeekFrom}; +use crate::node; +use byte_writer::*; +use eframe::Result; +use node::*; + +const MAGIC_NUMBER: u8 = 128; pub fn read_n_bytes(file: &mut File, len: u32) -> Vec { let mut n = 0; let mut out: Vec = Vec::new(); @@ -20,17 +28,39 @@ pub fn read_n_bytes(file: &mut File, len: u32) -> Vec { } out } +pub fn save_action(txt: &str, file: &mut File) -> Result<(), std::io::Error> { + file.seek(SeekFrom::Start(0))?; + let map = get_map_string(txt)?; + let nodes = nodes_at_vec(map); + let mut tree = create_tree(nodes); + let (str_bin, chars) = tree_to_string(&mut tree); + let binary = string_to_binary(&str_bin); + let len_tree: u32 = str_bin.len() as u32; + let string: String = chars.iter().collect(); + file.write_all(&MAGIC_NUMBER.to_be_bytes())?; + file.write_all(&len_tree.to_be_bytes())?; + file.write_all(&(string.len() as u32).to_be_bytes())?; + file.write_all(&binary)?; + file.write_all(string.as_bytes())?; -pub fn get_map_file(mut file: &File) -> Result, std::io::Error> { + let map = tree_to_map(&mut tree, true); + let trad = body_to_bin(&txt, map); + let trad_bin = string_to_binary(&trad); + let len_body = trad.len() as u32; + file.write_all(&len_body.to_be_bytes())?; + file.write_all(&trad_bin)?; + Ok(()) +} + +pub fn get_map_string(txt: &str) -> Result, std::io::Error> { let mut hashmap: HashMap = HashMap::new(); - let mut contents = String::new(); - file.read_to_string(&mut contents)?; - for c in contents.chars() { + for c in txt.chars() { let counter = hashmap.entry(c).or_insert(0); *counter += 1; } Ok(hashmap) } + pub fn is_valid_file(file: &mut File) -> bool { let mut mag_buf = [0u8]; let _ = file.read_exact(&mut mag_buf); @@ -39,11 +69,9 @@ pub fn is_valid_file(file: &mut File) -> bool { _ => false, } } -pub fn body_to_bin(file: &mut File, map: HashMap) -> String { - let mut txt = String::new(); +pub fn body_to_bin(txt: &str, map: HashMap) -> String { let mut translate = String::new(); - let _ = file.read_to_string(&mut txt); for c in txt.chars() { if let Some(code) = map.get(&c.to_string()) { translate.push_str(code); @@ -51,3 +79,51 @@ pub fn body_to_bin(file: &mut File, map: HashMap) -> String { } translate } +pub fn string_translate(file: &mut File) -> String { + let mut buffer = [0u8; 4]; + let _ = file.read_exact(&mut buffer); + let len_tree = u32::from_be_bytes(buffer); + let _ = file.read_exact(&mut buffer); + let len_chars = u32::from_be_bytes(buffer) * 8; + + let tree_bin = read_n_bytes(file, len_tree); + let tree_str = binary_to_string(tree_bin, len_tree); + + let chars_bin = read_n_bytes(file, len_chars); + let chars_str = String::from_utf8(chars_bin).unwrap(); + let root = read_tree(&tree_str, &chars_str.chars().collect()); + let _ = file.read_exact(&mut buffer); + let len_body = u32::from_be_bytes(buffer); + translate_bin_char(file, root, len_body) +} +pub fn translate_bin_char(file: &mut File, root: Node, len: u32) -> String { + let mut txt = Vec::new(); + let mut translate = String::new(); + let mut current = &root; + + let _ = file.read_to_end(&mut txt); + let txt_str = binary_to_string(txt, len); + for b in txt_str.chars() { + match b { + '1' => { + if let Some(r) = ¤t.r { + current = r; + } + } + '0' => { + if let Some(l) = ¤t.l { + current = l; + } + } + _ => { + println!("Error !"); + return String::new(); + } + } + if let Some(v) = current.val { + translate.push(v); + current = &root; + } + } + translate +}