[PATCH 1/3] QML UI: add CylinderDetailsEdit

Rick Walsh rickmwalsh at gmail.com
Wed Feb 10 02:33:32 PST 2016


This page is designed to be used with the planner, but also with dive edit in
mind.

It includes a ListModel for cylinder types. Ideally it would share
qt-models/tankinfomodel with the desktop app instead.

Signed-off-by: Rick Walsh <rickmwalsh at gmail.com>
---
 qt-mobile/qml/CylinderDetailsEdit.qml | 242 ++++++++++++++++++++++++++++++++++
 qt-mobile/qml/mobile-resources.qrc    |   1 +
 2 files changed, 243 insertions(+)
 create mode 100644 qt-mobile/qml/CylinderDetailsEdit.qml

diff --git a/qt-mobile/qml/CylinderDetailsEdit.qml b/qt-mobile/qml/CylinderDetailsEdit.qml
new file mode 100644
index 0000000..69eebed
--- /dev/null
+++ b/qt-mobile/qml/CylinderDetailsEdit.qml
@@ -0,0 +1,242 @@
+import QtQuick 2.3
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Styles 1.2
+import QtQuick.Dialogs 1.2
+import QtQuick.Layouts 1.1
+import org.subsurfacedivelog.mobile 1.0
+import org.kde.plasma.mobilecomponents 0.2 as MobileComponents
+
+MobileComponents.Page {
+	id: cylinderDetailsWindow
+	width: parent.width
+	objectName: "CylinderDetails"
+	signal cylinderOk()
+
+
+	// Properties correlate to subsurface-core types cylinder_t, cylinder_type_t, gasmix
+	property alias cylinderSizeText: txtCylinderSize.text
+	property int cylinderSizeMl: 1000 * Number(cylinderSizeText)
+	property int cylinderWorkingPressureMbar: 1000 * Number(txtCylinderWorkingPressure.text)
+	property string cylinderDescriptionText
+	property alias pcO2Text: txtPcO2.text
+	property alias pcHeText: txtPcHe.text
+	property int o2Pm: 10 * (Number(pcO2Text) > 0 ? pcO2Text : 21)
+	property int hePm: 10 * Number(pcHeText)
+	property int pressureStartMbar: 10 * Number(txtPressureStart.text)
+	property int pressureEndMbar: 10 * Number(txtPressureEnd.text)
+	property int gasDepthMm: 1000 * 3 * Math.floor(Number(10 * 1.6 * 1000 / o2Pm - 10) / 3)
+	property alias gasNameText: txtGasName.text
+	property int gasIndex
+
+	property bool isPlanner: false
+
+	function setGas(gasDescription) {
+		gasIndex = cylinderComboBox.find(gasDescription)
+		cylinderComboBox.currentIndex = gasIndex
+		if (gasIndex >= 0)
+			cylinderSizeText = (Number(cylinderTypeModel.get(gasIndex).sizeml) * 0.001).toFixed(2) //round to 2 dp
+
+	}
+	ColumnLayout {
+		anchors {
+			left: parent.left
+			right: parent.right
+			top: parent.top
+		}
+		spacing: MobileComponents.Units.smallSpacing
+
+
+		GridLayout {
+			id: cylinderEditorDetails
+			width: parent.width
+			columns: 2
+
+			MobileComponents.Heading {
+				Layout.columnSpan: 2
+				text: "Cylinder"
+			}
+			MobileComponents.Label {
+				Layout.alignment: Qt.AlignRight
+				text: "Type:"
+			}
+			ComboBox {
+				id: cylinderComboBox
+				model: cylinderTypeModel
+				textRole: "cylinderType"
+				onCurrentIndexChanged: {
+					cylinderDescriptionText = cylinderTypeModel.get(currentIndex).cylinderType
+					cylinderSizeText = (Number(cylinderTypeModel.get(currentIndex).sizeml) * 0.001).toFixed(2) //round to 2 dp
+				}
+			}
+			MobileComponents.Label {
+				Layout.alignment: Qt.AlignRight
+				text: "Size:"
+			}
+			TextField {
+				id: txtCylinderSize
+				inputMethodHints: Qt.ImhFormattedNumbersOnly
+				validator: DoubleValidator {bottom: 0; top: 1000; decimals:2; notation: DoubleValidator.StandardNotation}
+				Layout.fillWidth: true
+				onEditingFinished: cylinderDescriptionText = cylinderSizeText + "ℓ"
+			}
+			MobileComponents.Label {
+				Layout.alignment: Qt.AlignRight
+				text: "Working pressure:"
+				visible: !isPlanner
+			}
+			TextField {
+				id: txtCylinderWorkingPressure
+				inputMethodHints: Qt.ImhFormattedNumbersOnly
+				Layout.fillWidth: true
+				visible: !isPlanner
+			}
+
+			MobileComponents.Label {
+				Layout.alignment: Qt.AlignRight
+				text: "Start pressure:"
+			}
+			TextField {
+				id: txtPressureStart
+				inputMethodHints: Qt.ImhFormattedNumbersOnly
+				Layout.fillWidth: true
+			}
+
+			MobileComponents.Label {
+				Layout.alignment: Qt.AlignRight
+				text: "End pressure:"
+				visible: !isPlanner
+			}
+			TextField {
+				id: txtPressureEnd
+				inputMethodHints: Qt.ImhFormattedNumbersOnly
+				Layout.fillWidth: true
+				visible: !isPlanner
+			}
+
+			MobileComponents.Label {
+				Layout.alignment: Qt.AlignRight
+				text: "O2:"
+			}
+			TextField {
+				id: txtPcO2
+				inputMethodHints: Qt.ImhFormattedNumbersOnly
+				validator: DoubleValidator {bottom: 0; top: 100; decimals:1; notation: DoubleValidator.StandardNotation}
+				Layout.fillWidth: true
+			}
+
+			MobileComponents.Label {
+				Layout.alignment: Qt.AlignRight
+				text: "He:"
+			}
+			TextField {
+				id: txtPcHe
+				inputMethodHints: Qt.ImhFormattedNumbersOnly
+				validator: DoubleValidator {bottom: 0; top: 100; decimals:1; notation: DoubleValidator.StandardNotation}
+				Layout.fillWidth: true
+			}
+
+			MobileComponents.Label {
+				Layout.alignment: Qt.AlignRight
+				text: "Gasmix:"
+			}
+			MobileComponents.Label {
+				id: txtGasName
+				text: {
+					if (hePm == 0) {
+						if (o2Pm == 210)
+							return "air"
+						else if (o2Pm == 1000)
+							return "oxygen"
+						else
+							return "EAN" + 0.1 * o2Pm
+					} else {
+						return 0.1 * o2Pm + "/" + 0.1 * hePm
+					}
+				}
+			}
+			MobileComponents.Label {
+				Layout.alignment: Qt.AlignRight
+				text: "Switch depth:"
+			}
+			MobileComponents.Label {
+				id: txtGasDepth
+				text: 0.001 * gasDepthMm + "m"
+				}
+			Button {
+				id: okButton
+				text: "OK"
+				activeFocusOnPress: true // Without activeFocusOnPress, MOD won't be calculated if user hits ok after entering O2
+				onClicked: {
+					if (o2Pm + hePm > 1000) {
+						// That smells odd
+						msgInvalidGas.open()
+					} else {
+						print(cylinderDescriptionText)
+						cylinderDetailsWindow.cylinderOk()
+						stackView.pop();
+					}
+				}
+			}
+			Button {
+				id: cancelButton
+				text: "Cancel"
+
+				onClicked: {
+					stackView.pop();
+				}
+			}
+		}
+		Item {
+			height: MobileComponents.Units.gridUnit * 3
+			width: height // just to make sure the spacer doesn't produce scrollbars, but also isn't null
+		}
+	}
+	Component.onCompleted: {
+		print("cylinderComboBox index:" + cylinderComboBox.find(cylinderDescriptionText))
+		cylinderComboBox.currentIndex = cylinderComboBox.find(cylinderDescriptionText)
+	}
+	MessageDialog {
+		id: msgInvalidGas
+		title: "Invalid gas"
+		text: "Select a gas mix where O2 + He do not exceed 100%"
+	}
+	// TODO: populate cylinder model from the dive log with existing code
+	ListModel {
+		id: cylinderTypeModel
+		ListElement {property string cylinderType: "AL80"; property int sizeml: 11094; property int workPresBar: 207}
+		ListElement {property string cylinderType: "D12.2 232 bar"; property int sizeml: 24400; property int workPresBar: 232}
+		ListElement {property string cylinderType: "10.0ℓ"; property int sizeml: 10000}
+		ListElement {property string cylinderType: "11.1ℓ"; property int sizeml: 11100}
+		ListElement {property string cylinderType: "AL40"; property int sizeml: 5547; property int workPresBar: 207}
+		ListElement {property string cylinderType: "AL50"; property int sizeml: 6934; property int workPresBar: 207}
+		ListElement {property string cylinderType: "AL63"; property int sizeml: 8737; property int workPresBar: 207}
+		ListElement {property string cylinderType: "AL72"; property int sizeml: 9985; property int workPresBar: 207}
+		ListElement {property string cylinderType: "AL100"; property int sizeml: 12607; property int workPresBar: 228}
+		ListElement {property string cylinderType: "ALU7"; property int sizeml: 7000; property int workPresBar: 200}
+		ListElement {property string cylinderType: "LP85"; property int sizeml: 13395; property int workPresBar: 182}
+		ListElement {property string cylinderType: "LP95"; property int sizeml: 14971; property int workPresBar: 182}
+		ListElement {property string cylinderType: "LP108"; property int sizeml: 17020; property int workPresBar: 182}
+		ListElement {property string cylinderType: "LP121"; property int sizeml: 19069; property int workPresBar: 182}
+		ListElement {property string cylinderType: "HP65"; property int sizeml: 7857; property int workPresBar: 237}
+		ListElement {property string cylinderType: "HP80"; property int sizeml: 9670; property int workPresBar: 237}
+		ListElement {property string cylinderType: "HP100"; property int sizeml: 12087; property int workPresBar: 237}
+		ListElement {property string cylinderType: "HP119"; property int sizeml: 14384; property int workPresBar: 237}
+		ListElement {property string cylinderType: "HP130"; property int sizeml: 15713; property int workPresBar: 237}
+		ListElement {property string cylinderType: "3ℓ 232 bar"; property int sizeml: 3000; property int workPresBar: 232}
+		ListElement {property string cylinderType: "3ℓ 300 bar"; property int sizeml: 3000; property int workPresBar: 300}
+		ListElement {property string cylinderType: "10ℓ 300 bar"; property int sizeml: 10000; property int workPresBar: 300}
+		ListElement {property string cylinderType: "12ℓ 200 bar"; property int sizeml: 12000; property int workPresBar: 200}
+		ListElement {property string cylinderType: "12ℓ 232 bar"; property int sizeml: 12000; property int workPresBar: 232}
+		ListElement {property string cylinderType: "12ℓ 300 bar"; property int sizeml: 12000; property int workPresBar: 300}
+		ListElement {property string cylinderType: "15ℓ 200 bar"; property int sizeml: 15000; property int workPresBar: 200}
+		ListElement {property string cylinderType: "15ℓ 232 bar"; property int sizeml: 15000; property int workPresBar: 232}
+		ListElement {property string cylinderType: "D7 300 bar"; property int sizeml: 14000; property int workPresBar: 300}
+		ListElement {property string cylinderType: "D8.5 232 bar"; property int sizeml: 17000; property int workPresBar: 232}
+		ListElement {property string cylinderType: "D12 232 bar"; property int sizeml: 24000; property int workPresBar: 232}
+		ListElement {property string cylinderType: "D13 232 bar"; property int sizeml: 26000; property int workPresBar: 232}
+		ListElement {property string cylinderType: "D15 232 bar"; property int sizeml: 30000; property int workPresBar: 232}
+		ListElement {property string cylinderType: "D16 232 bar"; property int sizeml: 32000; property int workPresBar: 232}
+		ListElement {property string cylinderType: "D18 232 bar"; property int sizeml: 36000; property int workPresBar: 232}
+		ListElement {property string cylinderType: "D20 232 bar"; property int sizeml: 40000; property int workPresBar: 232}
+	}
+}
diff --git a/qt-mobile/qml/mobile-resources.qrc b/qt-mobile/qml/mobile-resources.qrc
index e57fa5e..77ec4ff 100644
--- a/qt-mobile/qml/mobile-resources.qrc
+++ b/qt-mobile/qml/mobile-resources.qrc
@@ -9,6 +9,7 @@
 		<file>DiveDetailsEdit.qml</file>
 		<file>DiveDetailsView.qml</file>
 		<file>DownloadFromDiveComputer.qml</file>
+		<file>CylinderDetailsEdit.qml</file>
 		<file>GpsList.qml</file>
 		<file>Log.qml</file>
 		<file>TopBar.qml</file>
-- 
2.5.0



More information about the subsurface mailing list