示例#1
0
        private void StartSelectTilesSequence(PointerEventInfo info, ILevelGeometry viewport)
        {
            bool controlKey = Control.ModifierKeys.HasFlag(Keys.Control);
            bool shiftKey   = Control.ModifierKeys.HasFlag(Keys.Shift);

            if (shiftKey)
            {
                StartDragAdd(info, viewport);
                return;
            }

            if (controlKey)
            {
                StartDragRemove(info, viewport);
                return;
            }

            TileCoord location = TileLocation(info);

            if (!_selectLayer.TileSelectionCoverageAt(location))
            {
                StartDragNew(info, viewport);
            }
            else
            {
                StartMove(info, viewport);
            }
        }
示例#2
0
        protected override void RenderContent(SpriteBatch spriteBatch)
        {
            if (_pattern == null)
            {
                _pattern = BuildCanvasPattern(spriteBatch.GraphicsDevice);
            }
            if (_borderPen == null)
            {
                _borderPen = new Pen(new SolidColorBrush(Model.BorderColor.ToXnaColor()));
            }
            if (_guidePen == null)
            {
                _guidePen = new Pen(new SolidColorBrush(Model.OriginGuideColor.ToXnaColor()));
            }

            ILevelGeometry geometry = LevelGeometry;
            Rectangle      bounds   = geometry.VisibleBounds.ToXnaRectangle();

            Rectangle dest = new Rectangle(
                (int)Math.Ceiling(bounds.X * geometry.ZoomFactor),
                (int)Math.Ceiling(bounds.Y * geometry.ZoomFactor),
                (int)(bounds.Width * geometry.ZoomFactor),
                (int)(bounds.Height * geometry.ZoomFactor)
                );

            spriteBatch.Draw(_pattern, dest, dest, Color.White);
        }
示例#3
0
            public override ToolState StartPointerSequence(PointerEventInfo info, ILevelGeometry viewport)
            {
                InitialLocation = new Point((int)info.X, (int)info.Y);
                Timeout         = DateTime.Now;

                return(this);
            }
示例#4
0
 protected override void PointerPositionCore(PointerEventInfo info, ILevelGeometry viewport)
 {
     if (_snapManager == null)
     {
         _snapManager = new SnappingManager(GetSnappingSourceOrigin(), GetSnappingSourceBounds(), GridSize);
     }
 }
示例#5
0
 private ToolState StartTimeoutSequence(PointerEventInfo info, ILevelGeometry viewport, ObjectInstance obj)
 {
     return(new SelectionTimeoutToolState(Tool)
     {
         HitObject = obj
     }.StartPointerSequence(info, viewport));
 }
示例#6
0
        private void EndEraseAreaSequence(PointerEventInfo info, ILevelGeometry viewport)
        {
            Rectangle selection = _band.Selection;
            int       xmin      = Math.Max(Layer.TileOriginX, selection.Left);
            int       ymin      = Math.Max(Layer.TileOriginY, selection.Top);
            int       xmax      = Math.Min(Layer.TileOriginX + Layer.TilesWide, selection.Right);
            int       ymax      = Math.Min(Layer.TileOriginY + Layer.TilesHigh, selection.Bottom);

            TileReplace2DCommand command = new TileReplace2DCommand(Layer);

            for (int x = xmin; x < xmax; x++)
            {
                for (int y = ymin; y < ymax; y++)
                {
                    command.QueueReplacement(new TileCoord(x, y), (TileStack)null);
                    Layer[new TileCoord(x, y)] = null;
                }
            }

            History.Execute(command);

            _annots.Remove(_selection);
            _inAreaSequence = false;

            EndAutoScroll(info, viewport);
        }
示例#7
0
            public override ToolState StartPointerSequence(PointerEventInfo info, ILevelGeometry viewport)
            {
                Tool._selectionManager.ClearSelection();
                Tool.UpdatePropertyProvider();

                return(this);
            }
示例#8
0
 public void PointerPosition(PointerEventInfo info, ILevelGeometry viewport)
 {
     if (IsCancelled)
     {
         return;
     }
     PointerPositionCore(info, viewport);
 }
示例#9
0
 protected override void EndPointerSequenceCore(PointerEventInfo info, ILevelGeometry viewport)
 {
     switch (info.Type) {
         case PointerEventType.Primary:
             EndSelectTilesSequence(info, viewport);
             break;
     }
 }
