feat: add typography style system with profiles, alignment, line spacing, first-line indent

This commit is contained in:
Developer
2026-05-14 21:02:34 +08:00
parent d69229b1ca
commit 7d056e2670
5 changed files with 160 additions and 18 deletions

View File

@@ -1,5 +1,6 @@
use crate::book::Book;
use crate::persistence;
use crate::style::StyleProfile;
use crate::theme::{self, Settings};
use eframe::egui;
use std::path::PathBuf;
@@ -102,6 +103,12 @@ impl App {
let _ = persistence::save_settings(&self.settings_dir, &self.settings);
}
fn active_profile(&self) -> &StyleProfile {
let idx = self.settings.profiles.iter().position(|p| p.name == self.settings.active_profile);
let idx = idx.unwrap_or(0);
&self.settings.profiles[idx]
}
fn save_reading_position(&mut self) {
if let Some(ref path) = self.state.file_path {
let path_str = path.to_string_lossy().to_string();
@@ -181,6 +188,10 @@ impl eframe::App for App {
.map(|p| p.to_string_lossy().to_string())
.unwrap_or_default();
let mut style = self.active_profile().clone();
let theme_copy = self.settings.theme;
let use_kraft = self.settings.use_kraft_bg;
egui::CentralPanel::default().show(ctx, |ui| {
let book = self.state.book.as_mut().unwrap();
let action = crate::reader::reading_view(
@@ -189,11 +200,11 @@ impl eframe::App for App {
&mut self.state.current_section,
&mut self.state.current_page,
&mut self.state.sidebar_open,
&mut self.settings.font_size,
&self.settings.theme,
&mut style,
&theme_copy,
&file_path,
self.kraft_texture.as_ref(),
self.settings.use_kraft_bg,
use_kraft,
);
if action.go_back {
@@ -203,6 +214,14 @@ impl eframe::App for App {
self.state.current_page = 0;
}
if action.cycle_profile {
let idx = self.settings.profiles.iter()
.position(|p| p.name == self.settings.active_profile)
.unwrap_or(0);
let next = (idx + 1) % self.settings.profiles.len();
self.settings.active_profile = self.settings.profiles[next].name.clone();
}
if action.toggle_kraft_bg {
self.settings.use_kraft_bg = !self.settings.use_kraft_bg;
}
@@ -224,6 +243,18 @@ impl eframe::App for App {
}
});
// Sync style changes back to active profile (outside closure)
if let Some(p) = self.settings.profiles.iter_mut()
.find(|p| p.name == self.settings.active_profile)
{
p.font_size = style.font_size;
p.alignment = style.alignment;
p.line_spacing = style.line_spacing;
p.paragraph_spacing = style.paragraph_spacing;
p.first_line_indent = style.first_line_indent;
}
self.settings.font_size = style.font_size;
self.save_reading_position();
self.save_settings();
}