Example #1
0
        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);
            }
        }
Example #2
0
        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;
            }
        }
Example #3
0
        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;
            }
        }
Example #4
0
        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();
                }
            }
        }