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:
@@ -17,6 +17,8 @@ pub struct AppConfig {
|
|||||||
pub high_contrast: bool,
|
pub high_contrast: bool,
|
||||||
pub large_text: bool,
|
pub large_text: bool,
|
||||||
pub reduced_motion: bool,
|
pub reduced_motion: bool,
|
||||||
|
pub history_max_entries: usize,
|
||||||
|
pub history_max_days: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for AppConfig {
|
impl Default for AppConfig {
|
||||||
@@ -36,6 +38,8 @@ impl Default for AppConfig {
|
|||||||
high_contrast: false,
|
high_contrast: false,
|
||||||
large_text: false,
|
large_text: false,
|
||||||
reduced_motion: false,
|
reduced_motion: false,
|
||||||
|
history_max_entries: 50,
|
||||||
|
history_max_days: 30,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -272,6 +272,32 @@ impl HistoryStore {
|
|||||||
self.write_all(&entries)
|
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>> {
|
pub fn list(&self) -> Result<Vec<HistoryEntry>> {
|
||||||
if !self.history_path.exists() {
|
if !self.history_path.exists() {
|
||||||
return Ok(Vec::new());
|
return Ok(Vec::new());
|
||||||
|
|||||||
@@ -1629,6 +1629,11 @@ fn show_results(
|
|||||||
output_files,
|
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
|
// Show toast
|
||||||
let savings = if result.total_input_bytes > 0 {
|
let savings = if result.total_input_bytes > 0 {
|
||||||
let pct =
|
let pct =
|
||||||
|
|||||||
@@ -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
|
// Save settings when the dialog closes
|
||||||
dialog.connect_closed(move |_| {
|
dialog.connect_closed(move |_| {
|
||||||
let new_config = AppConfig {
|
let new_config = AppConfig {
|
||||||
@@ -305,6 +309,8 @@ pub fn build_settings_dialog() -> adw::PreferencesDialog {
|
|||||||
high_contrast: contrast_row.is_active(),
|
high_contrast: contrast_row.is_active(),
|
||||||
large_text: large_text_row.is_active(),
|
large_text: large_text_row.is_active(),
|
||||||
reduced_motion: motion_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();
|
let store = ConfigStore::new();
|
||||||
|
|||||||
Reference in New Issue
Block a user