172 lines
4.4 KiB
C++
172 lines
4.4 KiB
C++
/*
|
|
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();
|
|
} |