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); }
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; } }
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; } }
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(); } }