Index: sources/gui/qml/pages/treatment/TreatmentCreate.qml =================================================================== diff -u -r9e57e4c990afab0996def98521d4f9fee83f96d8 -r0401b9a1fb6f89f0ec83571f2f868956c7500a0f --- sources/gui/qml/pages/treatment/TreatmentCreate.qml (.../TreatmentCreate.qml) (revision 9e57e4c990afab0996def98521d4f9fee83f96d8) +++ sources/gui/qml/pages/treatment/TreatmentCreate.qml (.../TreatmentCreate.qml) (revision 0401b9a1fb6f89f0ec83571f2f868956c7500a0f) @@ -1,14 +1,15 @@ /*! * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. - * \copyright \n - * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, \n - * IN PART OR IN WHOLE, \n - * WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. \n + * \copyright + * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN + * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * - * \file ManagerHome.qml - * \date 2019/10/21 - * \author Behrouz NematiPour + * \file TreatmentCreate.qml + * \author (last) Peter Lucia + * \date (last) 06-Oct-2020 + * \author (original) Behrouz NematiPour + * \date (original) 27-Jan-2020 * */ @@ -26,17 +27,609 @@ * which is the default screen in the "Manager" stack */ ScreenItem { id: _root - signal backPressed() - BackButton { id : _backButton - onPressed: backPressed() + objectName: "TreatmentCreate"; // SquishQt testability + signal clickedBack() + signal clickedContinue() + backgroundRect.color: Colors.backgroundMainMenu + + TopMenuBarCreateTreatment { id: _topMenuBar + anchors.top: parent.top + anchors.left: parent.left + width: parent.width + onClickedBack: { + _root.clickedBack(); + } } - Column { - spacing: Variables.columnSpacing - anchors.centerIn: parent - TitleText { id: _titleText - width: parent.width - text: qsTr("Create Treatment Placeholder") + + Flickable { id: _flickable + objectName: "TreatmentCreateFlickable" + anchors.top: _topMenuBar.bottom + anchors.left: parent.left + anchors.bottom: parent.bottom + width: parent.width + contentWidth: parent.width + contentHeight: _column.implicitHeight + clip: true + flickDeceleration: Variables.createTreatmentFlickableDeceleration + + function setInteractive(isInteractive) { + _flickable.interactive = isInteractive } + + ScrollBar.vertical: ScrollBar { id: _scrollBar + anchors.right: _flickable.right + anchors.rightMargin: 3 + contentItem: Rectangle { + color: Colors.backgroundRangeRect + implicitWidth: 6 + radius: width / 2 + width: 3 + } + } + + Column { id: _column + spacing: Variables.treatmentSpacing + anchors.horizontalCenter: parent.horizontalCenter; + anchors.fill: parent; + + Text { id: _titleText + anchors.horizontalCenter: parent.horizontalCenter; + text: qsTr("Create a Custom Treatment") + color: Colors.textMain + font.pixelSize: Fonts.fontPixelTitle + } + + Text { + anchors.horizontalCenter: parent.horizontalCenter; + text: qsTr("PRESCRIPTION"); + color: Colors.textMain; + font.pixelSize: Fonts.fontPixelButton + font.bold: true + + } + + SliderCreateTreatment { id: _bloodFlowRate + objectName: "_bloodFlowRate" + sliderObjectName: objectName + "Slider" + selectedValueObjectName: objectName + "Value" + min: vTreatmentCreate.bloodFlowRateMin + max: vTreatmentCreate.bloodFlowRateMax + step: vTreatmentCreate.bloodFlowRateRes + text: qsTr("Blood Flow Rate") + units: qsTr("mL/min") + onPressed: { + _flickable.setInteractive(false) + vTreatmentCreate.bloodFlowRate = value + } + onReleased: { + vTreatmentCreate.bloodFlowRate = value + _flickable.setInteractive(true) + } + } + + SliderCreateTreatment { id: _dialysateFlowRate + objectName: "_dialysateFlowRate" + sliderObjectName: objectName + "Slider" + selectedValueObjectName: objectName + "Value" + min: vTreatmentCreate.dialysateFlowRateMin + max: vTreatmentCreate.dialysateFlowRateMax + step: vTreatmentCreate.dialysateFlowRateRes + text: qsTr("Dialysate Flow Rate") + units: qsTr("mL/min") + onPressed: { + _flickable.setInteractive(false) + vTreatmentCreate.dialysateFlowRate = value; + } + onReleased: { + vTreatmentCreate.dialysateFlowRate = value; + _flickable.setInteractive(true) + } + } + + SliderCreateTreatment { id: _duration + objectName: "_duration" + sliderObjectName: objectName + "Slider" + selectedValueObjectName: objectName + "Value" + min: vTreatmentCreate.durationMin + max: vTreatmentCreate.durationMax + step: vTreatmentCreate.durationRes + text: qsTr("Duration") + units: qsTr("min") + onPressed: { + _flickable.setInteractive(false) + vTreatmentCreate.duration = value; + } + onReleased: { + vTreatmentCreate.duration = value; + _flickable.setInteractive(true) + } + } + + SliderCreateTreatment { id: _heparinDispensingRate + objectName: "_heparinDispensingRate" + sliderObjectName: objectName + "Slider" + selectedValueObjectName: objectName + "Value" + min: vTreatmentCreate.heparinDispensingRateMin + max: vTreatmentCreate.heparinDispensingRateMax + step: vTreatmentCreate.heparinDispensingRateRes + text: qsTr("Heparin Dispensing Rate") + units: qsTr("mL/hr") + onPressed: { + _flickable.setInteractive(false) + vTreatmentCreate.heparinDispensingRate = value + } + onReleased: { + vTreatmentCreate.heparinDispensingRate = value + _flickable.setInteractive(true) + } + } + + SliderCreateTreatment { id: _heparinBolusVolume + objectName: "_heparinBolusVolume" + sliderObjectName: objectName + "Slider" + selectedValueObjectName: objectName + "Value" + min: vTreatmentCreate.heparinBolusVolumeMin + max: vTreatmentCreate.heparinBolusVolumeMax + step: vTreatmentCreate.heparinBolusVolumeRes + + text: qsTr("Heparin Bolus Volume") + units: qsTr("mL") + onPressed: { + _flickable.setInteractive(false) + vTreatmentCreate.heparinBolusVolume = value + } + onReleased: { + vTreatmentCreate.heparinBolusVolume = value + _flickable.setInteractive(true) + } + } + + SliderCreateTreatment { id: _heparinStopTime + objectName: "_heparinStopTime" + sliderObjectName: objectName + "Slider" + selectedValueObjectName: objectName + "Value" + min: vTreatmentCreate.heparinStopTimeMin + max: vTreatmentCreate.heparinStopTimeMax + step: vTreatmentCreate.heparinStopTimeRes + text: qsTr("Heparin Stop Time") + units: qsTr("min") + onPressed: { + _flickable.setInteractive(false) + vTreatmentCreate.heparinStopTime = value + } + onReleased: { + vTreatmentCreate.heparinStopTime = value + _flickable.setInteractive(true) + } + } + + SliderCreateTreatment { + id: _salineBolus + objectName: "_salineBolus" + sliderObjectName: objectName + "Slider" + selectedValueObjectName: objectName + "Value" + text: "Saline Bolus" + units: qsTr("mL") + min: vTreatmentCreate.salineBolusVolumeMin + max: vTreatmentCreate.salineBolusVolumeMax + step: vTreatmentCreate.salineBolusVolumeRes + onPressed: { + _flickable.setInteractive(false) + vTreatmentCreate.salineBolusVolume = value + } + onReleased: { + vTreatmentCreate.salineBolusVolume = value + _flickable.setInteractive(true) + } + } + + GridSelection { + id: _acidConcentrate + objectName: "_acidConcentrateRect" + name: qsTr("Acid Concentrate") + buttonNames: vTreatmentCreate.acidConcentrateOptions + onButtonClicked: { + vTreatmentCreate.acidConcentrate = selectedIndex + } + } + + GridSelection { id: _bicarbonateConcentrate + objectName: "_bicarbonateConcentrateRect" + name: qsTr("Bicarbonate Concentrate") + numRows: 1 + numCols: 2 + buttonNames: vTreatmentCreate.bicarbonateConcentrateOptions; + onButtonClicked: { + vTreatmentCreate.bicarbonateConcentrate = selectedIndex; + } + } + + GridSelection { id: _dialyzerType + objectName: "_dialyzerTypeRect" + name: qsTr("Dialyzer Type") + numRows: 3 + numCols: 2 + buttonNames: vTreatmentCreate.dialyzerTypeOptions; + onButtonClicked: { + vTreatmentCreate.dialyzerType = selectedIndex; + } + } + + SliderCreateTreatment { id: _dialysateTemperature + objectName: "_dialysateTemperature" + sliderObjectName: objectName + "Slider" + selectedValueObjectName: objectName + "Value" + min: vTreatmentCreate.dialysateTempMin + max: vTreatmentCreate.dialysateTempMax + step: vTreatmentCreate.dialysateTempRes + text: qsTr("Dialysate Temperature") + units: qsTr("C") + onPressed: { + _flickable.setInteractive(false) + vTreatmentCreate.dialysateTemp = value + } + onReleased: { + vTreatmentCreate.dialysateTemp = value + _flickable.setInteractive(true) + } + } + + Text { id: _arterialPressureLimitsTitle + text: qsTr("Arterial Pressure Limits") + anchors.left: _arterialPressureLimits.left + font.pixelSize: Fonts.fontPixelFluidText + color: Colors.textMain; + + } + + SliderDoubleCreateTreatment { id: _arterialPressureLimits + objectName: "_arterialPressureLimits" + lowSliderObjectName: objectName + "LowSlider" + lowSelectedValueObjectName: objectName + "LowValue" + highSliderObjectName: objectName + "HighSlider" + highSelectedValueObjectName: objectName + "HighValue" + lowTitle: qsTr("Low") + lowUnits: qsTr("mmHg") + highTitle: qsTr("High") + highUnits: qsTr("mmHg") + lowMin: vTreatmentCreate.arterialPressureLimitLowMin + lowMax: vTreatmentCreate.arterialPressureLimitLowMax + highMin: vTreatmentCreate.arterialPressureLimitHighMin + highMax: vTreatmentCreate.arterialPressureLimitHighMax + lowValue: vTreatmentCreate.arterialPressureLimitLowMin + highValue: vTreatmentCreate.arterialPressureLimitHighMin + lowStep: vTreatmentCreate.arterialPressureLimitLowRes + highStep: vTreatmentCreate.arterialPressureLimitHighRes + onLowSliderPressed: { + _flickable.setInteractive(false) + vTreatmentCreate.arterialPressureLimitLow = lowValue + } + onLowSliderReleased: { + vTreatmentCreate.arterialPressureLimitLow = lowValue + _flickable.setInteractive(true) + } + onHighSliderPressed: { + _flickable.setInteractive(false) + vTreatmentCreate.arterialPressureLimitHigh = highValue + } + onHighSliderReleased: { + vTreatmentCreate.arterialPressureLimitHigh = highValue + _flickable.setInteractive(true) + } + } + + + Text { id: _venousPressureLimitsTitle + text: qsTr("Venous Pressure Limits") + anchors.left: _venousPressureLimits.left + font.pixelSize: Fonts.fontPixelFluidText + color: Colors.textMain; + + } + + SliderDoubleCreateTreatment { id: _venousPressureLimits + objectName: "_venousPressureLimits" + lowSliderObjectName: objectName + "LowSlider" + lowSelectedValueObjectName: objectName + "LowValue" + highSliderObjectName: objectName + "HighSlider" + highSelectedValueObjectName: objectName + "HighValue" + lowTitle: qsTr("Low") + lowUnits: Variables.unitTextBloodPressure + highTitle: qsTr("High") + highUnits: Variables.unitTextBloodPressure + lowMin: vTreatmentCreate.venousPressureLimitLowMin + lowMax: vTreatmentCreate.venousPressureLimitLowMax + highMin: vTreatmentCreate.venousPressureLimitHighMin + highMax: vTreatmentCreate.venousPressureLimitHighMax + lowValue: vTreatmentCreate.venousPressureLimitLowMin + highValue: vTreatmentCreate.venousPressureLimitHighMin + lowStep: vTreatmentCreate.venousPressureLimitLowRes + highStep: vTreatmentCreate.venousPressureLimitHighRes + onLowSliderPressed: { + _flickable.setInteractive(false) + vTreatmentCreate.venousPressureLimitLow = lowValue + } + onLowSliderReleased: { + vTreatmentCreate.venousPressureLimitLow = lowValue + _flickable.setInteractive(true) + } + onHighSliderPressed: { + _flickable.setInteractive(false) + vTreatmentCreate.venousPressureLimitHigh = highValue + } + onHighSliderReleased: { + vTreatmentCreate.venousPressureLimitHigh = highValue + _flickable.setInteractive(true) + } + } + + SliderCreateTreatment { id: _bloodPressureMeasurementInterval + objectName: "_bloodPressureMeasurementInterval" + sliderObjectName: objectName + "Slider" + selectedValueObjectName: objectName + "Value" + text: qsTr("Blood Pressure Measurement Interval") + units: Variables.unitTextBPMeasurementInterval + min: vTreatmentCreate.bloodPressureMeasureIntervalMin + max: vTreatmentCreate.bloodPressureMeasureIntervalMax + step: vTreatmentCreate.bloodPressureMeasureIntervalRes + stepSnap: true + onPressed: { + _flickable.setInteractive(false) + vTreatmentCreate.bloodPressureMeasureInterval = value + } + onReleased: { + vTreatmentCreate.bloodPressureMeasureInterval = value + _flickable.setInteractive(true) + } + } + + SliderCreateTreatment { id: _rinsebackFlowRate + objectName: "_rinsebackFlowRate" + sliderObjectName: objectName + "Slider" + selectedValueObjectName: objectName + "Value" + text: qsTr("Rinseback Flow Rate") + units: Variables.unitTextFlowRate + min: vTreatmentCreate.rinsebackFlowRateMin + max: vTreatmentCreate.rinsebackFlowRateMax + step: vTreatmentCreate.rinsebackFlowRateRes + stepSnap: true + onPressed: { + _flickable.setInteractive(false) + vTreatmentCreate.rinsebackFlowRate = value + } + onReleased: { + vTreatmentCreate.rinsebackFlowRate = value + _flickable.setInteractive(true) + } + } + + TouchRect { id : _continueRect + objectName: "_continueButton" + anchors.horizontalCenter: parent.horizontalCenter + text.text: qsTr("CONTINUE") + backgroundColor: Colors.createTreatmentNotReady + borderColor: Colors.createTreatmentNotReady + textColor: Colors.createTreatmentTextNotReady + button.onClicked: { + vTreatmentCreate.saveTreatmentProfile = false; + if (vTreatmentCreate.continueEnabled) { + _root.clickedContinue() + } + } + + function toggleEnabled(enabled) { + if (enabled) { + backgroundColor = Colors.createTreatmentActive + borderColor = Colors.createTreatmentActive + textColor = Colors.createTreatmentTextReady + } else { + backgroundColor = Colors.createTreatmentNotReady + borderColor = Colors.createTreatmentNotReady + textColor = Colors.createTreatmentTextNotReady + } + } + } + + Rectangle { + id: _spacer + height: 75 + width: parent.width + color: "transparent" + } + } } + + onVisibleChanged: { + if (visible) { + _mainMenu.hidden = true + } + } + + Connections { target: vTreatmentCreate + onContinueEnabledChanged: { + if (vTreatmentCreate.continueEnabled) { + _continueRect.toggleEnabled(true) + } else { + _continueRect.toggleEnabled(false) + + } + } + + onResetCreateTreatment: { + _bloodFlowRate.isActive = false; + _dialysateFlowRate.isActive = false; + _duration.isActive = false; + _heparinDispensingRate.isActive = false; + + _heparinBolusVolume.isActive = false; + _heparinStopTime.isActive = false; + + _salineBolus.isActive = false; + _acidConcentrate.setActive(false); + _bicarbonateConcentrate.setActive(false); + _dialyzerType.setActive(false); + + _dialysateTemperature.isActive = false; + _arterialPressureLimits.isLowActive = false; + _arterialPressureLimits.isHighActive = false; + _venousPressureLimits.isLowActive = false; + _venousPressureLimits.isHighActive = false; + _bloodPressureMeasurementInterval.isActive = false; + _rinsebackFlowRate.isActive = false; + + } + + onFwValidationSuccess: { + _bloodFlowRate .setValid (true) + _dialysateFlowRate .setValid (true) + _duration .setValid (true) + _heparinDispensingRate .setValid (true) + + _heparinBolusVolume .setValid (true) + _heparinStopTime .setValid (true) + + _salineBolus .setValid (true) + _acidConcentrate .setValid (true) + _bicarbonateConcentrate .setValid (true) + _dialyzerType .setValid (true) + + _dialysateTemperature .setValid (true) + _arterialPressureLimits .setLowValid (true) + _arterialPressureLimits .setHighValid(true) + _venousPressureLimits .setLowValid (true) + _venousPressureLimits .setHighValid(true) + _bloodPressureMeasurementInterval .setValid (true) + _rinsebackFlowRate .setValid (true) + } + + onFwValidationFailed: { + } + + onBloodFlowRate_ValidationFailed: { + _bloodFlowRate.setValid(false) + } + + onDialysateFlowRate_ValidationFailed: { + _dialysateFlowRate.setValid(false) + } + + onDuration_ValidationFailed: { + _duration.setValid(false) + } + + onHeparinDispensingRate_ValidationFailed: { + _heparinDispensingRate.setValid(false) + } + + onHeparinBolusVolume_ValidationFailed: { + _heparinBolusVolume.setValid(false) + } + + onHeparinStopTime_ValidationFailed: { + _heparinStopTime.setValid(false) + } + + onSalineBolusVolume_ValidationFailed: { + _salineBolus.setValid(false) + } + + onAcidConcentrate_ValidationFailed: { + _acidConcentrate.setValid(false) + } + + onBicarbonateConcentrate_ValidationFailed: { + _bicarbonateConcentrate.setValid(false) + } + + onDialyzerType_ValidationFailed: { + _dialyzerType.setValid(false) + } + + onDialysateTemp_ValidationFailed: { + _dialysateTemperature.setValid(false) + } + + onArterialPressureLimitLow_ValidationFailed: { + _arterialPressureLimits.setLowValid(false) + } + + onArterialPressureLimitHigh_ValidationFailed: { + _arterialPressureLimits.setHighValid(false) + } + + onVenousPressureLimitLow_ValidationFailed: { + _venousPressureLimits.setLowValid(false) + } + + onVenousPressureLimitHigh_ValidationFailed: { + _venousPressureLimits.setHighValid(false) + } + + onBloodPressureMeasureInterval_ValidationFailed: { + _bloodPressureMeasurementInterval.setValid(false) + } + + onRinsebackFlowRate_ValidationFailed: { + _rinsebackFlowRate.setValid(false) + } + + onScrollToParameter: { + let prefix = "data."; + let contentYMargin = 80; + let newContentY = 0; + + if (parameter === prefix+"bloodFlowRate") { + newContentY = _bloodFlowRate.mapToItem(_bloodFlowRate.parent, 0, 0).y; + } + else if (parameter === prefix+"dialysateFlowRate") { + newContentY = _dialysateFlowRate.mapToItem(_dialysateFlowRate.parent, 0, 0).y; + } + else if (parameter === prefix+"duration") { + newContentY = _duration.mapToItem(_duration.parent, 0, 0).y; + } + else if (parameter === prefix+"heparinDispensingRate") { + newContentY = _heparinDispensingRate.mapToItem(_heparinDispensingRate.parent, 0, 0).y; + } + else if (parameter === prefix+"heparinBolusVolume") { + newContentY = _heparinBolusVolume.mapToItem(_heparinBolusVolume.parent, 0, 0).y; + } + else if (parameter === prefix+"heparinStopTime") { + newContentY = _heparinStopTime.mapToItem(_heparinStopTime.parent, 0, 0).y; + } + else if (parameter === prefix+"salineBolus") { + newContentY = _salineBolus.mapToItem(_salineBolus.parent, 0, 0).y; + } + else if (parameter === prefix+"acidConcentrate") { + newContentY = _acidConcentrate.mapToItem(_acidConcentrate.parent, 0, 0).y; + } + else if (parameter === prefix+"bicarbonateConcentrate") { + newContentY = _bicarbonateConcentrate.mapToItem(_bicarbonateConcentrate.parent, 0, 0).y; + } + else if (parameter === prefix+"dialyzerType") { + newContentY = _dialyzerType.mapToItem(_dialyzerType.parent, 0, 0).y; + } + else if (parameter === prefix+"dialysateTemp") { + newContentY = _dialysateTemperature.mapToItem(_dialysateTemperature.parent, 0, 0).y; + } + else if (parameter === prefix+"arterialPressureLimitLow" || + parameter === prefix+"arterialPressureLimitHigh") { + newContentY = _arterialPressureLimits.mapToItem(_arterialPressureLimits.parent, 0, 0).y; + } + else if (parameter === prefix+"venousPressureLimitLow" || + parameter === prefix+"venousPressureLimitHigh") { + newContentY = _venousPressureLimits.mapToItem(_venousPressureLimits.parent, 0, 0).y; + } + else if (parameter === prefix+"bloodPressureMeasureInterval") { + newContentY = _bloodPressureMeasurementInterval.mapToItem(_bloodPressureMeasurementInterval.parent, 0, 0).y; + } + else if (parameter === prefix+"rinsebackFlowRate") { + newContentY = _rinsebackFlowRate.mapToItem(_rinsebackFlowRate.parent, 0, 0).y; + } + else { + return; + } + _flickable.contentY = newContentY - contentYMargin; + } + } }