package main import ( "fmt" g "github.com/AllenDang/giu" "strconv" ) func engineDisplacementRow() *g.RowWidget { return g.Row( g.Label("Engine Displacement"), g.InputFloat(&displacement.val).Format("%.2f").OnChange(func() { for i := 0; i < numPoints; i++ { engineMassFlowRate[i] = massFlowRateAt(i) } }), g.Combo( "", volumeUnitStrings()[selectedVolumeUnit], volumeUnitStrings(), &selectedVolumeUnit, ).OnChange(func() { s := volumeUnitStrings()[selectedVolumeUnit] u, err := volumeUnitFromString(s) check(err) displacement = volume{ displacement.asUnit(u), u, } }), ) } func engineSpeedRow() *g.TableRowWidget { widgets := []g.Widget{ g.Label("Engine Speed"), g.Label("rpm"), } for i := 0; i < numPoints; i++ { i := i widgets = append( widgets, g.InputInt(&engineSpeed[i]).OnChange(func() { engineMassFlowRate[i] = massFlowRateAt(i) }), ) } return g.TableRow(widgets...) } func volumetricEfficiencyRow() *g.TableRowWidget { widgets := []g.Widget{ g.Label("Volumetric Efficiency"), g.Label("%"), } for i := 0; i < numPoints; i++ { i := i widgets = append( widgets, g.InputInt(&volumetricEfficiency[i]).OnChange(func() { engineMassFlowRate[i] = massFlowRateAt(i) }), ) } return g.TableRow(widgets...) } func intakeAirTemperatureRow() *g.TableRowWidget { widgets := []g.Widget{ g.Label("Intake Air Temperature"), g.Combo( "", temperatureUnitStrings()[selectedTemperatureUnit], temperatureUnitStrings(), &selectedTemperatureUnit, ).OnChange(func() { s := temperatureUnitStrings()[selectedTemperatureUnit] u, err := temperatureUnitFromString(s) check(err) for i := range intakeAirTemperature { t, err := intakeAirTemperature[i].asUnit(u) check(err) intakeAirTemperature[i] = temperature{t, u} } }), } for i := 0; i < numPoints; i++ { i := i widgets = append( widgets, g.InputFloat(&intakeAirTemperature[i].val). Format("%.2f"). OnChange(func() { engineMassFlowRate[i] = massFlowRateAt(i) }), ) } return g.TableRow(widgets...) } func manifoldPressureRow() *g.TableRowWidget { widgets := []g.Widget{ g.Label("Manifold Absolute Pressure"), g.Combo( "", pressureUnitStrings()[selectedPressureUnit], pressureUnitStrings(), &selectedPressureUnit, ).OnChange(func() { s := pressureUnitStrings()[selectedPressureUnit] u, err := pressureUnitFromString(s) check(err) for i := 0; i < numPoints; i++ { manifoldPressure[i] = pressure{ manifoldPressure[i].asUnit(u), u, } } }), } for i := 0; i < numPoints; i++ { i := i widgets = append( widgets, g.InputFloat(&manifoldPressure[i].val).Format("%.2f"). OnChange(func() { pressureRatio[i] = pressureRatioAt(i) engineMassFlowRate[i] = massFlowRateAt(i) }), ) } return g.TableRow(widgets...) } func pressureRatioRow() *g.TableRowWidget { widgets := []g.Widget{ g.Label("Pressure Ratio"), g.Label(""), } for i := 0; i < numPoints; i++ { pr := strconv.FormatFloat(float64(pressureRatio[i]), 'f', 1, 32) widgets = append( widgets, g.Label(pr), ) } return g.TableRow(widgets...) } func massFlowRateRow() *g.TableRowWidget { widgets := []g.Widget{ g.Label("Mass Flow Rate"), g.Combo( "", massFlowRateUnitStrings()[selectedMassFlowRateUnit], massFlowRateUnitStrings(), &selectedMassFlowRateUnit, ).OnChange(func() { s := massFlowRateUnitStrings()[selectedMassFlowRateUnit] u, err := massFlowRateUnitFromString(s) check(err) for i := 0; i < numPoints; i++ { engineMassFlowRate[i] = massFlowRate{ engineMassFlowRate[i].asUnit(u), u, } } }), } for i := 0; i < numPoints; i++ { mfr := strconv.FormatFloat( float64(engineMassFlowRate[i].val), 'f', 3, 32, ) widgets = append( widgets, g.Label(mfr), ) } return g.TableRow(widgets...) } func duplicateDeleteRow() *g.TableRowWidget { widgets := []g.Widget{g.Label(""), g.Label("")} for i := 0; i < numPoints; i++ { i := i widgets = append(widgets, g.Row( g.Button("Duplicate").OnClick(func() { numPoints++ engineSpeed = insert( engineSpeed, engineSpeed[i], i, ) volumetricEfficiency = insert( volumetricEfficiency, volumetricEfficiency[i], i, ) intakeAirTemperature = insert( intakeAirTemperature, intakeAirTemperature[i], i, ) manifoldPressure = insert( manifoldPressure, manifoldPressure[i], i, ) pressureRatio = insert( pressureRatio, pressureRatio[i], i, ) engineMassFlowRate = insert( engineMassFlowRate, engineMassFlowRate[i], i, ) }), g.Button("Delete").OnClick(func() { if numPoints < 2 { return } numPoints-- engineSpeed = remove(engineSpeed, i) volumetricEfficiency = remove(volumetricEfficiency, i) intakeAirTemperature = remove(intakeAirTemperature, i) manifoldPressure = remove(manifoldPressure, i) pressureRatio = remove(pressureRatio, i) engineMassFlowRate = remove(engineMassFlowRate, i) }), )) } return g.TableRow(widgets...) } func columns() []*g.TableColumnWidget { widgets := []*g.TableColumnWidget{ g.TableColumn("Parameter"), g.TableColumn("Unit"), } for i := 0; i < numPoints; i++ { widgets = append( widgets, g.TableColumn(fmt.Sprintf("Point %d", i+1)), ) } return widgets }