PKHeX/PKHeX.WinForms/Controls/Slots/PokeGrid.cs
Kurt d8b8646de6 Use selectable picturebox
Closes #3757
Allows tabbing between windows, or pressing the keyboard's contextmenu key to pop up the context menu without ever needing to use the mouse.

changes pkmeditor dragout, box slot displays, sav-mystery gift r/w, and all the encounter/pkm db's
2023-02-04 14:52:38 -08:00

88 lines
2.5 KiB
C#

using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using PKHeX.Drawing.PokeSprite;
namespace PKHeX.WinForms.Controls;
public partial class PokeGrid : UserControl
{
public PokeGrid()
{
InitializeComponent();
}
public readonly List<PictureBox> Entries = new();
public int Slots { get; private set; }
private int sizeW = 68;
private int sizeH = 56;
public bool InitializeGrid(int width, int height, SpriteBuilder info)
{
var newCount = width * height;
if (Slots == newCount)
{
if (info.Width == sizeW && info.Height == sizeH)
return false;
}
sizeW = info.Width;
sizeH = info.Height;
Generate(width, height);
Slots = newCount;
return true;
}
private const int padEdge = 1; // edges
private const int border = 1; // between
private void Generate(int width, int height)
{
SuspendLayout();
Controls.Clear();
foreach (var c in Entries)
c.Dispose();
Entries.Clear();
int colWidth = sizeW;
int rowHeight = sizeH;
Location = Location with { X = 0 }; // prevent auto-expanding parent if position changes (centered)
for (int row = 0; row < height; row++)
{
var y = padEdge + (row * (rowHeight + border));
for (int column = 0; column < width; column++)
{
var x = padEdge + (column * (colWidth + border));
var pb = GetControl(sizeW, sizeH);
pb.Location = new Point(x, y);
Entries.Add(pb);
}
}
int w = (2 * padEdge) + border + (width * (colWidth + border));
int h = (2 * padEdge) + border + (height * (rowHeight + border));
Size = new Size(w, h);
Controls.AddRange(Entries.Cast<Control>().ToArray());
Debug.WriteLine($"{Name} -- Width: {Width}, Height: {Height}");
ResumeLayout();
}
public void SetBackground(Image img) => BackgroundImage = img;
public static SelectablePictureBox GetControl(int width, int height) => new()
{
AutoSize = false,
SizeMode = PictureBoxSizeMode.CenterImage,
BackColor = SlotUtil.GoodDataColor,
Width = width + (2 * border),
Height = height + (2 * border),
Padding = Padding.Empty,
Margin = Padding.Empty,
BorderStyle = BorderStyle.FixedSingle,
};
}