Desktop: Persist document path (#3272)

* persist document path

* persist data cleanup
This commit is contained in:
Timon
2025-10-15 10:30:47 +00:00
committed by GitHub
parent 591096a817
commit 3509f0b035
5 changed files with 13 additions and 7 deletions
+3 -4
View File
@@ -6,14 +6,13 @@ pub(crate) struct PersistentData {
current_document: Option<DocumentId>, current_document: Option<DocumentId>,
#[serde(skip)] #[serde(skip)]
document_order: Option<Vec<DocumentId>>, document_order: Option<Vec<DocumentId>>,
preferences: Option<Preferences>,
} }
impl PersistentData { impl PersistentData {
pub(crate) fn write_document(&mut self, id: DocumentId, document: Document) { pub(crate) fn write_document(&mut self, id: DocumentId, document: Document) {
self.documents.write(id, document); self.documents.write(id, document);
if let Some(order) = &self.document_order { if let Some(order) = &self.document_order {
self.documents.force_order(order.clone()); self.documents.force_order(order);
} }
self.flush(); self.flush();
} }
@@ -171,10 +170,10 @@ impl DocumentStore {
}) })
} }
fn force_order(&mut self, desired_order: Vec<DocumentId>) { fn force_order(&mut self, desired_order: &Vec<DocumentId>) {
let mut ordered_prefix_len = 0; let mut ordered_prefix_len = 0;
for id in desired_order { for id in desired_order {
if let Some(offset) = self.0[ordered_prefix_len..].iter().position(|meta| meta.id == id) { if let Some(offset) = self.0[ordered_prefix_len..].iter().position(|meta| meta.id == *id) {
let found_index = ordered_prefix_len + offset; let found_index = ordered_prefix_len + offset;
if found_index != ordered_prefix_len { if found_index != ordered_prefix_len {
self.0[ordered_prefix_len..=found_index].rotate_right(1); self.0[ordered_prefix_len..=found_index].rotate_right(1);
@@ -81,7 +81,7 @@ pub(super) fn intercept_frontend_message(dispatcher: &mut DesktopWrapperMessageD
id: document_id, id: document_id,
document: Document { document: Document {
name: details.name, name: details.name,
path: None, path: details.path,
content: document, content: document,
is_saved: details.is_saved, is_saved: details.is_saved,
}, },
@@ -1,3 +1,5 @@
use std::path::PathBuf;
use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier;
use crate::messages::prelude::*; use crate::messages::prelude::*;
@@ -10,6 +12,7 @@ pub struct OpenDocument {
#[derive(PartialEq, Eq, Clone, Debug, serde::Serialize, serde::Deserialize, specta::Type)] #[derive(PartialEq, Eq, Clone, Debug, serde::Serialize, serde::Deserialize, specta::Type)]
pub struct DocumentDetails { pub struct DocumentDetails {
pub name: String, pub name: String,
pub path: Option<PathBuf>,
#[serde(rename = "isSaved")] #[serde(rename = "isSaved")]
pub is_saved: bool, pub is_saved: bool,
#[serde(rename = "isAutoSaved")] #[serde(rename = "isAutoSaved")]
@@ -1050,6 +1050,8 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
DocumentMessage::SavedDocument { path } => { DocumentMessage::SavedDocument { path } => {
self.path = path; self.path = path;
responses.add(PortfolioMessage::AutoSaveActiveDocument);
// Update the name to match the file stem // Update the name to match the file stem
let document_name_from_path = self.path.as_ref().and_then(|path| { let document_name_from_path = self.path.as_ref().and_then(|path| {
if path.extension().is_some_and(|e| e == FILE_EXTENSION) { if path.extension().is_some_and(|e| e == FILE_EXTENSION) {
@@ -196,6 +196,7 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
document: document.serialize_document(), document: document.serialize_document(),
details: DocumentDetails { details: DocumentDetails {
name: document.name.clone(), name: document.name.clone(),
path: document.path.clone(),
is_saved: document.is_saved(), is_saved: document.is_saved(),
is_auto_saved: document.is_auto_saved(), is_auto_saved: document.is_auto_saved(),
}, },
@@ -1054,9 +1055,10 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
self.documents.get(id).map(|document| OpenDocument { self.documents.get(id).map(|document| OpenDocument {
id: *id, id: *id,
details: DocumentDetails { details: DocumentDetails {
is_auto_saved: document.is_auto_saved(),
is_saved: document.is_saved(),
name: document.name.clone(), name: document.name.clone(),
path: document.path.clone(),
is_saved: document.is_saved(),
is_auto_saved: document.is_auto_saved(),
}, },
}) })
}) })