diff --git a/editor/src/messages/dialog/dialog_message_handler.rs b/editor/src/messages/dialog/dialog_message_handler.rs index 4f3d09ab..47f4dac3 100644 --- a/editor/src/messages/dialog/dialog_message_handler.rs +++ b/editor/src/messages/dialog/dialog_message_handler.rs @@ -69,28 +69,23 @@ impl MessageHandler> for DialogMessageHandl } DialogMessage::RequestExportDialog => { if let Some(document) = portfolio.active_document() { - let mut index = 0; let artboards = document .metadata .all_layers() .filter(|&layer| document.metadata.is_artboard(layer)) .map(|layer| { - ( - layer, - format!("Artboard: {}", { - index += 1; - format!("Untitled {index}") - }), - ) + let name = document + .network + .nodes + .get(&layer.to_node()) + .and_then(|node| if node.alias.is_empty() { None } else { Some(node.alias.clone()) }) + .unwrap_or_else(|| "Artboard".to_string()); + (layer, name) }) .collect(); - self.export_dialog = ExportDialogMessageHandler { - scale_factor: 1., - artboards, - has_selection: document.selected_nodes.selected_layers(document.metadata()).next().is_some(), - ..Default::default() - }; + self.export_dialog.artboards = artboards; + self.export_dialog.has_selection = document.selected_nodes.selected_layers(document.metadata()).next().is_some(); self.export_dialog.send_dialog_to_frontend(responses); } } diff --git a/editor/src/messages/dialog/export_dialog/export_dialog_message_handler.rs b/editor/src/messages/dialog/export_dialog/export_dialog_message_handler.rs index 90cebd9e..5c4d6b49 100644 --- a/editor/src/messages/dialog/export_dialog/export_dialog_message_handler.rs +++ b/editor/src/messages/dialog/export_dialog/export_dialog_message_handler.rs @@ -8,7 +8,7 @@ pub struct ExportDialogMessageData<'a> { } /// A dialog to allow users to customize their file export. -#[derive(Debug, Clone, Default)] +#[derive(Debug, Clone)] pub struct ExportDialogMessageHandler { pub file_type: FileType, pub scale_factor: f64, @@ -18,6 +18,19 @@ pub struct ExportDialogMessageHandler { pub has_selection: bool, } +impl Default for ExportDialogMessageHandler { + fn default() -> Self { + Self { + file_type: Default::default(), + scale_factor: 1., + bounds: Default::default(), + transparent_background: false, + artboards: Default::default(), + has_selection: false, + } + } +} + impl MessageHandler> for ExportDialogMessageHandler { fn process_message(&mut self, message: ExportDialogMessage, responses: &mut VecDeque, data: ExportDialogMessageData) { let ExportDialogMessageData { portfolio } = data; @@ -91,22 +104,38 @@ impl LayoutHolder for ExportDialogMessageHandler { .widget_holder(), ]; - let artboards = self.artboards.iter().map(|(&layer, name)| (ExportBounds::Artboard(layer), name.to_string(), false)); - let mut export_area_options = vec![ + let standard_bounds = vec![ (ExportBounds::AllArtwork, "All Artwork".to_string(), false), (ExportBounds::Selection, "Selection".to_string(), !self.has_selection), ]; - export_area_options.extend(artboards); - let index = export_area_options.iter().position(|(val, _, _)| val == &self.bounds).unwrap(); - let entries = vec![export_area_options + let artboards = self.artboards.iter().map(|(&layer, name)| (ExportBounds::Artboard(layer), name.to_string(), false)).collect(); + let groups = [standard_bounds, artboards]; + + let current_bounds = if !self.has_selection && self.bounds == ExportBounds::Selection { + ExportBounds::AllArtwork + } else { + self.bounds + }; + let index = groups.iter().flatten().position(|(bounds, _, _)| *bounds == current_bounds).unwrap(); + + let mut entries = groups .into_iter() - .map(|(val, name, disabled)| { - MenuListEntry::new(format!("{val:?}")) - .label(name) - .on_commit(move |_| ExportDialogMessage::ExportBounds(val).into()) - .disabled(disabled) + .map(|group| { + group + .into_iter() + .map(|(val, name, disabled)| { + MenuListEntry::new(format!("{val:?}")) + .label(name) + .on_commit(move |_| ExportDialogMessage::ExportBounds(val).into()) + .disabled(disabled) + }) + .collect::>() }) - .collect()]; + .collect::>(); + + if entries[1].is_empty() { + entries.remove(1); + } let export_area = vec![ TextLabel::new("Bounds").table_align(true).min_width(100).widget_holder(),