using System; using System.Collections.Generic; using System.Drawing; using Gwen.ControlInternal; namespace Gwen.Control { /// /// RGBA color picker. /// public class ColorPicker : Base, IColorPicker { private Color m_Color; /// /// Selected color. /// public Color SelectedColor { get { return m_Color; } set { m_Color = value; UpdateControls(); } } /// /// Red value of the selected color. /// public int R { get { return m_Color.R; } set { m_Color = Color.FromArgb(m_Color.A, value, m_Color.G, m_Color.B); } } /// /// Green value of the selected color. /// public int G { get { return m_Color.G; } set { m_Color = Color.FromArgb(m_Color.A, m_Color.R, value, m_Color.B); } } /// /// Blue value of the selected color. /// public int B { get { return m_Color.B; } set { m_Color = Color.FromArgb(m_Color.A, m_Color.R, m_Color.G, value); } } /// /// Alpha value of the selected color. /// public int A { get { return m_Color.A; } set { m_Color = Color.FromArgb(value, m_Color.R, m_Color.G, m_Color.B); } } /// /// Invoked when the selected color has been changed. /// public event GwenEventHandler ColorChanged; /// /// Initializes a new instance of the class. /// /// Parent control. public ColorPicker(Base parent) : base(parent) { MouseInputEnabled = true; SetSize(256, 150); CreateControls(); SelectedColor = Color.FromArgb(255, 50, 60, 70); } private void CreateColorControl(String name, int y) { const int colorSize = 12; GroupBox colorGroup = new GroupBox(this); colorGroup.SetPosition(10, y); colorGroup.SetText(name); colorGroup.SetSize(160, 35); colorGroup.Name = name + "groupbox"; ColorDisplay disp = new ColorDisplay(colorGroup); disp.Name = name; disp.SetBounds(0, 10, colorSize, colorSize); TextBoxNumeric numeric = new TextBoxNumeric(colorGroup); numeric.Name = name + "Box"; numeric.SetPosition(105, 7); numeric.SetSize(26, 16); numeric.SelectAllOnFocus = true; numeric.TextChanged += NumericTyped; HorizontalSlider slider = new HorizontalSlider(colorGroup); slider.SetPosition(colorSize + 5, 10); slider.SetRange(0, 255); slider.SetSize(80, colorSize); slider.Name = name + "Slider"; slider.ValueChanged += SlidersMoved; } private void NumericTyped(Base control) { TextBoxNumeric box = control as TextBoxNumeric; if (null == box) return; if (box.Text == string.Empty) return; int textValue = (int) box.Value; if (textValue < 0) textValue = 0; if (textValue > 255) textValue = 255; if (box.Name.Contains("Red")) R = textValue; if (box.Name.Contains("Green")) G = textValue; if (box.Name.Contains("Blue")) B = textValue; if (box.Name.Contains("Alpha")) A = textValue; UpdateControls(); } private void CreateControls() { const int startY = 5; const int height = 35; CreateColorControl("Red", startY); CreateColorControl("Green", startY + height); CreateColorControl("Blue", startY + height*2); CreateColorControl("Alpha", startY + height*3); GroupBox finalGroup = new GroupBox(this); finalGroup.SetPosition(180, 40); finalGroup.SetSize(60, 60); finalGroup.SetText("Result"); finalGroup.Name = "ResultGroupBox"; ColorDisplay disp = new ColorDisplay(finalGroup); disp.Name = "Result"; disp.SetBounds(0, 10, 32, 32); //disp.DrawCheckers = true; //UpdateControls(); } private void UpdateColorControls(String name, Color col, int sliderVal) { ColorDisplay disp = FindChildByName(name, true) as ColorDisplay; disp.Color = col; HorizontalSlider slider = FindChildByName(name + "Slider", true) as HorizontalSlider; slider.Value = sliderVal; TextBoxNumeric box = FindChildByName(name + "Box", true) as TextBoxNumeric; box.Value = sliderVal; } private void UpdateControls() { //This is a little weird, but whatever for now UpdateColorControls("Red", Color.FromArgb(255, SelectedColor.R, 0, 0), SelectedColor.R); UpdateColorControls("Green", Color.FromArgb(255, 0, SelectedColor.G, 0), SelectedColor.G); UpdateColorControls("Blue", Color.FromArgb(255, 0, 0, SelectedColor.B), SelectedColor.B); UpdateColorControls("Alpha", Color.FromArgb(SelectedColor.A, 255, 255, 255), SelectedColor.A); ColorDisplay disp = FindChildByName("Result", true) as ColorDisplay; disp.Color = SelectedColor; if (ColorChanged != null) ColorChanged.Invoke(this); } private void SlidersMoved(Base control) { /* HorizontalSlider* redSlider = gwen_cast( FindChildByName( "RedSlider", true ) ); HorizontalSlider* greenSlider = gwen_cast( FindChildByName( "GreenSlider", true ) ); HorizontalSlider* blueSlider = gwen_cast( FindChildByName( "BlueSlider", true ) ); HorizontalSlider* alphaSlider = gwen_cast( FindChildByName( "AlphaSlider", true ) ); */ HorizontalSlider slider = control as HorizontalSlider; if (slider != null) SetColorByName(GetColorFromName(slider.Name), (int)slider.Value); UpdateControls(); //SetColor( Gwen::Color( redSlider->GetValue(), greenSlider->GetValue(), blueSlider->GetValue(), alphaSlider->GetValue() ) ); } /// /// Lays out the control's interior according to alignment, padding, dock etc. /// /// Skin to use. protected override void Layout(Skin.Base skin) { base.Layout(skin); SizeToChildren(false, true); SetSize(Width, Height + 5); GroupBox groupBox = FindChildByName("ResultGroupBox", true) as GroupBox; if (groupBox != null) groupBox.SetPosition(groupBox.X, Height * 0.5f - groupBox.Height * 0.5f); //UpdateControls(); // this spams events continuously every tick } private int GetColorByName(String colorName) { if (colorName == "Red") return SelectedColor.R; if (colorName == "Green") return SelectedColor.G; if (colorName == "Blue") return SelectedColor.B; if (colorName == "Alpha") return SelectedColor.A; return 0; } private static String GetColorFromName(String name) { if (name.Contains("Red")) return "Red"; if (name.Contains("Green")) return "Green"; if (name.Contains("Blue")) return "Blue"; if (name.Contains("Alpha")) return "Alpha"; return String.Empty; } private void SetColorByName(String colorName, int colorValue) { if (colorName == "Red") R = colorValue; else if (colorName == "Green") G = colorValue; else if (colorName == "Blue") B = colorValue; else if (colorName == "Alpha") A = colorValue; } /// /// Determines whether the Alpha control is visible. /// public bool AlphaVisible { get { GroupBox gb = FindChildByName("Alphagroupbox", true) as GroupBox; return !gb.IsHidden; } set { GroupBox gb = FindChildByName("Alphagroupbox", true) as GroupBox; gb.IsHidden = !value; Invalidate(); } } } }