Ejemplo n.º 1
0
        /// <summary>
        /// Registers the given view on this thread.
        /// </summary>
        internal void RegisterView(IInputEnabledView view)
        {
            view.EnsureNotNull(nameof(view));

            m_commandQueue.Enqueue(() =>
            {
                List <IInputHandler> inputHandlers = InputHandlerFactory.CreateInputHandlersForView(view);
                if (inputHandlers == null)
                {
                    return;
                }
                if (inputHandlers.Count == 0)
                {
                    return;
                }

                // Deregister old input handlers if necessary
                if (m_viewInputHandlers.ContainsKey(view))
                {
                    List <IInputHandler> oldList = m_viewInputHandlers[view];
                    foreach (IInputHandler actOldInputHanlder in oldList)
                    {
                        actOldInputHanlder.Stop();
                    }
                    m_viewInputHandlers.Remove(view);
                }

                // Register new ones
                m_viewInputHandlers[view] = inputHandlers;
                foreach (IInputHandler actInputHandler in inputHandlers)
                {
                    actInputHandler.Start(view);
                }
            });
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Gets all possible GraphicsInputHandlers for the given view and camera types.
        /// </summary>
        /// <typeparam name="ViewType">Gets the type of the view.</typeparam>
        /// <param name="viewObject">The view for which to the input handlers.</param>
        public List <IInputHandler> GetInputHandler <ViewType>(IInputEnabledView viewObject)
            where ViewType : class
        {
            Type givenViewType = typeof(ViewType);

            return(GetInputHandler(givenViewType));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Gets all possible GraphicsInputHandlers for the given view and camera types.
        /// </summary>
        /// <typeparam name="TViewType">Gets the type of the view.</typeparam>
        /// <param name="viewObject">The view for which to the input handlers.</param>
        public List <IInputHandler> GetInputHandler <TViewType>(IInputEnabledView viewObject)
            where TViewType : class
        {
            var givenViewType = typeof(TViewType);

            return(this.GetInputHandler(givenViewType));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Starts input handling.
        /// </summary>
        /// <param name="viewObject">The view object (e. g. Direct3D11Canvas).</param>
        public void Start(IInputEnabledView viewObject)
        {
            m_painter = viewObject as SeeingSharpPanelPainter;
            if (m_painter == null)
            {
                throw new ArgumentException("Unable to handle given view object!");
            }

            m_viewInterface = m_painter as IInputEnabledView;
            if (m_viewInterface == null)
            {
                throw new ArgumentException("Unable to handle given view object!");
            }

            m_renderLoop = m_viewInterface.RenderLoop;
            if (m_renderLoop == null)
            {
                throw new ArgumentException("Unable to handle given view object!");
            }

            m_dispatcher = m_painter.Disptacher;
            if (m_dispatcher == null)
            {
                throw new ArgumentException("Unable to get CoreDisptacher from target panel!");
            }

            // Deligate start logic to UI thread
            m_dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                // Register all events
                m_painter.TargetPanel.PointerExited       += OnTargetPanel_PointerExited;
                m_painter.TargetPanel.PointerEntered      += OnTargetPanel_PointerEntered;
                m_painter.TargetPanel.PointerWheelChanged += OnTargetPanel_PointerWheelChanged;
                m_painter.TargetPanel.PointerPressed      += OnTargetPanel_PointerPressed;
                m_painter.TargetPanel.PointerReleased     += OnTargetPanel_PointerReleased;
                m_painter.TargetPanel.PointerMoved        += OnTargetPanel_PointerMoved;

                // Create the dummy button for focus management
                //  see posts on: https://social.msdn.microsoft.com/Forums/en-US/54e4820d-d782-45d9-a2b1-4e3a13340788/set-focus-on-swapchainpanel-control?forum=winappswithcsharp
                m_dummyButtonForFocus                     = new Button();
                m_dummyButtonForFocus.Content             = "Button";
                m_dummyButtonForFocus.Width               = 0;
                m_dummyButtonForFocus.Height              = 0;
                m_dummyButtonForFocus.HorizontalAlignment = HorizontalAlignment.Left;
                m_dummyButtonForFocus.VerticalAlignment   = VerticalAlignment.Top;
                m_dummyButtonForFocus.KeyDown            += OnDummyButtonForFocus_KeyDown;
                m_dummyButtonForFocus.KeyUp              += OnDummyButtonForFocus_KeyUp;
                m_dummyButtonForFocus.LostFocus          += OnDummyButtonForFocus_LostFocus;
                m_dummyButtonForFocus.GotFocus           += OnDummyButtonForFocus_GotFocus;
                m_painter.TargetPanel.Children.Add(m_dummyButtonForFocus);

                m_coreWindow          = CoreWindow.GetForCurrentThread();
                m_coreWindow.KeyDown += OnCoreWindow_KeyDown;
                m_coreWindow.KeyUp   += OnCoreWindow_KeyUp;

                // Set focus on the target
                m_dummyButtonForFocus.Focus(FocusState.Programmatic);
            }).FireAndForget();
        }
        /// <summary>
        /// Starts input handling.
        /// </summary>
        /// <param name="viewObject">The view object (e. g. Direct3D11Canvas).</param>
        public void Start(IInputEnabledView viewObject)
        {
            m_currentControl = viewObject as Control;
            if (m_currentControl == null)
            {
                IInputControlHost inputControlHost = viewObject as IInputControlHost;
                m_currentControl = inputControlHost?.GetWinFormsInputControl();
                if (m_currentControl == null)
                {
                    throw new ArgumentException("Unable to handle given view object!");
                }
            }

            m_focusHandler = viewObject as IInputEnabledView;
            if (m_focusHandler == null)
            {
                throw new ArgumentException("Unable to handle given view object!");
            }

            m_renderLoop = m_focusHandler.RenderLoop;
            if (m_renderLoop == null)
            {
                throw new ArgumentException("Unable to handle given view object!");
            }

            // Perform event registrations on UI thread
            viewObject.RenderLoop.UISynchronizationContext.PostAsync(() =>
            {
                if (m_currentControl == null)
                {
                    return;
                }

                m_currentControl.MouseEnter += OnMouseEnter;
                m_currentControl.MouseClick += OnMouseClick;
                m_currentControl.MouseUp    += OnMouseUp;
                m_currentControl.MouseDown  += OnMouseDown;
                m_currentControl.MouseLeave += OnMouseLeave;
                m_currentControl.MouseMove  += OnMouseMove;
                m_currentControl.MouseWheel += OnMouseWheel;
                m_currentControl.KeyUp      += OnKeyUp;
                m_currentControl.KeyDown    += OnKeyDown;
                m_currentControl.LostFocus  += OnLostFocus;
                m_currentControl.GotFocus   += OnGotFocus;

                // Handle initial focus state
                if (m_currentControl.Focused || m_currentControl.ContainsFocus)
                {
                    m_stateKeyboard.NotifyFocusGot();
                }
            }).FireAndForget();
        }
Ejemplo n.º 6
0
        public void Start(IInputEnabledView viewObject)
        {
            IReadOnlyList <Gamepad> gamepads = Gamepad.Gamepads;

            for (int loop = 0; loop < MAX_GAMEPAD_COUNT; loop++)
            {
                if (gamepads.Count >= loop)
                {
                    break;
                }
                m_gamepads[loop] = gamepads[loop];
            }

            Gamepad.GamepadAdded   += OnGamepad_GamepadAdded;
            Gamepad.GamepadRemoved += OnGamepad_GamepadRemoved;
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Deregisters the given view from this thread.
        /// </summary>
        internal void DeregisterView(IInputEnabledView view)
        {
            view.EnsureNotNull(nameof(view));

            m_commandQueue.Enqueue(() =>
            {
                if (m_viewInputHandlers.ContainsKey(view))
                {
                    List <IInputHandler> oldList = m_viewInputHandlers[view];
                    foreach (IInputHandler actOldInputHanlder in oldList)
                    {
                        actOldInputHanlder.Stop();
                    }
                    m_viewInputHandlers.Remove(view);
                }
            });
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Updates all currently active input handlers for the given view.
        /// </summary>
        /// <param name="viewObject">The object of the view control.</param>
        /// <param name="inputHandlers">The collection of input handlers managed by the view object.</param>
        /// <param name="renderLoop">The renderloop used by the view object.</param>
        /// <param name="currentlyDispsoing">Is the view currently disposing?</param>
        internal static void UpdateInputHandlerList(
            IInputEnabledView viewObject,
            List <IInputHandler> inputHandlers,
            RenderLoop renderLoop,
            bool currentlyDispsoing)
        {
            viewObject.EnsureNotNull(nameof(viewObject));
            inputHandlers.EnsureNotNull(nameof(inputHandlers));
            renderLoop.EnsureNotNull(nameof(renderLoop));

            // Clear previous input handlers
            if (inputHandlers.Count > 0)
            {
                foreach (var actHandler in inputHandlers)
                {
                    actHandler.Stop();
                }
                inputHandlers.Clear();
            }

            // Check whether this object is disposed
            if (currentlyDispsoing)
            {
                return;
            }

            // Check for other dependencies
            if ((renderLoop == null) ||
                (renderLoop.Camera == null))
            {
                return;
            }

            // Get all possible input handlers
            inputHandlers.AddRange(GraphicsCore.Current.InputHandlers.GetInputHandler(
                                       viewObject.GetType()));

            // Start them all
            foreach (var actInputHandler in inputHandlers)
            {
                actInputHandler.Start(viewObject);
            }
        }
        /// <summary>
        /// Starts input handling.
        /// </summary>
        /// <param name="viewObject">The view object (e. g. Direct3D11Canvas).</param>
        public void Start(IInputEnabledView viewObject)
        {
            m_painter = viewObject as SeeingSharpCoreWindowPainter;
            if (m_painter == null)
            {
                throw new ArgumentException("Unable to handle given view object!");
            }

            m_viewInterface = m_painter as IInputEnabledView;
            if (m_viewInterface == null)
            {
                throw new ArgumentException("Unable to handle given view object!");
            }

            m_renderLoop = m_viewInterface.RenderLoop;
            if (m_renderLoop == null)
            {
                throw new ArgumentException("Unable to handle given view object!");
            }

            m_dispatcher = m_painter.Disptacher;
            if (m_dispatcher == null)
            {
                throw new ArgumentException("Unable to get CoreDisptacher from target panel!");
            }

            // Deligate start logic to UI thread
            m_dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                // Register all events
                m_painter.TargetWindow.PointerExited       += OnTargetPanel_PointerExited;
                m_painter.TargetWindow.PointerEntered      += OnTargetPanel_PointerEntered;
                m_painter.TargetWindow.PointerWheelChanged += OnTargetPanel_PointerWheelChanged;
                m_painter.TargetWindow.PointerPressed      += OnTargetPanel_PointerPressed;
                m_painter.TargetWindow.PointerReleased     += OnTargetPanel_PointerReleased;
                m_painter.TargetWindow.PointerMoved        += OnTargetPanel_PointerMoved;

                m_coreWindow          = CoreWindow.GetForCurrentThread();
                m_coreWindow.KeyDown += OnCoreWindow_KeyDown;
                m_coreWindow.KeyUp   += OnCoreWindow_KeyUp;
            }).FireAndForget();
        }
        /// <summary>
        /// Stops input handling.
        /// </summary>
        public void Stop()
        {
            // Perform event deregistrations on UI thread
            if (m_currentControl != null)
            {
                Control currentControl = m_currentControl;
                Action  removeEventRegistrationsAction = new Action(() =>
                {
                    if (currentControl == null)
                    {
                        return;
                    }

                    currentControl.MouseEnter -= OnMouseEnter;
                    currentControl.MouseClick -= OnMouseClick;
                    currentControl.MouseLeave -= OnMouseLeave;
                    currentControl.MouseMove  -= OnMouseMove;
                    currentControl.MouseWheel -= OnMouseWheel;
                    currentControl.MouseUp    -= OnMouseUp;
                    currentControl.MouseDown  -= OnMouseDown;
                    currentControl.KeyUp      -= OnKeyUp;
                    currentControl.KeyDown    -= OnKeyDown;
                    currentControl.LostFocus  -= OnLostFocus;
                    currentControl.GotFocus   -= OnGotFocus;
                });

                if (m_currentControl.IsHandleCreated)
                {
                    m_currentControl.BeginInvoke(removeEventRegistrationsAction);
                }
                else
                {
                    removeEventRegistrationsAction();
                }
            }

            // Set local references to zero
            m_currentControl = null;
            m_focusHandler   = null;
            m_renderLoop     = null;
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Starts input handling.
        /// </summary>
        /// <param name="viewObject">The view object (e. g. Direct3D11Canvas).</param>
        public void Start(IInputEnabledView viewObject)
        {
            m_rendererElement = viewObject as SeeingSharpRendererElement;
            if (m_rendererElement == null)
            {
                throw new ArgumentException("Unable to handle given view object!");
            }

            // Register all events needed for mouse camera dragging
            m_rendererElement.Dispatcher.BeginInvoke(new Action(() =>
            {
                m_rendererElement.MouseWheel        += OnRendererElement_MouseWheel;
                m_rendererElement.MouseDown         += OnRendererElement_MouseDown;
                m_rendererElement.MouseUp           += OnRendererElement_MouseUp;
                m_rendererElement.MouseMove         += OnRendererElement_MouseMove;
                m_rendererElement.MouseLeave        += OnRendererElement_MouseLeave;
                m_rendererElement.GotFocus          += OnRenderElement_GotFocus;
                m_rendererElement.LostFocus         += OnRendererElement_LostFocus;
                m_rendererElement.LostKeyboardFocus += OnRendererElement_LostKeyboardFocus;
                m_rendererElement.PreviewMouseUp    += OnRendererElement_PreviewMouseUp;
                m_rendererElement.KeyUp             += OnRendererElement_KeyUp;
                m_rendererElement.KeyDown           += OnRendererElement_KeyDown;
            }));
        }
Ejemplo n.º 12
0
 /// <summary>
 /// Starts input handling.
 /// </summary>
 /// <param name="viewObject">The view object (e. g. Direct3D11Canvas).</param>
 public void Start(IInputEnabledView viewObject)
 {
 }
Ejemplo n.º 13
0
        /// <summary>
        /// Creates all input handlers which are associated to one view.
        /// </summary>
        internal static List <IInputHandler> CreateInputHandlersForView(IInputEnabledView viewObject)
        {
            viewObject.EnsureNotNull(nameof(viewObject));

            return(GraphicsCore.Current.InputHandlers.GetInputHandler(viewObject.GetType()));
        }
        /// <summary>
        /// Starts input handling.
        /// </summary>
        /// <param name="viewObject">The view object (e. g. Direct3D11Canvas).</param>
        public void Start(IInputEnabledView viewObject)
        {
            _painter = viewObject as SeeingSharpPanelPainter;
            if (_painter == null)
            {
                throw new ArgumentException("Unable to handle given view object!");
            }

            _viewInterface = _painter;
            if (_viewInterface == null)
            {
                throw new ArgumentException("Unable to handle given view object!");
            }

            _renderLoop = _viewInterface.RenderLoop;
            if (_renderLoop == null)
            {
                throw new ArgumentException("Unable to handle given view object!");
            }

            _dispatcher = _painter.Dispatcher;
            if (_dispatcher == null)
            {
                throw new ArgumentException("Unable to get CoreDispatcher from target panel!");
            }

            // Delegate start logic to UI thread
            _ = _dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                // Register all events
                _targetPanel = _painter.TargetPanel;
                _targetPanel.PointerExited       += this.OnTargetPanel_PointerExited;
                _targetPanel.PointerEntered      += this.OnTargetPanel_PointerEntered;
                _targetPanel.PointerWheelChanged += this.OnTargetPanel_PointerWheelChanged;
                _targetPanel.PointerPressed      += this.OnTargetPanel_PointerPressed;
                _targetPanel.PointerReleased     += this.OnTargetPanel_PointerReleased;
                _targetPanel.PointerMoved        += this.OnTargetPanel_PointerMoved;

                // Create the dummy button for focus management
                //  see posts on: https://social.msdn.microsoft.com/Forums/en-US/54e4820d-d782-45d9-a2b1-4e3a13340788/set-focus-on-swapchainpanel-control?forum=winappswithcsharp
                _dummyButtonForFocus = new Button
                {
                    Content             = "Button",
                    Width               = 0,
                    Height              = 0,
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    BorderThickness     = new Thickness(0.0)
                };

                _dummyButtonForFocus.KeyDown   += this.OnDummyButtonForFocus_KeyDown;
                _dummyButtonForFocus.KeyUp     += this.OnDummyButtonForFocus_KeyUp;
                _dummyButtonForFocus.LostFocus += this.OnDummyButtonForFocus_LostFocus;
                _dummyButtonForFocus.GotFocus  += this.OnDummyButtonForFocus_GotFocus;
                _targetPanel.Children.Insert(0, _dummyButtonForFocus);

                _coreWindow          = CoreWindow.GetForCurrentThread();
                _coreWindow.KeyDown += this.OnCoreWindow_KeyDown;
                _coreWindow.KeyUp   += this.OnCoreWindow_KeyUp;

                // Set focus on the target
                _dummyButtonForFocus.Focus(FocusState.Programmatic);
            });
        }