;+ ; NAME: ; qImage ; PURPOSE: ; Widget 'wrapper' for the compound widget qImage_cw ; CATEGORY: ; Widgets ; CALLING SEQUENCE: ; qImage, filter, image=image, group=group, img_offset=img_offset, wid_base=wid_base ; INPUTS: ; filter scalar; type: string; default: *.* ; file name filter for file selection ; If the filter does not contain a wildcard (i.e. is the ; name of a single file) then an attempt is made to load ; the image from the file. ; OPTIONAL INPUT PARAMETERS: ; group=group scalar; type: long integer ; group leader passed to XMANAGER ; image=image array[n,m]; type: any ; image array to be displayed. If specified this image ; is displayed, overriding the filter specification. ; wid_base=wid_base ; scalar; type: long integer ; if this is the widget ID of a valid widget, then ; qImage assumes that it is an existing instance of ; itself and will use it to display the image ; Otherwise qImage will create a new instance. ; OUTPUTS: ; (to widget) ; CALLS: ; qImage_Send, qImage_Pick, qImage_TrackPeak, qImage_Gain, qImage_cw ; qImage_FileInfo, qImage_Clean, qImage_Save, hide_env ; PROCEDURE: ; The state structure is as follows: ; ; state = {STATE_QIMAGE, $ ; wid_send : 0L, $ Row base widget ; user value: widget ID of widget to receive QIMAGE_SEND ; events (set by qImage_SendDestination) ; wid_exit : 0L, $ 'Done' button ; user value: none ; wid_pick : 0L, $ 'Image' button for selection of image file ; user value: none ; wid_filter : 0L, $ cw_field for entering file filter for image file selection ; user value: none ; wid_qimage_cw : 0L, $ compound widget qimage_cw ; user value: none ; wid_info : 0L, $ 'Info' button to display information about the current image ; user value: string array containing information about image ; wid_clean : 0L, $ ; wid_save : 0L, $ ; foreign : 0 $ set by qImage_SendDestination using keyword 'foreign'; controls how ; qImage reacts to QIMAGE_CW_UPDATE events from qImage_cw compound widget. ; foreign=0: ignore events ; foreign=1,2: call qImage_TrackPeak (used by the 'Track' option in qView). ; boxes : fltarr(2,2,2) $ ; } ; MODIFICATION HISTORY: ; FEB-2000, Paul Hick (UCSD/CASS; pphick@ucsd.edu) ;- PRO qImage_Event, event @compile_opt.pro ; On error, return to caller ; event.top should be ID of the qImage top level widget ; qImage_cw should make sure to set the proper ID before passing an event on. ; Get the state structure from the top level widget widget_control, event.top, get_uvalue=state, /no_copy CASE event.id OF ; ID of widget that generated the message ; Intercepts WIDGET_KILL_REQUEST from top level widget event.top : widget_control, event.top, /destroy ; Message from 'Done' widget state.wid_exit : BEGIN qImage_Send, state, /confirm, cancel=cancel IF NOT cancel THEN widget_control, event.top, /destroy END ; Note that wid_send is a base widget and as such doesn't generate events. ; Events arriving here are typically send to qImage by another widget calling ; qImage_TriggerSend state.wid_send: qImage_Send, state ; Events from the 'Pick Image' and the Filter widget indicate that a ; new image is to be read. If succesfull then the image is used to set ; the value of the compound widget qImage_cw (ID in state.wid_qimage_cw). ; This will trigger a call to qImage_cw_Set_Value state.wid_pick : IF qImage_Pick(state, img) THEN widget_control, state.wid_qimage_cw, set_value=img state.wid_folder: state.wid_filter: IF qImage_Pick(state, img) THEN widget_control, state.wid_qimage_cw, set_value=img state.wid_info : qImage_FileInfo, state state.wid_clean : qImage_Clean, state, event state.wid_save : qImage_Save, state ELSE: BEGIN event_name = tag_names(event, /structure_name) ; A QIMAGE_CW_UPDATE event is generated by the compound widget qImage_cw each time a new image ; is displayed (by qImage_cw_Set_Value). ; The value of state.foreign is set by a keyword to qImage_SendDestination, and is currently ; used by the qView widget to track a peak through a sequence of images. CASE event_name OF 'QIMAGE_CW_UPDATE': BEGIN CASE state.foreign OF 0: ; nothing to do 1: qImage_TrackPeak, state 2: qImage_TrackPeak, state 3: qImage_Gain , state ELSE: ENDCASE END ELSE: unexpected_event, event ENDCASE END ENDCASE ; Put the state structure back where it belongs ; (the widget may have been destroyed already, so we check for event.top for validity.) IF widget_info(event.top,/valid_id) THEN $ widget_control, event.top, set_uvalue=state, /no_copy RETURN & END PRO qImage, filter, exten_no=exten_no, image=image, $ group=group, img_offset=img_offset, wid_base=wid_base @compile_opt.pro ; On error, return to caller CASE IsType(filter, /defined) OF 0: filter = filepath(root=getenv('PWD'),'*.*') 1: BEGIN IF n_elements(filter) gt 1 THEN info_field = filter filter = filter[0] END ENDCASE new_widget = IsType(wid_base, /undefined) IF NOT new_widget THEN new_widget = NOT widget_info(wid_base, /valid) IF new_widget THEN BEGIN state = {STATE_QIMAGE, $ wid_send : 0L, $ wid_exit : 0L, $ wid_pick : 0L, $ wid_folder : 0L, $ wid_filter : 0L, $ wid_ftsext : 0L, $ wid_qimage_cw : 0L, $ wid_info : 0L, $ wid_clean : 0L, $ wid_save : 0L, $ foreign : 0, $ boxes : fltarr(2,2,2) $ } wid_base = widget_base(title='qImage', /column, /tlb_kill_request_events) state.wid_send = widget_base(wid_base, /column) dummy = widget_base(state.wid_send, /row) state.wid_exit = widget_button(dummy, value=filepath(root=getenv('SSW_SMEI_UCSD'),subdir='image','done.ico'), /bitmap) state.wid_pick = widget_button(dummy, value='Image') state.wid_folder = cw_field(dummy, value='', /string , title='Filter', xsize=10, /return_ev) state.wid_filter = cw_field(dummy, value='', /string , title='', xsize=25, /return_ev) state.wid_ftsext = cw_field(dummy, value=0 , /integer, title='', xsize= 3, /return_ev) state.wid_info = widget_button(dummy, value=filepath(root=getenv('SSW_SMEI_UCSD'),subdir='image','info.ico'), /bitmap) state.wid_clean = widget_button(dummy, value='Clean') state.wid_save = widget_button(dummy, value='Save' ) state.wid_qimage_cw = qImage_cw(state.wid_send) widget_control, wid_base, set_uvalue=state, /no_copy widget_control, wid_base, /realize xmanager, 'qImage', wid_base, event_handler='qImage_Event', group=Group, /no_block ENDIF widget_control, wid_base, get_uvalue=state, /no_copy SetFileSpec, filter widget_control, state.wid_folder, set_value=hide_env(GetFileSpec(upto='directory')) widget_control, state.wid_filter, set_value=GetFileSpec(from='name') IF IsType(exten_no,/defined) THEN $ widget_control, state.wid_ftsext, set_value=exten_no IF IsType(info_field, /defined) THEN $ widget_control, state.wid_qimage_cw, set_uvalue=info_field ; If no image was specified we need to read and display a whole image. ; So we set the img_offset explicitly to zero. IF IsType(image, /undefined) THEN img_offset = [0,0] IF IsType(img_offset, /defined) THEN BEGIN wid_child = widget_info(state.wid_qimage_cw, /child) widget_control, wid_child, get_uvalue=qimage_cw_state, /no_copy qimage_cw_state.img_offset = img_offset widget_control, wid_child, set_uvalue=qimage_cw_state, /no_copy ENDIF wildcard = 1B CASE IsType(image, /defined) OF ; Check for the presence of wildcards. 0: wildcard = strpos(filter, '*') NE -1 OR $ strpos(filter, '?') NE -1 OR $ strpos(filter, '%') NE -1 1: BEGIN widget_control, state.wid_qimage_cw, set_value=image widget_control, state.wid_pick, sensitive=0 widget_control, state.wid_info, sensitive=IsType(info_field,/defined) IF IsType(info_field,/defined) THEN $ widget_control, state.wid_info, set_uvalue=info_field END ENDCASE tmp = state.wid_pick widget_control, wid_base, set_uvalue=state, /no_copy ; No image, and no wild card in the filter: try to load a file IF NOT wildcard THEN $ widget_control, tmp, send_event={WIDGET_BUTTON, ID:0L, TOP:0L, HANDLER:0L, SELECT:0}, sensitive=0 RETURN & END