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