7181 Rate this article:

New Color Picker in IDL


IDL 8.5 has a new color picker, which is not only used in the Widget Property Sheet, it is can also be called by the user for an easy way to programmatically call a dialog to pick a color.

Here is an example of an object that gets placed into a propertysheet that will pick a color:

pro propsheet_color::SetProperty, BASE_COLOR=baseColor, OUTLINE_COLOR=outlineColor, _REF_EXTRA=extra

  if N_Elements(baseColor) eq 3 then begin
    self.baseColor = baseColor
  if N_Elements(outlineColor) eq 3 then begin
    self.outlineColor = outlineColor
  if N_Elements(extra) gt 0 then begin
    self.IDLitComponent::SetProperty, _EXTRA=extra


pro propsheet_color::GetProperty, BASE_COLOR=baseColor, OUTLINE_COLOR=outlineColor, _REF_EXTRA=extra
  if Arg_Present(baseColor) then begin
    baseColor = self.baseColor
  if Arg_Present(outlineColor) then begin
    outlineColor = self.outlineColor
  if N_Elements(extra) gt 0 then begin
    self.IDLitComponent::GetProperty, _EXTRA=extra

pro propsheet_color__Define
  !null = {propsheet_color, $
           inherits IDLitComponent, $
           baseColor:[0b,0b,0b], $

To create a widget with this object, call this code (this is very basic; the propertysheet could be embedded into a much fancier widget):

o = Obj_New('propsheet_color')
o.RegisterProperty, 'BASE_COLOR', /COLOR, NAME='Base Color'
o.RegisterProperty, 'OUTLINE_COLOR', /COLOR, NAME='Outline Color'

base = Widget_Base()
propsheet = Widget_Propertysheet(base, VALUE=o)
Widget_Control, base, /REALIZE

This is what the widget looks like when the user clicks on one of the colors:

You can also call the color picker directly from the IDL command line or from code:

result = dialog_colorpicker(TITLE='Pick Fill')

This function comes with a number of keywords to control size, custom colors, add a callback object, etc. 

The return value will be a 3-element byte array representing the Red, Green, and Blue values, respectively.

Go ahead, give it a try next time you need a color!