mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-29 13:40:20 +00:00
50438b0456
Fix the issue that Gradient Factors cannot be set to 100 in the mobile version. This is done by changing the edits from a text box to a spin edit, which seems to be a better match for numerical values. As a side effect this also solves the issue that the keyboard for the text edit is not properly displayed when settings are opened when dive details are already on the page stack. Fixes #3911. Reported-by: @gbetous Signed-off-by: Michael Keller <github@ike.ch>
517 lines
11 KiB
QML
517 lines
11 KiB
QML
// SPDX-License-Identifier: GPL-2.0
|
|
import QtQuick 2.12
|
|
import QtQuick.Controls 2.12
|
|
import QtQuick.Controls 1.4
|
|
import QtQuick.Layouts 1.12
|
|
import QtQuick.Dialogs 1.3
|
|
import org.subsurfacedivelog.mobile 1.0
|
|
import org.kde.kirigami 2.4 as Kirigami
|
|
|
|
TemplatePage {
|
|
title: qsTr("Dive planner setup")
|
|
|
|
property string speedUnit: (Backend.length === Enums.METERS) ? qsTr(" m/min") : qsTr(" ft/min")
|
|
property string volumeUnit: (Backend.volume === Enums.LITER) ? qsTr(" l/min") : qsTr(" cuft/min")
|
|
property string pressureUnit: (Backend.pressure === Enums.BAR) ? qsTr(" BAR") : qsTr(" PSI")
|
|
Connections {
|
|
target: Backend
|
|
onLengthChanged: {
|
|
spinAscrate75.value = Backend.ascrate75
|
|
spinAscrate50.value = Backend.ascrate50
|
|
spinAscratestops.value = Backend.ascratestops
|
|
spinAscratelast6m.value = Backend.ascratelast6m
|
|
spinDescrate.value = Backend.descrate
|
|
spinBestmixend.value = Backend.bestmixend
|
|
}
|
|
onVolumeChanged: {
|
|
spinBottomsac.value = Backend.bottomsac
|
|
spinDecosac.value = Backend.decosac
|
|
}
|
|
onPressureChanged: {
|
|
}
|
|
}
|
|
Column {
|
|
width: parent.width
|
|
spacing: 1
|
|
Layout.margins: Kirigami.Units.gridUnit
|
|
|
|
TemplateSection {
|
|
id: rates
|
|
title: qsTr("Rates")
|
|
|
|
GridLayout {
|
|
columns: 2
|
|
rowSpacing: Kirigami.Units.smallSpacing * 2
|
|
columnSpacing: Kirigami.Units.smallSpacing
|
|
visible: rates.isExpanded
|
|
|
|
TemplateLabel {
|
|
Layout.columnSpan: 2
|
|
text: qsTr("Ascent")
|
|
font.bold: true
|
|
}
|
|
TemplateLabel {
|
|
text: qsTr("below 75% avg. depth")
|
|
}
|
|
TemplateSpinBox {
|
|
id: spinAscrate75
|
|
from: 1
|
|
to: 99
|
|
stepSize: 1
|
|
value: Backend.ascrate75
|
|
textFromValue: function (value, locale) {
|
|
return value + speedUnit
|
|
}
|
|
onValueModified: {
|
|
Backend.ascrate75 = value
|
|
}
|
|
}
|
|
TemplateLabel {
|
|
text: qsTr("75% to 50% avg. depth")
|
|
}
|
|
TemplateSpinBox {
|
|
id: spinAscrate50
|
|
from: 1
|
|
to: 99
|
|
stepSize: 1
|
|
value: Backend.ascrate50
|
|
textFromValue: function (value, locale) {
|
|
return value + speedUnit
|
|
}
|
|
onValueModified: {
|
|
Backend.ascrate50 = value
|
|
}
|
|
}
|
|
TemplateLabel {
|
|
text: qsTr("50% avg. depth to 6m")
|
|
}
|
|
TemplateSpinBox {
|
|
id: spinAscratestops
|
|
from: 1
|
|
to: 99
|
|
stepSize: 1
|
|
value: Backend.ascratestops
|
|
textFromValue: function (value, locale) {
|
|
return value + speedUnit
|
|
}
|
|
onValueModified: {
|
|
Backend.ascratestops = value
|
|
}
|
|
}
|
|
TemplateLabel {
|
|
text: qsTr("6m to surface")
|
|
}
|
|
TemplateSpinBox {
|
|
id: spinAscratelast6m
|
|
from: 1
|
|
to: 99
|
|
stepSize: 1
|
|
value: Backend.ascratelast6m
|
|
textFromValue: function (value, locale) {
|
|
return value + speedUnit
|
|
}
|
|
onValueModified: {
|
|
Backend.ascratelast6m = value
|
|
}
|
|
}
|
|
TemplateLabel {
|
|
Layout.columnSpan: 2
|
|
text: qsTr("Descent")
|
|
font.bold: true
|
|
}
|
|
TemplateLabel {
|
|
text: qsTr("Surface to the bottom")
|
|
}
|
|
TemplateSpinBox {
|
|
id: spinDescrate
|
|
from: 1
|
|
to: 99
|
|
stepSize: 1
|
|
value: Backend.descrate
|
|
enabled: !Backend.drop_stone_mode
|
|
textFromValue: function (value, locale) {
|
|
return value + speedUnit
|
|
}
|
|
onValueModified: {
|
|
Backend.descrate = value
|
|
}
|
|
}
|
|
TemplateCheckBox {
|
|
text: qsTr("Drop to first depth")
|
|
checked: Backend.drop_stone_mode
|
|
onClicked: {
|
|
Backend.drop_stone_mode = checked
|
|
}
|
|
}
|
|
}
|
|
}
|
|
TemplateSection {
|
|
id: planning
|
|
title: qsTr("Planning")
|
|
|
|
GridLayout {
|
|
columns: 2
|
|
rowSpacing: Kirigami.Units.smallSpacing * 2
|
|
columnSpacing: Kirigami.Units.smallSpacing
|
|
visible: planning.isExpanded
|
|
|
|
TemplateLabel {
|
|
text: qsTr("Dive mode")
|
|
}
|
|
TemplateComboBox {
|
|
editable: false
|
|
currentIndex: Backend.dive_mode
|
|
model: ListModel {
|
|
ListElement {text: qsTr("Open circuit")}
|
|
ListElement {text: qsTr("CCR")}
|
|
ListElement {text: qsTr("pSCR")}
|
|
}
|
|
onActivated: {
|
|
Backend.dive_mode = currentIndex
|
|
}
|
|
}
|
|
TemplateCheckBox {
|
|
text: qsTr("Bailout: Deco on OC")
|
|
Layout.columnSpan: 2
|
|
checked: Backend.dobailout
|
|
}
|
|
|
|
TemplateRadioButton {
|
|
text: qsTr("Recreational mode")
|
|
Layout.columnSpan: 2
|
|
checked: Backend.planner_deco_mode === Enums.RECREATIONAL
|
|
onClicked: {
|
|
Backend.planner_deco_mode = Enums.RECREATIONAL
|
|
}
|
|
}
|
|
|
|
TemplateLabel {
|
|
text: qsTr("Reserve gas")
|
|
leftPadding: Kirigami.Units.smallSpacing * 2
|
|
enabled: Backend.planner_deco_mode === Enums.RECREATIONAL
|
|
}
|
|
TemplateSpinBox {
|
|
from: 1
|
|
to: 99
|
|
stepSize: 1
|
|
value: Backend.reserve_gas
|
|
textFromValue: function (value, locale) {
|
|
return value + volumeUnit
|
|
}
|
|
onValueModified: {
|
|
Backend.reserve_gas = value
|
|
}
|
|
}
|
|
|
|
TemplateCheckBox {
|
|
text: qsTr("Safety stop")
|
|
Layout.columnSpan: 2
|
|
leftPadding: Kirigami.Units.smallSpacing * 6
|
|
checked: Backend.safetystop
|
|
onClicked: {
|
|
Backend.safetystop = checked
|
|
}
|
|
}
|
|
|
|
TemplateRadioButton {
|
|
text: qsTr("Bühlmann deco")
|
|
Layout.columnSpan: 2
|
|
checked: Backend.planner_deco_mode === Enums.BUEHLMANN
|
|
onClicked: {
|
|
Backend.planner_deco_mode = Enums.BUEHLMANN
|
|
}
|
|
}
|
|
|
|
TemplateLabel {
|
|
text: qsTr("GFLow")
|
|
leftPadding: Kirigami.Units.smallSpacing * 2
|
|
}
|
|
TemplateSpinBox {
|
|
from: 1
|
|
to: 100
|
|
stepSize: 1
|
|
value: Backend.gflow
|
|
textFromValue: function (value, locale) {
|
|
return value + volumeUnit
|
|
}
|
|
onValueModified: {
|
|
Backend.gflow = value
|
|
}
|
|
}
|
|
|
|
TemplateLabel {
|
|
text: qsTr("GFHigh")
|
|
leftPadding: Kirigami.Units.smallSpacing * 2
|
|
}
|
|
TemplateSpinBox {
|
|
from: 1
|
|
to: 100
|
|
stepSize: 1
|
|
value: Backend.gfhigh
|
|
textFromValue: function (value, locale) {
|
|
return value + volumeUnit
|
|
}
|
|
onValueModified: {
|
|
Backend.gfhigh = value
|
|
}
|
|
}
|
|
|
|
TemplateRadioButton {
|
|
text: qsTr("VPM-B deco")
|
|
Layout.columnSpan: 2
|
|
checked: Backend.planner_deco_mode === Enums.VPMB
|
|
onClicked: {
|
|
Backend.planner_deco_mode = Enums.VPMB
|
|
}
|
|
}
|
|
|
|
TemplateLabel {
|
|
text: qsTr("Conservatism level")
|
|
leftPadding: 20
|
|
}
|
|
TemplateSpinBox {
|
|
from: 0
|
|
to: 4
|
|
stepSize: 1
|
|
value: Backend.vpmb_conservatism
|
|
textFromValue: function (value, locale) {
|
|
return qsTr("+") + value
|
|
}
|
|
onValueModified: {
|
|
Backend.vpmb_conservatism = value
|
|
}
|
|
}
|
|
|
|
TemplateCheckBox {
|
|
text: qsTr("Last stop at ??")
|
|
Layout.columnSpan: 2
|
|
}
|
|
|
|
TemplateCheckBox {
|
|
text: qsTr("Plan backgas breaks")
|
|
Layout.columnSpan: 2
|
|
checked: Backend.last_stop6m
|
|
onClicked: {
|
|
Backend.last_stop6m = checked
|
|
}
|
|
}
|
|
|
|
TemplateCheckBox {
|
|
text: qsTr("Only switch at required stops")
|
|
Layout.columnSpan: 2
|
|
checked: Backend.switch_at_req_stop
|
|
onClicked: {
|
|
Backend.switch_at_req_stop = checked
|
|
}
|
|
}
|
|
|
|
TemplateLabel {
|
|
text: qsTr("Min switch time")
|
|
}
|
|
TemplateSpinBox {
|
|
from: 0
|
|
to: 4
|
|
stepSize: 1
|
|
value: Backend.min_switch_duration
|
|
textFromValue: function (value, locale) {
|
|
return qsTr("+") + value
|
|
}
|
|
onValueModified: {
|
|
Backend.min_switch_duration = value
|
|
}
|
|
}
|
|
|
|
TemplateLabel {
|
|
text: qsTr("Surface segment")
|
|
}
|
|
TemplateSpinBox {
|
|
from: 0
|
|
to: 4
|
|
stepSize: 1
|
|
value: Backend.surface_segment
|
|
textFromValue: function (value, locale) {
|
|
return qsTr("+") + value
|
|
}
|
|
onValueModified: {
|
|
Backend.surface_segment = value
|
|
}
|
|
}
|
|
}
|
|
}
|
|
TemplateSection {
|
|
id: gasoptions
|
|
title: qsTr("Gas options")
|
|
|
|
GridLayout {
|
|
columns: 2
|
|
rowSpacing: Kirigami.Units.smallSpacing * 2
|
|
columnSpacing: Kirigami.Units.smallSpacing
|
|
visible: gasoptions.isExpanded
|
|
|
|
TemplateLabel {
|
|
text: qsTr("Bottom SAC")
|
|
}
|
|
TemplateSpinBox {
|
|
id: spinBottomsac
|
|
from: 1
|
|
to: (Backend.volume === Enums.LITER) ? 85 : 300
|
|
stepSize: 1
|
|
value: Backend.bottomsac
|
|
textFromValue: function (value, locale) {
|
|
return (Backend.volume === Enums.LITER) ?
|
|
value + volumeUnit :
|
|
(value / 100).toFixed(2) + volumeUnit
|
|
}
|
|
onValueModified: {
|
|
Backend.bottomsac = value
|
|
}
|
|
}
|
|
TemplateLabel {
|
|
text: qsTr("Deco SAC")
|
|
}
|
|
TemplateSpinBox {
|
|
id: spinDecosac
|
|
from: 1
|
|
to: (Backend.volume === Enums.LITER) ? 85 : 300
|
|
stepSize: 1
|
|
value: Backend.decosac
|
|
textFromValue: function (value, locale) {
|
|
return (Backend.volume === Enums.LITER) ?
|
|
value + volumeUnit :
|
|
(value / 100).toFixed(2) + volumeUnit
|
|
}
|
|
onValueModified: {
|
|
Backend.decosac = value
|
|
}
|
|
}
|
|
TemplateLabel {
|
|
text: qsTr("SAC factor")
|
|
}
|
|
TemplateSpinBox {
|
|
from: 10
|
|
to: 99
|
|
stepSize: 1
|
|
value: Backend.sacfactor
|
|
textFromValue: function (value, locale) {
|
|
return (value / 10).toFixed(1)
|
|
}
|
|
onValueModified: {
|
|
Backend.sacfactor = value
|
|
}
|
|
}
|
|
TemplateLabel {
|
|
text: qsTr("Problem solving time")
|
|
}
|
|
TemplateSpinBox {
|
|
from: 1
|
|
to: 9
|
|
stepSize: 1
|
|
value: Backend.problemsolvingtime
|
|
textFromValue: function (value, locale) {
|
|
return value + qsTr(" min")
|
|
}
|
|
onValueModified: {
|
|
Backend.problemsolvingtime = value
|
|
}
|
|
}
|
|
TemplateLabel {
|
|
text: qsTr("Bottom pO2")
|
|
}
|
|
TemplateSpinBox {
|
|
from: 0
|
|
to: 250
|
|
stepSize: 1
|
|
value: Backend.bottompo2
|
|
textFromValue: function (value, locale) {
|
|
return (value / 100).toFixed(2) + "bar"
|
|
}
|
|
onValueModified: {
|
|
Backend.bottompo2 = value
|
|
}
|
|
}
|
|
TemplateLabel {
|
|
text: qsTr("Deco pO2")
|
|
}
|
|
TemplateSpinBox {
|
|
from: 0
|
|
to: 250
|
|
stepSize: 1
|
|
value: Backend.decopo2
|
|
textFromValue: function (value, locale) {
|
|
return (value / 100).toFixed(2) + "bar"
|
|
}
|
|
onValueModified: {
|
|
Backend.decopo2 = value
|
|
}
|
|
}
|
|
TemplateLabel {
|
|
text: qsTr("Best mix END")
|
|
}
|
|
TemplateSpinBox {
|
|
id: spinBestmixend
|
|
from: 1
|
|
to: 99
|
|
stepSize: 1
|
|
value: Backend.bestmixend
|
|
textFromValue: function (value, locale) {
|
|
return value + speedUnit
|
|
}
|
|
onValueModified: {
|
|
Backend.bestmixend = value
|
|
}
|
|
}
|
|
TemplateCheckBox {
|
|
text: qsTr("O2 narcotic")
|
|
checked: Backend.o2narcotic
|
|
onClicked: {
|
|
Backend.o2narcotic = checked
|
|
}
|
|
}
|
|
}
|
|
}
|
|
TemplateSection {
|
|
id: notes
|
|
title: qsTr("Notes")
|
|
|
|
ColumnLayout {
|
|
visible: notes.isExpanded
|
|
|
|
TemplateCheckBox {
|
|
text: qsTr("Display runtime")
|
|
checked: Backend.display_runtime
|
|
onClicked: {
|
|
Backend.display_runtime = checked
|
|
}
|
|
}
|
|
TemplateCheckBox {
|
|
text: qsTr("Display segment duration")
|
|
checked: Backend.display_duration
|
|
onClicked: {
|
|
Backend.display_duration = checked
|
|
}
|
|
}
|
|
TemplateCheckBox {
|
|
text: qsTr("Display transitions in deco")
|
|
checked: Backend.display_transitions
|
|
onClicked: {
|
|
Backend.display_transitions = checked
|
|
}
|
|
}
|
|
TemplateCheckBox {
|
|
text: qsTr("Verbatim dive plan")
|
|
checked: Backend.verbatim_plan
|
|
onClicked: {
|
|
Backend.verbatim_plan = checked
|
|
}
|
|
}
|
|
TemplateCheckBox {
|
|
text: qsTr("Display plan variations")
|
|
checked: Backend.display_variations
|
|
onClicked: {
|
|
Backend.display_variations = checked
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|