Desktop: Open file dialogs in the folder containing the document (#3934)

Desktop: Open save file dialogs in document parent folder
This commit is contained in:
Timon
2026-03-23 01:36:25 +00:00
committed by GitHub
parent 5b1e1cb2fb
commit 4a37ce4576
6 changed files with 35 additions and 19 deletions
@@ -89,10 +89,12 @@ pub enum FrontendMessage {
document_id: DocumentId,
name: String,
path: Option<PathBuf>,
folder: Option<PathBuf>,
content: serde_bytes::ByteBuf,
},
TriggerSaveFile {
name: String,
folder: Option<PathBuf>,
content: serde_bytes::ByteBuf,
},
TriggerExportImage {
@@ -835,26 +835,28 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
});
}
DocumentMessage::SaveDocument | DocumentMessage::SaveDocumentAs => {
if let DocumentMessage::SaveDocumentAs = message {
self.path = None;
responses.add(PortfolioMessage::AutoSaveActiveDocument);
let path = if let DocumentMessage::SaveDocumentAs = message { None } else { self.path.clone() };
if path.is_some() {
responses.add(DocumentMessage::MarkAsSaved);
}
self.set_save_state(true);
responses.add(PortfolioMessage::AutoSaveActiveDocument);
// Update the save status of the just saved document
responses.add(PortfolioMessage::UpdateOpenDocumentsList);
let folder = self.path.as_ref().and_then(|path| path.parent()).map(|parent| parent.to_path_buf());
responses.add(FrontendMessage::TriggerSaveDocument {
document_id,
name: format!("{}.{}", self.name.clone(), FILE_EXTENSION),
path: self.path.clone(),
path,
folder,
content: self.serialize_document().into_bytes().into(),
})
});
}
DocumentMessage::SavedDocument { path } => {
self.path = path;
responses.add(PortfolioMessage::AutoSaveActiveDocument);
responses.add(DocumentMessage::MarkAsSaved);
// Update the name to match the file stem
let document_name_from_path = self.path.as_ref().and_then(|path| {
@@ -485,9 +485,10 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
let name = path.file_stem().map(|n| n.to_string_lossy().to_string());
match Self::read_file(&path, content) {
FileContent::Document(content) => {
let document_path = if path.is_absolute() { Some(path) } else { None };
responses.add(PortfolioMessage::OpenDocumentFile {
document_name: name,
document_path: Some(path),
document_path,
document_serialized_content: content,
});
}