public override void OnHandleInput(PresentationTarget target, IInputService inputService) { base.OnHandleInput(target, inputService); if (inputService.IsMouseOrTouchHandled) { return; } if (!inputService.IsKeyboardHandled) { _isAltDown = inputService.IsDown(Keys.LeftAlt) || inputService.IsDown(Keys.RightAlt); _isShiftDown = inputService.IsDown(Keys.LeftShift) || inputService.IsDown(Keys.RightShift); } }
public override void OnHandleInput(PresentationTarget target, IInputService inputService) { base.OnHandleInput(target, inputService); if (inputService.IsMouseOrTouchHandled) { return; } var services = ServiceLocator.Current; var presenter = services.GetInstance <ApplicationPresenter>(); var filter = presenter.SelectedFilter; var worldScreen = target.WorldScreen; var zoomFactor = worldScreen.ZoomFactor; var region = target.Region; var(mx, my) = worldScreen.ToWorldCoordinates((int)_position.X, (int)_position.Y); var tile = region.GetTile(mx, my); if (tile != null) { var viewRectangle = worldScreen.GetViewRectangle(); var rx = (int)Math.Floor((mx - viewRectangle.Left) * (presenter.UnitSize * zoomFactor)); var ry = (int)Math.Floor((my - viewRectangle.Top) * (presenter.UnitSize * zoomFactor)); var dx = _position.X - (rx - 45); var dy = _position.Y - (ry - 45); foreach (var component in tile.Components) { if ((filter != null && !filter.IsValid(component)) || !IsValid(component)) { continue; } var renderList = component.GetTerrain().ToList(); for (var i = renderList.Count - 1; i >= 0; i--) { var render = renderList[i]; foreach (var layer in render.Terrain) { var sprite = layer.Sprite; if (sprite != null && sprite.HitTest((int)dx, (int)dy)) { _tileUnderMouse = tile; _componentUnderMouse = component; } } } } } if (!inputService.IsKeyboardHandled) { if (inputService.IsReleased(Keys.Escape)) { presenter.SelectTool(default(Tool)); inputService.IsKeyboardHandled = true; } } if (inputService.IsReleased(MouseButtons.Left)) { if (_componentUnderMouse != null) { OnClick(); } if (_tileUnderMouse != null) { _tileUnderMouse.UpdateTerrain(); } worldScreen.InvalidateRender(); inputService.IsMouseOrTouchHandled = true; } }
public override void OnHandleInput(PresentationTarget target, IInputService inputService) { base.OnHandleInput(target, inputService); if (inputService.IsMouseOrTouchHandled) { return; } var currentPosition = inputService.MousePosition; var services = ServiceLocator.Current; var graphicsScreen = target.WorldScreen; var region = target.Region; var presenter = services.GetInstance <ApplicationPresenter>(); var selection = presenter.Selection; if (!inputService.IsKeyboardHandled) { if (inputService.IsDown(Keys.LeftControl) || inputService.IsDown(Keys.RightControl)) { if (inputService.IsReleased(Keys.C)) { CopySelection(); inputService.IsKeyboardHandled = true; } else if (inputService.IsReleased(Keys.V)) { PasteSelection(); graphicsScreen.InvalidateRender(); inputService.IsKeyboardHandled = true; } } } var modify = (inputService.IsDown(Keys.RightShift) || inputService.IsDown(Keys.LeftShift)); var(cx, cy) = graphicsScreen.ToWorldCoordinates((int)currentPosition.X, (int)currentPosition.Y); if (!modify) { _cursor = _selectNormal; if (selection.IsSelected(cx, cy, region)) { _cursor = _selectMove; } } else { _cursor = _selectAdd; } if (inputService.IsReleased(MouseButtons.Right)) { if (!_isDragging) { if (selection.Count > 0 && !selection.IsSelected(cx, cy, region)) { selection.Clear(); graphicsScreen.InvalidateRender(); inputService.IsMouseOrTouchHandled = true; } } else { inputService.IsMouseOrTouchHandled = true; } } else if (inputService.IsDown(MouseButtons.Right)) { if (_dragStart != Vector2F.Zero) { _dragDelta = graphicsScreen.CameraDrag = currentPosition - _dragStart; if (_dragDelta.Magnitude > 2.0f) { _isDragging = true; } inputService.IsMouseOrTouchHandled = true; } else { _dragStart = currentPosition; } } else if (inputService.IsDown(MouseButtons.Left)) { if (!_isSelecting && !modify && selection.IsSelected(cx, cy, region) || _isMoving) { if (_isMoving) { _movingEnd = currentPosition; } else { _movingStart = _movingEnd = currentPosition; } _isMoving = true; } else { if (_isSelecting) { _selectionEnd = currentPosition; } else { _selectionStart = _selectionEnd = currentPosition; } _isSelecting = true; } inputService.IsMouseOrTouchHandled = true; } else { if (_isDragging) { var deltaX = (_dragDelta.X / (presenter.UnitSize * graphicsScreen.ZoomFactor)); var deltaY = (_dragDelta.Y / (presenter.UnitSize * graphicsScreen.ZoomFactor)); graphicsScreen.CameraLocation -= new Vector2F(deltaX, deltaY); graphicsScreen.CameraDrag = Vector2F.Zero; _isDragging = false; inputService.IsMouseOrTouchHandled = true; } _dragStart = Vector2F.Zero; _dragDelta = Vector2F.Zero; if (_isSelecting) { var(left, top) = graphicsScreen.ToWorldCoordinates((int)_selectionStart.X, (int)_selectionStart.Y); var(right, bottom) = graphicsScreen.ToWorldCoordinates((int)_selectionEnd.X, (int)_selectionEnd.Y); var width = Math.Max(1, Math.Abs(right - left) + 1); var height = Math.Max(1, Math.Abs(bottom - top) + 1); selection.Select(new Rectangle( (left < right ? left : right), (top < bottom ? top : bottom), width, height), region, modify); _isSelecting = false; graphicsScreen.InvalidateRender(); inputService.IsMouseOrTouchHandled = true; } else if (_isMoving) { var(left, top) = graphicsScreen.ToWorldCoordinates((int)_movingStart.X, (int)_movingStart.Y); var(right, bottom) = graphicsScreen.ToWorldCoordinates((int)_movingEnd.X, (int)_movingEnd.Y); selection.Shift(right - left, bottom - top); _isMoving = false; graphicsScreen.InvalidateRender(); inputService.IsMouseOrTouchHandled = true; } _selectionStart = Vector2F.Zero; _selectionEnd = Vector2F.Zero; } if (inputService.IsDoubleClick(MouseButtons.Left)) { if (graphicsScreen.UI != null) { var(mx, my) = graphicsScreen.ToWorldCoordinates((int)_position.X, (int)_position.Y); var tile = region.GetTile(mx, my); if (tile != null) { var componentWindow = new ComponentsWindow(region, tile, graphicsScreen); selection.Clear(); componentWindow.Show(graphicsScreen.UI); componentWindow.Center(); } else { new RegionWindow(region).Show(graphicsScreen.UI); } } inputService.IsMouseOrTouchHandled = true; } }
public override void OnHandleInput(PresentationTarget target, IInputService inputService) { base.OnHandleInput(target, inputService); if (inputService.IsMouseOrTouchHandled) { return; } var services = ServiceLocator.Current; var presenter = services.GetInstance <ApplicationPresenter>(); var graphicsScreen = target.WorldScreen; var region = target.Region; var selection = presenter.Selection; if (!inputService.IsKeyboardHandled) { _isShiftDown = inputService.IsDown(Keys.LeftShift) || inputService.IsDown(Keys.RightShift); _isAltDown = inputService.IsDown(Keys.LeftAlt) || inputService.IsDown(Keys.RightAlt); if (inputService.IsReleased(Keys.Escape)) { presenter.SelectTool(default(Tool)); inputService.IsKeyboardHandled = true; } } var(cx, cy) = graphicsScreen.ToWorldCoordinates((int)_position.X, (int)_position.Y); if (!selection.Any()) { return; } if (inputService.IsReleased(MouseButtons.Left) && selection.IsSelected(cx, cy, region)) { var component = presenter.SelectedComponent; if (component != null) { var componentType = component.GetType(); var floorTypes = new List <String>() { "FloorComponent", "WaterComponent", "IceComponent", "SkyComponent" }; IEnumerable <TerrainComponent> similar = Enumerable.Empty <TerrainComponent>(); foreach (var area in selection) { for (var x = area.Left; x < area.Right; x++) { for (var y = area.Top; y < area.Bottom; y++) { var selectedTile = region.GetTile(x, y); if (selectedTile == null) { region.SetTile(x, y, selectedTile = new SegmentTile(x, y)); } // Shift = Append; Alt = Replace // if not shift and not alt, then clobber like components. // if Shift, then there are no like components to clobber // if Alt, then all components get clobbered. // Alt wins in the case of shift+alt if (!_isShiftDown && !_isAltDown) //not appending and not replacing. { if (floorTypes.Contains(componentType.Name)) { similar = selectedTile.GetComponents <TerrainComponent>(c => c is FloorComponent || c is WaterComponent || c is IceComponent || c is SkyComponent); } else { similar = selectedTile.GetComponents <TerrainComponent>(c => c.GetType().IsAssignableFrom(componentType)); } } if (_isAltDown) // replacing { similar = selectedTile.GetComponents <TerrainComponent>(); } foreach (var similarComponent in similar) { selectedTile.RemoveComponent(similarComponent); } selectedTile.Components.Add(component.Clone()); selectedTile.UpdateTerrain(); } } } graphicsScreen.InvalidateRender(); } } }