;+ ; NAME: ; qImage_cw_Set_Value ; PURPOSE: ; 'Set Value' function called by the widget event function when ; widget_control is used to set the value of the compound widget ; CATEGORY: ; Compound widget qImage ; CALLING SEQUENCE: PRO qImage_cw_Set_Value, wid_root, image ; INPUTS: ; wid_root scalar; type: long integer ; window ID of base widget of pImage ; image array[n,m] or array[n,m,2] ; the image to be displayed ; array[n,m,1] contains the input image (without modifications) ; array[n,m,2] contains the input image (or a subsection ; if the zoom factor is unequal 1) converted to byte ; OUTPUTS: ; INCLUDE: @compile_opt.pro ; On error, return to caller ; CALLS: ; qImage_cw_BoxZoom, qImage_cw_BoxImage, qImage_cw_MinMax ; MagnifyArray, SuperArray ; PROCEDURE: ; ; STATE INFO USED: ; widget_info( wid_root, /child ) ; widget_control, wid_child, get_uvalue=state, /no_copy ; widget_info(state.wid_draw,/valid_id) ; widget_control, state.wid_win[0], get_value=ix ; widget_control, state.wid_win[1], get_value=iy ; widget_control, state.wid_tool, get_value=tool_state, /no_copy ; widget_control, state.wid_zoomout, set_uvalue=anchor, /no_copy ; widget_control, state.wid_draw, get_value=wnew ; STATE INFO UPDATED: ; widget_control, state.wid_tool , set_uvalue=tool, /no_copy ; widget_control, state.wid_image, set_uvalue=image, /no_copy ; widget_control, wid_child , set_uvalue=state, /no_copy ; widget_control, wid_root, send_event={QIMAGE_CW_UPDATE, id:0L, top:0L, handler:wid_root} ; ; state.img_size image dimensions ; MODIFICATION HISTORY: ; FEB-2000, Paul Hick (UCSD/CASS) ; MAR-2008, Paul Hick (UCSD/CASS; pphick@ucsd.edu) ; Bug fix. User value of slider widgets were not ; updated when zoom factor changes. ;- wid_child = widget_info(wid_root, /child) ; ID of first child widget_control, wid_child, get_uvalue=state, /no_copy ; Get qImage_cw state structure state.img_size = size(image,/dim) ; Full image dimensions widget_control, state.wid_win[0], get_value=ix widget_control, state.wid_win[1], get_value=iy new_screen_size = [ix,iy] ; Initialize window size to full image size IF new_screen_size[0] LE 0 OR new_screen_size[1] LE 0 THEN new_screen_size = size(image,/dim) ; Check whether the draw widget already exists. ; If it exists, but has the wrong dimension then destroy the widget IF widget_info(state.wid_draw_wrap, /valid_id) THEN BEGIN screen_size = qImage_cw_Property(state, /screen_size) IF (where(screen_size NE new_screen_size))[0] NE -1 THEN widget_control, state.wid_draw_wrap, /destroy wset, -1 ENDIF screen_size = new_screen_size ; We need to update the user value of wid_tool here, because this is were all ; functions get the zoom value. widget_control, state.wid_tool, get_uvalue=tool_state, /no_copy zoom = tool_state.send.zoom_val zoom_old = tool_state.send.zoom_uval IF zoom LT 0 THEN zoom = 1.0/abs(zoom) tool_state.send.zoom_uval = zoom nbin = tool_state.send.rebin_val nbin_old = tool_state.send.rebin_uval tool_state.send.rebin_uval = nbin widget_control, state.wid_tool, set_uvalue=tool_state, /no_copy tmp = qImage_cw_Tool(state, /update) ; Update qTool widget slider_range = round(size(image,/dim)*zoom-screen_size) ; Create draw widget, if it doesn't exist already IF NOT widget_info(state.wid_draw_wrap, /valid_id) THEN BEGIN state.wid_draw_wrap = widget_base(wid_root, /row) dummy1 = widget_base(state.wid_draw_wrap, /column) ;dummy2 = widget_base(dummy1, /row) ; state.wid_blowup = widget_draw(dummy2, xsize=76, ysize=76, frame=4, retain=2) ; state.wid_xcross = widget_draw(dummy2, xsize=screen_size[0], ysize=76, frame=4, /button_ev, retain=2) dummy2 = widget_base(dummy1, /row) ;state.wid_ycross = widget_draw(dummy2, xsize=76, ysize=screen_size[1], frame=4, /button_ev, retain=2) state.wid_draw = widget_draw(dummy2, xsize=screen_size[0], ysize=screen_size[1], frame=4, /button_ev, /motion_ev, retain=2) state.wid_yslide = widget_slider(dummy2, /drag, ysize=screen_size[1]-1, min=0L, max=1L, /vertical) dummy2 = widget_base(dummy1, /row) ;dummy3 = widget_base( dummy2, xsize=76) state.wid_xslide = widget_slider(dummy2, /drag, xsize=screen_size[0]-1, min=0L, max=1L) ; Don't merge the following two statements with the previous two. ; (why not??) widget_control, state.wid_xslide, set_value=0, set_uvalue=0 widget_control, state.wid_yslide, set_value=0, set_uvalue=0 widget_control, state.wid_win[0], set_value=screen_size[0] widget_control, state.wid_win[1], set_value=screen_size[1] reset_colors ENDIF CASE zoom EQ zoom_old OF 0: BEGIN ; The slider values refer to a pixel in the image magnified by zoom_old (NOT zoom!!). origin_old = qImage_cw_Property(state, /slider_origin) ;widget_control, state.wid_fixzoom, get_uvalue=anchor ;IF IsType(anchor,/undefined) THEN BEGIN qImage_cw_Box, state, anchor, /get ; Current box selection anchor = 0.5*total(anchor,2) ; Center of current box is used to anchor the zoom ; Convert to screen coordinates using the old zoom anchor = qImage_cw_Transform(state, fromimage=anchor, /toscreen, zoom=zoom_old, origin=origin_old) ;ENDIF ; Calculate the new slider values in the image magnified by zoom origin = (zoom*origin_old+(zoom-zoom_old)*(anchor+0.5))/zoom_old origin = round(origin) < slider_range ; Now update the slider with the new values widget_control, state.wid_xslide , $ sensitive = slider_range[0] GT 0 , $ set_slider_max = slider_range[0] > 1 , $ set_value = origin[0] , $ set_uvalue = origin[0] widget_control, state.wid_yslide , $ sensitive = slider_range[1] GT 0 , $ set_slider_max = slider_range[1] > 1 , $ set_value = origin[1] , $ set_uvalue = origin[1] END 1: BEGIN widget_control, state.wid_xslide , $ sensitive = slider_range[0] GT 0 , $ set_slider_max = slider_range[0] > 1 widget_control, state.wid_yslide , $ sensitive = slider_range[1] GT 0 , $ set_slider_max = slider_range[1] > 1 END ENDCASE widget_control, /hourglass img_box = make_array(type=IsType(image),dim=screen_size, value=BadValue(image)) parents = qImage_cw_Transform(state, fromscreen=[[0,0],[screen_size-1]], boxedge=zoom LT 1, /toimage, /parent) IF qImage_cw_BoxImage(state, parents, image=image, sub_img=sub_img, sub_box=sub_box) THEN BEGIN qImage_cw_BoxZoom, state, sub_img, sub_box, screen_size, zoom, nbin img_box[sub_box[0]:sub_box[2],sub_box[1]:sub_box[3]] = sub_img ENDIF img_box = qImage_cw_MinMax(state, img_box, /to_byte) qImage_cw_ctable, state, img_box=img_box ; Put image in draw widget widget_control, state.wid_image, set_uvalue=image, /no_copy widget_control, wid_child , set_uvalue=state, /no_copy ; Put into qImage_cw state structure ; Before returning we need to generate an event to force a redraw ; of the box and cross sections and update the z-fields widget_control, wid_root, send_event={QIMAGE_CW_UPDATE, id:0L, top:0L, handler:wid_root} RETURN & END