/* GWEN Copyright (c) 2010 Facepunch Studios See license in Gwen.h */ #include "Gwen/Controls/ColorPicker.h" #include "Gwen/Controls/HorizontalSlider.h" #include "Gwen/Controls/GroupBox.h" #include "Gwen/Controls/TextBox.h" #include "Gwen/Utility.h" using namespace Gwen; using namespace Gwen::Controls; using namespace Gwen::ControlsInternal; GWEN_CONTROL_CONSTRUCTOR( ColorPicker ) { SetMouseInputEnabled( true ); SetSize( 256, 150 ); CreateControls(); SetColor( Gwen::Color( 50, 60, 70, 255 ) ); } void ColorPicker::CreateColorControl( Gwen::String name, int y ) { int colorSize = 12; GroupBox* colorGroup = new GroupBox( this ); colorGroup->SetPos( 10, y ); colorGroup->SetText( name ); colorGroup->SetSize( 160, 35 ); colorGroup->SetName( name + "groupbox" ); ColorDisplay* disp = new ColorDisplay( colorGroup ); disp->SetName(name); disp->SetBounds( 0 , 10, colorSize, colorSize ); TextBoxNumeric* numeric = new TextBoxNumeric( colorGroup ); numeric->SetName( name + "Box" ); numeric->SetPos( 105, 7 ); numeric->SetSize( 26, 16 ); numeric->SetSelectAllOnFocus( true ); numeric->onTextChanged.Add( this, &ColorPicker::NumericTyped ); HorizontalSlider* slider = new HorizontalSlider( colorGroup ); slider->SetPos( colorSize + 5 , 10 ); slider->SetRange( 0, 255 ); slider->SetSize( 80, colorSize ); slider->SetName( name + "Slider"); slider->onValueChanged.Add( this, &ColorPicker::SlidersMoved ); } void ColorPicker::NumericTyped( Gwen::Controls::Base* control ) { if (!control) return; TextBoxNumeric* box = control->DynamicCastTextBoxNumeric(); if (!box) return; if ( box->GetText() == L"") return; int textValue = atoi( Utility::UnicodeToString( box->GetText()).c_str() ); if ( textValue < 0) textValue = 0; if ( textValue > 255) textValue = 255; if ( box->GetName().find("Red") != Gwen::String::npos ) SetRed( textValue ); if ( box->GetName().find("Green") != Gwen::String::npos ) SetGreen( textValue ); if ( box->GetName().find("Blue") != Gwen::String::npos ) SetBlue( textValue ); if ( box->GetName().find("Alpha") != Gwen::String::npos ) SetAlpha( textValue ); UpdateControls(); } void ColorPicker::SetColor( Gwen::Color color ) { m_Color = color; UpdateControls(); } void ColorPicker::CreateControls() { int startY = 5; 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->SetPos( 180, 40 ); finalGroup->SetSize( 60, 60 ); finalGroup->SetText( "Result" ); finalGroup->SetName( "ResultGroupBox" ); ColorDisplay* disp = new ColorDisplay( finalGroup ); disp->SetName( "Result" ); disp->SetBounds( 0 , 10, 32, 32 ); disp->SetDrawCheckers( true ); //UpdateControls(); } void ColorPicker::UpdateColorControls( Gwen::String name, Gwen::Color col, int sliderVal ) { Base* el = FindChildByName( name, true ); ColorDisplay* disp = el ? el->DynamicCastColorDisplay() : 0; disp->SetColor( col ); HorizontalSlider* slider = FindChildByName( name + "Slider", true )->DynamicCastHorizontalSlider(); slider->SetValue( sliderVal ); TextBoxNumeric* box = FindChildByName( name + "Box", true )->DynamicCastTextBoxNumeric(); box->SetText( Gwen::Utility::ToString( sliderVal ) ); } void ColorPicker::UpdateControls() { //This is a little weird, but whatever for now UpdateColorControls( "Red", Color( GetColor().r, 0, 0, 255 ), GetColor().r ); UpdateColorControls( "Green", Color( 0, GetColor().g, 0, 255 ), GetColor().g ); UpdateColorControls( "Blue", Color( 0, 0, GetColor().b, 255 ), GetColor().b ); UpdateColorControls( "Alpha", Color( 255, 255, 255, GetColor().a ), GetColor().a ); ColorDisplay* disp = FindChildByName( "Result", true )->DynamicCastColorDisplay(); disp->SetColor( Color( GetColor().r, GetColor().g, GetColor().b, GetColor().a ) ); onColorChanged.Call( this ); } void ColorPicker::SlidersMoved( Gwen::Controls::Base* control ) { HorizontalSlider* slider = control->DynamicCastHorizontalSlider(); if (slider) SetColorByName( GetColorFromName( slider->GetName() ), slider->GetValue() ); UpdateControls(); //SetColor( Gwen::Color( redSlider->GetValue(), greenSlider->GetValue(), blueSlider->GetValue(), alphaSlider->GetValue() ) ); } void ColorPicker::Layout( Skin::Base* skin ) { BaseClass::Layout( skin ); SizeToChildren( false, true ); SetSize( Width(), Height() + 5 ); GroupBox* groupBox = FindChildByName( "ResultGroupBox", true )->DynamicCastGroupBox(); if ( groupBox ) groupBox->SetPos( groupBox->X(), Height() * 0.5f - groupBox->Height() * 0.5f ); UpdateControls(); } void ColorPicker::Render( Skin::Base* skin ) { skin->DrawBackground( this ); } int ColorPicker::GetColorByName( Gwen::String colorName ) { if ( colorName == "Red") return GetColor().r; else if ( colorName == "Green") return GetColor().g; else if ( colorName == "Blue") return GetColor().b; else if ( colorName == "Alpha") return GetColor().a; else return 0; } Gwen::String ColorPicker::GetColorFromName( Gwen::String name ) { if ( name.find("Red") != Gwen::String::npos ) return "Red"; if ( name.find("Green") != Gwen::String::npos ) return "Green"; if ( name.find("Blue") != Gwen::String::npos ) return "Blue"; if ( name.find("Alpha") != Gwen::String::npos ) return "Alpha"; else return ""; } void ColorPicker::SetColorByName( Gwen::String colorName, int colorValue ) { if ( colorName == "Red") SetRed( colorValue ); else if ( colorName == "Green") SetGreen( colorValue ); else if ( colorName == "Blue") SetBlue( colorValue ); else if ( colorName == "Alpha") SetAlpha( colorValue ); } void ColorPicker::SetAlphaVisible( bool visible ) { GroupBox* groupBox = FindChildByName( "Alphagroupbox", true )->DynamicCastGroupBox(); groupBox->SetHidden( !visible ); Invalidate(); }