;+ ; NAME: ; qView ; PURPOSE: ; View sequence of images ; CATEGORY: ; Widget ; CALLING SEQUENCE: ; qView, Filter, group=group ; INPUTS: ; Filter scalar, character, default: filepath(root=getenv('SSW_SMEI_DAT'),'*.*') ; OPTIONAL INPUT PARAMETERS: ; group=Group passed to xmanager when registering the qView widget ; OUTPUTS: ; (to widget) ; CALLS: ; InitVar, IsType ; qView_Destroy, qView_UpdateTime, qView_SetBase, qView_Deep, qView_Gain, qView_Diff ; qView_PickFiles, qView_FileFilter, qView_UpdateFiles, qView_ShowInfo, qView_SetBox ; qView_GetData, qView_Image, qView_Wall, qView_Movie, qView_TrackPeak, qView_PlotSeries ; qView_Glitch, qView_Save2File, qView_UpdateActive, TimeUnit ; PROCEDURE: ; state = {STATE_QVIEW, $ ; wid_exit : 0L, $ 'Done' button ; wid_info : 0L, $ 'Info' button for displaying information about image cube ; user value: QIMAGE_SEND structure containing information ; wid_box : 0L, $ button widget for selecting area from image ; user value: none ; wid_init : 0L, $ base widget; a message to this widget is used by qView ; to initialize the file selection ; user value: none ; wid_pick : 0L, $ button widget for selecting files ; user value: string array with list of currently loaded files ; wid_folder : 0L, $ cw_field widget for entering directory ; user value: none ; wid_filter : 0L, $ cw_field widget for entering a file name filter ; user value: last filter for which file names were found ; wid_data : 0L, $ button widget for reading current file selection ; user value: the image cube read from the files ; wid_diff : 0L, $ droplist with options to control difference images ; user value: current selection ; wid_view : 0L, $ button for displaying current image ; user value: widget ID of the qImage base widget ; used for the display. ; wid_wall : 0L, $ 'Wall' button for displaying a 'wall view' ; user value: none ; wid_movie : 0L, $ 'Movie' button for generating a movie from the current image cube ; user value: none ; wid_series : 0L, $ 'Series' button for displaying time series ; user value: none ; wid_track : 0L, $ 'Track' button for starting tracking of a peak ; user value: off (0B) or on (1B) depending on wheter tracking is ; in progress. ; wid_glitch : 0L, $ 'Deglitch' button for ininiating glitch removal ; user value: none ; wid_gain : 0L, $ ; wid_save : 0L, $ button widget to save current image cube to disk ; user value: none ; wid_frst : 0L, $ cw_field, file index of first selected image file ; user value: none ; wid_last : 0L, $ cw_field, file index of last selected image file ; user value: none ; wid_incr : 0L, $ cw_field, file increment between selected images ; user value: none ; wid_select : 0L, $ label widget ; user value: none ; wid_forw : 0L, $ '-->' button to step to next image in sequence ; user value: none ; wid_active : 0L, $ cw_field displaying file index of currently selected image. ; user value: file index of displayed image; updated by ; qView_Image by copying the value into the user value each ; time a new image is displayed. ; wid_back : 0L, $ '<--' button to step to previous image in sequence ; user value: none ; wid_time : 0L, $ cw_field to set the time for image file ; user value: min and max time ; wid_tmo : 0L, $ non-exclusive button for switching tracking sky motion ; in TMO data on/off ; user value: current on/off status ; ; setbase : 0L, $ ; ; base_type : 0L, $ ; base_ref : 0L, $ ; base_order : 0L, $ ; zactive : lonarr(4) $ ; ; } ; MODIFICATION HISTORY: ; JAN-1999, Paul Hick (UCSD/CASS) ; FEB-2000, Paul Hick (UCSD/CASS) ; substantial facelift ; JUN-2004, Paul Hick (UCSD/CASS; pphick@ucsd.edu) ; Added /force to qview_UpdateActive call triggered by ; state.wid_active to force screen update. ;- PRO qView_Event, event @compile_opt.pro ; On error, return to caller widget_control, event.handler, get_uvalue=state, /no_copy CASE event.id OF ; ID of widget that generated the message event.top : qView_Destroy, event ; Intercepts WIDGET_KILL_REQUEST from base widget state.wid_exit : qView_Destroy, event ; Message from Exit widget state.wid_init : qView_FileFilter , state ; Message from qView to force filter initialization state.wid_pick : qView_PickFiles , state ; Use 'pickfile' dialog to select first and last file state.wid_folder: ;qView_FileFolder , state ; Select directory where files are located state.wid_filter: qView_FileFilter , state ; Use filter to select first and last file state.wid_frst : qView_UpdateFiles , state state.wid_last : qView_UpdateFiles , state state.wid_incr : qView_UpdateFiles , state state.wid_info : qView_ShowInfo , state state.wid_box : qView_SetBox , state, event state.wid_data : qView_GetData , state, event, wid_send=wid_send, send_event=send_event state.wid_view : qView_Image , state state.wid_wall : qView_Wall , state, event, wid_send=wid_send, send_event=send_event state.wid_movie : qView_Movie , state, event, wid_send=wid_send, send_event=send_event state.wid_series: qView_PlotSeries , state, event, wid_send=wid_send, send_event=send_event state.wid_track : qView_TrackPeak , state, event, wid_send=wid_send, send_event=send_event state.wid_gain : qView_Gain , state, event, wid_send=wid_send, send_event=send_event state.wid_glitch: qView_Glitch , state state.wid_save : qView_Save2File , state, event, wid_send=wid_send, send_event=send_event state.wid_back : IF qView_UpdateActive(state, step=-1 ) THEN qView_Image, state, /if_display state.wid_active: IF qView_UpdateActive(state, step= 0, /force) THEN qView_Image, state, /if_display state.wid_forw : IF qView_UpdateActive(state, step= 1 ) THEN qView_Image, state, /if_display state.wid_diff : IF qView_Diff (state) THEN qView_Image, state, /if_display state.wid_time : IF qView_UpdateTime(state) THEN qView_Image, state, /if_display state.wid_tmo : widget_control, state.wid_tmo, set_uvalue=event.select state.base_type : BEGIN ;qView_ModifyData, state ;qView_ShowImage , state, qView_GetImage(state,minmax=minmax), minmax=minmax, /noz END state.setbase : qView_SetBase , state state.deep[0] : qView_Deep, state, event state.deep[1] : qView_Deep, state, event state.deep[2] : qView_Deep, state, event ELSE: unexpected_event, event ENDCASE IF widget_info(event.handler,/valid_id) THEN $ widget_control, event.handler, set_uvalue=state, /no_copy IF IsType(wid_send, /defined) THEN widget_control, wid_send, send_event=send_event RETURN & END PRO qView, Filter, group=Group @compile_opt.pro ; On error, return to caller bFilter = IsType(Filter, /defined) InitVar, Filter , filepath(root=getenv('PWD'),'*.*') InitVar, img_time, '' ; This should expand environment variables, such as $dat/tmo SetFileSpec, Filter, /parse, status=status IF status THEN Filter = GetFileSpec() state = {STATE_QVIEW, $ ; State structure wid_exit : 0L, $ wid_info : 0L, $ wid_box : 0L, $ wid_init : 0L, $ wid_pick : 0L, $ wid_folder : 0l, $ wid_filter : 0L, $ wid_ftsext : 0L, $ wid_data : 0L, $ wid_diff : 0L, $ wid_view : 0L, $ wid_wall : 0L, $ wid_movie : 0L, $ wid_series : 0L, $ wid_track : 0L, $ wid_glitch : 0L, $ wid_gain : 0L, $ wid_save : 0L, $ wid_frst : 0L, $ wid_last : 0L, $ wid_incr : 0L, $ wid_select : 0L, $ wid_forw : 0L, $ wid_active : 0L, $ wid_back : 0L, $ wid_tmo : 0L, $ wid_time : 0L, $ setbase : 0L, $ base_type : 0L, $ base_ref : 0L, $ base_order : 0L, $ deep : lonarr(3),$ box : lonarr(4),$ zactive : lonarr(4) $ } base = widget_base(title='qView',/column,/tlb_kill_request) base_options = widget_base(base, /row) sys = filepath(root=getenv('SSW_SMEI_UCSD'),'image') state.wid_exit = widget_button(base_options, value=filepath(root=sys,'done.ico'),/bitmap) state.wid_box = widget_button(base_options, value='Set Area' , sensitive=0) state.wid_data = widget_button(base_options, value='Read Area', sensitive=0) state.wid_view = widget_button(base_options, value='View' , sensitive=0, uvalue=0L) ;state.wid_back = widget_button(base_options, value='<--' ,sensitive=0) state.wid_back = widget_button(base_options, value=filepath(root=sys,'down.ico') ,sensitive=0, /bitmap) state.wid_active= cw_field(base_options, value=-1, /long, uvalue=-1, title=' ', /row, xsize=5, /return_ev) state.wid_forw = widget_button(base_options, value=filepath(root=sys,'up.ico') ,sensitive=0, /bitmap) ;state.wid_forw = widget_button(base_options, value='-->' ,sensitive=0) tmp = ['DNone','DFrst','DLast','DPrev','DNext'] n = n_elements(tmp) state.wid_diff = widget_droplist(base_options, value=tmp, $ uvalue={qview_diff_struct, value:0, zlog: bytarr(n), fixz: bytarr(n), zmin:fltarr(n), zmax:fltarr(n)}) state.wid_info = widget_button(base_options, value=filepath(root=sys,'info.ico'),/bitmap) state.wid_wall = widget_button(base_options, value='Wall' , sensitive=0) state.wid_movie = widget_button(base_options, value='Animate', sensitive=0) state.wid_series= widget_button(base_options, value='Series' , sensitive=0) state.wid_track = widget_button(base_options, value='Track' , sensitive=0, uvalue=0B) state.wid_glitch= widget_button(base_options, value='Deglitch', sensitive=0) state.wid_gain = widget_button(base_options, value='Gain', sensitive=0, uvalue=0B) state.wid_save = widget_button(base_options, value='Save', sensitive=0) base_top = widget_base(base, /row) base_data = widget_base( base_top, /column, frame=2) state.wid_init = widget_base(base_data, /row) state.wid_pick = widget_button(state.wid_init, value='Pick Files') SetFileSpec, Filter tmp = GetFileSpec(upto='directory') state.wid_folder= cw_field(state.wid_init, value=hide_env(tmp), uvalue=tmp, /string, title='', xsize=10, /return_ev) tmp = GetFileSpec(from='name') state.wid_filter= cw_field(state.wid_init, value=tmp, uvalue=tmp, /string , title='', xsize=30, /return_ev) state.wid_ftsext= cw_field(state.wid_init, value=0 , /integer, title='', xsize= 3, /return_ev) base_selection = widget_base(base_data, /row) state.wid_frst = cw_field(base_selection, value=1, /long, title='Selected:', /row, xsize=5, /all_ev) state.wid_last = cw_field(base_selection, value=0, /long, title='to', /row, xsize=5, /all_ev) state.wid_incr = cw_field(base_selection, value=1, /long, title='in steps of', /row, xsize=2, /all_ev) state.wid_select= widget_label(base_selection, value='(Total of 0/0 files)', /dynamic) base_time = widget_base(base_top, /column, frame=1) state.wid_time = cw_field(base_time, value=img_time, /string, title=' Time', /row, xsize=23, uvalue='', /return_events) base_deep = widget_base(base_time, /row, frame=1, /exclusive) state.deep[0] = widget_button(base_deep, value='x-deep', uvalue=0B) state.deep[1] = widget_button(base_deep, value='y-deep', uvalue=0B) state.deep[2] = widget_button(base_deep, value='z-deep', uvalue=0B) base_tmo = widget_base(base_top, /column, /nonexclusive, frame=1) state.wid_tmo = widget_button(base_tmo, value='TMO', uvalue=0B) ;base_container = widget_base(base, /row) ; base_base = widget_base(base_container, /column, frame=2) ; state.setbase = widget_button(base_base, value='Set Base',uvalue=0B) ; base_base_label = widget_label(base_base, value='Base Definition', /align_left) ; base_boptions = widget_base(base_base, /row) ; ; cvalue= [ 'No base subtracted', $ ; 'Same base value for all images', $ ; 'Same base area for all images', $ ; 'Polyfit columns only', $ ; 'Polyfit rows only', $ ; 'Polyfit rows and columns', $ ; 'Running difference', $ ; 'Difference with reference image'] ; state.base_type = widget_droplist(base_boptions, value=cvalue, uvalue=cvalue) ; ; state.base_ref = cw_field(base_boptions, value=1, /integer, title='Ref img', /row, xsize=1) ; state.base_order= cw_field(base_boptions, value=1, /integer, title='Order', /row, xsize=1) ; ; base_xybase = widget_base(base_base, /row) ; state.box[0] = cw_field(base_xybase, value= 0, /integer, title='X-min', /row, xsize=6, /all_ev) ; state.box[1] = cw_field(base_xybase, value=-1, /integer, title='X-max', /row, xsize=6, /all_ev) ; dummy = widget_label(base_xybase,xsize=15,value='') ; state.box[2] = cw_field(base_xybase, value= 0, /integer, title='Y-min', /row, xsize=6, /all_ev) ; state.box[3] = cw_field(base_xybase, value=-1, /integer, title='Y-max', /row, xsize=6, /all_ev) ; dummy = widget_label(base_xybase,xsize=15,value='') ; ; base_zbase = widget_base(base_base, /row) ; ; state.zactive[0] = cw_field(base_zbase, value= 0., /floating, title='Z-min' ,/row,xsize=6) ; state.zactive[1] = cw_field(base_zbase, value=-1., /floating, title='Z-max' ,/row,xsize=6) ; dummy = widget_label(base_zbase,xsize=15,value='') ; state.zactive[2] = cw_field(base_zbase, value= 0., /floating, title='Z-avg' ,/row,xsize=6) ; state.zactive[3] = cw_field(base_zbase, value= 0., /floating, title='Z-std' ,/row,xsize=6) ; ; Pick up the widget id for the filter widget before the state vector is destroyed ;filterid = state.wid_filter ;print, state widget_control, base, set_uvalue=state, /no_copy widget_control, base, /realize ; This is a kludgy way to get a first cut at a file selection. ; The event structure matches the event when a return is entered on the ; the filter text widget. As a result all files matching the filter are selected. ;qView_event, { ID:filterid, TOP:base, HANDLER: base, VALUE:Filter, TYPE:0 , UPDATE:1} xmanager, 'qView', base, group=Group, /no_block, event_handler='qView_Event' IF bFilter THEN BEGIN widget_control, base, get_uvalue=state, /no_copy wid_init = state.wid_init widget_control, base, set_uvalue=state, /no_copy widget_control, wid_init, send_event={ID:0L, TOP:0L, HANDLER: 0L} ENDIF RETURN & END