forked from 1b-agent/opencadstudio-upstream
Generate a small wire-raster thumbnail when saving a DWG and embed it via acadrust's preview API, so OCS drawings show a thumbnail in file browsers and other CAD applications. Read the embedded preview back cheaply (file header + preview bytes only, no full parse) to show a thumbnail per file in the Start page's Recent Documents panel. - io/thumbnail.rs: CPU rasterizer (current-layout wires -> BMP DIB) plus a preview-only reader/decoder (BMP/PNG -> iced handle) for the Start page. - Embedded on save via stamp_thumbnail on both save paths. - recent_thumbs cache filled on config load / recents change (never from a view); a thumbnail is drawn beside each recent file. Requires acadrust at 3111694 (preview read/write), already pinned in Cargo.lock. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
49 lines
1.9 KiB
Rust
49 lines
1.9 KiB
Rust
//! Recent-files list backing the Start page's Recent Documents panel. The list
|
|
//! itself lives in the consolidated app config (`settings.json`, the "recent"
|
|
//! section); this module just mutates the in-memory list and persists via
|
|
//! `save_config`.
|
|
|
|
use super::OpenCADStudio;
|
|
use std::path::{Path, PathBuf};
|
|
|
|
/// Bounds and default for how many recent files are kept.
|
|
pub(super) const RECENT_MIN: usize = 5;
|
|
pub(super) const RECENT_MAX: usize = 100;
|
|
pub(super) const RECENT_DEFAULT: usize = 20;
|
|
|
|
impl OpenCADStudio {
|
|
/// Record a freshly opened file at the top of the recents list.
|
|
pub(super) fn push_recent(&mut self, path: PathBuf) {
|
|
self.recent_files.retain(|r| r != &path);
|
|
self.recent_files.insert(0, path);
|
|
self.recent_files.truncate(self.recent_limit);
|
|
self.refresh_recent_thumbs();
|
|
self.save_config();
|
|
}
|
|
|
|
/// Decode any not-yet-cached DWG preview thumbnails for the current recents
|
|
/// (cheap preview-only reads). Cached per path; safe to call repeatedly.
|
|
/// Call when the recents list changes — never from a `view`.
|
|
pub(super) fn refresh_recent_thumbs(&mut self) {
|
|
for path in self.recent_files.clone() {
|
|
self.recent_thumbs
|
|
.entry(path.clone())
|
|
.or_insert_with(|| crate::io::thumbnail::read_handle(&path));
|
|
}
|
|
}
|
|
|
|
/// Drop a path from the recents list (manual removal from the Start page).
|
|
pub(super) fn remove_recent(&mut self, path: &Path) {
|
|
self.recent_files.retain(|r| r.as_path() != path);
|
|
self.save_config();
|
|
}
|
|
|
|
/// Set how many recent files are kept, trim the current list to fit, and
|
|
/// persist both.
|
|
pub(super) fn set_recent_limit(&mut self, limit: usize) {
|
|
self.recent_limit = limit.clamp(RECENT_MIN, RECENT_MAX);
|
|
self.recent_files.truncate(self.recent_limit);
|
|
self.save_config();
|
|
}
|
|
}
|