using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using PKHeX.Core;
using Exception = System.Exception;
namespace PKHeX.WinForms
{
///
/// Drawing Configuration for painting and updating controls
///
public sealed class DrawConfig : IDisposable
{
private const string PKM = "Pokémon Editor";
private const string Moves = "Moves";
private const string Hovering = "Hovering";
[Category(Hovering), Description("Hovering over a PKM color 1.")]
public Color GlowInitial { get; set; } = Color.White;
[Category(Hovering), Description("Hovering over a PKM color 2.")]
public Color GlowFinal { get; set; } = Color.LightSkyBlue;
#region PKM
[Category(PKM), Description("Background color of a ComboBox when the selected item is not valid.")]
public Color InvalidSelection { get; set; } = Color.DarkSalmon;
[Category(PKM), Description("Default colored marking.")]
public Color MarkDefault { get; set; } = Color.Black;
[Category(PKM), Description("Blue colored marking.")]
public Color MarkBlue { get; set; } = Color.FromArgb(000, 191, 255);
[Category(PKM), Description("Pink colored marking.")]
public Color MarkPink { get; set; } = Color.FromArgb(255, 117, 179);
[Category(PKM), Description("Male gender color.")]
public Color Male { get; set; } = Color.Blue;
[Category(PKM), Description("Female gender color.")]
public Color Female { get; set; } = Color.Red;
[Category(PKM), Description("Shiny star when using unicode characters.")]
public string ShinyUnicode { get; set; } = "☆";
[Category(PKM), Description("Shiny star when not using unicode characters.")]
public string ShinyDefault { get; set; } = "*";
#endregion
#region Moves
[Category(Moves), Description("Legal move choice background color.")]
public Color BackLegal { get; set; } = Color.FromArgb(200, 255, 200);
[Category(Moves), Description("Legal move choice text color.")]
public Color TextColor { get; set; } = SystemColors.WindowText;
[Category(Moves), Description("Illegal Legal move choice background color.")]
public Color BackColor { get; set; } = SystemColors.Window;
[Category(Moves), Description("Highlighted move choice background color.")]
public Color BackHighlighted { get; set; } = SystemColors.Highlight;
[Category(Moves), Description("Highlighted move choice text color.")]
public Color TextHighlighted { get; set; } = SystemColors.HighlightText;
#endregion
public DrawConfig() => LoadBrushes();
public Color GetGenderColor(int gender)
{
return gender switch
{
0 => Male,
1 => Female,
_ => TextColor
};
}
public bool GetMarkingColor(int markval, out Color c)
{
switch (markval)
{
case 1: c = MarkBlue; return true;
case 2: c = MarkPink; return true;
default: c = MarkDefault; return false; // recolor not required
}
}
public Color GetText(bool highlight) => highlight ? TextHighlighted : TextColor;
public Color GetBackground(bool legal, bool highlight) => highlight ? BackHighlighted : (legal ? BackLegal : BackColor);
public readonly BrushSet Brushes = new();
public void LoadBrushes()
{
Brushes.BackLegal = new SolidBrush(BackLegal);
Brushes.Text = new SolidBrush(TextColor);
Brushes.BackDefault = new SolidBrush(BackColor);
Brushes.TextHighlighted = new SolidBrush(TextHighlighted);
Brushes.BackHighlighted = new SolidBrush(BackHighlighted);
}
public void Dispose() => Brushes.Dispose();
public override string ToString()
{
var props = ReflectUtil.GetAllPropertyInfoCanWritePublic(typeof(DrawConfig));
var lines = new List();
foreach (var p in props)
{
if (p.PropertyType == typeof(BrushSet))
continue;
var name = p.Name;
var value = p.PropertyType == typeof(Color) ? ((Color)p.GetValue(this)!).ToArgb() : p.GetValue(this);
lines.Add($"{name}\t{value}");
}
return string.Join("\n", lines);
}
public static DrawConfig GetConfig(string data)
{
var config = new DrawConfig();
if (string.IsNullOrWhiteSpace(data))
return config;
var lines = data.Split('\n');
foreach (var l in lines)
config.ApplyLine(l);
return config;
}
private void ApplyLine(string l)
{
var t = typeof(DrawConfig);
var split = l.Split('\t');
var name = split[0];
var value = split[1];
try
{
var pi = t.GetProperty(name);
if (pi == null)
throw new ArgumentNullException(name);
if (pi.PropertyType == typeof(Color))
{
var color = Color.FromArgb(int.Parse(value));
pi.SetValue(this, color);
}
else
{
pi.SetValue(this, value);
}
}
#pragma warning disable CA1031 // Do not catch general exception types
catch (Exception e)
#pragma warning restore CA1031 // Do not catch general exception types
{
Debug.WriteLine($"Failed to write {name} to {value}!");
Debug.WriteLine(e.Message);
}
}
}
public sealed class BrushSet : IDisposable
{
public Brush Text { get; set; } = Brushes.Black;
public Brush BackLegal { get; set; } = Brushes.DarkSeaGreen;
public Brush BackDefault { get; set; } = Brushes.White;
public Brush TextHighlighted { get; set; } = Brushes.White;
public Brush BackHighlighted { get; set; } = Brushes.Blue;
public Brush GetText(bool highlight) => highlight ? TextHighlighted : Text;
public Brush GetBackground(bool legal, bool highlight) => highlight ? BackHighlighted : (legal ? BackLegal : BackDefault);
public void Dispose()
{
Text.Dispose();
BackLegal.Dispose();
BackDefault.Dispose();
TextHighlighted.Dispose();
BackHighlighted.Dispose();
}
}
}