diff --git a/text_editor/Cargo.toml b/text_editor/Cargo.toml index 7ee0c60..09e4513 100644 --- a/text_editor/Cargo.toml +++ b/text_editor/Cargo.toml @@ -20,4 +20,7 @@ windows = { version = "0.61.1", features = [ ] } serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" \ No newline at end of file +serde_json = "1.0" + +[package.metadata.bundle] +windows = ["msyh.ttf"] # 确保字体打包进安装程序 \ No newline at end of file diff --git a/text_editor/assets/fronts/msyh.ttf b/text_editor/msyh.ttf similarity index 100% rename from text_editor/assets/fronts/msyh.ttf rename to text_editor/msyh.ttf diff --git a/text_editor/src/app.rs b/text_editor/src/app.rs index a1a777e..d29fa5e 100644 --- a/text_editor/src/app.rs +++ b/text_editor/src/app.rs @@ -1,4 +1,5 @@ use eframe::egui; +use egui::{ScrollArea, TextEdit}; use serde_json::{Value, to_string_pretty}; use std::path::{Path, PathBuf}; use walkdir::WalkDir; @@ -8,97 +9,63 @@ pub struct TextEditorApp { files: Vec, selected_file: Option, file_content: String, + pending_selection: Option, // 新增字段用于延迟加载 } impl Default for TextEditorApp { fn default() -> Self { Self { - current_dir: String::from("C:\\"), // 默认目录 + current_dir: String::from("C:\\"), files: Vec::new(), selected_file: None, file_content: String::new(), + pending_selection: None, } } } impl eframe::App for TextEditorApp { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { - egui::TopBottomPanel::top("top_panel").show(ctx, |ui| { - ui.heading("轻量文本编辑器"); - }); - - egui::CentralPanel::default().show(ctx, |ui| { - ui.horizontal(|ui| { - // 左侧资源管理器面板 - egui::SidePanel::left("explorer_panel") - .resizable(true) - .default_width(200.0) - .show_inside(ui, |ui| { - ui.heading("资源管理器"); - - // 目录输入框 - ui.horizontal(|ui| { - ui.label("目录:"); - ui.text_edit_singleline(&mut self.current_dir); - if ui.button("加载").clicked() { - self.load_directory(); - } - }); - - // 文件列表 - egui::ScrollArea::vertical().show(ui, |ui| { - let mut clicked_file = None; - - for file in &self.files { - let display_name = file - .file_name() - .and_then(|n| n.to_str()) - .unwrap_or_default(); - - if ui - .selectable_label( - self.selected_file.as_ref() == Some(file), - display_name, - ) - .clicked() - { - clicked_file = Some(file.clone()); - } - } - - if let Some(file) = clicked_file { - self.selected_file = Some(file.clone()); - self.load_file_content(&file); - } - }); - }); - - // 右侧文本编辑面板 - egui::CentralPanel::default().show_inside(ui, |ui| { - ui.heading("文本编辑器"); - - // 文本编辑区域 - egui::ScrollArea::both().show(ui, |ui| { - ui.text_edit_multiline(&mut self.file_content); - }); + // 先处理待处理的文件选择 + if let Some(file_path) = self.pending_selection.take() { + self.selected_file = Some(file_path.clone()); + self.load_file_content(&file_path); + } - // 转换按钮 - ui.with_layout(egui::Layout::bottom_up(egui::Align::LEFT), |ui| { - ui.horizontal(|ui| { - if ui.button("转换为大写").clicked() { - self.convert_to_uppercase(); - } - if ui.button("转换为小写").clicked() { - self.convert_to_lowercase(); - } - if ui.button("格式化JSON").clicked() { - self.format_json(); - } - }); - }); + let available_height = ctx.available_rect().height() - 40.0; + + egui::SidePanel::left("resource_panel") + .resizable(false) + .default_width(200.0) + .show(ctx, |ui| { + ui.set_height(available_height); + ScrollArea::vertical().show(ui, |ui| { + ui.label("项目文件"); + ui.separator(); + + // 保存文件列表到临时变量避免借用冲突 + let files = self.files.clone(); + for file in files { + if ui.selectable_label( + self.selected_file.as_ref() == Some(&file), + file.file_name().unwrap().to_string_lossy() + ).clicked() { + // 不直接调用load方法,而是设置待处理选择 + self.pending_selection = Some(file); + } + } }); }); - }); + + egui::CentralPanel::default() + .frame(egui::Frame::NONE) + .show(ctx, |ui| { + TextEdit::multiline(&mut self.file_content) + .desired_width(f32::INFINITY) + .desired_rows((available_height / 20.0) as usize) + .font(egui::TextStyle::Monospace) + .show(ui); + }); } } @@ -142,7 +109,6 @@ impl TextEditorApp { } } Err(e) => { - // 可以在这里添加错误处理,比如显示错误消息 println!("JSON 格式化错误: {}", e); } } diff --git a/text_editor/src/main.rs b/text_editor/src/main.rs index 3730f63..9af9eed 100644 --- a/text_editor/src/main.rs +++ b/text_editor/src/main.rs @@ -1,41 +1,48 @@ mod app; + use app::TextEditorApp; use eframe::egui; fn main() -> eframe::Result<()> { let options = eframe::NativeOptions { - viewport: egui::ViewportBuilder::default() - .with_inner_size([1000.0, 600.0]) - .with_min_inner_size([400.0, 300.0]), + viewport: egui::ViewportBuilder::default().with_inner_size([1000.0, 600.0]), ..Default::default() }; eframe::run_native( - "轻量文本编辑器", + "文本编辑器", options, Box::new(|cc| { - // 使用系统字体 + // 1. 创建字体配置 let mut fonts = egui::FontDefinitions::default(); - // 添加中文字体 - fonts.font_data.insert( - "msyh".to_owned(), - egui::FontData::from_static(include_bytes!("C:\\Windows\\Fonts\\msyh.ttc")), - ); - - // 或者使用系统已安装的字体 - fonts - .families - .entry(egui::FontFamily::Proportional) - .or_default() - .insert(0, "Microsoft YaHei".to_owned()); - - fonts - .families - .entry(egui::FontFamily::Monospace) - .or_default() - .push("Microsoft YaHei".to_owned()); + // 2. 加载字体数据(确保文件存在) + if let Ok(font_data) = std::fs::read("msyh.ttf") { + fonts.font_data.insert( + "msyh".to_owned(), + egui::FontData::from_owned(font_data).into(), // 使用Arc包装 + ); + + // 3. 设置字体优先级 + fonts.families.insert( + egui::FontFamily::Proportional, + vec!["msyh".to_owned()], // 主字体 + ); + + // 保留默认字体作为后备 + fonts + .families + .get_mut(&egui::FontFamily::Proportional) + .unwrap() + .extend( + egui::FontDefinitions::default().families[&egui::FontFamily::Proportional] + .clone(), + ); + } else { + eprintln!("警告: 未找到msyh.ttf字体文件,使用默认字体"); + } + // 4. 应用字体配置 cc.egui_ctx.set_fonts(fonts); Ok(Box::new(TextEditorApp::default()))