mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-26 13:48:12 +08:00
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:
@@ -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,
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user