From a82fa6b7b6bb83800f80856b67618194123bbe35 Mon Sep 17 00:00:00 2001 From: Developer Date: Thu, 14 May 2026 22:50:01 +0800 Subject: [PATCH] fix(styling): fullscreen kraft paper bg, persistence preset refresh, reader cleanup --- .cargo/config.toml | 4 ++++ src/app.rs | 46 ++++++++++++++++++++++++++++++++-------------- src/persistence.rs | 16 ++++++++++++++-- src/reader.rs | 20 ++++++-------------- 4 files changed, 56 insertions(+), 30 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index 8ec9022..18b9e99 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,2 +1,6 @@ [target.x86_64-pc-windows-gnu] rustflags = ["-C", "target-feature=+crt-static"] +linker = "x86_64-w64-mingw32-gcc" + +[env] +CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER = "x86_64-w64-mingw32-gcc" diff --git a/src/app.rs b/src/app.rs index 3cfeb57..641bec3 100644 --- a/src/app.rs +++ b/src/app.rs @@ -178,6 +178,26 @@ impl App { impl eframe::App for App { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + let use_kraft = self.settings.use_kraft_bg; + + // 牛皮纸模式:全窗口绘制纹理 + 面板透明 + if use_kraft { + if let Some(texture) = &self.kraft_texture { + ctx.style_mut(|s| { + s.visuals.panel_fill = egui::Color32::TRANSPARENT; + s.visuals.window_fill = egui::Color32::TRANSPARENT; + s.visuals.faint_bg_color = egui::Color32::TRANSPARENT; + }); + let viewport_rect = + ctx.input(|i| i.screen_rect()); + crate::texture::draw_tiled_bg( + &ctx.layer_painter(egui::LayerId::background()), + viewport_rect, + texture, + ); + } + } + if self.state.book.is_none() { self.welcome_view(ctx); return; @@ -190,24 +210,22 @@ impl eframe::App for App { let mut style = self.active_profile().clone(); let theme_copy = self.settings.theme; - let use_kraft = self.settings.use_kraft_bg; let profile_names: Vec = self.settings.profiles.iter().map(|p| p.name.clone()).collect(); egui::CentralPanel::default().show(ctx, |ui| { let book = self.state.book.as_mut().unwrap(); - let action = crate::reader::reading_view( - ui, - book, - &mut self.state.current_section, - &mut self.state.current_page, - &mut self.state.sidebar_open, - &mut style, - &theme_copy, - &file_path, - self.kraft_texture.as_ref(), - use_kraft, - &profile_names, - ); +let action = crate::reader::reading_view( + ui, + book, + &mut self.state.current_section, + &mut self.state.current_page, + &mut self.state.sidebar_open, + &mut style, + &theme_copy, + use_kraft, + &file_path, + &profile_names, + ); if action.go_back { self.save_reading_position(); diff --git a/src/persistence.rs b/src/persistence.rs index 73e38a3..e384fb2 100644 --- a/src/persistence.rs +++ b/src/persistence.rs @@ -25,8 +25,20 @@ pub fn load_settings(dir: &Path) -> Result { let path = dir.join(SETTINGS_FILE); let json = std::fs::read_to_string(&path) .map_err(|e| format!("读取设置失败: {}", e))?; - serde_json::from_str(&json) - .map_err(|e| format!("解析设置失败: {}", e)) + let mut settings: Settings = serde_json::from_str(&json) + .map_err(|e| format!("解析设置失败: {}", e))?; + // Always refresh profiles from code-defined presets so that updated + // preset values (font size, spacing, etc.) take effect even when + // an older settings.json is present on disk. + let preset_names: Vec = crate::style::StyleProfile::presets() + .iter() + .map(|p| p.name.clone()) + .collect(); + settings.profiles = crate::style::StyleProfile::presets(); + if !preset_names.contains(&settings.active_profile) { + settings.active_profile = "Kindle 默认".into(); + } + Ok(settings) } #[cfg(test)] diff --git a/src/reader.rs b/src/reader.rs index 04ec06c..c2082d9 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -39,9 +39,8 @@ pub fn reading_view( sidebar_open: &mut bool, style: &mut StyleProfile, theme: &Theme, - _file_path: &str, - kraft_texture: Option<&egui::TextureHandle>, use_kraft_bg: bool, + _file_path: &str, profile_names: &[String], ) -> ReaderAction { let mut action = ReaderAction { @@ -180,19 +179,12 @@ pub fn reading_view( }); }); - // --- Center text area --- - egui::CentralPanel::default().show_inside(ui, |ui| { - let available = ui.available_size(); - let (rect, response) = ui.allocate_at_least(available, egui::Sense::click()); +// --- Center text area --- + egui::CentralPanel::default().show_inside(ui, |ui| { + let available = ui.available_size(); + let (rect, response) = ui.allocate_at_least(available, egui::Sense::click()); - // Draw kraft paper background if enabled - if use_kraft_bg { - if let Some(tex) = kraft_texture { - crate::texture::draw_tiled_bg(ui.painter(), rect, tex); - } - } - - // Add reading margins (inset) + // Add reading margins (inset) let inset = 24.0; let text_rect = egui::Rect::from_min_size( egui::pos2(rect.min.x + inset, rect.min.y),