source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/V_RAW_Data_Panel.ipf @ 1051

Last change on this file since 1051 was 1051, checked in by srkline, 6 years ago

a lot of little changes:

changed the name of the Raw Data display procedure file (removed test)

lots of bug fixes, moving items from the macros menu to proper locations, getting the file status to display properly, some error checking, and cleaning up a few TODO items.

File size: 38.1 KB
Line 
1#pragma rtGlobals=3             // Use modern global access method and strict wave access.
2#pragma version=1.0
3#pragma IgorVersion=6.1
4
5//
6// this will become the equivalent of "RawWindowHook"
7//
8// Procedures to:
9// display the detector data
10// visualization tools
11// mouse interaction
12// status information necessary to understand the data
13// buttons to more functionality to process data
14
15
16// TODO
17//
18// -- have the status automatically fill in when a new file is loaded, rather than needing a click of the "status" button
19// -- need a place somewhere to show the currently displayed folder
20// -- checkboxes for "active" corrections?
21// -- display of Q, counts, QxQy, X and Y
22// -- do I need a color bar? or is this not used at all? I like it to be there, or the colors are a waste of information
23//              (then... where do I put the color bar?)
24// -- define the "hook" function, and attach it to the panel (or the main detector subwindow?)
25//
26
27
28//
29// call this after loading data to either draw the data display panel or to update the contents
30//
31// TODO
32// -- make sure that the "type" input is correctly used for the updating of the data, values, etc.
33// -- add a procedure to define the global variables for pos, counts, QxQy, etc.
34//
35Function V_UpdateDisplayInformation(type)
36        String type
37       
38        DoWindow/F VSANS_Data
39//      Print V_flag
40        if(V_flag==0)
41       
42                VSANSDataPanelGlobals()
43               
44                Execute "VSANS_DataPanel()"             //draws the panel
45
46        endif
47       
48        // TODO: update the information here  - in either case
49        // what isn't automatically picked up? What is "stale" on the display?
50        String/G root:Packages:NIST:VSANS:Globals:gCurDispType = type
51       
52        // fake a click on all three tabs - to populate the data
53        V_FakeTabClick(2)
54        V_FakeTabClick(1)
55        V_FakeTabClick(0)
56
57        V_LogLinDisplayPref()           // resets the display depending on the preference state
58       
59        // either clear the status, or fake a click
60//      root:Packages:NIST:VSANS:Globals:gStatusText = "status info box"
61
62        V_FakeStatusButtonClick()
63
64        V_FakeRestorePanelsButtonClick()                //so the panels display correctly
65
66       
67//      DoWindow/T VSANS_Data,type + " VSANS_Data"
68
69        // get the string with the file name that is in the "type" folder
70        // this string is what goes in the status of the display
71        SVAR gFileForDisplay = root:Packages:NIST:VSANS:Globals:gLastLoadedFile         //for the status of the display
72        SVAR gFileList = $("root:Packages:NIST:VSANS:"+type+":gFileList")
73       
74        gFileForDisplay=gFileList
75       
76
77        String newTitle = "WORK_"+type
78        DoWindow/F VSANS_Data
79        DoWindow/T VSANS_Data, newTitle
80        KillStrings/Z newTitle
81       
82end
83
84Function V_LogLinDisplayPref()
85
86        // get the state of the log/lin button, and make sure preferences are obeyed
87        // log/lin current state is in the S_UserData string (0=linear, 1=log)
88        ControlInfo/W=VSANS_Data button_log
89        Variable curState
90        curState = str2num(S_UserData)
91
92        NVAR gLogScalingAsDefault = root:Packages:NIST:VSANS:Globals:gLogScalingAsDefault
93        if(curState != gLogScalingAsDefault)
94                STRUCT WMButtonAction ba
95                ba.eventCode = 2                //fake mouse click
96                V_LogLinButtonProc(ba)
97        endif
98       
99        return(0)
100end
101
102
103//
104// creates/initializes the globals for display of the data panel
105//
106Function VSANSDataPanelGlobals()
107
108        SetDataFolder root:Packages:NIST:VSANS:Globals
109       
110        Variable/G gXPos=0
111        Variable/G gYPos=0
112        Variable/G gQX=0
113        Variable/G gQY=0
114        Variable/G gQQ=0
115        Variable/G gNCounts=0
116        String/G gCurDispFile = "default string"
117        String/G gCurTitle = ""
118        String/G gCurDispType = ""
119        String/G gStatusText = "status"
120        String/G gLastLoadedFile=""
121       
122        SetDataFolder root:
123End
124
125
126// TODO
127//
128// -- now that the sliders work, label them and move them to a better location
129// -- logical location for all of the buttons
130// -- add raw data load button, load/draw mask button
131// x- fill in the proper window title in the DoWindow/T command
132// -- add help text for all of the controls
133// -- tab order? can I set this?
134//
135Window VSANS_DataPanel() : Panel
136        PauseUpdate; Silent 1           // building window...
137        NewPanel /W=(37,45,1038,719) /K=1 /N=VSANS_Data
138//      ShowTools/A
139        ModifyPanel cbRGB=(65535,60076,49151)
140
141        String curFolder = root:Packages:NIST:VSANS:Globals:gCurDispType
142        DoWindow/T VSANS_Data,curFolder + " VSANS_Data"
143        SetWindow VSANS_Data,hook(dataHook)=VSANSDataHook,hookevents=2
144       
145        SetDrawLayer UserBack
146        SetDrawEnv linethick= 2,dash= 1,fillpat= 0
147        DrawRect 200,70,310,160
148        SetDrawEnv linethick= 2,dash= 1,fillpat= 0
149        DrawRect 320,70,430,160
150        SetDrawEnv linethick= 2,dash= 1,fillpat= 0
151        DrawRect 440,70,550,160
152       
153        SetDrawEnv fsize= 18
154        DrawText 230,115,"Front"
155        SetDrawEnv fsize= 18
156        DrawText 348,115,"Middle"
157        SetDrawEnv fsize= 18
158        DrawText 476,115,"Back"
159       
160        ToolsGrid visible=1
161
162
163        TabControl tab0,pos={13,41},size={572,617},proc=V_DataTabProc,tabLabel(0)="Front"
164        TabControl tab0,tabLabel(1)="Middle",tabLabel(2)="Back",value= 2,focusRing=0
165
166// on the side 
167        Button button_status,pos={607,146},size={70,20},proc=V_StatusButtonProc,title="Status"
168        Button button_IvsQ,pos={689,113},size={70,20},proc=V_IvsQPanelButtonProc,title="I vs. Q"
169        Button button_file_m,pos={619,55},size={50,20},proc=V_File_minus_ButtonProc,title="File <"
170        Button button_file_p,pos={679,55},size={50,20},proc=V_File_plus_ButtonProc,title="File >"
171        Button button_log,pos={689,146},size={70,20},proc=V_LogLinButtonProc,title="isLin",userData="0"
172        Button button_tab_p,pos={648,81},size={50,20},proc=V_Tab_p_ButtonProc,title="Tab >"
173        Button button_isolate,pos={606,114},size={70,20},proc=V_IsolateButtonProc,title="Isolate"
174        Button button_toWork,pos={770,113},size={70,20},proc=V_ToWorkFileButtonProc,title="to WORK"
175
176        TitleBox title_file,pos={606,178},size={76,20},variable= root:Packages:NIST:VSANS:Globals:gLastLoadedFile
177        TitleBox title_dataPresent,pos={606,210},size={76,20},variable= root:Packages:NIST:VSANS:Globals:gCurDispFile
178        TitleBox title_status,pos={606,240},size={200,200},variable= root:Packages:NIST:VSANS:Globals:gStatusText
179       
180//      Button button_tagFile,pos={720,412},size={70,20},proc=V_TagFileButtonProc,title="Tag File"
181//      Button button_tagFile,disable=2
182        Button button_saveIQ,pos={603,412},size={120,20},proc=V_SaveIQ_ButtonProc,title="Save I(Q) as ITX"
183        Button button_BeamCtr,pos={603,450},size={110,20},proc=V_BeamCtrButtonProc,title="Beam Center"
184        Button button_SpreadPanels,pos={603,488},size={100,20},proc=V_SpreadPanelButtonProc,title="Spread Panels"
185        Button button_RestorePanels,pos={603,526},size={100,20},proc=V_RestorePanelButtonProc,title="Restore Panels"
186
187
188// on the tabs, always visible
189        TitleBox title_xy,pos={24,71},size={76,20},variable= root:Packages:NIST:VSANS:Globals:gLastLoadedFile
190        Slider slider_hi,pos={558,224},size={16,80},proc=V_HiMapSliderProc
191        Slider slider_hi,limits={0,1,0},value= 1,ticks= 0
192        Slider slider_lo,pos={558,315},size={16,80},proc=V_LowMapSliderProc
193        Slider slider_lo,limits={0,1,0},value= 0,ticks= 0
194
195        SetVariable xpos,pos={22,97},size={50,17},title="X "
196        SetVariable xpos,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gXPos
197        SetVariable xpos,help={"x-position on the detector"},frame=0,noedit=1
198        SetVariable ypos,pos={22,121},size={50,17},title="Y "
199        SetVariable ypos,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gYPos
200        SetVariable ypos,help={"y-position on the detector"},frame=0,noedit=1
201        SetVariable counts,pos={22,151},size={150,17},title="Counts "
202        SetVariable counts,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gNCounts
203        SetVariable counts,help={"Neutron counts"},frame=0,noedit=1
204        SetVariable qxval,pos={83,94},size={85,17},title="qX"
205        SetVariable qxval,help={"q value in the x-direction on the detector"},frame=0,noedit=1
206        SetVariable qxval,format="%+7.5f",limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gQX
207        SetVariable qyval,pos={83,113},size={85,17},title="qY"
208        SetVariable qyval,help={"q value in the y-direction on the detector"},frame=0,noedit=1
209        SetVariable qyval,format="%+7.5f",limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gQY
210        SetVariable q_pos,pos={83,132},size={85,17},title="q "
211        SetVariable q_pos,help={"q-value on the detector at (x,y)"},format="%+7.5f"
212        SetVariable q_pos,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gQQ,frame=0,noedit=1
213       
214        Make/O/D tmp_asdf
215        // for back panels (in pixels?)
216//      Display/W=(50,185,545,620)/HOST=# tmp_asdf
217        Display/W=(50,185,517,620)/HOST=# tmp_asdf
218        RenameWindow #,det_panelsB
219        ModifyGraph mode=2              // mode = 2 = dots
220        ModifyGraph marker=19
221        ModifyGraph rgb=(0,0,0)
222        ModifyGraph tick=2,mirror=1
223        Label left "pixels"
224        Label bottom "pixels"   
225        SetActiveSubwindow ##
226       
227        // for middle panels (in pixels?)       
228        Display/W=(50,185,517,620)/HOST=# tmp_asdf
229        RenameWindow #,det_panelsM
230        ModifyGraph mode=2              // mode = 2 = dots
231        ModifyGraph marker=19
232        ModifyGraph rgb=(0,0,0)
233        ModifyGraph tick=2,mirror=1
234        Label left "pixels"
235        Label bottom "pixels"   
236        SetActiveSubwindow ##
237       
238        // for front panels (in pixels?)       
239        Display/W=(50,185,517,620)/HOST=# tmp_asdf
240        RenameWindow #,det_panelsF
241        ModifyGraph mode=2              // mode = 2 = dots
242        ModifyGraph marker=19
243        ModifyGraph rgb=(0,0,0)
244        ModifyGraph tick=2,mirror=1
245        Label left "pixels"
246        Label bottom "pixels"   
247        SetActiveSubwindow ##
248       
249EndMacro
250
251//
252// event code 4: mouse moved
253// event code 11: keyboard events
254//
255// mouse moved is the only event that I really care about for the data display.
256//
257// TODO:
258// -- figure out how to respond only to events in the main window
259// -- figure out which is the correct image to respond "from"
260// -- More complete documentation of how the hook is identifying what graph is "under" the mouse
261//    AND what assumptions are behind this identification
262//
263//
264Function VSANSDataHook(s)
265        STRUCT WMWinHookStruct &s
266
267        Variable hookResult = 0
268
269        switch(s.eventCode)
270                case 0:                         // Activate
271                        // Handle activate
272//                      Print "Activate"
273                        break
274
275                case 1:                         // Deactivate
276                        // Handle deactivate
277                        break
278                       
279                case 3:         //mouse down
280//                      Print "mouse down"
281//
282// TODO (Way in the future -- I could make the small graphs into "buttons" by responding to a "mouse up" (not down)
283//    that hits in one of the small graph areas, and treat that as a click on that tab
284// -- instead of this, I can try to get the focus rectangle to work more easily to move with the TAB,
285//    if I can intercept the keystroke (event 11), see below.
286//
287                        break
288                       
289                case 4:         // mouse moved
290                        NVAR xloc = root:Packages:NIST:VSANS:Globals:gXPos
291                        NVAR yloc = root:Packages:NIST:VSANS:Globals:gYPos
292                        NVAR gQX = root:Packages:NIST:VSANS:Globals:gQX
293                        NVAR gQY = root:Packages:NIST:VSANS:Globals:gQY
294                        NVAR gQQ = root:Packages:NIST:VSANS:Globals:gQQ
295                        NVAR gNCounts = root:Packages:NIST:VSANS:Globals:gNCounts
296                        SVAR gCurDispFile = root:Packages:NIST:VSANS:Globals:gCurDispFile
297                        SVAR gCurDispType = root:Packages:NIST:VSANS:Globals:gCurDispType               //the current folder
298                        Variable xaxval,yaxval,tab
299                       
300                        // is the mouse location within the "main" display window?
301                        // if so, do something, if not, do nothing?
302                        // right now, the "main" display is at (50,185,545,620). its name depends on the active tab
303                       
304//                              xloc = s.mouseLoc.h
305//                              yloc = s.mouseLoc.v
306
307//                      if out of bounds, exit now
308//              TODO - currently the values are hard-wired. eliminate this later if the size of the graph changes
309                        if(s.mouseLoc.h < 50 || s.mouseLoc.h > 545 || s.mouseLoc.v < 185 || s.mouseLoc.v > 620)
310                                break
311                        endif   
312                       
313//                      if(in bounds)
314//                              get the point location
315//                              update the globals --
316//                              but which data instance am I pointing to?
317//                              deduce the carriage and panel, and calculate Q
318//                      endif
319
320                        GetWindow $s.winName activeSW
321                        String activeSubwindow = S_value                // returns something like: "VSANS_Data#det_panelsF"
322                               
323                        xaxval= AxisValFromPixel("","bottom",s.mouseLoc.h)
324                        yaxval= AxisValFromPixel("","left",s.mouseLoc.v)
325                        xloc = round(xaxval)
326                        yloc = round(yaxval)
327                       
328                        // which tab is selected? -this is the main graph panel (subwindow may not be the active one!)
329                        ControlInfo/W=VSANS_Data tab0
330                        tab = V_Value
331                        if(tab == 0)
332                                activeSubwindow = "VSANS_Data#det_panelsF"
333                        elseif (tab == 1)
334                                activeSubwindow = "VSANS_Data#det_panelsM"
335                        else
336                                activeSubwindow = "VSANS_Data#det_panelsB"
337                        endif
338                       
339                       
340                        // which images are here?
341                        String detStr="",imStr,carriageStr
342                        String currentImageRef
343                        String imageList = ImageNameList(activeSubwindow,";")
344                        Variable ii,nIm,testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY
345                        nIm = ItemsInList(imageList,";")
346                        gCurDispFile = imageList
347                        if(nIm==0)
348                                break           //problem, get out
349                        endif
350
351                        // images were added in the order TBLR, so look back through in the order RLBT, checking each to see if
352                        // the xy value is found on that (scaled) array
353                                               
354                        // loop backwards through the list of panels (may only be one if on the back)
355                        for(ii=nIm-1;ii>=0;ii-=1)
356                                Wave w = ImageNameToWaveRef(activeSubwindow,StringFromList(ii, imageList,";"))
357                               
358                                // which, if any image is the mouse xy location on?
359                                // use a multidemensional equivalent to x2pnt: (ScaledDimPos - DimOffset(waveName, dim))/DimDelta(waveName,dim)
360
361                               
362                                testX = ScaleToIndex(w,xloc,0)
363                                testY = ScaleToIndex(w,yloc,1)
364                               
365                                if( (testX >= 0 && testX < DimSize(w,0)) && (testY >= 0 && testY < DimSize(w,1)) )
366                                        // we're in-bounds on this wave
367                                       
368                                        // count value to the global
369                                        gNCounts = w[testX][testY]
370                                       
371                                        // deduce the detector panel
372                                        currentImageRef = StringFromList(ii, imageList,";")     //the image instance ##
373                                        // string is "data", or "data#2" etc. - so this returns "", "1", "2", or "3"
374                                        imStr = StringFromList(1, currentImageRef,"#")         
375                                        carriageStr = activeSubWindow[strlen(activeSubWindow)-1]
376                                       
377                                        if(cmpstr(carriageStr,"B")==0)
378                                                detStr = carriageStr
379                                        else
380                                                if(strlen(imStr)==0)
381                                                        imStr = "9"                     // a dummy value so I can replace it later
382                                                endif
383                                                detStr = carriageStr+imStr              // "F2" or something similar
384                                                detStr = ReplaceString("9", detStr, "T")        // ASSUMPTION :::: instances 0123 correspond to TBLR
385                                                detStr = ReplaceString("1", detStr, "B")        // ASSUMPTION :::: this is the order that the panels
386                                                detStr = ReplaceString("2", detStr, "L")        // ASSUMPTION :::: are ALWAYS added to the graph
387                                                detStr = ReplaceString("3", detStr, "R")        // ASSUMPTION ::::
388                                        endif
389                                        gCurDispFile = detStr
390
391                                        // now figure out q
392                                        // calculate the q-values, will be different depending on which panel is up (pixel size, geometry, etc.)
393                                        // TODO: !!!! get rid of the hard-wired values
394                                        // TODO: be sure that the units from HDF are what I expect
395                                        // TODO: beam center XY are pixels in the file, expected in the function, but are better suited for mm or cm
396                                        // TODO: units of xy pixel size are likely wrong
397//                                      xctr = V_getDet_beam_center_x(gCurDispType,detStr)              //written in pixels
398//                                      yctr = V_getDet_beam_center_y(gCurDispType,detStr)
399                                        xctr = V_getDet_beam_center_x_mm(gCurDispType,detStr)           //written in mm
400                                        yctr = V_getDet_beam_center_y_mm(gCurDispType,detStr)   
401                                       
402                                        sdd = V_getDet_ActualDistance(gCurDispType,detStr)      / 100   //written in cm, pass in meters
403                                        lam = V_getWavelength(gCurDispType)             //A
404//                                      pixSizeX = V_getDet_x_pixel_size(gCurDispType,detStr)           // written mm? need mm
405//                                      pixSizeY = V_getDet_y_pixel_size(gCurDispType,detStr)           // written mm? need mm
406//
407// TODO: these q-values ignore the non-linear corrections!!!
408// -- What can I do about this?
409                                        String destPath = "root:Packages:NIST:VSANS:"+gCurDispType
410                                        Wave data_realDistX = $(destPath + ":entry:instrument:detector_"+detStr+":data_realDistX")
411                                        Wave data_realDistY = $(destPath + ":entry:instrument:detector_"+detStr+":data_realDistY")     
412                                       
413// TODO: figure out what coordinates I need to pass -- xloc, yloc, textX, testY, (+1 on any?)                           
414                                        //gQQ = VC_CalcQval(testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
415                                        //gQX = VC_CalcQX(testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
416                                        //gQY = VC_CalcQY(testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
417                                        gQQ = V_CalcQval(testX,testY,xctr,yctr,sdd,lam,data_realDistX,data_realDistY)
418                                        gQX = V_CalcQX(testX,testY,xctr,yctr,sdd,lam,data_realDistX,data_realDistY)
419                                        gQY = V_CalcQY(testX,testY,xctr,yctr,sdd,lam,data_realDistX,data_realDistY)
420
421                                        ii = -1         //look no further, set ii to bad value to exit the for loop
422                                       
423                                        // TODO
424                                        // -- remove this - it sets the globals to display to the pixel values, unscaled
425//                                      xloc = testX
426//                                      yloc = testY
427                                       
428                                endif   //end if(mouse is over a detector panel)
429                        endfor          // end loop over list of displayed images
430               
431                        break
432                       
433                        case 11: // keyboard event
434                                // TODO -- figure out why I'm not getting the TAB keystroke
435                                //  -- I want to be able to use the tab to change the focus only between File <.> and Tab > buttons, not everything
436                                // see the help file section "Keyboard Events" for an example and "WMWinHookStruct"
437                               
438                                //Print "key code = ",s.specialKeyCode
439                                //hookresult = 1                //if non-zero, we handled it and Igor will ignore it
440                                break
441                // And so on . . .
442        endswitch
443
444        return hookResult               // 0 if nothing done, else 1
445End
446
447
448// ********
449//
450// this procedure does most of the work for drawing the panels, setting the proper log/lin
451// scaling, the color scale, and the location based on the active tab
452//
453//lots to to here:
454//
455// - 1 - display the appropriate controls for each tab, and hide the others
456// - 2 - display the correct detector data for each tab, and remove the others from the graph
457// -----?? can I draw 3 graphs, and just put the right one on top?? move the other two to the side?
458//
459//
460// TODO
461//  -- add all of the controls of the VCALC panel (log scaling, adjusting the axes, etc.)
462//  x- get the panel to be correctly populated first, rather than needing to click everywhere to fill in
463//  x- remove the dependency on VCALC being initialized first, and using dummy waves from there...
464//
465//
466Function V_DataTabProc(tca) : TabControl
467        STRUCT WMTabControlAction &tca
468
469        switch( tca.eventCode )
470                case 2: // mouse up
471                        Variable tab = tca.tab
472               
473//                      SetDataFolder root:Packages:NIST:VSANS:VCALC
474                        SetDataFolder root:
475                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsB tmp_asdf
476                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsM tmp_asdf
477                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsF tmp_asdf
478                        SetDataFolder root:
479                       
480                        SVAR dataType = root:Packages:NIST:VSANS:Globals:gCurDispType
481                       
482// make sure log scaling is correct
483                        NVAR state = root:Packages:NIST:VSANS:Globals:gIsLogScale
484                        if(State == 0)
485                                // lookup wave
486                                Wave LookupWave = root:Packages:NIST:VSANS:Globals:linearLookupWave
487                        else
488                                // lookup wave - the linear version
489                                Wave LookupWave = root:Packages:NIST:VSANS:Globals:logLookupWave
490                        endif
491                                               
492                       
493                        //************
494                        // -- can I use "ReplaceWave/W=VSANS_Data#det_panelsB allinCDF" to do this?
495                        // -- only works for "B", since for M and F panels, all 4 data sets are named "data"
496                        // in their respective folders...
497                       
498                       
499                        // get the slider values for the color mapping
500                        Variable lo,hi,lo_B,hi_B
501                        Variable lo_MT,lo_MB,lo_MR,lo_ML
502                        Variable lo_FT,lo_FB,lo_FR,lo_FL
503                        Variable hi_MT,hi_MB,hi_MR,hi_ML
504                        Variable hi_FT,hi_FB,hi_FR,hi_FL
505                        ControlInfo slider_lo
506                        lo = V_Value
507                        ControlInfo slider_hi
508                        hi = V_Value
509                       
510                       
511                        String tmpStr
512                        Variable ii
513                        if(tab==2)
514                                tmpStr = ImageNameList("VSANS_Data#det_panelsB",";")
515                                // for some odd reason, it appears that I need to work from the back of the list
516                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
517                                if(ItemsInList(tmpStr) > 0)
518                                        do
519                                                RemoveImage /W=VSANS_Data#det_panelsB $(StringFromList(0,tmpStr,";"))           //get 1st item
520                                                tmpStr = ImageNameList("VSANS_Data#det_panelsB",";")                                                            //refresh list
521                                        while(ItemsInList(tmpStr) > 0)
522                                endif
523                               
524                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_B")
525                                Wave det_B=data
526                               
527                                CheckDisplayed /W=VSANS_Data#det_panelsB det_B 
528                                if(V_flag == 0)         // 0 == data is not displayed, so append it
529                                        AppendImage/W=VSANS_Data#det_panelsB det_B
530                                        lo_B = lo*(WaveMax(det_B) - WaveMin(det_B)) + WaveMin(det_B)
531                                        hi_B = hi*(WaveMax(det_B) - WaveMin(det_B)) + WaveMin(det_B)
532                                        ModifyImage/W=VSANS_Data#det_panelsB ''#0 ctab= {lo_B,hi_B,ColdWarm,0}          // don't autoscale {*,*,ColdWarm,0}
533                                endif
534                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(50,185,517,620)
535                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(320,70,430,160)
536                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(200,70,310,160)
537
538                                ModifyImage/W=VSANS_Data#det_panelsB ''#0 ctabAutoscale=0,lookup= LookupWave
539                               
540                                // make the plot square
541                                ModifyGraph/W=VSANS_Data#det_panelsB width={Aspect,1}
542                               
543                                SetActiveSubWindow VSANS_Data#det_panelsB
544                                SetDataFolder root:
545                        endif
546       
547                        if(tab==1)
548                                tmpStr = ImageNameList("VSANS_Data#det_panelsM",";")
549                                // for some odd reason, it appears that I need to work from the back of the list
550                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
551                                if(ItemsInList(tmpStr) > 0)
552                                        do
553                                                RemoveImage /W=VSANS_Data#det_panelsM $(StringFromList(0,tmpStr,";"))           //get 1st item
554                                                tmpStr = ImageNameList("VSANS_Data#det_panelsM",";")                                                            //refresh list
555                                        while(ItemsInList(tmpStr) > 0)
556                                endif
557
558                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_ML")
559                                Wave det_ML=data                               
560                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_MR")
561                                Wave det_MR=data
562                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_MT")
563                                Wave det_MT=data
564                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_MB")
565                                Wave det_MB=data
566
567                                CheckDisplayed /W=VSANS_Data#det_panelsM det_MR
568                                if(V_flag == 0)
569                                        AppendImage/W=VSANS_Data#det_panelsM det_MT             //order is important here to get LR on "top" of display
570                                        AppendImage/W=VSANS_Data#det_panelsM det_MB
571                                        AppendImage/W=VSANS_Data#det_panelsM det_ML
572                                        AppendImage/W=VSANS_Data#det_panelsM det_MR
573                                        lo_MT = lo*(WaveMax(det_MT) - WaveMin(det_MT)) + WaveMin(det_MT)
574                                        hi_MT = hi*(WaveMax(det_MT) - WaveMin(det_MT)) + WaveMin(det_MT)
575                                        lo_MB = lo*(WaveMax(det_MB) - WaveMin(det_MB)) + WaveMin(det_MB)
576                                        hi_MB = hi*(WaveMax(det_MB) - WaveMin(det_MB)) + WaveMin(det_MB)
577                                        lo_ML = lo*(WaveMax(det_ML) - WaveMin(det_ML)) + WaveMin(det_ML)
578                                        hi_ML = hi*(WaveMax(det_ML) - WaveMin(det_ML)) + WaveMin(det_ML)
579                                        lo_MR = lo*(WaveMax(det_MR) - WaveMin(det_MR)) + WaveMin(det_MR)
580                                        hi_MR = hi*(WaveMax(det_MR) - WaveMin(det_MR)) + WaveMin(det_MR)
581                                       
582                                        ModifyImage/W=VSANS_Data#det_panelsM ''#0 ctab= {lo_MT,hi_MT,ColdWarm,0}                // ''#n means act on the nth image (there are 4)
583                                        ModifyImage/W=VSANS_Data#det_panelsM ''#1 ctab= {lo_MB,hi_MB,ColdWarm,0}
584                                        ModifyImage/W=VSANS_Data#det_panelsM ''#2 ctab= {lo_ML,hi_ML,ColdWarm,0}
585                                        ModifyImage/W=VSANS_Data#det_panelsM ''#3 ctab= {lo_MR,hi_MR,ColdWarm,0}
586                                endif
587                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(50,185,517,620)
588                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(440,70,550,160)
589                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(200,70,310,160)
590
591                                ModifyImage/W=VSANS_Data#det_panelsM ''#0 ctabAutoscale=0,lookup= LookupWave
592                                ModifyImage/W=VSANS_Data#det_panelsM ''#1 ctabAutoscale=0,lookup= LookupWave
593                                ModifyImage/W=VSANS_Data#det_panelsM ''#2 ctabAutoscale=0,lookup= LookupWave
594                                ModifyImage/W=VSANS_Data#det_panelsM ''#3 ctabAutoscale=0,lookup= LookupWave
595                               
596                                // make the plot square
597                                ModifyGraph/W=VSANS_Data#det_panelsM width={Aspect,1}
598                                                       
599                                SetActiveSubWindow VSANS_Data#det_panelsM
600                                SetDataFolder root:
601                        endif
602
603                        if(tab==0)
604                                tmpStr = ImageNameList("VSANS_Data#det_panelsF",";")
605                                // for some odd reason, it appears that I need to work from the back of the list
606                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
607                                if(ItemsInList(tmpStr) > 0)
608                                        do
609                                                RemoveImage /W=VSANS_Data#det_panelsF $(StringFromList(0,tmpStr,";"))           //get 1st item
610                                                tmpStr = ImageNameList("VSANS_Data#det_panelsF",";")                                                            //refresh list
611                                        while(ItemsInList(tmpStr) > 0)
612                                endif
613
614                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_FL")
615                                Wave det_FL=data
616                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_FR")
617                                Wave det_FR=data
618                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_FT")
619                                Wave det_FT=data                               
620                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_FB")
621                                Wave det_FB=data
622                                                               
623                                CheckDisplayed /W=VSANS_Data#det_panelsF det_FL
624                                if(V_flag == 0)
625                                        AppendImage/W=VSANS_Data#det_panelsF det_FT
626                                        AppendImage/W=VSANS_Data#det_panelsF det_FB
627                                        AppendImage/W=VSANS_Data#det_panelsF det_FL
628                                        AppendImage/W=VSANS_Data#det_panelsF det_FR
629                                        lo_FT = lo*(WaveMax(det_FT) - WaveMin(det_FT)) + WaveMin(det_FT)
630                                        hi_FT = hi*(WaveMax(det_FT) - WaveMin(det_FT)) + WaveMin(det_FT)
631                                        lo_FB = lo*(WaveMax(det_FB) - WaveMin(det_FB)) + WaveMin(det_FB)
632                                        hi_FB = hi*(WaveMax(det_FB) - WaveMin(det_FB)) + WaveMin(det_FB)
633                                        lo_FL = lo*(WaveMax(det_FL) - WaveMin(det_FL)) + WaveMin(det_FL)
634                                        hi_FL = hi*(WaveMax(det_FL) - WaveMin(det_FL)) + WaveMin(det_FL)
635                                        lo_FR = lo*(WaveMax(det_FR) - WaveMin(det_FR)) + WaveMin(det_FR)
636                                        hi_FR = hi*(WaveMax(det_FR) - WaveMin(det_FR)) + WaveMin(det_FR)
637                                       
638                                        ModifyImage/W=VSANS_Data#det_panelsF ''#0 ctab= {lo_FT,hi_FT,ColdWarm,0}
639                                        ModifyImage/W=VSANS_Data#det_panelsF ''#1 ctab= {lo_FB,hi_FB,ColdWarm,0}
640                                        ModifyImage/W=VSANS_Data#det_panelsF ''#2 ctab= {lo_FL,hi_FL,ColdWarm,0}
641                                        ModifyImage/W=VSANS_Data#det_panelsF ''#3 ctab= {lo_FR,hi_FR,ColdWarm,0}
642                                endif
643                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(50,185,517,620)
644                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(440,70,550,160)
645                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(320,70,430,160)
646                               
647                                ModifyImage/W=VSANS_Data#det_panelsF ''#0 ctabAutoscale=0,lookup= LookupWave
648                                ModifyImage/W=VSANS_Data#det_panelsF ''#1 ctabAutoscale=0,lookup= LookupWave
649                                ModifyImage/W=VSANS_Data#det_panelsF ''#2 ctabAutoscale=0,lookup= LookupWave
650                                ModifyImage/W=VSANS_Data#det_panelsF ''#3 ctabAutoscale=0,lookup= LookupWave
651
652                                // make the plot square
653                                ModifyGraph/W=VSANS_Data#det_panelsF width={Aspect,1}                           
654       
655                                SetActiveSubWindow VSANS_Data#det_panelsF
656                                SetDataFolder root:
657                        endif
658
659                                               
660                        break
661                case -1: // control being killed
662                        break
663        endswitch
664
665        return 0
666End
667
668// fake restore panels button click
669Function V_FakeRestorePanelsButtonClick()
670
671        STRUCT WMButtonAction ba
672        ba.eventCode = 2
673        V_RestorePanelButtonProc(ba)
674       
675        return(0)
676End
677
678
679// fake status button click
680Function V_FakeStatusButtonClick()
681
682        STRUCT WMButtonAction ba
683        ba.eventCode = 2
684        V_StatusButtonProc(ba)
685       
686        return(0)
687End
688
689// fake click on each tab to populate the data
690Function V_FakeTabClick(tab)
691        Variable tab
692       
693        STRUCT WMTabControlAction tca
694
695        tca.eventCode = 2               //fake mouse up
696        tca.tab = tab
697        V_DataTabProc(tca)
698       
699        TabControl tab0,win=VSANS_Data,value= tab               //select the proper tab
700        return(0)
701End
702
703// TODO
704//
705// move one file number back
706//
707Function V_File_minus_ButtonProc(ba) : ButtonControl
708        STRUCT WMButtonAction &ba
709
710        switch( ba.eventCode )
711                case 2: // mouse up
712                        // click code here
713                        V_LoadPlotAndDisplayRAW(-1)
714                       
715                        break
716                case -1: // control being killed
717                        break
718        endswitch
719
720        return 0
721End
722
723// TODO
724//
725// move one file number forward
726//
727Function V_File_plus_ButtonProc(ba) : ButtonControl
728        STRUCT WMButtonAction &ba
729
730        switch( ba.eventCode )
731                case 2: // mouse up
732                        // click code here
733                        V_LoadPlotAndDisplayRAW(1)
734
735                        break
736                case -1: // control being killed
737                        break
738        endswitch
739
740        return 0
741End
742
743//
744// button that mimics a click on the tab, cycling through the tabs 0->1->2->0 etc.
745// only goes one direction
746//
747Function V_Tab_p_ButtonProc(ba) : ButtonControl
748        STRUCT WMButtonAction &ba
749
750        switch( ba.eventCode )
751                case 2: // mouse up
752                        // click code here
753                        ControlInfo/W=VSANS_Data tab0
754                       
755                        V_Value += 1
756                        if(V_Value == 3)
757                                V_Value = 0             //reset to 0
758                        endif
759                        V_FakeTabClick(V_Value)
760
761// update the status when the tab is clicked                   
762                        STRUCT WMButtonAction sa
763                        sa.eventCode = 2
764                        V_StatusButtonProc(sa)
765
766                        break
767                case -1: // control being killed
768                        break
769        endswitch
770
771        return 0
772End
773
774
775// See V_Detector_Isolate.ipf
776// isolates a single panel to allow a better view of the details
777// useful for T/B panels which are partially blocked from view
778//
779// will open a separate panel to display the selected detector
780// (more to do here, depending what is necessary for instrument troubleshooting)
781// - like being able to turn corrections on/off and view with different axes (pix, mm, Q)
782//
783Function V_IsolateButtonProc(ba) : ButtonControl
784        STRUCT WMButtonAction &ba
785
786        switch( ba.eventCode )
787                case 2: // mouse up
788                        // click code here
789                        V_DetectorIsolate()
790                        break
791                case -1: // control being killed
792                        break
793        endswitch
794
795        return 0
796End
797
798//
799// if the data display is RAW, convert to the specified WORK data type
800//
801// TODO
802// -- better error checking
803// -- if the data type is not RAW, can I Copy Folder instead?
804//
805Function V_ToWorkFileButtonProc(ba) : ButtonControl
806        STRUCT WMButtonAction &ba
807
808        switch( ba.eventCode )
809                case 2: // mouse up
810                        // click code here
811                        //Convert_to_Workfile(newtype, doadd) // a proc
812                        Execute "V_Convert_to_Workfile()"
813
814                        break
815                case -1: // control being killed
816                        break
817        endswitch
818
819        return 0
820End
821
822
823// TODO
824//
825// opens a separate panel with the I(q) representation of the data
826// ? controls here to select how the data is processed/grouped/saved, etc.
827//
828// -- currently just the graph, no controls
829// -- this re-bins the data every time by calling V_QBinAllPanels(folderStr,binType) from inside V_BinningModePopup()
830Function V_IvsQPanelButtonProc(ba) : ButtonControl
831        STRUCT WMButtonAction &ba
832
833        switch( ba.eventCode )
834                case 2: // mouse up
835                        // click code here
836                       
837                        V_PlotData_Panel()              //-9999 requests a read from the popup on the panel
838                        Variable binType = V_GetBinningPopMode()
839                        V_BinningModePopup("",binType,"")               // does default circular binning and updates the graph
840                       
841                        break
842                case -1: // control being killed
843                        break
844        endswitch
845
846        return 0
847End
848
849// TODO
850//
851// gets the status of the currently displayed file and dumps it to the panel (not the cmd window)
852// - lots to decide here about what is the important stuff to display. There's a lot more information for VSANS
853//
854Function V_StatusButtonProc(ba) : ButtonControl
855        STRUCT WMButtonAction &ba
856
857        switch( ba.eventCode )
858                case 2: // mouse up
859                        // click code here
860                       
861                        // figure out wether to display per carraige, or the whole file
862                        SVAR str = root:Packages:NIST:VSANS:Globals:gStatusText
863                        SVAR type = root:Packages:NIST:VSANS:Globals:gCurDispType               //what folder
864                        // which tab active
865                        ControlInfo/W=VSANS_Data tab0
866                        Variable curTab = V_value
867                       
868                        str = "Current data is from "+ type + "\r"
869                        str += "Description = "+V_getSampleDescription(type) + "\r"
870                        str += "Wavelength is "+num2str(V_getWavelength(type)) + " A \r"
871                        if(curTab == 2)
872                                str += "SDD B = "+num2str(V_getDet_ActualDistance(type,"B")) + " cm \r"         //V_getDet_distance(fname,detStr)
873                        endif
874                        if(curTab == 1)
875                                str += "SDD ML = "+num2str(V_getDet_ActualDistance(type,"ML")) + " cm \r"
876                                str += "SDD MR = "+num2str(V_getDet_ActualDistance(type,"MR")) + " cm \r"
877                                str += "SDD MT = "+num2str(V_getDet_ActualDistance(type,"MT")) + " cm \r"
878                                str += "SDD MB = "+num2str(V_getDet_ActualDistance(type,"MB")) + " cm \r"
879                        endif
880                        if(curTab == 0)
881                                str += "SDD FL = "+num2str(V_getDet_ActualDistance(type,"FL")) + " cm \r"
882                                str += "SDD FR = "+num2str(V_getDet_ActualDistance(type,"FR")) + " cm \r"
883                                str += "SDD FT = "+num2str(V_getDet_ActualDistance(type,"FT")) + " cm \r"
884                                str += "SDD FB = "+num2str(V_getDet_ActualDistance(type,"FB")) + " cm \r"
885                        endif
886                       
887                       
888                       
889                       
890                       
891                        break
892                case -1: // control being killed
893                        break
894        endswitch
895
896        return 0
897End
898
899
900// TODO:
901// x- link this to the preferences for the display. this is done in UpdateDisplayInformation (the main call) so that
902//     the panels are rescaled only once, rather than toggled three times (F, M, B) if I call from the tabProc
903// -- come up with a better definition of the log lookup wave (> 1000 pts, what is the first point)
904// -- make an equivalent linear wave
905// -- hard wire it in so it is created at initialization and stored someplace safe
906// -- catch the error if it doesn't exist (re-make the wave as needed)
907//
908// Using the ModifyImage log=1 keyword fails for values of zero in the data, which is a common
909// occurrence with count data. the display just goes all gray, so that's not an option. Use the lookup wave instead
910//
911// toggle the (z) value of the display log/lin
912//
913Function V_LogLinButtonProc(ba) : ButtonControl
914        STRUCT WMButtonAction &ba
915
916        switch( ba.eventCode )
917                case 2: // mouse up
918                        // click code here
919                       
920                        // which tab is active? does it matter - or do I log-scale everything?
921                        // log/lin current state is in the S_UserData string (0=linear, 1=log)
922                        ControlInfo/W=VSANS_Data button_log
923                        Variable curState,newState
924                        String newStateStr,newTitleStr
925                       
926                       
927                        curState = str2num(S_UserData)
928                       
929                        if(curState == 0)
930                                newState = 1
931                                newStateStr="1"
932                                newTitleStr = "isLog"
933                                // lookup wave
934                                Wave LookupWave = root:Packages:NIST:VSANS:Globals:logLookupWave
935                        else
936                                newState = 0
937                                newStateStr="0"
938                                newTitleStr = "isLin"
939                                // lookup wave - the linear version
940                                Wave LookupWave = root:Packages:NIST:VSANS:Globals:linearLookupWave
941                        endif
942                       
943                        // update the button and the global value
944                        Button button_log,userData=newStateStr,title=newTitleStr
945                        NVAR state = root:Packages:NIST:VSANS:Globals:gIsLogScale
946                        state = newState
947                       
948                        // on the front:                       
949                        ModifyImage/W=VSANS_Data#det_panelsF ''#0 ctabAutoscale=0,lookup= LookupWave
950                        ModifyImage/W=VSANS_Data#det_panelsF ''#1 ctabAutoscale=0,lookup= LookupWave
951                        ModifyImage/W=VSANS_Data#det_panelsF ''#2 ctabAutoscale=0,lookup= LookupWave
952                        ModifyImage/W=VSANS_Data#det_panelsF ''#3 ctabAutoscale=0,lookup= LookupWave
953                        //on the middle:
954//                      ModifyImage/W=VSANS_Data#det_panelsM ''#0 log=newState
955//                      ModifyImage/W=VSANS_Data#det_panelsM ''#1 log=newState
956//                      ModifyImage/W=VSANS_Data#det_panelsM ''#2 log=newState
957//                      ModifyImage/W=VSANS_Data#det_panelsM ''#3 log=newState
958                               
959                        ModifyImage/W=VSANS_Data#det_panelsM ''#0 ctabAutoscale=0,lookup= LookupWave
960                        ModifyImage/W=VSANS_Data#det_panelsM ''#1 ctabAutoscale=0,lookup= LookupWave
961                        ModifyImage/W=VSANS_Data#det_panelsM ''#2 ctabAutoscale=0,lookup= LookupWave
962                        ModifyImage/W=VSANS_Data#det_panelsM ''#3 ctabAutoscale=0,lookup= LookupWave
963
964
965                        // on the back:
966                        ModifyImage/W=VSANS_Data#det_panelsB ''#0 ctabAutoscale=0,lookup= LookupWave
967
968                        break
969                case -1: // control being killed
970                        break
971        endswitch
972
973        return 0
974End
975
976// TODO
977// possibly function to "tag" files right here in the disaply with things
978// like their intent, or other values that reduction will need, kind of like a "quick patch"
979// with limited functionality (since full function would be a nightmare!)
980Function V_TagFileButtonProc(ba) : ButtonControl
981        STRUCT WMButtonAction &ba
982
983        switch( ba.eventCode )
984                case 2: // mouse up
985                        // click code here
986                        DoAlert 0, "TagFileButtonProc(ba) unfinished - this may be used to 'tag' a file as scatter, trans, emp, bkg, etc."
987                       
988                               
989                        break
990                case -1: // control being killed
991                        break
992        endswitch
993
994        return 0
995End
996
997// TODO
998// -- fill in more functionality
999// -- currently a straight concatentation of all data, no options
1000// -- maybe allow save of single panels?
1001// -- any other options?
1002Function V_SaveIQ_ButtonProc(ba) : ButtonControl
1003        STRUCT WMButtonAction &ba
1004
1005        switch( ba.eventCode )
1006                case 2: // mouse up
1007                        // click code here
1008
1009//                      V_SimpleSave1DData("root:Packages:NIST:VSANS:","","","")       
1010
1011// this is the same as clicking the I(q) button. Ensures that the current file has been averaged,
1012// and the data being saved is not "stale"
1013
1014                        V_PlotData_Panel()              //-9999 requests a read from the popup on the panel
1015                        Variable binType = V_GetBinningPopMode()
1016                        V_BinningModePopup("",binType,"")               // does default circular binning and updates the graph
1017       
1018                        SVAR type = root:Packages:NIST:VSANS:Globals:gCurDispType               //what folder
1019
1020                        // look for the binning type
1021//                      Variable binType
1022//                      ControlInfo/W=V_1D_Data popup0
1023//                      binType = (V_flag == 0) ? 1 : V_flag            // if binType not defined, set binType == 1
1024
1025                        String saveName=""
1026                // write out the data set to a file
1027                        if(strlen(saveName)==0)
1028                                Execute "V_GetNameForSave()"
1029                                SVAR newName = root:saveName
1030                                saveName = newName
1031                        endif
1032                       
1033                        V_Write1DData_ITX("root:Packages:NIST:VSANS:",type,saveName,binType)
1034       
1035                        Print "Saved file: "    +       saveName + ".itx"       
1036                        break
1037                case -1: // control being killed
1038                        break
1039        endswitch
1040
1041        return 0
1042End
1043
1044//TODO
1045//
1046//link this to the beam center finding panel
1047//
1048Function V_BeamCtrButtonProc(ba) : ButtonControl
1049        STRUCT WMButtonAction &ba
1050
1051        switch( ba.eventCode )
1052                case 2: // mouse up
1053                        // click code here
1054                        V_FindBeamCenter()
1055                        break
1056                case -1: // control being killed
1057                        break
1058        endswitch
1059
1060        return 0
1061End
1062
1063//TODO
1064//
1065// this "spreads" the display of panels to a nominal separation for easier viewing
1066//
1067Function V_SpreadPanelButtonProc(ba) : ButtonControl
1068        STRUCT WMButtonAction &ba
1069
1070        switch( ba.eventCode )
1071                case 2: // mouse up
1072                        // click code here
1073                        V_SpreadOutPanels()
1074                       
1075                        break
1076                case -1: // control being killed
1077                        break
1078        endswitch
1079
1080        return 0
1081End
1082
1083//TODO
1084//
1085// this "restores" the display of panels to their actual position based on the apparent beam center
1086//
1087Function V_RestorePanelButtonProc(ba) : ButtonControl
1088        STRUCT WMButtonAction &ba
1089
1090        switch( ba.eventCode )
1091                case 2: // mouse up
1092                        // click code here
1093                        V_RestorePanels()
1094                               
1095                        break
1096                case -1: // control being killed
1097                        break
1098        endswitch
1099
1100        return 0
1101End
1102
1103// TODO
1104//
1105// link this slider to the "high" end of the color mapping for whatever is currently displayed
1106//
1107// -- see Buttons.ipf for the old SANS implementation
1108//
1109Function V_HiMapSliderProc(sa) : SliderControl
1110        STRUCT WMSliderAction &sa
1111
1112        switch( sa.eventCode )
1113                case -1: // control being killed
1114                        break
1115                default:
1116                        if( sa.eventCode & 1 ) // value set
1117                                Variable curval = sa.curval
1118                                ControlInfo tab0
1119                                V_FakeTabClick(V_Value)
1120                               
1121//                              ControlInfo slider_lo
1122//                              V_MakeImageLookupTables(10000,V_Value,curval)
1123                        endif
1124                        break
1125        endswitch
1126
1127        return 0
1128End
1129
1130// TODO
1131//
1132// link this slider to the "low" end of the color mapping for whatever is currently displayed
1133//
1134// -- see Buttons.ipf for the old SANS implementation
1135//
1136Function V_LowMapSliderProc(sa) : SliderControl
1137        STRUCT WMSliderAction &sa
1138
1139        switch( sa.eventCode )
1140                case -1: // control being killed
1141                        break
1142                default:
1143                        if( sa.eventCode & 1 ) // value set
1144                                Variable curval = sa.curval
1145                                ControlInfo tab0
1146                                V_FakeTabClick(V_Value)
1147
1148//                              ControlInfo slider_hi
1149//                              V_MakeImageLookupTables(10000,curval,V_Value)
1150                        endif
1151                        break
1152        endswitch
1153
1154        return 0
1155End
1156
1157
Note: See TracBrowser for help on using the repository browser.