[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

TLB Widget resizing

In case you can't tell, I'm trying my hand at some more widget
programming and I am rusty.

One nice thing about widgets is that you can make them resizeable.
You can ask for resize events by setting the TLB_SIZE_EVENTS keyword
to WIDGET_BASE.  Then you are supposed to get a nice little widget
event whenever it changes in size.

Okay, we also know about the bug in IDL's widgets, which can cause
funny resizing behavior.  I refer the kind reader to David Fanning's
nice redux of the situation.


I have a different question however.  There appear to be times when
you can resize a window to *smaller* than it is supposed to be.  That
is, try to resize a window so that there is no way for all of the
component widgets to fit.

In that case, you do get a resize event which describes the size of
the new, small window.  For a moment on my Linux screen, the window
does get smaller.  However, IDL smartly decides that the component
widgets can't fit inside, and the window "bounces" back to a larger
size.  It grows to a new size -- BUT a resize event is NEVER SENT.

Who cares right?  Well, I have a draw widget that is resized based on
the (incorrect) numbers in the resize event.  When the window
"bounces" to a new size, the resulting draw widget looks pretty goofy.
You can reproduce this in David Fanning (and my) XWINDOW program, and
also with the following RESIZE program, based on work by Liam Gumley.
Just run it, and resize the window to a very small width. 

Can anybody suggest a way to get a new resize event?  I have
considered requesting a timer event to periodically adjust the draw
widget's dimensions.


Craig B. Markwardt, Ph.D.         EMAIL:    craigmnet@cow.physics.wisc.edu
Astrophysics, IDL, Finance, Derivatives | Remove "net" for better response

;; ----------   BEGIN RESIZE.PRO
;;  Adapted from Liam Gumley's routine of the same name

;- Get info structure

widget_control, event.top, get_uvalue=info

;- Resize the draw widget using one of two methods

case info.fix of

  ;- First method: widget grows vertically
  0 : widget_control, info.drawid, xsize=event.x, ysize=event.y

  ;- Second method: resizes widget correctly
  1 : begin
    ;- Get current tlb size

    widget_control, event.top, tlb_get_size=result
    tlb_xsize = result[0]
    tlb_ysize = result[1]

    ;- Compute difference between current and old tlb size

    xdiff = tlb_xsize - info.tlb_xsize
    ydiff = tlb_ysize - info.tlb_ysize

    ;- Set new tlb size

    info.tlb_xsize = tlb_xsize
    info.tlb_ysize = tlb_ysize   

    ;- Set new draw widget size

    info.draw_xsize = info.draw_xsize + xdiff
    info.draw_ysize = info.draw_ysize + ydiff

    ;- Resize the draw widget

    widget_control, info.drawid, $
      draw_xsize=info.draw_xsize, draw_ysize=info.draw_ysize


;- Display a plot

plot, indgen(10)



;- Check keywords

if not keyword_set( fix ) then fix = 0

;- Set initial size of draw widget

draw_xsize = 400
draw_ysize = 400

;- Create base widget with menubar and draw widget

tlb = widget_base( title='Resize Example', $
  tlb_size_events=1, mbar=menubase, column=1 )
buttonbar = widget_base(tlb, row=1, /align_left)
button1 = widget_button(buttonbar, value='Button1')
button2 = widget_button(buttonbar, value='Button2')
drawid = widget_draw( tlb, xsize=draw_xsize, ysize=draw_ysize )
widget_control, tlb, /realize

;- Display a plot

plot, indgen(10)

;- Get size of top level base

widget_control, tlb, tlb_get_size=result
tlb_xsize = result[0]
tlb_ysize = result[1]

;- Create and store info structure

info = { fix        : fix, $
         drawid     : drawid, $
         draw_xsize : draw_xsize, $
         draw_ysize : draw_ysize, $
         tlb_xsize  : tlb_xsize, $
         tlb_ysize  : tlb_ysize }
widget_control, tlb, set_uvalue = info

;- Manage widget events

xmanager, 'resize', tlb