2014-07-22 08:12:30 +02:00
|
|
|
package controlP5;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* controlP5 is a processing gui library.
|
|
|
|
*
|
2016-04-14 12:39:16 +02:00
|
|
|
* 2006-2015 by Andreas Schlegel
|
2014-07-22 08:12:30 +02:00
|
|
|
*
|
2016-04-14 12:39:16 +02:00
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2.1
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
2014-07-22 08:12:30 +02:00
|
|
|
*
|
2016-04-14 12:39:16 +02:00
|
|
|
* You should have received a copy of the GNU Lesser General
|
|
|
|
* Public License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
|
|
* Boston, MA 02111-1307 USA
|
2014-07-22 08:12:30 +02:00
|
|
|
*
|
|
|
|
* @author Andreas Schlegel (http://www.sojamo.de)
|
|
|
|
* @modified ##date##
|
|
|
|
* @version ##version##
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
|
|
import java.lang.reflect.Method;
|
|
|
|
|
|
|
|
import processing.core.PGraphics;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A simple color picker using sliders to adjust RGBA values.
|
|
|
|
*
|
|
|
|
* @example controllers/ControlP5colorPicker
|
|
|
|
*/
|
|
|
|
public class ColorPicker extends ControlGroup< ColorPicker > {
|
|
|
|
|
|
|
|
protected Slider sliderRed;
|
|
|
|
|
|
|
|
protected Slider sliderGreen;
|
|
|
|
|
|
|
|
protected Slider sliderBlue;
|
|
|
|
|
|
|
|
protected Slider sliderAlpha;
|
|
|
|
|
|
|
|
protected Canvas currentColor;
|
|
|
|
|
|
|
|
private Object _myPlug;
|
|
|
|
|
|
|
|
private String _myPlugName;
|
|
|
|
|
|
|
|
private boolean broadcast;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convenience constructor to extend ColorPicker.
|
|
|
|
*
|
|
|
|
* @example use/ControlP5extendController
|
|
|
|
* @param theControlP5
|
|
|
|
* @param theName
|
|
|
|
*/
|
|
|
|
public ColorPicker( ControlP5 theControlP5 , String theName ) {
|
|
|
|
this( theControlP5 , theControlP5.getDefaultTab( ) , theName , 0 , 0 , 255 , 10 );
|
|
|
|
theControlP5.register( theControlP5.papplet , theName , this );
|
|
|
|
}
|
|
|
|
|
|
|
|
protected ColorPicker( ControlP5 theControlP5 , ControllerGroup< ? > theParent , String theName , int theX , int theY , int theWidth , int theHeight ) {
|
|
|
|
super( theControlP5 , theParent , theName , theX , theY , theWidth , theHeight );
|
|
|
|
isBarVisible = false;
|
|
|
|
isCollapse = false;
|
|
|
|
_myArrayValue = new float[] { 255 , 255 , 255 , 255 };
|
|
|
|
|
|
|
|
currentColor = addCanvas( new ColorField( ) );
|
|
|
|
sliderRed = cp5.addSlider( theName + "-red" , 0 , 255 , 0 , 0 , theWidth , theHeight );
|
|
|
|
cp5.removeProperty( sliderRed );
|
|
|
|
sliderRed.setId( 0 );
|
|
|
|
sliderRed.setBroadcast( false );
|
|
|
|
sliderRed.addListener( this );
|
|
|
|
sliderRed.moveTo( this );
|
|
|
|
sliderRed.setMoveable( false );
|
|
|
|
sliderRed.setColorBackground( 0xff660000 );
|
|
|
|
sliderRed.setColorForeground( 0xffaa0000 );
|
|
|
|
sliderRed.setColorActive( 0xffff0000 );
|
|
|
|
sliderRed.getCaptionLabel( ).setVisible( false );
|
|
|
|
sliderRed.setDecimalPrecision( 0 );
|
|
|
|
sliderRed.setValue( 255 );
|
|
|
|
|
|
|
|
sliderGreen = cp5.addSlider( theName + "-green" , 0 , 255 , 0 , theHeight + 1 , theWidth , theHeight );
|
|
|
|
cp5.removeProperty( sliderGreen );
|
|
|
|
sliderGreen.setId( 1 );
|
|
|
|
sliderGreen.setBroadcast( false );
|
|
|
|
sliderGreen.addListener( this );
|
|
|
|
sliderGreen.moveTo( this );
|
|
|
|
sliderGreen.setMoveable( false );
|
|
|
|
sliderGreen.setColorBackground( 0xff006600 );
|
|
|
|
sliderGreen.setColorForeground( 0xff00aa00 );
|
|
|
|
sliderGreen.setColorActive( 0xff00ff00 );
|
|
|
|
sliderGreen.getCaptionLabel( ).setVisible( false );
|
|
|
|
sliderGreen.setDecimalPrecision( 0 );
|
|
|
|
sliderGreen.setValue( 255 );
|
|
|
|
|
|
|
|
sliderBlue = cp5.addSlider( theName + "-blue" , 0 , 255 , 0 , ( theHeight + 1 ) * 2 , theWidth , theHeight );
|
|
|
|
cp5.removeProperty( sliderBlue );
|
|
|
|
sliderBlue.setId( 2 );
|
|
|
|
sliderBlue.setBroadcast( false );
|
|
|
|
sliderBlue.addListener( this );
|
|
|
|
sliderBlue.moveTo( this );
|
|
|
|
sliderBlue.setMoveable( false );
|
|
|
|
sliderBlue.setColorBackground( 0xff000066 );
|
|
|
|
sliderBlue.setColorForeground( 0xff0000aa );
|
|
|
|
sliderBlue.setColorActive( 0xff0000ff );
|
|
|
|
sliderBlue.getCaptionLabel( ).setVisible( false );
|
|
|
|
sliderBlue.setDecimalPrecision( 0 );
|
|
|
|
sliderBlue.setValue( 255 );
|
|
|
|
|
|
|
|
sliderAlpha = cp5.addSlider( theName + "-alpha" , 0 , 255 , 0 , ( theHeight + 1 ) * 3 , theWidth , theHeight );
|
|
|
|
cp5.removeProperty( sliderAlpha );
|
|
|
|
sliderAlpha.setId( 3 );
|
|
|
|
sliderAlpha.setBroadcast( false );
|
|
|
|
sliderAlpha.addListener( this );
|
|
|
|
|
|
|
|
sliderAlpha.moveTo( this );
|
|
|
|
sliderAlpha.setMoveable( false );
|
|
|
|
sliderAlpha.setColorBackground( 0xff666666 );
|
|
|
|
sliderAlpha.setColorForeground( 0xffaaaaaa );
|
|
|
|
sliderAlpha.setColorActive( 0xffffffff );
|
|
|
|
sliderAlpha.getCaptionLabel( ).setVisible( false );
|
|
|
|
sliderAlpha.setDecimalPrecision( 0 );
|
|
|
|
sliderAlpha.getValueLabel( ).setColor( 0xff000000 );
|
|
|
|
sliderAlpha.setValue( 255 );
|
|
|
|
|
|
|
|
_myPlug = cp5.papplet;
|
|
|
|
_myPlugName = getName( );
|
|
|
|
if ( !ControllerPlug.checkPlug( _myPlug , _myPlugName , new Class[] { int.class } ) ) {
|
|
|
|
_myPlug = null;
|
|
|
|
}
|
|
|
|
broadcast = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ColorPicker plugTo( Object theObject ) {
|
|
|
|
_myPlug = theObject;
|
|
|
|
if ( !ControllerPlug.checkPlug( _myPlug , _myPlugName , new Class[] { int.class } ) ) {
|
|
|
|
_myPlug = null;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ColorPicker plugTo( Object theObject , String thePlugName ) {
|
|
|
|
_myPlug = theObject;
|
|
|
|
_myPlugName = thePlugName;
|
|
|
|
if ( !ControllerPlug.checkPlug( _myPlug , _myPlugName , new Class[] { int.class } ) ) {
|
|
|
|
_myPlug = null;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ControlP5.Invisible
|
|
|
|
public void controlEvent( ControlEvent theEvent ) {
|
|
|
|
if ( broadcast ) {
|
|
|
|
_myArrayValue[ theEvent.getId( ) ] = theEvent.getValue( );
|
|
|
|
broadcast( );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private ColorPicker broadcast( ) {
|
|
|
|
ControlEvent ev = new ControlEvent( this );
|
|
|
|
setValue( getColorValue( ) );
|
|
|
|
cp5.getControlBroadcaster( ).broadcast( ev , ControlP5Constants.EVENT );
|
|
|
|
if ( _myPlug != null ) {
|
|
|
|
try {
|
|
|
|
Method method = _myPlug.getClass( ).getMethod( _myPlugName , int.class );
|
2016-04-14 12:39:16 +02:00
|
|
|
method.invoke( _myPlug , ( int ) getColorValue( ) );
|
2014-07-22 08:12:30 +02:00
|
|
|
} catch ( SecurityException ex ) {
|
|
|
|
ex.printStackTrace( );
|
|
|
|
} catch ( NoSuchMethodException ex ) {
|
|
|
|
ex.printStackTrace( );
|
|
|
|
} catch ( IllegalArgumentException ex ) {
|
|
|
|
ex.printStackTrace( );
|
|
|
|
} catch ( IllegalAccessException ex ) {
|
|
|
|
ex.printStackTrace( );
|
|
|
|
} catch ( InvocationTargetException ex ) {
|
|
|
|
ex.printStackTrace( );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Requires an array of size 4 for RGBA
|
|
|
|
*
|
|
|
|
* @return ColorPicker
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
public ColorPicker setArrayValue( float[] theArray ) {
|
|
|
|
broadcast = false;
|
|
|
|
sliderRed.setValue( theArray[ 0 ] );
|
|
|
|
sliderGreen.setValue( theArray[ 1 ] );
|
|
|
|
sliderBlue.setValue( theArray[ 2 ] );
|
|
|
|
sliderAlpha.setValue( theArray[ 3 ] );
|
|
|
|
broadcast = true;
|
|
|
|
_myArrayValue = theArray;
|
|
|
|
return broadcast( );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* {@inheritDoc}
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
public ColorPicker setColorValue( int theColor ) {
|
|
|
|
setArrayValue( new float[] { theColor >> 16 & 0xff , theColor >> 8 & 0xff , theColor >> 0 & 0xff , theColor >> 24 & 0xff } );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getColorValue( ) {
|
|
|
|
return 0xffffffff & ( int ) ( _myArrayValue[ 3 ] ) << 24 | ( int ) ( _myArrayValue[ 0 ] ) << 16 | ( int ) ( _myArrayValue[ 1 ] ) << 8 | ( int ) ( _myArrayValue[ 2 ] ) << 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
private class ColorField extends Canvas {
|
|
|
|
|
|
|
|
public void draw( PGraphics theGraphics ) {
|
|
|
|
theGraphics.fill( _myArrayValue[ 0 ] , _myArrayValue[ 1 ] , _myArrayValue[ 2 ] , _myArrayValue[ 3 ] );
|
|
|
|
theGraphics.rect( 0 , 44 , getWidth( ) , 15 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// public ColorPicker setColor(int... theArray) {
|
|
|
|
// switch (theArray.length) {
|
|
|
|
// case (1):
|
|
|
|
// setArrayValue(new float[] { theArray[0], theArray[0], theArray[0], getColorValue() >> 24 &
|
|
|
|
// 0xff });
|
|
|
|
// break;
|
|
|
|
// case (2):
|
|
|
|
// setArrayValue(new float[] { theArray[0], theArray[0], theArray[0], theArray[1] });
|
|
|
|
// break;
|
|
|
|
// case (3):
|
|
|
|
// setArrayValue(new float[] { theArray[0], theArray[1], theArray[2], getColorValue() >> 24 &
|
|
|
|
// 0xff });
|
|
|
|
// break;
|
|
|
|
// case (4):
|
|
|
|
// setArrayValue(new float[] { theArray[0], theArray[1], theArray[2], theArray[3] });
|
|
|
|
// break;
|
|
|
|
// }
|
|
|
|
// return this;
|
|
|
|
// }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @exclude {@inheritDoc}
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
public String getInfo( ) {
|
|
|
|
return "type:\tColorPicker\n" + super.toString( );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// some inspiration
|
|
|
|
// http://www.nbdtech.com/blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx
|
|
|
|
// http://alienryderflex.com/hsp.html
|