Add Graphics to a Widget Application
You can combine graphics within IDL widget applications by using the WIDGET_WINDOW function. Adding graphics to widget applications gives you the functionality of interactive graphic window with the ability to add your own GUI elements.
The code shown below creates the GUI (widget) application above. You can copy the entire block and paste it into the IDL editor, or enter .edit plot_widget_doc
at the IDL command line to open the program.
PRO PLOT_WIDGET_DOC_EVENT, event
CASE TAG_NAMES(event, /STRUCTURE_NAME) OF
'WIDGET_BUTTON': BEGIN
WIDGET_CONTROL, event.id, GET_UVALUE = event_UV
; Retrieve the Widget Window
wDraw = WIDGET_INFO(event.top, FIND_BY_UNAME = 'DRAW')
WIDGET_CONTROL, wDraw, GET_VALUE = graphicWin
; Retrieve the plot with the NAME
; provided on plot creation
p = graphicWin['PLOT_WIDGET_DOC']
CASE event_UV OF
'DONE': WIDGET_CONTROL, event.top, /DESTROY
'RED': p.color='red'
'BLUE': p.color='blue'
ELSE: ; do nothing
ENDCASE
END
'WIDGET_BASE': begin
; Handle base resize events. Retrieve our cached padding,
; and our new size.
WIDGET_CONTROL, event.id, GET_UVALUE=pad, TLB_GET_SIZE=newSize
wDraw = WIDGET_INFO(event.top, FIND_BY_UNAME='DRAW')
; Change the draw widget to match the new size, minus padding.
xy = newSize - pad
WIDGET_CONTROL, wDraw, $
DRAW_XSIZE=xy[0], DRAW_YSIZE=xy[1], $
SCR_XSIZE=xy[0], SCR_YSIZE=xy[1]
end
ELSE: ; do nothing
ENDCASE
END
PRO PLOT_WIDGET_DOC
base1 = WIDGET_BASE(/COLUMN, TITLE='Widget Window example', $
/TLB_SIZE_EVENTS)
wDraw = WIDGET_WINDOW(base1, UVALUE='draw', UNAME='DRAW')
; Create the base for the button:
base2 = WIDGET_BASE(base1, /ROW, /ALIGN_CENTER)
; Create the action buttons.
redline = WIDGET_BUTTON(base2, VALUE='Red Line', UVALUE = 'RED')
blueline = WIDGET_BUTTON(base2, VALUE='Blue line', UVALUE='BLUE')
done = WIDGET_BUTTON(base2, VALUE = 'Done', UVALUE = 'DONE')
; Realize the widget (i.e., display it on screen).
WIDGET_CONTROL, base1, /REALIZE
; Register the widget with the XMANAGER, leaving the IDL command
; line active.
XMANAGER, 'PLOT_WIDGET_DOC', base1, /NO_BLOCK
; Cache the padding between the base and the draw
WIDGET_CONTROL, base1, TLB_GET_SIZE=basesize
xpad = basesize[0] - 640
ypad = basesize[1] - 512
WIDGET_CONTROL, base1, SET_UVALUE=[xpad,ypad]
; Retrieve the newly-created Window object.
WIDGET_CONTROL, wDraw, GET_VALUE = graphicWin
graphicWin.SELECT
PRECIP=[0.5,0.7,1.2,1.8,2.5,1.6,1.9,1.5,1.2,1.0,0.8,0.6]
TEMP=[30, 34, 38, 47, 57, 67, 73, 71, 63, 52, 39, 33]
DAY=FINDGEN(12) * 30 + 15
; Plot #1: In position #1 on the grid defined by LAYOUT
p=PLOT(DAY, PRECIP, NAME = 'PLOT_WIDGET_DOC', SYMBOL='o', $
LINESTYLE='--', TITLE = 'Precipitation', $
YTITLE = 'Inches', XTITLE= 'Day of Year', $
THICK=2, /CURRENT)
END