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:
mfish33
2022-07-03 08:06:27 -06:00
committed by Keavon Chambers
co-authored by Keavon Chambers
parent c343aaa3ab
commit a6c91204d6
35 changed files with 634 additions and 451 deletions
@@ -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![]
}
}
+4 -1
View File
@@ -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
+2
View File
@@ -23,6 +23,8 @@ pub enum Message {
#[remain::unsorted]
NoOp,
#[child]
Broadcast(BroadcastMessage),
#[child]
Dialog(DialogMessage),
#[child]
Frontend(FrontendMessage),
+2
View File
@@ -1,3 +1,5 @@
pub mod broadcast_message;
pub mod broadcast_message_handler;
pub mod dispatcher;
pub mod message;
pub mod message_handler;