User interface to select multiple files and folders

Hello all,

I have a long procedure which starts with the User needing to pick the 4 different types of file from disk and specify a disk folder for the outputs. Everything runs at the moment but the User has to know which files to pick and in what order. I'd like a better solution, if anyone has some ideas or perhaps some code to point me to, that would be great!

My ideas so far:
1. A prompt at the start that the User must dismiss telling them which order to pick everything - don't know how to do that and is not very robust
2. A message on each dialog. I've tried this for specifying the output folder (don't know if possible for picking other files) but under macOS it seems that the /M flag does not get displayed(?)
3. A proper solution. Perhaps a panel where the user can pick files and also change their mind if they pick the wrong thing.

Any help would be appreciated.

The first function is below (the subfunction runs LoadWave twice).
Function LoadImagesForAnalysis()
    // Load channel 1 tiff
    ImageLoad/T=tiff/N=ch1tiff/O/S=0/C=-1 ""
    // Load channel 2 tiff
    ImageLoad/T=tiff/N=ch2tiff/O/S=0/C=-1 ""
    // Now load the ComDet data
    Load2ChComDetResults()
    // Now specify the OutputFolder
    NewPath/O/Q/M="Please find disk folder" OutputFolder
    if (V_flag!=0)
        DoAlert 0, "Disk folder error"
        Return -1
    endif
    PathInfo/S OutputFolder
    String/G gOutputFolder = S_path
End
My approach for this has been a panel which allows the user to pick files and output location in whatever order. The paths are stored here in a global text wave in a package folder and then used by a separate "DoStuff" function.

function myIO_Panel()
    // make global text wave to store paths and output folder
    if (!WaveExists(root:Packages:myFolder:Path))
        NewDataFolder/O root:Packages
        NewDataFolder/O root:Packages:myFolder
        Make/T/O/N=3 root:Packages:myFolder:Path
        wave/T Path = root:Packages:myFolder:Path
    endif

    NewPanel /W=(81,73,774,248)
    Button SelectFile1,pos={12.00,10.00},size={140.00,20.00},proc=ButtonProc,title="Select File No. 1"
    Button SelectFile2,pos={12.00,41.00},size={140.00,20.00},proc=ButtonProc,title="Select File No. 2"
    Button Output,pos={13.00,72.00},size={140.00,20.00},proc=ButtonProc,title="Select Output Folder"
    SetVariable File1,pos={168.00,13.00},size={500.00,14.00},value= Path[0]
    SetVariable File2,pos={168.00,43.00},size={500.00,14.00},value= Path[1]
    SetVariable File5,pos={168.00,75.00},size={500.00,14.00},value= Path[2]
    Button DoIt,pos={291.00,121.00},size={100.00,20.00},proc=ButtonProc,title="Do It"
end

// define buttons
Function ButtonProc(ctrlName) : ButtonControl
    String ctrlName
   
        wave/T Path = root:Packages:myFolder:Path
        variable refnum
   
        strswitch(ctrlName)
       
            case "SelectFile1"  :
                // get File Paths
                Open/D/R/F="*.tif"/M="Select fist file" refNum
                if (strlen(S_FileName) == 0) // user cancelled or some error occured
                    return -1
                endif
                Path[0] = S_fileName
                break
       
            case "SelectFile2"  :
                // get File Paths
                Open/D/R/F="*.tif"/M="Select fist file" refNum
                if (strlen(S_FileName) == 0)
                    return -1
                endif
                Path[1] = S_fileName
                break
       
            case "Output"   :
                // set outputfolder
                NewPath/Q/O OutputPath
                PathInfo OutputPath
                Path[2] = S_Path
                break
           
            case "DoIt" :
                // run your loadwave commands and other functions
                DoStuff(path)
                break
       
        EndSwitch
End

// run your stuff
function DoStuff(path)
    wave/T path
   
    print "LoadWave from: " + Path[0]
    print "LoadWave from: " + Path[1]
    print "Calculate output and save to: " + Path[2]
end

ChriLie solution sounds like the way to go. Do the files differ in suffix? In that case you could supply each Open call with a specific list of allowed extensions.
Good idea Thomas. Yes, the first two files are both .tif and the second two are both .csv, so I could do that. Thanks.