Add artboard names to the export dialog and make it recall its last settings

Closes #1883, closes #1884
This commit is contained in:
Keavon Chambers 2024-08-02 04:35:50 -07:00
parent a6af5d4831
commit 4d3e459f1f
2 changed files with 50 additions and 26 deletions

View File

@ -69,28 +69,23 @@ impl MessageHandler<DialogMessage, DialogMessageData<'_>> for DialogMessageHandl
} }
DialogMessage::RequestExportDialog => { DialogMessage::RequestExportDialog => {
if let Some(document) = portfolio.active_document() { if let Some(document) = portfolio.active_document() {
let mut index = 0;
let artboards = document let artboards = document
.metadata .metadata
.all_layers() .all_layers()
.filter(|&layer| document.metadata.is_artboard(layer)) .filter(|&layer| document.metadata.is_artboard(layer))
.map(|layer| { .map(|layer| {
( let name = document
layer, .network
format!("Artboard: {}", { .nodes
index += 1; .get(&layer.to_node())
format!("Untitled {index}") .and_then(|node| if node.alias.is_empty() { None } else { Some(node.alias.clone()) })
}), .unwrap_or_else(|| "Artboard".to_string());
) (layer, name)
}) })
.collect(); .collect();
self.export_dialog = ExportDialogMessageHandler { self.export_dialog.artboards = artboards;
scale_factor: 1., self.export_dialog.has_selection = document.selected_nodes.selected_layers(document.metadata()).next().is_some();
artboards,
has_selection: document.selected_nodes.selected_layers(document.metadata()).next().is_some(),
..Default::default()
};
self.export_dialog.send_dialog_to_frontend(responses); self.export_dialog.send_dialog_to_frontend(responses);
} }
} }

View File

@ -8,7 +8,7 @@ pub struct ExportDialogMessageData<'a> {
} }
/// A dialog to allow users to customize their file export. /// A dialog to allow users to customize their file export.
#[derive(Debug, Clone, Default)] #[derive(Debug, Clone)]
pub struct ExportDialogMessageHandler { pub struct ExportDialogMessageHandler {
pub file_type: FileType, pub file_type: FileType,
pub scale_factor: f64, pub scale_factor: f64,
@ -18,6 +18,19 @@ pub struct ExportDialogMessageHandler {
pub has_selection: bool, 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<ExportDialogMessage, ExportDialogMessageData<'_>> for ExportDialogMessageHandler { impl MessageHandler<ExportDialogMessage, ExportDialogMessageData<'_>> for ExportDialogMessageHandler {
fn process_message(&mut self, message: ExportDialogMessage, responses: &mut VecDeque<Message>, data: ExportDialogMessageData) { fn process_message(&mut self, message: ExportDialogMessage, responses: &mut VecDeque<Message>, data: ExportDialogMessageData) {
let ExportDialogMessageData { portfolio } = data; let ExportDialogMessageData { portfolio } = data;
@ -91,22 +104,38 @@ impl LayoutHolder for ExportDialogMessageHandler {
.widget_holder(), .widget_holder(),
]; ];
let artboards = self.artboards.iter().map(|(&layer, name)| (ExportBounds::Artboard(layer), name.to_string(), false)); let standard_bounds = vec![
let mut export_area_options = vec![
(ExportBounds::AllArtwork, "All Artwork".to_string(), false), (ExportBounds::AllArtwork, "All Artwork".to_string(), false),
(ExportBounds::Selection, "Selection".to_string(), !self.has_selection), (ExportBounds::Selection, "Selection".to_string(), !self.has_selection),
]; ];
export_area_options.extend(artboards); let artboards = self.artboards.iter().map(|(&layer, name)| (ExportBounds::Artboard(layer), name.to_string(), false)).collect();
let index = export_area_options.iter().position(|(val, _, _)| val == &self.bounds).unwrap(); let groups = [standard_bounds, artboards];
let entries = vec![export_area_options
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() .into_iter()
.map(|(val, name, disabled)| { .map(|group| {
MenuListEntry::new(format!("{val:?}")) group
.label(name) .into_iter()
.on_commit(move |_| ExportDialogMessage::ExportBounds(val).into()) .map(|(val, name, disabled)| {
.disabled(disabled) MenuListEntry::new(format!("{val:?}"))
.label(name)
.on_commit(move |_| ExportDialogMessage::ExportBounds(val).into())
.disabled(disabled)
})
.collect::<Vec<_>>()
}) })
.collect()]; .collect::<Vec<_>>();
if entries[1].is_empty() {
entries.remove(1);
}
let export_area = vec![ let export_area = vec![
TextLabel::new("Bounds").table_align(true).min_width(100).widget_holder(), TextLabel::new("Bounds").table_align(true).min_width(100).widget_holder(),