示例#1
0
        public override bool StartInteraction(PointF[] points)
        {
            (int column, int row) = _pixelMapper.PixelsToCoords((int)points[0].X, (int)points[0].Y);
            this.CurrentTool?.Execute(column, row);

            Invalidate();

            return(true);
        }
示例#2
0
        public void SetSize(int width, int height)
        {
            (int columns, int rows) = _pixelMapper.PixelsToCoords(width, height);
            columns = Math.Max(columns, 1);
            rows    = Math.Max(rows, 1);

            (_width, _height) = _pixelMapper.CoordsToPixels(columns, rows);

            _gameBoard.Columns = columns;
            _gameBoard.Rows    = rows;
        }
示例#3
0
        public MainForm(IGame game,
                        IPixelMapper pixelMapper,
                        IEnumerable <ITool> tools,
                        IEnumerable <ILayerRenderer> renderers,
                        ITrackParameters parameters)
        {
            _game        = game;
            _parameters  = parameters;
            _currentTool = tools.First();

            this.Text          = "Trains.NET";
            this.AutoScaleMode = AutoScaleMode.Font;
            this.StartPosition = FormStartPosition.Manual;
            this.Location      = new Point(1086, 559);
            this.ClientSize    = new Size(1547, 897);

            var splitContainer = new SplitContainer()
            {
                FixedPanel       = FixedPanel.Panel1,
                SplitterDistance = 400,
                Dock             = DockStyle.Fill,
                IsSplitterFixed  = true
            };

            var buttonPanel = new Panel()
            {
                Dock     = DockStyle.Top,
                Padding  = new Padding(5),
                AutoSize = true
            };

            var rendererPanel = new Panel()
            {
                Dock     = DockStyle.Top,
                Padding  = new Padding(5),
                AutoSize = true
            };

            foreach (ITool tool in tools)
            {
                buttonPanel.Controls.Add(CreateButton(tool));
            }

            var button = new CheckBox
            {
                Text       = "Configure",
                Height     = 30,
                TextAlign  = ContentAlignment.MiddleCenter,
                Dock       = DockStyle.Top,
                Appearance = Appearance.Button
            };

            buttonPanel.Controls.Add(button);

            button.CheckedChanged += (s, e) =>
            {
                if (_debugForm == null)
                {
                    _debugForm = CreateDebugForm();
                }

                if (button.Checked)
                {
                    _debugForm.Location = new Point(this.Left - _debugForm.Width, this.Top);
                    _debugForm.Show();
                }
                else
                {
                    _debugForm.Hide();
                }
            };

            var skiaView = new SKControl()
            {
                Dock = DockStyle.Fill
            };

            skiaView.MouseDown    += DoMouseClick;
            skiaView.MouseMove    += DoMouseClick;
            skiaView.Resize       += (s, e) => _game.SetSize(skiaView.Width, skiaView.Height);
            skiaView.PaintSurface += (s, e) => _game.Render(e.Surface.Canvas);

            foreach (ILayerRenderer renderer in renderers)
            {
                rendererPanel.Controls.Add(CreateRendererCheckbox(renderer));
            }

            splitContainer.Panel1.Controls.Add(rendererPanel);
            splitContainer.Panel1.Controls.Add(buttonPanel);
            splitContainer.Panel2.Controls.Add(skiaView);
            splitContainer.Panel2.Padding = new Padding(5);

            _timer          = new Timer();
            _timer.Tick    += (s, e) => skiaView.Refresh();
            _timer.Interval = 16;
            _timer.Start();

            this.Controls.Add(splitContainer);

            void DoMouseClick(object sender, MouseEventArgs e)
            {
                if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
                {
                    (int column, int row) = pixelMapper.PixelsToCoords(e.X, e.Y);
                    _currentTool.Execute(column, row);
                }
            }

            RadioButton CreateButton(ITool tool)
            {
                var button = new RadioButton()
                {
                    Text       = tool.Name,
                    Dock       = DockStyle.Top,
                    Height     = 50,
                    Appearance = Appearance.Button,
                    TextAlign  = ContentAlignment.MiddleCenter,
                    Checked    = _currentTool == tool
                };

                button.Click += (s, e) => _currentTool = tool;

                return(button);
            }

            Control CreateRendererCheckbox(ILayerRenderer renderer)
            {
                var checkbox = new CheckBox
                {
                    Text       = renderer.Name,
                    Dock       = DockStyle.Top,
                    Height     = 50,
                    Appearance = Appearance.Button,
                    TextAlign  = ContentAlignment.MiddleCenter,
                    Checked    = renderer.Enabled
                };

                checkbox.CheckedChanged += (s, e) =>
                {
                    renderer.Enabled = checkbox.Checked;
                };

                return(checkbox);
            }
        }