|
@@ -17,22 +17,51 @@ use std::{
|
|
|
time::{Duration, Instant},
|
|
|
};
|
|
|
use stretch2::{prelude::Size, Stretch};
|
|
|
+use tokio::sync::broadcast::Receiver;
|
|
|
use tui::{backend::CrosstermBackend, style::Style as TuiStyle, Terminal};
|
|
|
|
|
|
pub struct RinkContext {
|
|
|
- last_event: RefCell<Option<TermEvent>>,
|
|
|
- receiver: Rc<Cell<Option<UnboundedReceiver<TermEvent>>>>,
|
|
|
+ last_event: Rc<Cell<Option<TermEvent>>>,
|
|
|
+ subscribers: Rc<RefCell<HashMap<ScopeId, bool>>>,
|
|
|
}
|
|
|
|
|
|
impl RinkContext {
|
|
|
- pub fn new(receiver: UnboundedReceiver<TermEvent>) -> Self {
|
|
|
+ pub fn new(mut receiver: UnboundedReceiver<TermEvent>, cx: &ScopeState) -> Self {
|
|
|
+ let updater = cx.schedule_update_any();
|
|
|
+ let last_event = Rc::new(Cell::new(None));
|
|
|
+ let last_event2 = last_event.clone();
|
|
|
+ let subscribers = Rc::new(RefCell::new(HashMap::new()));
|
|
|
+ let subscribers2 = subscribers.clone();
|
|
|
+
|
|
|
+ cx.push_future(async move {
|
|
|
+ while let Some(evt) = receiver.next().await {
|
|
|
+ last_event2.replace(Some(evt));
|
|
|
+ for (subscriber, received) in subscribers2.borrow_mut().iter_mut() {
|
|
|
+ updater(*subscriber);
|
|
|
+ *received = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
Self {
|
|
|
- last_event: RefCell::new(None),
|
|
|
- receiver: Rc::new(Cell::new(Some(receiver))),
|
|
|
+ last_event: last_event,
|
|
|
+ subscribers: subscribers,
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
pub fn subscribe_to_events(&self, scope: ScopeId) {
|
|
|
- //
|
|
|
+ self.subscribers.borrow_mut().insert(scope, false);
|
|
|
+ }
|
|
|
+
|
|
|
+ pub fn get_event(&self, scope: ScopeId) -> Option<TermEvent> {
|
|
|
+ let mut subscribers = self.subscribers.borrow_mut();
|
|
|
+ let received = subscribers.get_mut(&scope)?;
|
|
|
+ if !*received {
|
|
|
+ *received = true;
|
|
|
+ self.last_event.get()
|
|
|
+ } else {
|
|
|
+ None
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -45,7 +74,7 @@ pub struct AppHandlerProps<'a> {
|
|
|
onmousedown: EventHandler<'a, MouseEvent>,
|
|
|
|
|
|
#[props(default)]
|
|
|
- onresize: Option<EventHandler<'a, (u16, u16)>>,
|
|
|
+ onresize: EventHandler<'a, (u16, u16)>,
|
|
|
}
|
|
|
|
|
|
/// This component lets you handle input events
|
|
@@ -64,38 +93,26 @@ pub fn InputHandler<'a>(cx: Scope<'a, AppHandlerProps<'a>>) -> Element {
|
|
|
// perhaps add some tracking to context?
|
|
|
rcx.subscribe_to_events(cx.scope_id());
|
|
|
|
|
|
- let mut rec = rcx.receiver.take().unwrap();
|
|
|
- let updater = cx.schedule_update();
|
|
|
- let rc2 = rcx.clone();
|
|
|
- cx.push_future(async move {
|
|
|
- while let Some(evt) = rec.next().await {
|
|
|
- rc2.last_event.borrow_mut().replace(evt);
|
|
|
- println!("{:?}", evt);
|
|
|
- updater();
|
|
|
- }
|
|
|
- //
|
|
|
- });
|
|
|
-
|
|
|
rcx
|
|
|
});
|
|
|
|
|
|
- if let Some(evet) = rcx.last_event.borrow().as_ref() {
|
|
|
- match evet {
|
|
|
- TermEvent::Key(key) => {
|
|
|
- cx.props.onkeydown.call(key.clone());
|
|
|
- // let mut handler = cx.props.keydown.borrow_mut();
|
|
|
- // handler(*key);
|
|
|
- // if let Some(handler) = cx.props.onkeydown {
|
|
|
- // handler(*key);
|
|
|
- // }
|
|
|
- }
|
|
|
- TermEvent::Mouse(mouse) => {
|
|
|
- cx.props.onmousedown.call(mouse.clone());
|
|
|
- }
|
|
|
- TermEvent::Resize(x, y) => {
|
|
|
- // if let Some(handler) = cx.props.onresize {
|
|
|
- // handler((*x, *y));
|
|
|
- // }
|
|
|
+ {
|
|
|
+ if let Some(evet) = rcx.get_event(cx.scope_id()) {
|
|
|
+ match evet {
|
|
|
+ TermEvent::Key(key) => {
|
|
|
+ cx.props.onkeydown.call(key.clone());
|
|
|
+ // let mut handler = cx.props.keydown.borrow_mut();
|
|
|
+ // handler(*key);
|
|
|
+ // if let Some(handler) = cx.props.onkeydown {
|
|
|
+ // handler(*key);
|
|
|
+ // }
|
|
|
+ }
|
|
|
+ TermEvent::Mouse(mouse) => {
|
|
|
+ cx.props.onmousedown.call(mouse.clone());
|
|
|
+ }
|
|
|
+ TermEvent::Resize(x, y) => {
|
|
|
+ cx.props.onresize.call((x, y));
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|