Skip to content

Commit 7dfa5d4

Browse files
committed
Fix export dialogues showing
1 parent 7fcdad1 commit 7dfa5d4

File tree

12 files changed

+87
-169
lines changed

12 files changed

+87
-169
lines changed

editor/src/messages/dialog/dialog_message.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ pub enum DialogMessage {
88
ExportDialog(ExportDialogMessage),
99
#[child]
1010
NewDocumentDialog(NewDocumentDialogMessage),
11-
#[child]
12-
PreferencesDialog(PreferencesDialogMessage),
1311

1412
// Messages
1513
CloseAllDocumentsWithConfirmation,

editor/src/messages/dialog/dialog_message_handler.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::simple_dialogs::{self, AboutGraphiteDialog, ComingSoonDialog, DemoArtworkDialog, LicensesDialog};
1+
use super::simple_dialogs::{self, *};
22
use crate::messages::layout::utility_types::widget_prelude::*;
33
use crate::messages::prelude::*;
44

@@ -13,7 +13,6 @@ pub struct DialogMessageContext<'a> {
1313
pub struct DialogMessageHandler {
1414
export_dialog: ExportDialogMessageHandler,
1515
new_document_dialog: NewDocumentDialogMessageHandler,
16-
preferences_dialog: PreferencesDialogMessageHandler,
1716
}
1817

1918
#[message_handler_data]
@@ -24,7 +23,6 @@ impl MessageHandler<DialogMessage, DialogMessageContext<'_>> for DialogMessageHa
2423
match message {
2524
DialogMessage::ExportDialog(message) => self.export_dialog.process_message(message, responses, ExportDialogMessageContext { portfolio }),
2625
DialogMessage::NewDocumentDialog(message) => self.new_document_dialog.process_message(message, responses, ()),
27-
DialogMessage::PreferencesDialog(message) => self.preferences_dialog.process_message(message, responses, PreferencesDialogMessageContext { preferences }),
2826

2927
DialogMessage::CloseAllDocumentsWithConfirmation => {
3028
let dialog = simple_dialogs::CloseAllDocumentsDialog {
@@ -33,13 +31,13 @@ impl MessageHandler<DialogMessage, DialogMessageContext<'_>> for DialogMessageHa
3331
dialog.send_dialog_to_frontend(responses);
3432
}
3533
DialogMessage::CloseDialogAndThen { followups } => {
34+
// Since this message is "close dialog and then", the closing of the dialogue must happen first.
35+
// This is because processing may spawn another dialogue (e.g. the export dialogue may produce an error dialogue).
36+
responses.add(FrontendMessage::DisplayDialogDismiss);
37+
3638
for message in followups.into_iter() {
3739
responses.add(message);
3840
}
39-
40-
// This come after followups, so that the followups (which can cause the dialog to open) happen first, then we close it afterwards.
41-
// If it comes before, the dialog reopens (and appears to not close at all).
42-
responses.add(FrontendMessage::DisplayDialogDismiss);
4341
}
4442
DialogMessage::DisplayDialogError { title, description } => {
4543
let dialog = simple_dialogs::ErrorDialog { title, description };
@@ -105,8 +103,8 @@ impl MessageHandler<DialogMessage, DialogMessageContext<'_>> for DialogMessageHa
105103
self.new_document_dialog.send_dialog_to_frontend(responses);
106104
}
107105
DialogMessage::RequestPreferencesDialog => {
108-
self.preferences_dialog = PreferencesDialogMessageHandler {};
109-
self.preferences_dialog.send_dialog_to_frontend(responses, preferences);
106+
let dialog = PreferencesDialog { preferences };
107+
dialog.send_dialog_to_frontend(responses);
110108
}
111109
}
112110
}

editor/src/messages/dialog/export_dialog/export_dialog_message_handler.rs

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,22 @@ impl MessageHandler<ExportDialogMessage, ExportDialogMessageContext<'_>> for Exp
4343
ExportDialogMessage::TransparentBackground(transparent_background) => self.transparent_background = transparent_background,
4444
ExportDialogMessage::ExportBounds(export_area) => self.bounds = export_area,
4545

46-
ExportDialogMessage::Submit => responses.add_front(PortfolioMessage::SubmitDocumentExport {
47-
file_name: portfolio.active_document().map(|document| document.name.clone()).unwrap_or_default(),
48-
file_type: self.file_type,
49-
scale_factor: self.scale_factor,
50-
bounds: self.bounds,
51-
transparent_background: self.file_type != FileType::Jpg && self.transparent_background,
52-
}),
46+
ExportDialogMessage::Submit => {
47+
responses.add(FrontendMessage::DisplayDialogDismiss);
48+
responses.add(PortfolioMessage::SubmitDocumentExport {
49+
file_name: portfolio.active_document().map(|document| document.name.clone()).unwrap_or_default(),
50+
file_type: self.file_type,
51+
scale_factor: self.scale_factor,
52+
bounds: self.bounds,
53+
transparent_background: self.file_type != FileType::Jpg && self.transparent_background,
54+
});
55+
}
5356
}
5457

55-
self.send_dialog_to_frontend(responses);
58+
// Don't send the dialogue if the form was already submitted
59+
if message != ExportDialogMessage::Submit {
60+
self.send_dialog_to_frontend(responses);
61+
}
5662
}
5763

5864
advertise_actions! {ExportDialogUpdate;}
@@ -64,15 +70,7 @@ impl DialogLayoutHolder for ExportDialogMessageHandler {
6470

6571
fn layout_buttons(&self) -> Layout {
6672
let widgets = vec![
67-
TextButton::new("Export")
68-
.emphasized(true)
69-
.on_update(|_| {
70-
DialogMessage::CloseDialogAndThen {
71-
followups: vec![ExportDialogMessage::Submit.into()],
72-
}
73-
.into()
74-
})
75-
.widget_holder(),
73+
TextButton::new("Export").emphasized(true).on_update(|_| ExportDialogMessage::Submit.into()).widget_holder(),
7674
TextButton::new("Cancel").on_update(|_| FrontendMessage::DisplayDialogDismiss.into()).widget_holder(),
7775
];
7876

editor/src/messages/dialog/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ mod dialog_message_handler;
1010

1111
pub mod export_dialog;
1212
pub mod new_document_dialog;
13-
pub mod preferences_dialog;
1413
pub mod simple_dialogs;
1514

1615
#[doc(inline)]

editor/src/messages/dialog/new_document_dialog/new_document_dialog_message_handler.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,16 @@ pub struct NewDocumentDialogMessageHandler {
1414
#[message_handler_data]
1515
impl MessageHandler<NewDocumentDialogMessage, ()> for NewDocumentDialogMessageHandler {
1616
fn process_message(&mut self, message: NewDocumentDialogMessage, responses: &mut VecDeque<Message>, _: ()) {
17+
let mut dismiss = false;
18+
1719
match message {
1820
NewDocumentDialogMessage::Name(name) => self.name = name,
1921
NewDocumentDialogMessage::Infinite(infinite) => self.infinite = infinite,
2022
NewDocumentDialogMessage::DimensionsX(x) => self.dimensions.x = x as u32,
2123
NewDocumentDialogMessage::DimensionsY(y) => self.dimensions.y = y as u32,
2224
NewDocumentDialogMessage::Submit => {
25+
responses.add(FrontendMessage::DisplayDialogDismiss);
26+
dismiss = true;
2327
responses.add(PortfolioMessage::NewDocumentWithName { name: self.name.clone() });
2428

2529
let create_artboard = !self.infinite && self.dimensions.x > 0 && self.dimensions.y > 0;
@@ -41,7 +45,10 @@ impl MessageHandler<NewDocumentDialogMessage, ()> for NewDocumentDialogMessageHa
4145
}
4246
}
4347

44-
self.send_dialog_to_frontend(responses);
48+
// Don't send the dialogue if the form was already dismissed (this would reopen it)
49+
if !dismiss {
50+
self.send_dialog_to_frontend(responses);
51+
}
4552
}
4653

4754
advertise_actions! {NewDocumentDialogUpdate;}
@@ -53,15 +60,7 @@ impl DialogLayoutHolder for NewDocumentDialogMessageHandler {
5360

5461
fn layout_buttons(&self) -> Layout {
5562
let widgets = vec![
56-
TextButton::new("OK")
57-
.emphasized(true)
58-
.on_update(|_| {
59-
DialogMessage::CloseDialogAndThen {
60-
followups: vec![NewDocumentDialogMessage::Submit.into()],
61-
}
62-
.into()
63-
})
64-
.widget_holder(),
63+
TextButton::new("OK").emphasized(true).on_update(|_| NewDocumentDialogMessage::Submit.into()).widget_holder(),
6564
TextButton::new("Cancel").on_update(|_| FrontendMessage::DisplayDialogDismiss.into()).widget_holder(),
6665
];
6766

editor/src/messages/dialog/preferences_dialog/mod.rs

Lines changed: 0 additions & 7 deletions
This file was deleted.

editor/src/messages/dialog/preferences_dialog/preferences_dialog_message.rs

Lines changed: 0 additions & 7 deletions
This file was deleted.

editor/src/messages/dialog/simple_dialogs/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ mod coming_soon_dialog;
55
mod demo_artwork_dialog;
66
mod error_dialog;
77
mod licenses_dialog;
8+
mod preferences_dialog;
89

910
pub use about_graphite_dialog::AboutGraphiteDialog;
1011
pub use close_all_documents_dialog::CloseAllDocumentsDialog;
@@ -14,3 +15,4 @@ pub use demo_artwork_dialog::ARTWORK;
1415
pub use demo_artwork_dialog::DemoArtworkDialog;
1516
pub use error_dialog::ErrorDialog;
1617
pub use licenses_dialog::LicensesDialog;
18+
pub use preferences_dialog::PreferencesDialog;
Lines changed: 13 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,28 @@ use crate::messages::portfolio::document::utility_types::wires::GraphWireStyle;
44
use crate::messages::preferences::SelectionMode;
55
use crate::messages::prelude::*;
66

7-
#[derive(ExtractField)]
8-
pub struct PreferencesDialogMessageContext<'a> {
7+
pub struct PreferencesDialog<'a> {
98
pub preferences: &'a PreferencesMessageHandler,
109
}
1110

12-
/// A dialog to allow users to customize Graphite editor options
13-
#[derive(Debug, Clone, Default, ExtractField)]
14-
pub struct PreferencesDialogMessageHandler {}
15-
16-
#[message_handler_data]
17-
impl MessageHandler<PreferencesDialogMessage, PreferencesDialogMessageContext<'_>> for PreferencesDialogMessageHandler {
18-
fn process_message(&mut self, message: PreferencesDialogMessage, responses: &mut VecDeque<Message>, context: PreferencesDialogMessageContext) {
19-
let PreferencesDialogMessageContext { preferences } = context;
11+
impl<'a> DialogLayoutHolder for PreferencesDialog<'a> {
12+
const ICON: &'static str = "Settings";
13+
const TITLE: &'static str = "Editor Preferences";
2014

21-
match message {
22-
PreferencesDialogMessage::Confirm => {}
23-
}
15+
fn layout_buttons(&self) -> Layout {
16+
let widgets = vec![
17+
TextButton::new("OK").emphasized(true).on_update(|_| FrontendMessage::DisplayDialogDismiss.into()).widget_holder(),
18+
TextButton::new("Reset to Defaults").on_update(|_| PreferencesMessage::ResetToDefaults.into()).widget_holder(),
19+
];
2420

25-
self.send_dialog_to_frontend(responses, preferences);
21+
Layout::WidgetLayout(WidgetLayout::new(vec![LayoutGroup::Row { widgets }]))
2622
}
27-
28-
advertise_actions! {PreferencesDialogUpdate;}
2923
}
3024

31-
// This doesn't actually implement the `DialogLayoutHolder` trait like the other dialog message handlers.
32-
// That's because we need to give `send_layout` the `preferences` argument, which is not part of the trait.
33-
// However, it's important to keep the methods in sync with those from the trait for consistency.
34-
impl PreferencesDialogMessageHandler {
35-
const ICON: &'static str = "Settings";
36-
const TITLE: &'static str = "Editor Preferences";
25+
impl<'a> LayoutHolder for PreferencesDialog<'a> {
26+
fn layout(&self) -> Layout {
27+
let preferences = self.preferences;
3728

38-
fn layout(&self, preferences: &PreferencesMessageHandler) -> Layout {
3929
// ==========
4030
// NAVIGATION
4131
// ==========
@@ -221,58 +211,6 @@ impl PreferencesDialogMessageHandler {
221211
LayoutGroup::Row { widgets: vector_meshes },
222212
]))
223213
}
224-
225-
pub fn send_layout(&self, responses: &mut VecDeque<Message>, layout_target: LayoutTarget, preferences: &PreferencesMessageHandler) {
226-
responses.add(LayoutMessage::SendLayout {
227-
layout: self.layout(preferences),
228-
layout_target,
229-
})
230-
}
231-
232-
fn layout_column_2(&self) -> Layout {
233-
Layout::default()
234-
}
235-
236-
fn send_layout_column_2(&self, responses: &mut VecDeque<Message>, layout_target: LayoutTarget) {
237-
responses.add(LayoutMessage::SendLayout {
238-
layout: self.layout_column_2(),
239-
layout_target,
240-
});
241-
}
242-
243-
fn layout_buttons(&self) -> Layout {
244-
let widgets = vec![
245-
TextButton::new("OK")
246-
.emphasized(true)
247-
.on_update(|_| {
248-
DialogMessage::CloseDialogAndThen {
249-
followups: vec![PreferencesDialogMessage::Confirm.into()],
250-
}
251-
.into()
252-
})
253-
.widget_holder(),
254-
TextButton::new("Reset to Defaults").on_update(|_| PreferencesMessage::ResetToDefaults.into()).widget_holder(),
255-
];
256-
257-
Layout::WidgetLayout(WidgetLayout::new(vec![LayoutGroup::Row { widgets }]))
258-
}
259-
260-
fn send_layout_buttons(&self, responses: &mut VecDeque<Message>, layout_target: LayoutTarget) {
261-
responses.add(LayoutMessage::SendLayout {
262-
layout: self.layout_buttons(),
263-
layout_target,
264-
});
265-
}
266-
267-
pub fn send_dialog_to_frontend(&self, responses: &mut VecDeque<Message>, preferences: &PreferencesMessageHandler) {
268-
self.send_layout(responses, LayoutTarget::DialogColumn1, preferences);
269-
self.send_layout_column_2(responses, LayoutTarget::DialogColumn2);
270-
self.send_layout_buttons(responses, LayoutTarget::DialogButtons);
271-
responses.add(FrontendMessage::DisplayDialog {
272-
icon: Self::ICON.into(),
273-
title: Self::TITLE.into(),
274-
});
275-
}
276214
}
277215

278216
/// Maps display values (1-100) to actual zoom rates.

editor/src/messages/portfolio/document/document_message_handler.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
657657
return;
658658
}
659659

660-
let layers_to_move = self.network_interface.shallowest_unique_layers_sorted(&self.selection_network_path);
660+
let layers_to_move = self.network_interface.shallowest_unique_layers(&self.selection_network_path).collect::<Vec<_>>();
661661
// Offset the index for layers to move that are below another layer to move. For example when moving 1 and 2 between 3 and 4, 2 should be inserted at the same index as 1 since 1 is moved first.
662662
let layers_to_move_with_insert_offset = layers_to_move
663663
.iter()
@@ -712,7 +712,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
712712
}
713713
DocumentMessage::MoveSelectedLayersToGroup { parent } => {
714714
// Group all shallowest unique selected layers in order
715-
let all_layers_to_group_sorted = self.network_interface.shallowest_unique_layers_sorted(&self.selection_network_path);
715+
let all_layers_to_group_sorted = self.network_interface.shallowest_unique_layers(&self.selection_network_path).collect::<Vec<_>>();
716716

717717
for layer_to_group in all_layers_to_group_sorted.into_iter().rev() {
718718
responses.add(NodeGraphMessage::MoveLayerToStack {

0 commit comments

Comments
 (0)