;+ ; Project : General user interaction. ; ; Name : DIALOG_PROJ_INPUT ; ; Purpose : Allows user to input data on a GUI. ; ; Explanation : This function brings up a GUI which asks for input for the ; PROJ_TUTORIAL procedure. ; ; Use : RESULT = DIALOG_PROJ_INPUT(QINPUT) ; ; Inputs : QINPUT: A structure containing the following tags (created in the ; calling procedure PROJ_TUTORIAL): ; ; V0: Initial velocity (m/s). ; PANGLE: Projection angle (degrees). ; T0: Initial time (seconds). ; X0: Initial horizontal position (meters). ; Y0: Initial vertical position (meters). ; TSTEP: Time step useed in the ODE solver. ; GRAV: Surface gravity in m/s^2. ; ; Opt. Inputs : None. ; ; Outputs : QINPUT: As listed above. ; ; RESULT: 0: Input complete with no errors. ; 1: An error has occurred for the input data. ; ; Opt. Outputs: None. ; ; Keywords : None. ; ; Calls : None. ; ; Common : None. ; ; Restrictions: None. ; ; Side effects: None. ; ; Category : User input for projectile motion tutorial. GUI driven. ; ; Prev. Hist. : DIALOG_INPUT. ; ; Written : Donald G. Luttermoser, ETSU/Physics, 3 November 2015 ; ; Modified : Version 1, Donald G. Luttermoser, ETSU/Physics, 3 Nov 2015 ; Initial program. ; ; Version : Version 1, 3 November 2015. ; ;- ; FUNCTION DIALOG_PROJ_INPUT, QINPUT ; ; This procedure brings up a widget that allows the user to input data. ; RESULT = 0 WM = LONARR(7) & WQ = WM & WA = WM NUM = INDGEN(7) & WUN = STRTRIM(STRING(NUM), 2) DEFVAL = DBLARR(7) & QVALUE = DEFVAL TEXT = ['Initial Velocity (m/s): ', 'Launch Angle (deg): ', $ 'Initial Time (s): ', 'Initial Position (m): ', $ 'Initial Height (m): ', 'Time Step (s): ', $ 'Surface Gravity (m/s^2): '] DEFVAL[0] = QINPUT.V0 & DEFVAL[1] = QINPUT.PANGLE DEFVAL[2] = QINPUT.T0 & DEFVAL[3] = QINPUT.X0 & DEFVAL[4] = QINPUT.Y0 DEFVAL[5] = QINPUT.TSTEP & DEFVAL[6] = QINPUT.GRAV ; ; Make the widget. ; BASEIN = WIDGET_BASE(TITLE='Projectile Motion Input', /COLUMN) WIL1 = WIDGET_LABEL(BASEIN, VALUE='Enter data for input.') WIL2 = WIDGET_LABEL(BASEIN, VALUE='Click "Input Done" when complete.') FOR I = 0, 6 DO BEGIN WM[I] = WIDGET_BASE(BASEIN, /ROW) WQ[I] = WIDGET_LABEL(WM[I], VALUE=TEXT[I]) WA[I] = WIDGET_TEXT(WM[I], VALUE=STRTRIM(STRING(DEFVAL[I], FORMAT='(F12.4)'), 2), $ /EDITABLE, UVALUE=WUN[I], XSIZE=8, /ALL_EVENTS) ENDFOR ; WOK = WIDGET_BUTTON(BASEIN, VALUE=' Input Complete ') WC = WIDGET_BUTTON(BASEIN, VALUE=' Cancel ') ; WIDGET_CONTROL, BASEIN, /REALIZE TYPEIN = '' WHILE TYPEIN NE 'QUIT' DO BEGIN EVENTIN = WIDGET_EVENT(BASEIN) TYPE = TAG_NAMES(EVENTIN, /STRUCTURE) ; ; Act on the buttons. ; IF TYPE EQ 'WIDGET_BUTTON' THEN BEGIN WIDGET_CONTROL, EVENTIN.ID, GET_VALUE=VALUE IF STRLOWCASE(STRTRIM(VALUE, 2)) EQ 'input complete' THEN $ TYPEIN = 'QUIT' IF STRLOWCASE(STRTRIM(VALUE, 2)) EQ 'cancel' THEN BEGIN RESULT = 1 TYPEIN = 'QUIT' ENDIF ENDIF ; ; Process the widget TEXT event. ; IF TYPE EQ 'WIDGET_TEXT_CH' THEN BEGIN WIDGET_CONTROL, EVENTIN.ID, GET_VALUE=VALUE, $ GET_UVALUE=UVALUE, /EDITABLE CASE UVALUE OF WUN[0]: QINPUT.V0 = DOUBLE(VALUE[0]) WUN[1]: QINPUT.PANGLE = DOUBLE(VALUE[0]) WUN[2]: QINPUT.T0 = DOUBLE(VALUE[0]) WUN[3]: QINPUT.X0 = DOUBLE(VALUE[0]) WUN[4]: QINPUT.Y0 = DOUBLE(VALUE[0]) WUN[5]: QINPUT.TSTEP = DOUBLE(VALUE[0]) WUN[6]: QINPUT.GRAV = DOUBLE(VALUE[0]) ELSE: RESULT = 1 ENDCASE ENDIF ; ENDWHILE ; WIDGET_CONTROL, BASEIN, /DESTROY ; RETURN, RESULT END