/* GWEN Copyright (c) 2010 Facepunch Studios See license in Gwen.h */ #include "Gwen/Controls/HSVColorPicker.h" #include "Gwen/Controls/ColorControls.h" #include "Gwen/Controls/ColorPicker.h" #include "Gwen/Controls/TextBox.h" #include "Gwen/Controls/Label.h" #include "Gwen/Controls/PanelListPanel.h" #include "Gwen/Utility.h" using namespace Gwen; using namespace Gwen::Controls; GWEN_CONTROL_CONSTRUCTOR( HSVColorPicker ) { SetMouseInputEnabled( true ); SetSize( 256, 128 ); SetCacheToTexture(); m_LerpBox = new Gwen::Controls::ColorLerpBox( this ); m_LerpBox->onSelectionChanged.Add( this, &HSVColorPicker::ColorBoxChanged ); m_LerpBox->SetPos( 5, 5 ); m_ColorSlider = new Gwen::Controls::ColorSlider( this ); m_ColorSlider->SetPos( m_LerpBox->Width() + 15, 5 ); m_ColorSlider->onSelectionChanged.Add( this, &HSVColorPicker::ColorSliderChanged ); m_After = new Gwen::ControlsInternal::ColorDisplay( this ); m_After->SetSize( 48, 24 ); m_After->SetPos( m_ColorSlider->X() + m_ColorSlider->Width() + 15, 5 ); m_Before = new Gwen::ControlsInternal::ColorDisplay( this ); m_Before->SetSize( 48, 24 ); m_Before->SetPos( m_After->X(), 28 ); int x = m_Before->X(); int y = m_Before->Y() + 30; { Label* label = new Label( this ); label->SetText(L"R:"); label->SizeToContents(); label->SetPos( x, y ); TextBoxNumeric* numeric = new TextBoxNumeric( this ); numeric->SetName( "RedBox" ); numeric->SetPos( x + 15, y -1 ); numeric->SetSize( 26, 16 ); numeric->SetSelectAllOnFocus( true ); numeric->onTextChanged.Add( this, &HSVColorPicker::NumericTyped ); } y+= 20; { Label* label = new Label( this ); label->SetText(L"G:"); label->SizeToContents(); label->SetPos( x, y ); TextBoxNumeric* numeric = new TextBoxNumeric( this ); numeric->SetName( "GreenBox" ); numeric->SetPos( x + 15, y -1 ); numeric->SetSize( 26, 16 ); numeric->SetSelectAllOnFocus( true ); numeric->onTextChanged.Add( this, &HSVColorPicker::NumericTyped ); } y+= 20; { Label* label = new Label( this ); label->SetText(L"B:"); label->SizeToContents(); label->SetPos( x, y ); TextBoxNumeric* numeric = new TextBoxNumeric( this ); numeric->SetName( "BlueBox" ); numeric->SetPos( x + 15, y -1 ); numeric->SetSize( 26, 16 ); numeric->SetSelectAllOnFocus( true ); numeric->onTextChanged.Add( this, &HSVColorPicker::NumericTyped ); } } void HSVColorPicker::NumericTyped( Gwen::Controls::Base* control ) { TextBoxNumeric* box = control->DynamicCastTextBoxNumeric(); if ( !box ) return; if ( box->GetText() == L"" ) return; int textValue = atoi( Gwen::Utility::UnicodeToString( box->GetText()).c_str() ); if ( textValue < 0 ) textValue = 0; if ( textValue > 255 ) textValue = 255; Gwen::Color newColor = GetColor(); if ( box->GetName().find( "Red" ) != Gwen::String::npos ) { newColor.r = textValue; } else if ( box->GetName().find( "Green" ) != Gwen::String::npos ) { newColor.g = textValue; } else if ( box->GetName().find( "Blue" ) != Gwen::String::npos ) { newColor.b = textValue; } else if ( box->GetName().find( "Alpha" ) != Gwen::String::npos ) { newColor.a = textValue; } SetColor( newColor ); } void HSVColorPicker::UpdateControls(Gwen::Color color) { TextBoxNumeric* redBox = FindChildByName( "RedBox", false )->DynamicCastTextBoxNumeric(); if ( redBox ) redBox->SetText( Gwen::Utility::ToString( (int)color.r), false ); TextBoxNumeric* greenBox = FindChildByName( "GreenBox", false )->DynamicCastTextBoxNumeric(); if ( greenBox ) greenBox->SetText( Gwen::Utility::ToString( (int)color.g ), false ); TextBoxNumeric* blueBox = FindChildByName( "BlueBox", false )->DynamicCastTextBoxNumeric(); if ( blueBox ) blueBox->SetText( Gwen::Utility::ToString( (int)color.b ), false ); m_After->SetColor( color ); } void HSVColorPicker::SetColor( Gwen::Color color, bool onlyHue, bool reset ) { UpdateControls( color ); if ( reset ) m_Before->SetColor( color ); m_ColorSlider->SetColor( color ); m_LerpBox->SetColor( color, onlyHue ); m_After->SetColor( color ); } Gwen::Color HSVColorPicker::GetColor() { return m_LerpBox->GetSelectedColor(); } void HSVColorPicker::ColorBoxChanged( Gwen::Controls::Base* /*pControl*/ ) { onColorChanged.Call( this ); UpdateControls( GetColor() ); Invalidate(); } void HSVColorPicker::ColorSliderChanged( Gwen::Controls::Base* /*pControl*/ ) { if ( m_LerpBox ) m_LerpBox->SetColor( m_ColorSlider->GetSelectedColor(), true ); Invalidate(); }