mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-12-23 10:11:54 +00:00
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
2 changed files with 50 additions and 26 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue