Implement editor level future message handler (#4182)

* Implement proper editor level async message handler

* Take application_io and wake callback as Editor::new arguments

* Rename AsyncMessage -> FutureMessage

* add DesktopWrapperMessage::Wake

---------

Co-authored-by: Timon <me@timon.zip>
This commit is contained in:
Dennis Kobert
2026-05-31 21:26:29 +00:00
committed by GitHub
co-authored by Timon
parent 51427bef5f
commit 78679a5ba2
22 changed files with 261 additions and 82 deletions
@@ -1,7 +1,7 @@
use super::IconName;
use super::utility_types::{MouseCursorIcon, PersistedState};
use crate::messages::app_window::app_window_message_handler::AppWindowPlatform;
use crate::messages::frontend::utility_types::{DocumentInfo, EyedropperPreviewImage, FrontendMessageFuture};
use crate::messages::frontend::utility_types::{DocumentInfo, EyedropperPreviewImage};
use crate::messages::input_mapper::utility_types::misc::ActionShortcut;
use crate::messages::layout::utility_types::widget_prelude::*;
use crate::messages::portfolio::document::node_graph::utility_types::{
@@ -27,13 +27,6 @@ use crate::messages::portfolio::document::overlays::utility_types::OverlayContex
#[derive(derivative::Derivative, Clone, serde::Serialize, serde::Deserialize)]
#[derivative(Debug, PartialEq)]
pub enum FrontendMessage {
Await {
#[serde(skip, default)]
#[derivative(Debug = "ignore", PartialEq = "ignore")]
#[cfg_attr(feature = "wasm", tsify(type = "unknown"))]
future: FrontendMessageFuture,
},
// Display prefix: make the frontend show something, like a dialog
DisplayDialog {
title: String,
-1
View File
@@ -4,7 +4,6 @@ pub mod utility_types;
#[doc(inline)]
pub use frontend_message::{FrontendMessage, FrontendMessageDiscriminant};
pub use utility_types::FrontendMessageFuture;
// TODO: Make this an enum with the actual icon names, somehow derived from or tied to the frontend icon set.
// TODO: Then remove `#[widget_builder(string)]` from all icon fields.
@@ -1,7 +1,4 @@
use std::future::{Future, IntoFuture};
use std::path::PathBuf;
use std::pin::Pin;
use std::sync::{Arc, Mutex};
use graph_craft::application_io::resource::ResourceHash;
@@ -85,31 +82,3 @@ pub struct EyedropperPreviewImage {
pub width: u32,
pub height: u32,
}
#[derive(Clone, Default)]
pub struct FrontendMessageFuture {
inner: Arc<Mutex<Option<InnerFrontendMessageFuture>>>,
}
impl FrontendMessageFuture {
pub fn new(future: impl Future<Output = FrontendMessage> + Send + 'static) -> Self {
Self {
inner: Arc::new(Mutex::new(Some(Box::pin(future)))),
}
}
}
type InnerFrontendMessageFuture = Pin<Box<dyn Future<Output = FrontendMessage> + Send + 'static>>;
impl IntoFuture for FrontendMessageFuture {
type Output = FrontendMessage;
type IntoFuture = InnerFrontendMessageFuture;
fn into_future(self) -> Self::IntoFuture {
self.inner
.lock()
.unwrap_or_else(|poisoned| poisoned.into_inner())
.take()
.expect("FrontendMessageFuture can only be awaited once")
}
}