예제 #1
0
        private bool ResolvePointerUpAndClick(Event currentEvent, GraphicalEventHandler handler)
        {
            bool used = false;

            // Left mouse button was released. If mouse had left the screen, we treat it as if left mouse button was released.
            if ((currentEvent.type == EventType.MouseUp && currentEvent.button == 0) || (currentEvent.type == EventType.MouseLeaveWindow))
            {
                if (initiallyPressedHandler != null)
                {
                    // Also, it is a click if we clicked and released LMB over the same element.
                    if (handler == initiallyPressedHandler)
                    {
                        initiallyPressedHandler.InvokePointerClick(currentEvent.mousePosition);
                    }

                    // Initially pressed element recieves the event in any case,
                    initiallyPressedHandler.InvokePointerUp(currentEvent.mousePosition);

                    StartHovering(currentEvent, handler);

                    used = true;
                }

                Selected = null;
                initiallyPressedHandler = null;
            }

            return(used);
        }
예제 #2
0
        private void StartHovering(Event currentEvent, GraphicalEventHandler handler)
        {
            if (initiallyHoveredHandler != null)
            {
                StopHovering(currentEvent);
            }

            initiallyHoveredHandler = handler;
            handler.InvokePointerHoverStart(currentEvent.mousePosition);
        }
예제 #3
0
        /// <summary>
        /// Process current event.
        /// </summary>
        /// <param name="currentEvent">Event that is currently being processed.</param>
        /// <param name="window">Current window rect. Elements outside the window rect are ignored.</param>
        public void HandleEvent(Event currentEvent, Rect window)
        {
            if (currentEvent.type == EventType.Layout)
            {
                Layout();
                return;
            }

            if (currentEvent.isMouse)
            {
                if (window.Contains(currentEvent.mousePosition) == false)
                {
                    if (initiallyPressedHandler != null)
                    {
                        // Initially pressed element recieves the event in any case,
                        initiallyPressedHandler.InvokePointerUp(currentEvent.mousePosition);
                    }

                    Selected = null;
                    initiallyPressedHandler = null;
                    return;
                }

                GraphicalElement element = GetGraphicalElementWithHandlerAtPoint(currentEvent.mousePosition).FirstOrDefault();

                GraphicalEventHandler handler = Canvas;

                if (element != null)
                {
                    handler = element.GraphicalEventHandler;
                }

                if (currentEvent.type == EventType.MouseDrag)
                {
                    if (ResolvePointerDrag(currentEvent))
                    {
                        Event.current.Use();
                    }
                }
                else if (ResolvePointerHover(currentEvent, handler)
                         // | is on purpose.
                         | ResolveContextPointerUpAndClick(currentEvent, handler)
                         | ResolvePointerUpAndClick(currentEvent, handler)
                         | ResolveContextPointerDown(currentEvent, handler)
                         | ResolvePointerDown(currentEvent, handler))
                {
                    Event.current.Use();
                }
            }

            if (currentEvent.type == EventType.Repaint)
            {
                Draw(window);
            }
        }
예제 #4
0
        public EditorGraphics(WorkflowEditorColorPalette workflowEditorColorPalette)
        {
            // Guarantees that at least default palette is assigned.
            if (workflowEditorColorPalette == null)
            {
                ColorPalette = WorkflowEditorColorPalette.GetDefaultPalette();
            }
            else
            {
                ColorPalette = workflowEditorColorPalette;
            }

            Canvas = new GraphicalEventHandler();

            Reset();
        }
예제 #5
0
        private bool ResolvePointerHover(Event currentEvent, GraphicalEventHandler handler)
        {
            if (initiallyHoveredHandler != null && initiallyHoveredHandler != handler)
            {
                StopHovering(currentEvent);
                initiallyHoveredHandler = null;
                return(false);
            }

            if (initiallyHoveredHandler != handler && handler != null)
            {
                StartHovering(currentEvent, handler);
                return(true);
            }

            return(false);
        }
예제 #6
0
        /// <summary>
        /// Resets this <see cref="EditorGraphics"/> instance to it's initial state.
        /// </summary>
        public void Reset()
        {
            foreach (GraphicalElement element in elements.ToList())
            {
                Deregister(element);

                if (element.IsReceivingEvents)
                {
                    element.GraphicalEventHandler.Reset();
                }
            }

            initiallyPressedHandler        = null;
            initiallyContextPressedHandler = null;

            Selected = null;
        }
예제 #7
0
        private bool ResolveContextPointerDown(Event currentEvent, GraphicalEventHandler handler)
        {
            bool used = false;

            // Left mouse button was pressed down.
            if (currentEvent.type == EventType.MouseDown && currentEvent.button == 1)
            {
                initiallyContextPressedHandler = handler;

                if (handler != null)
                {
                    handler.InvokeContextPointerDown(currentEvent.mousePosition);

                    StopHovering(currentEvent);

                    used = true;
                }
            }

            return(used);
        }
예제 #8
0
        public EditorGraphics(WorkflowEditorColorPalette workflowEditorColorPalette)
        {
            // Guarantees that at least default palette is assigned.
            if (workflowEditorColorPalette == null)
            {
                ColorPalette = WorkflowEditorColorPalette.GetDefaultPalette();
            }
            else
            {
                ColorPalette = workflowEditorColorPalette;
            }

            Canvas = new GraphicalEventHandler();

            additionalDrawer.Clear();
            ReflectionUtils.GetConcreteImplementationsOf <IEditorGraphicDrawer>().ToList().ForEach(type =>
            {
                additionalDrawer.Add((IEditorGraphicDrawer)ReflectionUtils.CreateInstanceOfType(type));
            });
            additionalDrawer.Sort((drawer1, drawer2) => drawer1.Priority.CompareTo(drawer2.Priority));

            Reset();
        }
예제 #9
0
        private bool ResolveContextPointerUpAndClick(Event currentEvent, GraphicalEventHandler handler)
        {
            bool used = false;

            if (currentEvent.type == EventType.MouseUp && currentEvent.button == 1 && handler != null && handler == initiallyContextPressedHandler || (currentEvent.type == EventType.MouseLeaveWindow))
            {
                if (initiallyContextPressedHandler != null)
                {
                    if (handler == initiallyContextPressedHandler)
                    {
                        initiallyContextPressedHandler.InvokeContextPointerClick(currentEvent.mousePosition);
                    }

                    initiallyContextPressedHandler.InvokeContextPointerUp(currentEvent.mousePosition);

                    StartHovering(currentEvent, handler);
                    used = true;
                }

                initiallyContextPressedHandler = null;
            }

            return(used);
        }