Example #1
0
        /// <summary>
        /// Mouse has been clicked on the canvas. Depending on the radio button that is active either
        ///     - Add a new hex
        ///     - Select (or unselect a hex). If shift is held select multiple
        ///     - Delete a hex
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cnv_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            //TODO add some sort of undo feature here - deleting hexes and not being able to recover them may be very bad down the line

            //Unselect the hex before adding or deleting
            if (!_selectButton.IsChecked ?? true)
            {
                _selectedHexes = new List <Hex>();
            }

            // Determine which point was clicked after calculating offset
            var clickedPoint = new Point(e.GetPosition(_canvas).X - +_offset.X, e.GetPosition(_canvas).Y - _offset.Y);

            if (_addButton.IsChecked ?? false)
            {
                //Add a new hex under the mouse if one does not already exist - if one exists do nothing
                var cubicCoords = HexUtils.CartesianToCubic(Utils.PointToPoint(clickedPoint), _hexMap.Orientation, _hexMap.Width);
                try {
                    _hexMap.AddHex(cubicCoords);
                }
                catch (ArgumentException) {
                    //This means a hex already exists at that location
                    Console.WriteLine($"Not adding hex at {cubicCoords} as it already exists");
                }

                Console.WriteLine($"Adding hex at {cubicCoords}");
            }
            else if (_selectButton.IsChecked ?? false)
            {
                //Select the hex under the mouse if it exists
                var key = HexUtils.CartesianToCubic(Utils.PointToPoint(clickedPoint), _hexMap.Orientation, _hexMap.Width);

                if (_hexMap.Hexes.ContainsKey(key))
                {
                    var clickedHex = _selectedHexes.FirstOrDefault(hex => hex.Coordinate.Equals(key));
                    if (clickedHex != null)
                    {
                        if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
                        {
                            //CLicked on a hex that is already selected - unselect it
                            _selectedHexes.Remove(clickedHex);
                        }
                        else
                        {
                            if (_selectedHexes.Count > 1)
                            {
                                //Multiple hexes are selected so deselect all of them except for the one clicked
                                _selectedHexes = new List <Hex>()
                                {
                                    _hexMap.Hexes[key]
                                };
                            }
                            else
                            {
                                _selectedHexes.Clear();
                            }
                        }
                    }
                    else
                    {
                        //Check if selecting multiple hexes
                        if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
                        {
                            _selectedHexes.Add(_hexMap.Hexes[key]);
                        }
                        else
                        {
                            _selectedHexes = new List <Hex>()
                            {
                                _hexMap.Hexes[key]
                            };
                        }
                    }

                    RedrawHexes();
                }
            }
            else if (_deleteButton.IsChecked ?? false)
            {
                //Delete the hex that was clicked
                var key = HexUtils.CartesianToCubic(Utils.PointToPoint(clickedPoint), _hexMap.Orientation, _hexMap.Width);

                if (_hexMap.Hexes.ContainsKey(key))
                {
                    _hexMap.Hexes.Remove(key);
                    RedrawHexes();
                }
            }
            else
            {
                Console.WriteLine("Error - no radio buttons are selected?? or all of them are null somehow");
            }

            RedrawHexes();
        }