;+ ; NAME: ; qsmei_sky ; PURPOSE: ; Widget 'wrapper' for the compound widget qImage_cw ; CATEGORY: ; Widgets ; CALLING SEQUENCE: ; qsmei_sky, 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 ; PROCEDURE: ; The state structure is as follows: ; ; state = {STATE_QSMEI_SKY, $ ; 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, $ ; wid_magnify : 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 qsmei_sky_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_folder : IF qsmei_sky_Pick(state, event, img) THEN widget_control, state.wid_qimage_cw, set_value=img state.wid_back2 : IF qsmei_sky_Pick(state, event, img) THEN widget_control, state.wid_qimage_cw, set_value=img state.wid_back : IF qsmei_sky_Pick(state, event, img) THEN widget_control, state.wid_qimage_cw, set_value=img state.wid_select : IF qsmei_sky_Pick(state, event, img) THEN widget_control, state.wid_qimage_cw, set_value=img state.wid_forw : IF qsmei_sky_Pick(state, event, img) THEN widget_control, state.wid_qimage_cw, set_value=img state.wid_forw2 : IF qsmei_sky_Pick(state, event, img) THEN widget_control, state.wid_qimage_cw, set_value=img state.wid_mode : IF qsmei_sky_Pick(state, event, img) THEN widget_control, state.wid_qimage_cw, set_value=img state.wid_fitsext: IF qsmei_sky_Pick(state, event, img) THEN widget_control, state.wid_qimage_cw, set_value=img state.wid_info : qsmei_sky_FileInfo, state state.wid_digsource: widget_control, state.wid_digsource, set_uvalue=event.select state.wid_clean : qsmei_sky_Clean, state, event state.wid_save : qsmei_sky_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: qsmei_sky_TrackPeak, state 2: qsmei_sky_TrackPeak, state 3: qsmei_sky_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 qsmei_sky, folder, image=image, group=group, img_offset=img_offset, wid_base=wid_base @compile_opt.pro ; On error, return to caller InitVar, folder, '$SMEISKY0' new_widget = IsType(wid_base, /undefined) IF NOT new_widget THEN new_widget = NOT widget_info(wid_base, /valid) IF new_widget THEN BEGIN icon_dir = filepath(root=getenv('SSW_SMEI_UCSD'),'image') state = {STATE_QSMEI_SKY, $ wid_send : 0L, $ wid_exit : 0L, $ wid_folder : 0L, $ wid_type : 0L, $ wid_back2 : 0L, $ wid_back : 0L, $ wid_select : 0L, $ wid_forw : 0L, $ wid_forw2 : 0L, $ wid_mode : 0L, $ wid_fitsext : 0L, $ wid_camera : 0L, $ wid_digsource : 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='qsmei_sky', /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=icon_dir,'done.ico'), /bitmap) dummy1 = widget_base(dummy, /row, /nonexclusive) state.wid_digsource = widget_button(dummy1, value='Dig', uvalue=0) widget_control, state.wid_digsource, /set_button, set_uvalue=1 state.wid_folder = cw_field(dummy, value=folder, /string, title='Dir', xsize=25, /return_ev) state.wid_back2 = widget_button(dummy, value=filepath(root=icon_dir,'down.ico') ,sensitive=0, /bitmap) state.wid_back = widget_button(dummy, value=filepath(root=icon_dir,'down.ico') ,sensitive=0, /bitmap) state.wid_select = cw_field(dummy, value='c*sky*.fts.gz', /string, title='', xsize=25, /return_ev) state.wid_forw = widget_button(dummy, value=filepath(root=icon_dir,'up.ico' ) ,sensitive=0, /bitmap) state.wid_forw2 = widget_button(dummy, value=filepath(root=icon_dir,'up.ico' ) ,sensitive=0, /bitmap) state.wid_info = widget_button(dummy, value=filepath(root=icon_dir,'info.ico'), /bitmap) ;state.wid_clean = widget_button(dummy, value='Clean') ;state.wid_save = widget_button(dummy, value='Save' ) state.wid_mode = widget_droplist(dummy,value=['sky','equ','sky-bkg','sky-zld','sky-bkg-zld','equ-zld','ecl']) state.wid_fitsext = widget_droplist(dummy,value=smei_sky_field(droplist='sky')) state.wid_camera = widget_droplist(dummy, value= $ ['c2,1','c3,2,1','c1','c2','c3','c0']) 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='qsmei_sky_event', group=Group, /no_block ENDIF widget_control, wid_base, get_uvalue=state, /no_copy ;widget_control, state.wid_filter, set_value=filter ;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