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 => {
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);
}
}

View file

@ -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<ExportDialogMessage, ExportDialogMessageData<'_>> for ExportDialogMessageHandler {
fn process_message(&mut self, message: ExportDialogMessage, responses: &mut VecDeque<Message>, 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::<Vec<_>>()
})
.collect()];
.collect::<Vec<_>>();
if entries[1].is_empty() {
entries.remove(1);
}
let export_area = vec![
TextLabel::new("Bounds").table_align(true).min_width(100).widget_holder(),