protected override IDisposable Run(IObserver <IObservable <TSource> > observer, IDisposable cancel, Action <IDisposable> setSink) { if (_scheduler == null) { var sink = new _(this, observer, cancel); setSink(sink); return(sink.Run()); } else if (_count > 0) { var sink = new BoundedWindowImpl(this, observer, cancel); setSink(sink); return(sink.Run()); } else { if (_timeSpan == _timeShift) { var sink = new TimeShiftImpl(this, observer, cancel); setSink(sink); return(sink.Run()); } else { var sink = new WindowImpl(this, observer, cancel); setSink(sink); return(sink.Run()); } } }
public Window(WindowImpl impl) { Impl = impl; }
public override void Update(GameTime gameTime) { base.Update(gameTime); var scene = Services.GetService <SceneSystem>(); Camera = scene.GraphicsCompositor.Cameras[0].Camera; if (Camera == null) { return; } all = ((IClassicDesktopStyleApplicationLifetime)Application.Current.ApplicationLifetime) .Windows.Select(w => (WindowImpl)w.PlatformImpl); if (!all.Any(w => w.IsVisible)) { return; } var modifiers = GetRawInputModifiers(); foreach (var _event in input.Events) { if (_event is PointerEvent pointerEvent) { if (pointerEvent.EventType == PointerEventType.Pressed) { var newFocusedWindow = Get2DWindow(lastMousePosition) ?? Get3DWindow(); if (focusedWindow != newFocusedWindow) { if (focusedWindow != null) { var tosave = focusedWindow; Dispatcher.UIThread.Post(() => { tosave.Deactivated?.Invoke(); tosave.LostFocus?.Invoke(); }, DispatcherPriority.Input); } focusedWindow = newFocusedWindow; if (focusedWindow != null) { var tosave = focusedWindow; Dispatcher.UIThread.Post(() => { tosave.Activated?.Invoke(); }, DispatcherPriority.Input); } } } if (pointerEvent.Device is IMouseDevice) { if (pointerEvent.EventType == PointerEventType.Moved) { lastMousePosition = pointerEvent.AbsolutePosition; CalculateRay(lastMousePosition); var newHoveredWindow = Get2DWindow(lastMousePosition) ?? Get3DWindow(); if (hoveredWindow != newHoveredWindow) { if (hoveredWindow != null) { var inputRoot = hoveredWindow.InputRoot; SendEvents(hoveredWindow, new RawPointerEventArgs(hoveredWindow.MouseDevice, Timestamp, inputRoot, RawPointerEventType.LeaveWindow, new Avalonia.Point(-1, -1), modifiers)); } hoveredWindow = newHoveredWindow; } if (hoveredWindow != null) { var position = ScreenToWindowPoint(hoveredWindow, pointerEvent.AbsolutePosition); var inputRoot = hoveredWindow.InputRoot; SendEvents(hoveredWindow, new RawPointerEventArgs(hoveredWindow.MouseDevice, Timestamp, inputRoot, RawPointerEventType.Move, position.ToAvalonia(), modifiers)); } } } } else if (_event is MouseButtonEvent mouseEvent && focusedWindow != null) { var position = ScreenToWindowPoint(focusedWindow, lastMousePosition); SendEvents(focusedWindow, new RawPointerEventArgs(focusedWindow.MouseDevice, Timestamp, focusedWindow.InputRoot, ToAvalonia(mouseEvent.Button, mouseEvent.IsDown), position.ToAvalonia(), modifiers)); }