Add history pruning with configurable max entries and max days

- Add history_max_entries (default 50) and history_max_days (default 30)
  to AppConfig
- Add prune() method to HistoryStore that removes old entries by age
  and count limits
- Call prune after each history entry is added in the GUI
- Preserve history settings through settings dialog save/load cycle
This commit is contained in:
2026-03-06 15:22:17 +02:00
parent 5e83cb09ef
commit 1e3ffaadd3
4 changed files with 41 additions and 0 deletions

View File

@@ -17,6 +17,8 @@ pub struct AppConfig {
pub high_contrast: bool,
pub large_text: bool,
pub reduced_motion: bool,
pub history_max_entries: usize,
pub history_max_days: u32,
}
impl Default for AppConfig {
@@ -36,6 +38,8 @@ impl Default for AppConfig {
high_contrast: false,
large_text: false,
reduced_motion: false,
history_max_entries: 50,
history_max_days: 30,
}
}
}

View File

@@ -272,6 +272,32 @@ impl HistoryStore {
self.write_all(&entries)
}
pub fn prune(&self, max_entries: usize, max_days: u32) -> Result<()> {
let mut entries = self.list()?;
if entries.is_empty() {
return Ok(());
}
let now_secs = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
let cutoff_secs = now_secs.saturating_sub(max_days as u64 * 86400);
// Remove entries older than max_days
entries.retain(|e| {
e.timestamp.parse::<u64>().unwrap_or(0) >= cutoff_secs
});
// Trim to max_entries (keep the most recent)
if entries.len() > max_entries {
let start = entries.len() - max_entries;
entries = entries.split_off(start);
}
self.write_all(&entries)
}
pub fn list(&self) -> Result<Vec<HistoryEntry>> {
if !self.history_path.exists() {
return Ok(Vec::new());

View File

@@ -1629,6 +1629,11 @@ fn show_results(
output_files,
});
// Prune old history entries
let config_store = pixstrip_core::storage::ConfigStore::new();
let app_config = config_store.load().unwrap_or_default();
let _ = history.prune(app_config.history_max_entries, app_config.history_max_days);
// Show toast
let savings = if result.total_input_bytes > 0 {
let pct =

View File

@@ -271,6 +271,10 @@ pub fn build_settings_dialog() -> adw::PreferencesDialog {
});
}
// Preserve history settings from current config (not exposed in UI yet)
let hist_max_entries = config.history_max_entries;
let hist_max_days = config.history_max_days;
// Save settings when the dialog closes
dialog.connect_closed(move |_| {
let new_config = AppConfig {
@@ -305,6 +309,8 @@ pub fn build_settings_dialog() -> adw::PreferencesDialog {
high_contrast: contrast_row.is_active(),
large_text: large_text_row.is_active(),
reduced_motion: motion_row.is_active(),
history_max_entries: hist_max_entries,
history_max_days: hist_max_days,
};
let store = ConfigStore::new();