示例#10
0
 public void EndPointerSequence(PointerEventInfo info, ILevelGeometry viewport)
 {
     if (IsCancelled)
     {
         return;
     }
     EndPointerSequenceCore(info, viewport);
 }
示例#11
0
 public override ToolState EndPointerSequence(PointerEventInfo info, ILevelGeometry viewport)
 {
     if ((DateTime.Now - Timeout).TotalMilliseconds < _timeoutThreshold)
     {
         return new RotationStandbyToolState(Tool)
                {
                    HitObject = HitObject
                }
     }
示例#12
0
            private ToolState StartClickRemove(PointerEventInfo info, ILevelGeometry viewport, ObjectInstance obj)
            {
                Tool._selectionManager.RemoveObjectFromSelection(obj);

                Tool.StartAutoScroll(info, viewport);
                Tool.UpdatePropertyProvider();

                return(new SelectionStandbyToolState(Tool).StartPointerSequence(info, viewport));
            }
示例#13
0
        private void StartDragRemove(PointerEventInfo info, ILevelGeometry viewport)
        {
            if (!_selectLayer.HasSelection)
            {
                return;
            }

            StartDrag(info, viewport, MergeAction.Remove);
        }
示例#14
0
 protected override void EndPointerSequenceCore(PointerEventInfo info, ILevelGeometry viewport)
 {
     switch (info.Type)
     {
     case PointerEventType.Primary:
         EndSelectTilesSequence(info, viewport);
         break;
     }
 }
示例#15
0
        protected override void EndPointerSequenceCore(PointerEventInfo info, ILevelGeometry viewport)
        {
            _state = _state.EndPointerSequence(info, viewport);

            /*switch (info.Type) {
                case PointerEventType.Primary:
                    EndSelectObjectSequence(info, viewport);
                    break;
            }*/
        }
示例#16
0
        private void EndMove(PointerEventInfo info, ILevelGeometry viewport)
        {
            Command command = new MoveTileSelectionCommand(_selectLayer, _initialOffset, _selectLayer.TileSelectionOffset);

            History.Execute(command);

            _action = UpdateAction.None;

            EndAutoScroll(info, viewport);
        }
示例#17
0
        protected override void PointerPositionCore(PointerEventInfo info, ILevelGeometry viewport)
        {
            TileCoord location = TileLocation(info);
            if (!TileInRange(location) || _inAreaSequence) {
                HidePreviewMarker();
                return;
            }

            ShowPreviewMarker(location);
        }
示例#18
0
        private void UpdateDragCommon(PointerEventInfo info, ILevelGeometry viewport)
        {
            TileCoord location = TileLocation(info);

            _band.End = new Point(location.X, location.Y);
            Rectangle selection = _band.Selection;

            _selectionAnnot.Start = new Point(selection.Left * Layer.TileWidth, selection.Top * Layer.TileHeight);
            _selectionAnnot.End   = new Point(selection.Right * Layer.TileWidth, selection.Bottom * Layer.TileHeight);
        }
示例#19
0
        protected override void StartPointerSequenceCore(PointerEventInfo info, ILevelGeometry viewport)
        {
            switch (info.Type) {
                case PointerEventType.Primary:
                    StartFillSequence(info);
                    break;
            }

            UpdatePointerSequence(info, viewport);
        }
示例#20
0
        protected override void EndPointerSequenceCore(PointerEventInfo info, ILevelGeometry viewport)
        {
            _state = _state.EndPointerSequence(info, viewport);

            /*switch (info.Type) {
             *  case PointerEventType.Primary:
             *      EndSelectObjectSequence(info, viewport);
             *      break;
             * }*/
        }
示例#21
0
            public override ToolState EndPointerSequence(PointerEventInfo info, ILevelGeometry viewport)
            {
                ClearAnnot();

                Tool._selectionManager.AddObjectsToSelection(Tool.ObjectsInArea(Band.Selection));

                Tool.EndAutoScroll(info, viewport);
                Tool.UpdatePropertyProvider();

                return(new ReleaseToolState(Tool).EndPointerSequence(info, viewport));
            }
示例#22
0
        protected override void StartPointerSequenceCore(PointerEventInfo info, ILevelGeometry viewport)
        {
            switch (info.Type)
            {
            case PointerEventType.Primary:
                StartFillSequence(info);
                break;
            }

            UpdatePointerSequence(info, viewport);
        }
示例#23
0
 protected override void EndPointerSequenceCore(PointerEventInfo info, ILevelGeometry viewport)
 {
     switch (info.Type) {
         case PointerEventType.Primary:
             EndErasePathSequence(info);
             break;
         case PointerEventType.Secondary:
             EndEraseAreaSequence(info, viewport);
             break;
     }
 }
示例#24
0
        protected override void PointerPositionCore(PointerEventInfo info, ILevelGeometry viewport)
        {
            TileCoord location = TileLocation(info);

            if (!TileInRange(location) || _inAreaSequence)
            {
                HidePreviewMarker();
                return;
            }

            ShowPreviewMarker(location);
        }
示例#25
0
        public ObjectSelectTool(ILayerContext layerContext, ObjectLayer layer, Size gridSize, ObjectSelectionManager selectionManager)
            : base(layerContext, layer, gridSize)
        {
            _annots = layerContext.Annotations;
            _viewport = layerContext.Geometry;
            _selectionManager = selectionManager;
            _layerContext = layerContext;

            InitializeCommandManager();

            _state = new SelectionStandbyToolState(this);
        }
示例#26
0
        public ObjectSelectTool(ILayerContext layerContext, ObjectLayer layer, Size gridSize, ObjectSelectionManager selectionManager)
            : base(layerContext, layer, gridSize)
        {
            _annots           = layerContext.Annotations;
            _viewport         = layerContext.Geometry;
            _selectionManager = selectionManager;
            _layerContext     = layerContext;

            InitializeCommandManager();

            _state = new SelectionStandbyToolState(this);
        }
示例#27
0
            public override ToolState UpdatePointerSequence(PointerEventInfo info, ILevelGeometry viewport)
            {
                Band.End = new Point((int)info.X, (int)info.Y);
                Rectangle selection = Band.Selection;

                Annot.Start = new Point(selection.Left, selection.Top);
                Annot.End   = new Point(selection.Right, selection.Bottom);

                Tool.UpdateAutoScroll(info, viewport);

                return(this);
            }
示例#28
0
        protected void StartAutoScroll(PointerEventInfo info, ILevelGeometry viewport)
        {
            _prevX          = info.X;
            _prevY          = info.Y;
            _scrollViewport = viewport;

            if (_scrollTimer.Interval != 50)
            {
                _scrollTimer.Interval = 50;
                _scrollTimer.Tick    += new System.EventHandler(ScrollTick);
            }
            _scrollTimer.Enabled = true;
        }
示例#29
0
        protected override void StartPointerSequenceCore(PointerEventInfo info, ILevelGeometry viewport)
        {
            switch (info.Type) {
                case PointerEventType.Primary:
                    StartDrawObjectSequence(info);
                    break;
                case PointerEventType.Secondary:
                    Cancel();
                    break;
            }

            UpdatePointerSequence(info, viewport);
        }
示例#30
0
        private void UpdateEraseAreaSequenceCommon(PointerEventInfo info, ILevelGeometry viewport)
        {
            TileCoord location = TileLocation(info);

            int x = Math.Max(0, Math.Min(Layer.TilesWide - 1, location.X)) * Layer.TileWidth;
            int y = Math.Max(0, Math.Min(Layer.TilesHigh - 1, location.Y)) * Layer.TileHeight;

            _band.End = new Point(location.X, location.Y);
            Rectangle selection = _band.Selection;

            _selection.Start = new Point(selection.Left * Layer.TileWidth, selection.Top * Layer.TileHeight);
            _selection.End   = new Point(selection.Right * Layer.TileWidth, selection.Bottom * Layer.TileHeight);
        }
示例#31
0
        protected override void EndPointerSequenceCore(PointerEventInfo info, ILevelGeometry viewport)
        {
            switch (info.Type)
            {
            case PointerEventType.Primary:
                EndErasePathSequence(info);
                break;

            case PointerEventType.Secondary:
                EndEraseAreaSequence(info, viewport);
                break;
            }
        }
示例#32
0
        protected override void StartPointerSequenceCore(PointerEventInfo info, ILevelGeometry viewport)
        {
            switch (info.Type) {
                case PointerEventType.Primary:
                    StartSelectTilesSequence(info, viewport);
                    break;
                case PointerEventType.Secondary:
                    DefloatSelection();
                    break;
            }

            UpdatePointerSequence(info, viewport);
        }
示例#33
0
            public override ToolState EndPointerSequence(PointerEventInfo info, ILevelGeometry viewport)
            {
                if (Annot == null)
                {
                    float radius = Tool.MaxBoundingDiagonal(HitObject) / 2 + 5;
                    Annot             = new CircleAnnot(HitObject.ImageBounds.Center, radius);
                    Annot.Outline     = Outline;
                    Annot.OutlineGlow = OutlineGlow;
                    Tool._annots.Add(Annot);
                }

                return(this);
            }
示例#34
0
        protected override void UpdatePointerSequenceCore(PointerEventInfo info, ILevelGeometry viewport)
        {
            switch (info.Type)
            {
            case PointerEventType.Primary:
                UpdateDrawPathSequence(info);
                break;

            case PointerEventType.Secondary:
                UpdateDrag(info, viewport);
                break;
            }
        }
示例#35
0
        private void EndSelectTilesSequence(PointerEventInfo info, ILevelGeometry viewport)
        {
            switch (_action)
            {
            case UpdateAction.Move:
                EndMove(info, viewport);
                break;

            case UpdateAction.Box:
                EndDrag(info, viewport);
                break;
            }
        }
示例#36
0
            public override ToolState StartPointerSequence(PointerEventInfo info, ILevelGeometry viewport)
            {
                switch (info.Type)
                {
                case PointerEventType.Primary:
                    return(StartPrimaryPointerSequence(info, viewport));

                case PointerEventType.Secondary:
                    return(StartSecondaryPointerSequence(info, viewport));

                default:
                    return(base.StartPointerSequence(info, viewport));
                }
            }
示例#37
0
            public override ToolState UpdatePointerSequence(PointerEventInfo info, ILevelGeometry viewport)
            {
                if (info.X == InitialLocation.X && info.Y == InitialLocation.Y)
                {
                    return(this);
                }

                return(new SelectionMovingToolState(Tool)
                {
                    InitialLocation = InitialLocation,
                    InitialSnapLocation = new Point(HitObject.X, HitObject.Y),
                    SnapManager = Tool.GetSnappingManager(HitObject.ObjectClass),
                }.UpdatePointerSequence(info, viewport));
            }
示例#38
0
            public override ToolState StartPointerSequence(PointerEventInfo info, ILevelGeometry viewport)
            {
                Band  = new RubberBand(new Point((int)info.X, (int)info.Y));
                Annot = new SelectionAnnot(new Point((int)info.X, (int)info.Y))
                {
                    Fill    = SelectionAnnotFill,
                    Outline = SelectionAnnotOutline,
                };

                Tool._annots.Add(Annot);
                Tool.StartAutoScroll(info, viewport);

                return(this);
            }
示例#39
0
        protected override void StartPointerSequenceCore(PointerEventInfo info, ILevelGeometry viewport)
        {
            _state = _state.StartPointerSequence(info, viewport);

            /*switch (info.Type) {
                case PointerEventType.Primary:
                    StartSelectObjectSequence(info, viewport);
                    break;
                case PointerEventType.Secondary:
                    _selectionManager.ClearSelection();
                    if (_rotationAnnot != null) {
                        _annots.Remove(_rotationAnnot);
                        _rotationAnnot = null;
                    }
                    UpdatePropertyProvider();
                    break;
            }*/

            UpdatePointerSequence(info, viewport);
        }
示例#40
0
        private void EndEraseAreaSequence(PointerEventInfo info, ILevelGeometry viewport)
        {
            Rectangle selection = _band.Selection;
            int xmin = Math.Max(Layer.TileOriginX, selection.Left);
            int ymin = Math.Max(Layer.TileOriginY, selection.Top);
            int xmax = Math.Min(Layer.TileOriginX + Layer.TilesWide, selection.Right);
            int ymax = Math.Min(Layer.TileOriginY + Layer.TilesHigh, selection.Bottom);

            TileReplace2DCommand command = new TileReplace2DCommand(Layer);
            for (int x = xmin; x < xmax; x++) {
                for (int y = ymin; y < ymax; y++) {
                    command.QueueReplacement(new TileCoord(x, y), (TileStack)null);
                    Layer[new TileCoord(x, y)] = null;
                }
            }

            History.Execute(command);

            _annots.Remove(_selection);
            _inAreaSequence = false;

            EndAutoScroll(info, viewport);
        }
示例#41
0
            private ToolState StartClickRemove(PointerEventInfo info, ILevelGeometry viewport, ObjectInstance obj)
            {
                Tool._selectionManager.RemoveObjectFromSelection(obj);

                Tool.StartAutoScroll(info, viewport);
                Tool.UpdatePropertyProvider();

                return new SelectionStandbyToolState(Tool).StartPointerSequence(info, viewport);
            }
示例#42
0
 private ToolState StartDrag(PointerEventInfo info, ILevelGeometry viewport)
 {
     Tool._selectionManager.ClearSelection();
     return StartDragAdd(info, viewport);
 }
示例#43
0
 protected override void PointerPositionCore(PointerEventInfo info, ILevelGeometry viewport)
 {
     SelectObjectPosition(info, viewport);
 }
示例#44
0
        private void UpdateEraseAreaSequenceCommon(PointerEventInfo info, ILevelGeometry viewport)
        {
            TileCoord location = TileLocation(info);

            int x = Math.Max(0, Math.Min(Layer.TilesWide - 1, location.X)) * Layer.TileWidth;
            int y = Math.Max(0, Math.Min(Layer.TilesHigh - 1, location.Y)) * Layer.TileHeight;

            _band.End = new Point(location.X, location.Y);
            Rectangle selection = _band.Selection;

            _selection.Start = new Point(selection.Left * Layer.TileWidth, selection.Top * Layer.TileHeight);
            _selection.End = new Point(selection.Right * Layer.TileWidth, selection.Bottom * Layer.TileHeight);
        }
示例#45
0
            private ToolState StartSecondaryPointerSequence(PointerEventInfo info, ILevelGeometry viewport)
            {
                ObjectInstance hitObject = Tool.TopObject(Tool.CoarseHitTest((int)info.X, (int)info.Y));
                if (hitObject == null)
                    return new ReleaseToolState(Tool).StartPointerSequence(info, viewport);

                Tool.ActivateObjectMenu(info);

                if (Tool._selectionManager.IsObjectSelected(hitObject))
                    return this;
                else
                    return StartClickNew(info, viewport, hitObject);
            }
示例#46
0
 private ToolState StartTimeoutSequence(PointerEventInfo info, ILevelGeometry viewport, ObjectInstance obj)
 {
     return new SelectionTimeoutToolState(Tool) {
         HitObject = obj
     }.StartPointerSequence(info, viewport);
 }
示例#47
0
        private void UpdateDrag(PointerEventInfo info, ILevelGeometry viewport)
        {
            TileCoord location = TileLocation(info);

            _band.End = new Point(location.X, location.Y);
            Rectangle selection = _band.Selection;

            _selectionAnnot.Start = new Point(selection.Left * Layer.TileWidth, selection.Top * Layer.TileHeight);
            _selectionAnnot.End = new Point(selection.Right * Layer.TileWidth, selection.Bottom * Layer.TileHeight);

            //UpdateAutoScroll(info, viewport);
        }
示例#48
0
        private void StartDrag(PointerEventInfo info, ILevelGeometry viewport)
        {
            ClearPreviewMarker();
            _activeBrush = null;

            TileCoord location = TileLocation(info);

            int x = (int)(location.X * Layer.TileWidth);
            int y = (int)(location.Y * Layer.TileHeight);

            _band = new RubberBand(new Point(location.X, location.Y));
            _selectionAnnot = new SelectionAnnot(new Point((int)info.X, (int)info.Y)) {
                Fill = new SolidColorBrush(new Color(76, 178, 255, 128)),
            };

            _annots.Add(_selectionAnnot);

            //StartAutoScroll(info, viewport);
        }
示例#49
0
        private void EndDrag(PointerEventInfo info, ILevelGeometry viewport)
        {
            Rectangle selection = ClampSelection(_band.Selection);

            StaticTileBrush anonBrush = new StaticTileBrush("User Selected", Layer.TileWidth, Layer.TileHeight);
            foreach (LocatedTile tile in Layer.TilesAt(_band.Selection))
                anonBrush.AddTile(new TileCoord(tile.X - _band.Selection.Left, tile.Y - _band.Selection.Top), tile.Tile);

            anonBrush.Normalize();

            _activeBrush = anonBrush;

            _annots.Remove(_selectionAnnot);
            _selectionAnnot = null;

            //EndAutoScroll(info, viewport);
        }
示例#50
0
 protected override void UpdatePointerSequenceCore(PointerEventInfo info, ILevelGeometry viewport)
 {
     switch (info.Type) {
         case PointerEventType.Primary:
             UpdateDrawPathSequence(info);
             break;
         case PointerEventType.Secondary:
             UpdateDrag(info, viewport);
             break;
     }
 }
示例#51
0
 public virtual ToolState UpdatePointerSequence(PointerEventInfo info, ILevelGeometry viewport)
 {
     return this;
 }
示例#52
0
        private void StartEraseAreaSequence(PointerEventInfo info, ILevelGeometry viewport)
        {
            HidePreviewMarker();

            TileCoord location = TileLocation(info);

            int x = (int)(location.X * Layer.TileWidth);
            int y = (int)(location.Y * Layer.TileHeight);

            _band = new RubberBand(new Point(location.X, location.Y));
            _selection = new SelectionAnnot(new Point(x, y))
            {
                Fill = new SolidColorBrush(new Color(192, 0, 0, 128)),
                //Outline = new Pen(new SolidColorBrush(new Color(192, 0, 0, 200))),
            };

            _annots.Add(_selection);
            _inAreaSequence = true;

            StartAutoScroll(info, viewport);
        }
示例#53
0
 private void UpdateEraseAreaSequence(PointerEventInfo info, ILevelGeometry viewport)
 {
     UpdateEraseAreaSequenceCommon(info, viewport);
     UpdateAutoScroll(info, viewport);
 }
示例#54
0
            public override ToolState StartPointerSequence(PointerEventInfo info, ILevelGeometry viewport)
            {
                InitialLocation = new Point((int)info.X, (int)info.Y);
                Timeout = DateTime.Now;

                return this;
            }
示例#55
0
 protected override void PointerPositionCore(PointerEventInfo info, ILevelGeometry viewport)
 {
     if (_snapManager == null)
         _snapManager = new SnappingManager(GetSnappingSourceOrigin(), GetSnappingSourceBounds(), GridSize);
 }
示例#56
0
            public override ToolState UpdatePointerSequence(PointerEventInfo info, ILevelGeometry viewport)
            {
                if (info.X == InitialLocation.X && info.Y == InitialLocation.Y)
                    return this;

                return new SelectionMovingToolState(Tool) {
                    InitialLocation = InitialLocation,
                    InitialSnapLocation = new Point(HitObject.X, HitObject.Y),
                    SnapManager = Tool.GetSnappingManager(HitObject.ObjectClass),
                }.UpdatePointerSequence(info, viewport);
            }
示例#57
0
 private ToolState StartDragAdd(PointerEventInfo info, ILevelGeometry viewport)
 {
     return new SelectionAreaToolState(Tool).StartPointerSequence(info, viewport);
 }
示例#58
0
 public override ToolState EndPointerSequence(PointerEventInfo info, ILevelGeometry viewport)
 {
     if ((DateTime.Now - Timeout).TotalMilliseconds < _timeoutThreshold)
         return new RotationStandbyToolState(Tool) {
             HitObject = HitObject
         }.EndPointerSequence(info, viewport);
     else
         return new SelectionStandbyToolState(Tool).EndPointerSequence(info, viewport);
 }
示例#59
0
 protected override void StartPointerSequenceCore(PointerEventInfo info, ILevelGeometry viewport)
 {
     _snapManager = new SnappingManager(GetSnappingSourceOrigin(), GetSnappingSourceBounds(), GridSize);
 }
示例#60
0
            private ToolState StartPrimaryPointerSequence(PointerEventInfo info, ILevelGeometry viewport)
            {
                ObjectInstance hitObject = Tool.TopObject(Tool.CoarseHitTest((int)info.X, (int)info.Y));
                bool controlKey = Control.ModifierKeys.HasFlag(Keys.Control);

                if (hitObject == null) {
                    if (controlKey)
                        return StartDragAdd(info, viewport);
                    else
                        return StartDrag(info, viewport);
                }

                if (Tool._selectionManager.IsObjectSelected(hitObject)) {
                    if (controlKey)
                        return StartClickRemove(info, viewport, hitObject);
                    else
                        return StartTimeoutSequence(info, viewport, hitObject);
                }
                else {
                    if (controlKey)
                        return StartClickAdd(info, viewport, hitObject);
                    else
                        return StartClickNew(info, viewport, hitObject);
                }
            }