コード例 #1
0
 public HashSet <Room> GetRoomSelection(Panel2DMap parent)
 {
     if (_roomSelectionCache == null && _area.Size.Length() > 0.5f)
     {
         _roomSelectionCache = new HashSet <Room>(
             WinFormsUtils.BoolCombine(parent._editor.SelectedRooms,
                                       parent._editor.Level.Rooms.Where(room => room != null)
                                       .Where(room => parent._depthBar.CheckRoom(room))
                                       .Where(room =>
                                              room.Position.X + room.NumXSectors > Math.Min(_area.Start.X, _area.End.X) &&
                                              room.Position.Z + room.NumZSectors > Math.Min(_area.Start.Y, _area.End.Y) &&
                                              room.Position.X < Math.Max(_area.Start.X, _area.End.X) &&
                                              room.Position.Z < Math.Max(_area.Start.Y, _area.End.Y)), ModifierKeys));
     }
     return(_roomSelectionCache);
 }
コード例 #2
0
        protected override void OnMouseDoubleClick(MouseEventArgs e)
        {
            base.OnMouseDown(e);

            Vector2 clickPos = FromVisualCoord(e.Location);

            switch (e.Button)
            {
            case MouseButtons.Left:
                if (!ModifierKeys.HasFlag(Keys.Shift))
                {
                    int?currentProbeIndex = FindClosestProbe(clickPos);
                    if (currentProbeIndex.HasValue)
                    {
                        _depthBar.DepthProbes.RemoveAt(currentProbeIndex.Value);
                    }
                    else
                    {
                        _depthBar.DepthProbes.Add(new DepthBar.DepthProbe(_depthBar)
                        {
                            Position = clickPos
                        });
                    }
                    Invalidate();
                }
                break;

            case MouseButtons.Middle:
                Room clickedRoom  = DoPicking(clickPos);
                Keys modifierKeys = ModifierKeys;
                if (clickedRoom != null)
                {
                    IEnumerable <Room> connectedRooms = _editor.Level.GetConnectedRooms(clickedRoom);
                    connectedRooms = WinFormsUtils.BoolCombine(_editor.SelectedRooms, _editor.Level.GetConnectedRooms(clickedRoom), ModifierKeys);
                    connectedRooms =     // Don't use the currently clicked room because it was already processed with the previous single click.
                                     _editor.SelectedRooms.Where(room => room == clickedRoom || room == clickedRoom.AlternateOpposite)
                                     .Concat(
                        connectedRooms.Where(room => room != clickedRoom && room != clickedRoom.AlternateOpposite));
                    _editor.SelectRoomsAndResetCamera(connectedRooms);
                }
                _selectionArea = null;
                break;
            }
        }
コード例 #3
0
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);

            var clickPos = FromVisualCoord(e.Location);

            if (!_depthBar.MouseDown(e, Size, clickPos))
            {
                return;
            }

            _lastMousePosition = e.Location;

            //https://stackoverflow.com/questions/14191219/receive-mouse-move-even-cursor-is-outside-control
            Capture = true; // Capture mouse for zoom and panning

            switch (e.Button)
            {
            case MouseButtons.Left:
                // Check for depth probe
                int?currentProbeIndex = FindClosestProbe(clickPos);

                if (ModifierKeys.HasFlag(Keys.Alt))
                {
                    if (currentProbeIndex.HasValue)
                    {
                        // Remove depth probe closest to mouse pointer
                        _depthBar.DepthProbes.RemoveAt(currentProbeIndex.Value);
                    }
                    else
                    {
                        // Add depth probe under mouse pointer
                        _currentlyEditedDepthProbeIndex = _depthBar.DepthProbes.Count;
                        _depthBar.DepthProbes.Add(new DepthBar.DepthProbe(_depthBar)
                        {
                            Position = clickPos
                        });
                    }
                    Invalidate();
                }
                else if (currentProbeIndex.HasValue)
                {
                    // Depth probe normally selected
                    _currentlyEditedDepthProbeIndex = FindClosestProbe(clickPos);
                }
                else
                {
                    _overallDelta     = VectorInt3.Zero;
                    _roomMouseClicked = DoPicking(clickPos);
                    if (_roomMouseClicked == null)
                    {
                        _editor.SelectedRooms = new[] { _editor.SelectedRoom };
                        _selectionArea        = new SelectionArea {
                            _area = new Rectangle2(clickPos, clickPos)
                        };
                    }
                    else
                    {
                        if (ModifierKeys != Keys.None || !_editor.SelectedRooms.Contains(_roomMouseClicked))
                        {
                            _editor.SelectRoomsAndResetCamera(WinFormsUtils.BoolCombine(_editor.SelectedRooms,
                                                                                        new[] { _roomMouseClicked }, ModifierKeys));
                        }
                        _roomMouseOffset = clickPos - _roomMouseClicked.SectorPos;
                    }
                }
                break;

            case MouseButtons.Right:
                _startMousePosition = e.Location;

                // Move view with mouse cursor
                // Mouse cursor is a fixed point
                _viewMoveMouseWorldCoord = clickPos;
                break;

            case MouseButtons.Middle:
                _selectionArea = new SelectionArea {
                    _area = new Rectangle2(clickPos, clickPos)
                };
                break;

            case MouseButtons.XButton1:
                // Remove depth probe closest to mouse pointer
                currentProbeIndex = FindClosestProbe(clickPos);
                if (currentProbeIndex.HasValue)
                {
                    _depthBar.DepthProbes.RemoveAt(currentProbeIndex.Value);
                    Invalidate();
                }
                break;

            case MouseButtons.XButton2:
                // Add depth probe under mouse pointer
                _currentlyEditedDepthProbeIndex = _depthBar.DepthProbes.Count;
                _depthBar.DepthProbes.Add(new DepthBar.DepthProbe(_depthBar)
                {
                    Position = clickPos
                });
                Invalidate();
                break;
            }
        }
コード例 #4
0
        public Panel2DMap()
        {
            DoubleBuffered = true;
            AllowDrop      = true;
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.Selectable, true);
            UpdateStyles();

            if (LicenseManager.UsageMode == LicenseUsageMode.Runtime)
            {
                _editor = Editor.Instance;
                _editor.EditorEventRaised += EditorEventRaised;

                _depthBar = new DepthBar(_editor);
                _depthBar.InvalidateParent += Invalidate;
                _depthBar.GetParent        += () => this;
                _depthBar.SelectedRoom     += rooms => _editor.SelectRoomsAndResetCamera(WinFormsUtils.BoolCombine(_editor.SelectedRooms, rooms, ModifierKeys));

                _movementTimer = new MovementTimer(MoveTimerTick);

                UpdateBrushes();
                ResetView();
            }
        }