Skip to content

Commit 4a37ce4

Browse files
Desktop: Open file dialogs in the folder containing the document (#3934)
Desktop: Open save file dialogs in document parent folder
1 parent 5b1e1cb commit 4a37ce4

File tree

6 files changed

+35
-19
lines changed

6 files changed

+35
-19
lines changed

desktop/wrapper/src/intercept_frontend_message.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#[cfg(target_os = "macos")]
22
use graphite_editor::messages::layout::utility_types::layout_widget::LayoutTarget;
33
use graphite_editor::messages::prelude::FrontendMessage;
4-
use std::path::PathBuf;
54

65
use super::DesktopWrapperMessageDispatcher;
76
use super::messages::{DesktopFrontendMessage, Document, FileFilter, OpenFileDialogContext, SaveFileDialogContext};
@@ -25,15 +24,21 @@ pub(super) fn intercept_frontend_message(dispatcher: &mut DesktopWrapperMessageD
2524
context: OpenFileDialogContext::Import,
2625
});
2726
}
28-
FrontendMessage::TriggerSaveDocument { document_id, name, path, content } => {
27+
FrontendMessage::TriggerSaveDocument {
28+
document_id,
29+
name,
30+
path,
31+
folder,
32+
content,
33+
} => {
2934
let content = content.into_vec();
3035
if let Some(path) = path {
3136
dispatcher.respond(DesktopFrontendMessage::WriteFile { path, content });
3237
} else {
3338
dispatcher.respond(DesktopFrontendMessage::SaveFileDialog {
3439
title: "Save Document".to_string(),
3540
default_filename: name,
36-
default_folder: path.and_then(|p| p.parent().map(PathBuf::from)),
41+
default_folder: folder,
3742
filters: vec![FileFilter {
3843
name: "Graphite".to_string(),
3944
extensions: vec!["graphite".to_string()],
@@ -42,12 +47,12 @@ pub(super) fn intercept_frontend_message(dispatcher: &mut DesktopWrapperMessageD
4247
});
4348
}
4449
}
45-
FrontendMessage::TriggerSaveFile { name, content } => {
50+
FrontendMessage::TriggerSaveFile { name, folder, content } => {
4651
let content = content.into_vec();
4752
dispatcher.respond(DesktopFrontendMessage::SaveFileDialog {
4853
title: "Save File".to_string(),
4954
default_filename: name,
50-
default_folder: None,
55+
default_folder: folder,
5156
filters: Vec::new(),
5257
context: SaveFileDialogContext::File { content },
5358
});

desktop/wrapper/src/messages.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ pub(crate) use graphite_editor::messages::prelude::Message as EditorMessage;
55

66
pub use graphite_editor::messages::input_mapper::utility_types::input_keyboard::{Key, ModifierKeys};
77
pub use graphite_editor::messages::input_mapper::utility_types::input_mouse::{EditorMouseState as MouseState, EditorPosition as Position, MouseKeys};
8-
pub use graphite_editor::messages::prelude::InputPreprocessorMessage as InputMessage;
9-
108
pub use graphite_editor::messages::prelude::DocumentId;
9+
pub use graphite_editor::messages::prelude::InputPreprocessorMessage as InputMessage;
1110
pub use graphite_editor::messages::prelude::PreferencesMessageHandler as Preferences;
11+
1212
pub enum DesktopFrontendMessage {
1313
ToWeb(Vec<FrontendMessage>),
1414
OpenLaunchDocuments,

editor/src/messages/frontend/frontend_message.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,12 @@ pub enum FrontendMessage {
8989
document_id: DocumentId,
9090
name: String,
9191
path: Option<PathBuf>,
92+
folder: Option<PathBuf>,
9293
content: serde_bytes::ByteBuf,
9394
},
9495
TriggerSaveFile {
9596
name: String,
97+
folder: Option<PathBuf>,
9698
content: serde_bytes::ByteBuf,
9799
},
98100
TriggerExportImage {

editor/src/messages/portfolio/document/document_message_handler.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -835,26 +835,28 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
835835
});
836836
}
837837
DocumentMessage::SaveDocument | DocumentMessage::SaveDocumentAs => {
838-
if let DocumentMessage::SaveDocumentAs = message {
839-
self.path = None;
838+
responses.add(PortfolioMessage::AutoSaveActiveDocument);
839+
840+
let path = if let DocumentMessage::SaveDocumentAs = message { None } else { self.path.clone() };
841+
if path.is_some() {
842+
responses.add(DocumentMessage::MarkAsSaved);
840843
}
841844

842-
self.set_save_state(true);
843-
responses.add(PortfolioMessage::AutoSaveActiveDocument);
844-
// Update the save status of the just saved document
845-
responses.add(PortfolioMessage::UpdateOpenDocumentsList);
845+
let folder = self.path.as_ref().and_then(|path| path.parent()).map(|parent| parent.to_path_buf());
846846

847847
responses.add(FrontendMessage::TriggerSaveDocument {
848848
document_id,
849849
name: format!("{}.{}", self.name.clone(), FILE_EXTENSION),
850-
path: self.path.clone(),
850+
path,
851+
folder,
851852
content: self.serialize_document().into_bytes().into(),
852-
})
853+
});
853854
}
854855
DocumentMessage::SavedDocument { path } => {
855856
self.path = path;
856857

857858
responses.add(PortfolioMessage::AutoSaveActiveDocument);
859+
responses.add(DocumentMessage::MarkAsSaved);
858860

859861
// Update the name to match the file stem
860862
let document_name_from_path = self.path.as_ref().and_then(|path| {

editor/src/messages/portfolio/portfolio_message_handler.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,9 +485,10 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
485485
let name = path.file_stem().map(|n| n.to_string_lossy().to_string());
486486
match Self::read_file(&path, content) {
487487
FileContent::Document(content) => {
488+
let document_path = if path.is_absolute() { Some(path) } else { None };
488489
responses.add(PortfolioMessage::OpenDocumentFile {
489490
document_name: name,
490-
document_path: Some(path),
491+
document_path,
491492
document_serialized_content: content,
492493
});
493494
}

editor/src/node_graph_executor.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ impl NodeGraphExecutor {
332332

333333
if let Some(export_config) = execution_context.export_config {
334334
// Special handling for exporting the artwork
335-
self.process_export(node_graph_output, export_config, responses)?;
335+
self.process_export(node_graph_output, export_config, document, responses)?;
336336
} else {
337337
self.process_node_graph_output(node_graph_output, responses)?;
338338
}
@@ -435,7 +435,7 @@ impl NodeGraphExecutor {
435435
Ok(())
436436
}
437437

438-
fn process_export(&self, node_graph_output: TaggedValue, export_config: ExportConfig, responses: &mut VecDeque<Message>) -> Result<(), String> {
438+
fn process_export(&self, node_graph_output: TaggedValue, export_config: ExportConfig, document: &DocumentMessageHandler, responses: &mut VecDeque<Message>) -> Result<(), String> {
439439
let ExportConfig {
440440
file_type,
441441
name,
@@ -455,6 +455,7 @@ impl NodeGraphExecutor {
455455
_ => name,
456456
};
457457
let name = format!("{base_name}.{file_extension}");
458+
let folder = document.path.as_ref().and_then(|path| path.parent()).map(|parent| parent.to_path_buf());
458459

459460
match node_graph_output {
460461
TaggedValue::RenderOutput(RenderOutput {
@@ -464,6 +465,7 @@ impl NodeGraphExecutor {
464465
if file_type == FileType::Svg {
465466
responses.add(FrontendMessage::TriggerSaveFile {
466467
name,
468+
folder,
467469
content: svg.into_bytes().into(),
468470
});
469471
} else {
@@ -506,7 +508,11 @@ impl NodeGraphExecutor {
506508
}
507509
}
508510

509-
responses.add(FrontendMessage::TriggerSaveFile { name, content: encoded.into() });
511+
responses.add(FrontendMessage::TriggerSaveFile {
512+
name,
513+
folder,
514+
content: encoded.into(),
515+
});
510516
}
511517
_ => {
512518
return Err(format!("Incorrect render type for exporting to an SVG ({file_type:?}, {node_graph_output})"));

0 commit comments

Comments
 (0)