PKHeX/Subforms/PKM Editors/RibbonEditor.cs
Kaphotics b47b26222f More descriptive pkm properties (ribbon/training)
Adding new update for editors
2016-07-16 15:52:33 -07:00

164 lines
5.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace PKHeX
{
public partial class RibbonEditor : Form
{
public RibbonEditor()
{
InitializeComponent();
int vertScrollWidth = SystemInformation.VerticalScrollBarWidth;
TLP_Ribbons.Padding = FLP_Ribbons.Padding = new Padding(0, 0, vertScrollWidth, 0);
populateRibbons();
}
private readonly List<RibbonInfo> riblist = new List<RibbonInfo>();
private readonly PKM pkm = Main.pkm.Clone();
private const string PrefixNUD = "NUD_";
private const string PrefixLabel = "L_";
private const string PrefixCHK = "CHK_";
private const string PrefixPB = "PB_";
private void B_Cancel_Click(object sender, EventArgs e)
{
Close();
}
private void B_Save_Click(object sender, EventArgs e)
{
save();
Close();
}
private void populateRibbons()
{
// Get a list of all Ribbon Attributes in the PKM
var RibbonNames = ReflectUtil.getPropertiesStartWithPrefix(pkm.GetType(), "Ribbon");
foreach (var RibbonName in RibbonNames)
{
object RibbonValue = ReflectUtil.GetValue(pkm, RibbonName);
if (RibbonValue is int)
riblist.Add(new RibbonInfo(RibbonName, (int)RibbonValue));
if (RibbonValue is bool)
riblist.Add(new RibbonInfo(RibbonName, (bool)RibbonValue));
}
TLP_Ribbons.ColumnCount = 2;
TLP_Ribbons.RowCount = 0;
// Add Ribbons
foreach (var rib in riblist)
{
addRibbonSprite(rib);
addRibbonChoice(rib);
}
// Force auto-size
foreach (RowStyle style in TLP_Ribbons.RowStyles)
style.SizeType = SizeType.AutoSize;
foreach (ColumnStyle style in TLP_Ribbons.ColumnStyles)
style.SizeType = SizeType.AutoSize;
}
private void addRibbonSprite(RibbonInfo rib)
{
PictureBox pb = new PictureBox { AutoSize = true, Visible = false, Name = PrefixPB + rib.Name };
var img = Properties.Resources.ResourceManager.GetObject(rib.Name.ToLower());
if (img != null)
pb.Image = (Image)img;
FLP_Ribbons.Controls.Add(pb);
}
private void addRibbonChoice(RibbonInfo rib)
{
// Get row we add to
int row = TLP_Ribbons.RowCount;
TLP_Ribbons.RowCount++;
var label = new Label
{
Anchor = AnchorStyles.Left,
Name = PrefixLabel + rib.Name,
Text = rib.Name,
Padding = Padding.Empty,
AutoSize = true,
};
TLP_Ribbons.Controls.Add(label, 1, row);
if (rib.RibbonCount >= 0) // numeric count ribbon
{
var nud = new NumericUpDown
{
Anchor = AnchorStyles.Right,
Name = PrefixNUD + rib.Name,
Minimum = 0,
Width = 35,
Increment = 1,
Padding = Padding.Empty,
};
if (rib.Name.Contains("MemoryContest"))
nud.Maximum = 40;
else if (rib.Name.Contains("MemoryBattle"))
nud.Maximum = 8;
else nud.Maximum = 4; // g3 contest ribbons
nud.ValueChanged += (sender, e) => { rib.RibbonCount = (int)nud.Value; FLP_Ribbons.Controls[PrefixPB + rib.Name].Visible = rib.RibbonCount > 0; };
nud.Value = rib.RibbonCount > nud.Maximum ? nud.Maximum : rib.RibbonCount;
TLP_Ribbons.Controls.Add(nud, 0, row);
}
else // boolean ribbon
{
var chk = new CheckBox
{
Anchor = AnchorStyles.Right,
Name = PrefixCHK + rib.Name,
AutoSize = true,
Padding = Padding.Empty,
};
chk.CheckedChanged += (sender, e) => { rib.HasRibbon = chk.Checked; FLP_Ribbons.Controls[PrefixPB + rib.Name].Visible = rib.HasRibbon; };
chk.Checked = rib.HasRibbon;
TLP_Ribbons.Controls.Add(chk, 0, row);
}
}
private void save()
{
foreach (var rib in riblist)
ReflectUtil.SetValue(pkm, rib.Name, rib.RibbonCount < 0 ? rib.HasRibbon : (object) rib.RibbonCount);
Main.pkm = pkm;
}
private class RibbonInfo
{
public readonly string Name;
public bool HasRibbon;
public int RibbonCount = -1;
public RibbonInfo(string name, bool hasRibbon)
{
Name = name;
HasRibbon = hasRibbon;
}
public RibbonInfo(string name, int count)
{
Name = name;
RibbonCount = count;
}
}
private void B_All_Click(object sender, EventArgs e)
{
foreach (var c in TLP_Ribbons.Controls.OfType<CheckBox>())
c.Checked = true;
foreach (var n in TLP_Ribbons.Controls.OfType<NumericUpDown>())
n.Value = n.Maximum;
}
private void B_None_Click(object sender, EventArgs e)
{
foreach (var c in TLP_Ribbons.Controls.OfType<CheckBox>())
c.Checked = false;
foreach (var n in TLP_Ribbons.Controls.OfType<NumericUpDown>())
n.Value = 0;
}
}
}