Re: Communication between different widget bases [message #23975] |
Fri, 02 March 2001 10:17  |
davidf
Messages: 2866 Registered: September 1996
|
Senior Member |
|
|
Michael Baca (mbaca@bos.fti-net.com) writes:
> I have a program that allows the user to view a TVSCL of a data cube with
> intensity obtained at (x,y) position (rows/columsn) over time. Typically the
> user plots the intensity at all positions at a single slice in time, i.e.
> TVSCL, A(*,*,n). I would like to allow the user to open a new window that
> will show the intensity plot vs. time for the position under the mouse
> pointer. Regrettably, I have already used up all of the space in my current
> WIDGET_BASE and I do not have room to add another draw widget. I would like
> to open a new WIDGET_BASE with a draw widget that will change as the mouse
> moves over the image.
>
> Does anyone have any suggestions? Most of the work I have done before
> spawned new WIDGET_BASEs that ran independent of the original one. I can
> already pop up a plot of the point under the mouse after a mouse release
> event, but that's not what I had in mind. I want the plot to change as the
> user moves the mouse to new positions. Is there any way to have real-time
> communication between two widget bases?
I guess there would probably be a dozen different ways
to do this. But the simplest is to just write the pop-up
window as a function that returns information you are
interested in. For example, if you call the function
from within a widget event handler, it might be written
like this:
FUNCTION INTENSITY_PLOT, time, intensity, Group_Leader=gleader
tlb = Widget_Base(Group_Leader=gleader)
drawID = Widget_Draw(tlb, XSize=400, YSize=400)
Widget_Control, tlb, /Realize
Widget_Control, drawID, Get_Value=wid
WSet, wid
Plot, time, intensity
RETURN, {tlb:tlb, drawID:drawID, wid:wid}
END
Suppose you have a field in the info structure
of your main program where you store this information:
info.iplot = Intensity_Plot(time, intensity, Group_Leader=event.top)
Then, when you want to update the plot, all you have to
do it this:
IF Widget_Valid(info.iplot.drawID) THEN BEGIN
WSet, info.iplot.wid
Plot, time, intensity
ENDIF ELSE BEGIN
info.iplot = Intensity_Plot(time, intensity, Group_Leader=event.top)
ENDELSE
You might even want to close the pop-up window
for some reason:
Widget_Control, info.iplot.tlb, /Destroy
Cheers,
David
--
David Fanning, Ph.D.
Fanning Software Consulting
Phone: 970-221-0438 E-Mail: davidf@dfanning.com
Coyote's Guide to IDL Programming: http://www.dfanning.com/
Toll-Free IDL Book Orders: 1-888-461-0155
|
|
|
|