Add artboard names to the export dialog and make it recall its last settings
Closes #1883, closes #1884
This commit is contained in:
parent
a6af5d4831
commit
4d3e459f1f
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue