;+ ; NAME: ; qslider_cw ; PURPOSE: ; Creates compound widget qslider_cw ; CATEGORY: ; Widget qslider_cw ; CALLING SEQUENCE: ; qslider_cw, ; wid = qslider_cw, parent, uvalue=uvalue, title=title, $ ; value=value, minimum=minimum, maximum=maximum, frame=frame, $ ; xsize=xsize, lxsize=lxsize, steps=steps, length=length ; INPUTS: ; parent scalar; type: long integer ; widget id of parent widget creating compound widget ; OPTIONAL INPUS: ; uvalue=uvalue user value ; title=title scalar; type: string; default: 'title' ; title of compound widget ; value=value scalar; type: float ; initial value ; minimum=maximum scalar; type: float ; minimum allowed value ; maximum=maximum scalar; type: float ; maximum allowed value ; steps=steps scalar; type: integer: default: 100 ; the slider widget used in the compound widget is an ; integer slider. The integer range [0,steps] is ; mapped to the float range [minimum,maximum]. ; I.e. the step size is (maximum-minimum)/steps ; frame=frame scalar; type: integer; default: 0 ; border width around compound widget in pixels ; xsize=xsize ; lxsize=lxsize ; length=length ; OUTPUTS: ; wid scalar; type: long integer ; widget id of compound widget ; RESTRICTIONS: ; The modified cw_field widget accepting keyword lxsize is needed. ; CALLS: ; IsType, unexpected_event ; EXTERNAL; ; qslider_cw_state__define ; SIDE EFFECTS: ; PROCEDURE: ; > The event returned: ; event = {SLIDER_CW, id:0L, top:0L, handler:0L, value:value} ; Probably this event is never needed. The current state of the compound widget ; can be retrieved or modified using widget_control with the get_value and ; set_value keywords. ; > widget_control, id, get_value=value ; returns a three-element float array containg ; slider value, and slider minimum and maximum values ; > widget_control, id, set_value=value ; expects the same three-element array. ; ; tmp = {QSLIDER_CW_STATE,$ ; wid_value : 0L, $ ; First child (contains slider value) ; ; User value: state structure ; wid_minimum : 0L, $ ; Contains slider minimum ; wid_slider : 0L, $ ; Slider widget ; wid_maximum : 0L $ ; Contains slider maximum ; } ; ; MODIFICATION HISTORY: ; SEP-2001, Paul Hick (UCSD/CASS; pphick@ucsd.edu) ;- ;=============== ; Event handler function qslider_cw_event, event @compile_opt.pro ; On error, return to caller wid_child = widget_info(event.handler, /child) widget_control, wid_child, get_uvalue=state, /no_copy case event.id of ; ID of widget that generated the message state.wid_value : qslider_cw_update, state state.wid_minimum: qslider_cw_update, state state.wid_maximum: qslider_cw_update, state state.wid_slider : qslider_cw_update, state, /backward else: unexpected_event, event, /destroy endcase widget_control, state.wid_value, get_value=value widget_control, wid_child, set_uvalue=state, /no_copy ; Set up the event to be passed to the event handler of the parent widget. ; The event.id is set to event.handler before returning. ; event.handler is the widget id of the compound widget. if IsType(event, /structure) then $ event = {SLIDER_CW, id: event.handler, top: event.top, handler: event.handler, value: value} return, event & end ;================================== ; Function to retrieve widget value function qslider_cw_get, wid_root @compile_opt.pro ; On error, return to caller wid = widget_info(wid_root, /child) widget_control, wid, get_uvalue=state, /no_copy widget_control, state.wid_value , get_value=value widget_control, state.wid_minimum, get_value=minimum widget_control, state.wid_maximum, get_value=maximum steps = (widget_info(state.wid_slider, /slider_min_max))[1] widget_control, wid, set_uvalue=state, /no_copy return, [value,minimum,maximum,steps] & end ;============================== ; Procedure to set widget value pro qslider_cw_set, wid_root, value @compile_opt.pro ; On error, return to caller wid = widget_info(wid_root, /child) widget_control, wid, get_uvalue=state, /no_copy widget_control, state.wid_value , set_value=(value[0] > value[1]) < value[2] widget_control, state.wid_minimum, set_value=value[1] widget_control, state.wid_maximum, set_value=value[2] widget_control, state.wid_slider , set_slider_max=value[3] qslider_cw_update, state widget_control, wid, set_uvalue=state, /no_copy ; Make the slider insensitive is minimum and maximum are the same widget_control, wid_root, sensitive=value[1] ne value[2] return & end ;==================================== ; Procedure to maintain widget status pro qslider_cw_update, state, backward=backward @compile_opt.pro ; On error, return to caller backward = keyword_set(backward) widget_control, state.wid_minimum, get_value=minimum widget_control, state.wid_maximum, get_value=maximum steps = ( widget_info(state.wid_slider, /slider_min_max) )[1] case backward of 0: begin widget_control, state.wid_value, get_value=value if value lt minimum or value gt maximum then begin value = (value > minimum) < maximum widget_control, state.wid_value, set_value=value endif value = ( double(value-minimum)/(maximum-minimum) > 0 ) < 1 value = round(value*steps) widget_control, state.wid_slider, set_value=value end 1: widget_control, state.wid_slider, get_value=value endcase value = double(value)/steps value = (1-value)*minimum + value*maximum widget_control, state.wid_value, set_value=value return & end ;==================================== ; Main widget function defines layout function qslider_cw, parent, uvalue=uvalue, title=title, $ value=value, minimum=minimum, maximum=maximum, frame=frame, $ xsize=xsize, lxsize=lxsize, steps=steps, length=length, double=double @compile_opt.pro ; On error, return to caller if n_elements(parent ) eq 0 then message, 'No parent widget specified' InitVar, double , /key InitVar, title , 'title' InitVar, minimum, 0 InitVar, maximum, 100 InitVar, steps , 100 InitVar, uvalue , '' state = {qslider_cw_state} ; Create state structure wid_root = widget_base(parent, uvalue=uvalue, /row, $ event_func = 'qslider_cw_event', $ func_get_value = 'qslider_cw_get', $ pro_set_value = 'qslider_cw_set', $ frame=frame) print, value, minimum state.wid_value = cw_field(wid_root, value=value , float=1-double, double=double, title=title[0], $ /row, /return_ev, lxsize=lxsize, xsize=xsize) state.wid_minimum = cw_field(wid_root, value=minimum, float=1-double, double=double, title='-', $ /row, /return_ev, xsize=xsize) v = ( double(value-minimum)/(maximum-minimum) > 0 ) < 1 v = round(v*steps) state.wid_slider = widget_slider(wid_root, value=v, minimum=0, maximum=steps, /suppress, xsize=length) state.wid_maximum = cw_field(wid_root, value=maximum, float=1-double, double=double, title=' ', /row, $ /return_ev, xsize=xsize) ; Store the state structure in the user value of the first child widget widget_control, widget_info(wid_root, /child), set_uvalue=state, /no_copy ; Return the widget ID of the root widget return, wid_root & end