Browse Source

中文显示问题和控件高度问题解决。

master
hejl 2 months ago
parent
commit
0c3bce28c1
  1. 5
      text_editor/Cargo.toml
  2. 0
      text_editor/msyh.ttf
  3. 116
      text_editor/src/app.rs
  4. 53
      text_editor/src/main.rs

5
text_editor/Cargo.toml

@ -20,4 +20,7 @@ windows = { version = "0.61.1", features = [
] } ] }
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
[package.metadata.bundle]
windows = ["msyh.ttf"] # 确保字体打包进安装程序

0
text_editor/assets/fronts/msyh.ttf → text_editor/msyh.ttf

116
text_editor/src/app.rs

@ -1,4 +1,5 @@
use eframe::egui; use eframe::egui;
use egui::{ScrollArea, TextEdit};
use serde_json::{Value, to_string_pretty}; use serde_json::{Value, to_string_pretty};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use walkdir::WalkDir; use walkdir::WalkDir;
@ -8,97 +9,63 @@ pub struct TextEditorApp {
files: Vec<PathBuf>, files: Vec<PathBuf>,
selected_file: Option<PathBuf>, selected_file: Option<PathBuf>,
file_content: String, file_content: String,
pending_selection: Option<PathBuf>, // 新增字段用于延迟加载
} }
impl Default for TextEditorApp { impl Default for TextEditorApp {
fn default() -> Self { fn default() -> Self {
Self { Self {
current_dir: String::from("C:\\"), // 默认目录 current_dir: String::from("C:\\"),
files: Vec::new(), files: Vec::new(),
selected_file: None, selected_file: None,
file_content: String::new(), file_content: String::new(),
pending_selection: None,
} }
} }
} }
impl eframe::App for TextEditorApp { impl eframe::App for TextEditorApp {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
egui::TopBottomPanel::top("top_panel").show(ctx, |ui| { // 先处理待处理的文件选择
ui.heading("轻量文本编辑器"); if let Some(file_path) = self.pending_selection.take() {
}); self.selected_file = Some(file_path.clone());
self.load_file_content(&file_path);
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);
});
// 转换按钮 let available_height = ctx.available_rect().height() - 40.0;
ui.with_layout(egui::Layout::bottom_up(egui::Align::LEFT), |ui| {
ui.horizontal(|ui| { egui::SidePanel::left("resource_panel")
if ui.button("转换为大写").clicked() { .resizable(false)
self.convert_to_uppercase(); .default_width(200.0)
} .show(ctx, |ui| {
if ui.button("转换为小写").clicked() { ui.set_height(available_height);
self.convert_to_lowercase(); ScrollArea::vertical().show(ui, |ui| {
} ui.label("项目文件");
if ui.button("格式化JSON").clicked() { ui.separator();
self.format_json();
} // 保存文件列表到临时变量避免借用冲突
}); 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) => { Err(e) => {
// 可以在这里添加错误处理,比如显示错误消息
println!("JSON 格式化错误: {}", e); println!("JSON 格式化错误: {}", e);
} }
} }

53
text_editor/src/main.rs

@ -1,41 +1,48 @@
mod app; mod app;
use app::TextEditorApp; use app::TextEditorApp;
use eframe::egui; use eframe::egui;
fn main() -> eframe::Result<()> { fn main() -> eframe::Result<()> {
let options = eframe::NativeOptions { let options = eframe::NativeOptions {
viewport: egui::ViewportBuilder::default() viewport: egui::ViewportBuilder::default().with_inner_size([1000.0, 600.0]),
.with_inner_size([1000.0, 600.0])
.with_min_inner_size([400.0, 300.0]),
..Default::default() ..Default::default()
}; };
eframe::run_native( eframe::run_native(
"轻量文本编辑器", "文本编辑器",
options, options,
Box::new(|cc| { Box::new(|cc| {
// 使用系统字体 // 1. 创建字体配置
let mut fonts = egui::FontDefinitions::default(); let mut fonts = egui::FontDefinitions::default();
// 添加中文字体 // 2. 加载字体数据(确保文件存在)
fonts.font_data.insert( if let Ok(font_data) = std::fs::read("msyh.ttf") {
"msyh".to_owned(), fonts.font_data.insert(
egui::FontData::from_static(include_bytes!("C:\\Windows\\Fonts\\msyh.ttc")), "msyh".to_owned(),
); egui::FontData::from_owned(font_data).into(), // 使用Arc包装
);
// 或者使用系统已安装的字体
fonts // 3. 设置字体优先级
.families fonts.families.insert(
.entry(egui::FontFamily::Proportional) egui::FontFamily::Proportional,
.or_default() vec!["msyh".to_owned()], // 主字体
.insert(0, "Microsoft YaHei".to_owned()); );
fonts // 保留默认字体作为后备
.families fonts
.entry(egui::FontFamily::Monospace) .families
.or_default() .get_mut(&egui::FontFamily::Proportional)
.push("Microsoft YaHei".to_owned()); .unwrap()
.extend(
egui::FontDefinitions::default().families[&egui::FontFamily::Proportional]
.clone(),
);
} else {
eprintln!("警告: 未找到msyh.ttf字体文件,使用默认字体");
}
// 4. 应用字体配置
cc.egui_ctx.set_fonts(fonts); cc.egui_ctx.set_fonts(fonts);
Ok(Box::new(TextEditorApp::default())) Ok(Box::new(TextEditorApp::default()))

Loading…
Cancel
Save