static public List <OperatorWidgetInputZone> ComputeInputZonesForOp(IConnectionLineTarget op)
        {
            var opWidget = op as OperatorWidget;

            if (opWidget != null)
            {
                return(ComputeInputZonesForOperatorWidget(opWidget));
            }

            var outputWidget = op as OutputWidget;

            if (outputWidget != null)
            {
                return(ComputeIntputZonesForOutputWidget(outputWidget));
            }

            throw new Exception("Can't compute input zones for unknown widget type");
        }
Пример #2
0
        /**
         * This function is called by IConnectionTargets when
         * the end of a connection is dragged over them.
         *
         * To "snap" valid connections, we save the zone so the
         * GiveFeedbackHandler can use its position.
         */
        public void HandleDragOverEvent(DragEventArgs e, IConnectionLineTarget targetWidget)
        {
            e.Effects = DragDropEffects.None;
            e.Handled = true;

            var connectionStartOutput = e.Data.GetData(CONNECTION_LINE_OUTPUT_IDENTIFIER) as OperatorPart;

            if (connectionStartOutput == null)
            {
                return;  // Skip non-connection drop data
            }
            // We can't use Mouse.GetPosition() also see
            // http://msdn.microsoft.com/en-us/library/system.windows.input.mouse.getposition(v=vs.110).aspx
            var mousePosition     = e.GetPosition(targetWidget as UIElement);
            var inputZonesForDrag = OperatorWidgetInputZoneManager.ComputeInputZonesForOp(targetWidget);
            var zoneBelowMouse    = OperatorWidgetInputZoneManager.FindZoneBelowMouse(inputZonesForDrag, mousePosition);

            if (zoneBelowMouse != null)
            {
                zoneBelowMouse.IsBelowMouse = true;
                _snappedToValidInput        = zoneBelowMouse.Input.Type == connectionStartOutput.Type ||
                                              zoneBelowMouse.Input.Type == FunctionType.Generic;

                if (_snappedToValidInput)
                {
                    e.Effects             = DragDropEffects.Copy;
                    _snappedPointOnCanvas = targetWidget.PositionOnCanvas + new Vector(zoneBelowMouse.LeftPosition + 0.5 * zoneBelowMouse.Width, targetWidget.Height);
                }
            }

            if (mousePosition == _lastDragOverPosition)
            {
                return;
            }

            _lastDragOverPosition = mousePosition;
            targetWidget.UpdateInputZonesUIFromDescription(inputZonesForDrag);
        }
Пример #3
0
        public ConnectionLine(Guid id, Operator parentOp, IConnectionLineSource source, IConnectionLineTarget target, OperatorPart output, OperatorPart input)
        {
            //IsHitTestVisible = false;
            ID       = id;
            ParentOp = parentOp;
            Source   = source;
            Target   = target;
            Output   = output;
            Input    = input;
            CreateLineGeometry();
            IsSelected = false;

            if (!Output.Parent.Visible || !Input.Parent.Visible)
            {
                Opacity          = 0;
                IsHitTestVisible = false;
            }
            ToolTip              = Output.ToString() + " -> " + Input.ToString() + "\n" + "(Drag with CTRL to disconnect)";
            MouseLeftButtonDown += ConnectionLine_MouseLeftButtonDownHandler;

            Loaded   += ConnectionLine_Loaded;
            Unloaded += OnUnloaded;
        }