95 lines
3.7 KiB
Rust
95 lines
3.7 KiB
Rust
use crate::communication::BuildMetadata;
|
|
use crate::document::PortfolioMessageHandler;
|
|
use crate::layout::{layout_message::LayoutTarget, widgets::PropertyHolder};
|
|
use crate::message_prelude::*;
|
|
|
|
use super::*;
|
|
|
|
#[derive(Debug, Default, Clone)]
|
|
pub struct DialogMessageHandler {
|
|
export_dialog: Export,
|
|
new_document_dialog: NewDocument,
|
|
}
|
|
|
|
impl MessageHandler<DialogMessage, (&BuildMetadata, &PortfolioMessageHandler)> for DialogMessageHandler {
|
|
#[remain::check]
|
|
fn process_action(&mut self, message: DialogMessage, (build_metadata, portfolio): (&BuildMetadata, &PortfolioMessageHandler), responses: &mut VecDeque<Message>) {
|
|
#[remain::sorted]
|
|
match message {
|
|
#[remain::unsorted]
|
|
DialogMessage::ExportDialog(message) => self.export_dialog.process_action(message, (), responses),
|
|
#[remain::unsorted]
|
|
DialogMessage::NewDocumentDialog(message) => self.new_document_dialog.process_action(message, (), responses),
|
|
|
|
DialogMessage::CloseAllDocumentsWithConfirmation => {
|
|
let dialog = dialogs::CloseAllDocuments;
|
|
dialog.register_properties(responses, LayoutTarget::DialogDetails);
|
|
responses.push_back(FrontendMessage::DisplayDialog { icon: "Copy".to_string() }.into());
|
|
}
|
|
DialogMessage::CloseDialogAndThen { followup } => {
|
|
responses.push_back(FrontendMessage::DisplayDialogDismiss.into());
|
|
responses.push_back(*followup);
|
|
}
|
|
DialogMessage::DisplayDialogError { title, description } => {
|
|
let dialog = dialogs::Error { title, description };
|
|
dialog.register_properties(responses, LayoutTarget::DialogDetails);
|
|
responses.push_back(FrontendMessage::DisplayDialog { icon: "Warning".to_string() }.into());
|
|
}
|
|
DialogMessage::RequestAboutGraphiteDialog => {
|
|
let about_graphite = AboutGraphite {
|
|
build_metadata: build_metadata.clone(),
|
|
};
|
|
about_graphite.register_properties(responses, LayoutTarget::DialogDetails);
|
|
responses.push_back(FrontendMessage::DisplayDialog { icon: "GraphiteLogo".to_string() }.into());
|
|
}
|
|
DialogMessage::RequestComingSoonDialog { issue } => {
|
|
let coming_soon = ComingSoon { issue };
|
|
coming_soon.register_properties(responses, LayoutTarget::DialogDetails);
|
|
responses.push_back(FrontendMessage::DisplayDialog { icon: "Warning".to_string() }.into());
|
|
}
|
|
DialogMessage::RequestExportDialog => {
|
|
let artboard_handler = &portfolio.active_document().artboard_message_handler;
|
|
let mut index = 0;
|
|
let artboards = artboard_handler
|
|
.artboard_ids
|
|
.iter()
|
|
.rev()
|
|
.filter_map(|&artboard| artboard_handler.artboards_graphene_document.layer(&[artboard]).ok().map(|layer| (artboard, layer)))
|
|
.map(|(artboard, layer)| {
|
|
(
|
|
artboard,
|
|
format!(
|
|
"Artboard: {}",
|
|
layer.name.clone().unwrap_or_else(|| {
|
|
index += 1;
|
|
format!("Untitled {index}")
|
|
})
|
|
),
|
|
)
|
|
})
|
|
.collect();
|
|
|
|
self.export_dialog = Export {
|
|
file_name: portfolio.active_document().name.clone(),
|
|
scale_factor: 1.,
|
|
artboards,
|
|
..Default::default()
|
|
};
|
|
self.export_dialog.register_properties(responses, LayoutTarget::DialogDetails);
|
|
responses.push_back(FrontendMessage::DisplayDialog { icon: "File".to_string() }.into());
|
|
}
|
|
DialogMessage::RequestNewDocumentDialog => {
|
|
self.new_document_dialog = NewDocument {
|
|
name: portfolio.generate_new_document_name(),
|
|
infinite: true,
|
|
dimensions: glam::UVec2::new(1920, 1080),
|
|
};
|
|
self.new_document_dialog.register_properties(responses, LayoutTarget::DialogDetails);
|
|
responses.push_back(FrontendMessage::DisplayDialog { icon: "File".to_string() }.into());
|
|
}
|
|
}
|
|
}
|
|
|
|
advertise_actions!(DialogMessageDiscriminant;RequestNewDocumentDialog,RequestExportDialog,CloseAllDocumentsWithConfirmation);
|
|
}
|