mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-30 22:38:11 +08:00
Event broadcasting system (#692)
* broadcast system implemented but not everywhere * unused types * code review with keavon * - optional signal mappings - tool.rs simplification * Cleanup * reduced code duplication in `tool.rs` * ran cargo fmt * code review changes * fix merge error Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
committed by
Keavon Chambers
co-authored by
Keavon Chambers
parent
c343aaa3ab
commit
a6c91204d6
@@ -0,0 +1,26 @@
|
||||
use crate::message_prelude::*;
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[impl_message(Message, Broadcast)]
|
||||
#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)]
|
||||
pub enum BroadcastMessage {
|
||||
SubscribeSignal {
|
||||
on: BroadcastSignal,
|
||||
send: Box<Message>,
|
||||
},
|
||||
UnsubscribeSignal {
|
||||
on: BroadcastSignal,
|
||||
message: Box<Message>,
|
||||
},
|
||||
#[child]
|
||||
TriggerSignal(BroadcastSignal),
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize, Hash)]
|
||||
#[impl_message(Message, BroadcastMessage, TriggerSignal)]
|
||||
pub enum BroadcastSignal {
|
||||
DocumentIsDirty,
|
||||
ToolAbort,
|
||||
SelectionChanged,
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
use crate::message_prelude::*;
|
||||
|
||||
use std::collections::HashMap;
|
||||
|
||||
#[derive(Debug, Clone, Default)]
|
||||
pub struct BroadcastMessageHandler {
|
||||
listeners: HashMap<BroadcastSignal, Vec<Message>>,
|
||||
}
|
||||
|
||||
impl MessageHandler<BroadcastMessage, ()> for BroadcastMessageHandler {
|
||||
fn process_action(&mut self, action: BroadcastMessage, _data: (), responses: &mut VecDeque<Message>) {
|
||||
use BroadcastMessage::*;
|
||||
match action {
|
||||
SubscribeSignal { on, send } => self.listeners.entry(on).or_default().push(*send),
|
||||
UnsubscribeSignal { on, message } => self.listeners.entry(on).or_default().retain(|msg| *msg != *message),
|
||||
TriggerSignal(signal) => {
|
||||
for message in self.listeners.entry(signal).or_default() {
|
||||
responses.push_front(message.clone())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn actions(&self) -> ActionList {
|
||||
vec![]
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
use super::broadcast_message_handler::BroadcastMessageHandler;
|
||||
use crate::document::PortfolioMessageHandler;
|
||||
use crate::global::GlobalMessageHandler;
|
||||
use crate::input::{InputMapperMessageHandler, InputPreprocessorMessageHandler};
|
||||
@@ -18,6 +19,7 @@ pub struct Dispatcher {
|
||||
#[remain::sorted]
|
||||
#[derive(Debug, Default)]
|
||||
struct DispatcherMessageHandlers {
|
||||
broadcast_message_handler: BroadcastMessageHandler,
|
||||
dialog_message_handler: DialogMessageHandler,
|
||||
global_message_handler: GlobalMessageHandler,
|
||||
input_mapper_message_handler: InputMapperMessageHandler,
|
||||
@@ -43,7 +45,7 @@ const SIDE_EFFECT_FREE_MESSAGES: &[MessageDiscriminant] = &[
|
||||
MessageDiscriminant::Frontend(FrontendMessageDiscriminant::UpdateActiveDocument),
|
||||
MessageDiscriminant::Frontend(FrontendMessageDiscriminant::UpdateOpenDocumentsList),
|
||||
MessageDiscriminant::Frontend(FrontendMessageDiscriminant::TriggerFontLoad),
|
||||
MessageDiscriminant::Tool(ToolMessageDiscriminant::DocumentIsDirty),
|
||||
MessageDiscriminant::Broadcast(BroadcastMessageDiscriminant::TriggerSignal(BroadcastSignalDiscriminant::DocumentIsDirty)),
|
||||
];
|
||||
|
||||
impl Dispatcher {
|
||||
@@ -85,6 +87,7 @@ impl Dispatcher {
|
||||
match message {
|
||||
#[remain::unsorted]
|
||||
NoOp => {}
|
||||
Broadcast(message) => self.message_handlers.broadcast_message_handler.process_action(message, (), &mut queue),
|
||||
Dialog(message) => {
|
||||
self.message_handlers
|
||||
.dialog_message_handler
|
||||
|
||||
@@ -23,6 +23,8 @@ pub enum Message {
|
||||
#[remain::unsorted]
|
||||
NoOp,
|
||||
#[child]
|
||||
Broadcast(BroadcastMessage),
|
||||
#[child]
|
||||
Dialog(DialogMessage),
|
||||
#[child]
|
||||
Frontend(FrontendMessage),
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
pub mod broadcast_message;
|
||||
pub mod broadcast_message_handler;
|
||||
pub mod dispatcher;
|
||||
pub mod message;
|
||||
pub mod message_handler;
|
||||
|
||||
Reference in New Issue
Block a user