This adds the option to select a cylinder when adding or editing a dive.
Due to limited screen size we restrict the editing to the first cylinder only.

Signed-off-by: Joakim Bygdell <[email protected]>
---
 core/subsurface-qt/DiveObjectHelper.cpp | 25 ++++++++++++++++++++-----
 core/subsurface-qt/DiveObjectHelper.h   |  4 ++--
 mobile-widgets/qml/DiveDetails.qml      |  3 +++
 mobile-widgets/qml/DiveDetailsEdit.qml  | 24 +++++++++++++++++++++---
 mobile-widgets/qmlmanager.cpp           | 24 +++++++++++++++++++++++-
 mobile-widgets/qmlmanager.h             | 10 +++++-----
 6 files changed, 74 insertions(+), 16 deletions(-)

diff --git a/core/subsurface-qt/DiveObjectHelper.cpp 
b/core/subsurface-qt/DiveObjectHelper.cpp
index 768d4a8..87fae7c 100644
--- a/core/subsurface-qt/DiveObjectHelper.cpp
+++ b/core/subsurface-qt/DiveObjectHelper.cpp
@@ -5,6 +5,7 @@
 
 #include "../qthelper.h"
 #include "../helpers.h"
+#include "../../qt-models/tankinfomodel.h"
 
 static QString EMPTY_DIVE_STRING = QStringLiteral("");
 enum returnPressureSelector {START_PRESSURE, END_PRESSURE};
@@ -252,15 +253,29 @@ QString DiveObjectHelper::suit() const
        return m_dive->suit ? m_dive->suit : EMPTY_DIVE_STRING;
 }
 
-QString DiveObjectHelper::cylinderList() const
+QStringList DiveObjectHelper::cylinderList() const
 {
-       QString cylinders;
-       for (int i = 0; i < MAX_CYLINDERS; i++) {
-               QString cyl = getFormattedCylinder(m_dive, i);
+       QStringList cylinders;
+       struct dive *d;
+       int i = 0;
+       for_each_dive (i, d) {
+               for (int j = 0; j < MAX_CYLINDERS; j++) {
+                       QString cyl = d->cylinder[j].type.description;
+                       if (cyl == EMPTY_DIVE_STRING)
+                               continue;
+                       cylinders << cyl;
+               }
+       }
+
+       for (i = 0; i < sizeof(tank_info) && tank_info[i].name != NULL; i++) {
+               QString cyl = tank_info[i].name;
                if (cyl == EMPTY_DIVE_STRING)
                        continue;
-               cylinders += cyl + "; ";
+               cylinders << cyl;
        }
+
+       cylinders.removeDuplicates();
+       cylinders.sort();
        return cylinders;
 }
 
diff --git a/core/subsurface-qt/DiveObjectHelper.h 
b/core/subsurface-qt/DiveObjectHelper.h
index c685690..8650f7a 100644
--- a/core/subsurface-qt/DiveObjectHelper.h
+++ b/core/subsurface-qt/DiveObjectHelper.h
@@ -33,7 +33,7 @@ class DiveObjectHelper : public QObject {
        Q_PROPERTY(QStringList weights READ weights CONSTANT)
        Q_PROPERTY(bool singleWeight READ singleWeight CONSTANT)
        Q_PROPERTY(QString suit READ suit CONSTANT)
-       Q_PROPERTY(QString cylinderList READ cylinderList CONSTANT)
+       Q_PROPERTY(QStringList cylinderList READ cylinderList CONSTANT)
        Q_PROPERTY(QStringList cylinders READ cylinders CONSTANT)
        Q_PROPERTY(QList<CylinderObjectHelper*> cylinderObjects READ 
cylinderObjects CONSTANT)
        Q_PROPERTY(QString trip READ trip CONSTANT)
@@ -76,7 +76,7 @@ public:
        QString weight(int idx) const;
        bool singleWeight() const;
        QString suit() const;
-       QString cylinderList() const;
+       QStringList cylinderList() const;
        QStringList cylinders() const;
        QString cylinder(int idx) const;
        QList<CylinderObjectHelper*> cylinderObjects() const;
diff --git a/mobile-widgets/qml/DiveDetails.qml 
b/mobile-widgets/qml/DiveDetails.qml
index a66968a..b85b593 100644
--- a/mobile-widgets/qml/DiveDetails.qml
+++ b/mobile-widgets/qml/DiveDetails.qml
@@ -29,6 +29,8 @@ Kirigami.Page {
        property alias weight: detailsEdit.weightText
        property alias startpressure: detailsEdit.startpressureText
        property alias endpressure: detailsEdit.endpressureText
+       property alias cylinderIndex: detailsEdit.cylinderIndex
+       property alias cylinderModel: detailsEdit.cylinderModel
        property alias gasmix: detailsEdit.gasmixText
        property alias gpsCheckbox: detailsEdit.gpsCheckbox
        property int updateCurrentIdx: manager.updateSelectedDive
@@ -168,6 +170,7 @@ Kirigami.Page {
                        startpressure = 
diveDetailsListView.currentItem.modelData.dive.startPressure
                        endpressure = 
diveDetailsListView.currentItem.modelData.dive.endPressure
                        gasmix = 
diveDetailsListView.currentItem.modelData.dive.firstGas
+                       cylinderIndex = 
diveDetailsListView.currentItem.modelData.dive.cylinderList.indexOf(diveDetailsListView.currentItem.modelData.dive.getCylinder)
                } else {
                        // careful when translating, this text is "magic" in 
DiveDetailsEdit.qml
                        startpressure = "cannot edit multiple cylinders"
diff --git a/mobile-widgets/qml/DiveDetailsEdit.qml 
b/mobile-widgets/qml/DiveDetailsEdit.qml
index ad62997..093d911 100644
--- a/mobile-widgets/qml/DiveDetailsEdit.qml
+++ b/mobile-widgets/qml/DiveDetailsEdit.qml
@@ -18,6 +18,7 @@ Item {
        property alias suitIndex: suitBox.currentIndex
        property alias buddyIndex: buddyBox.currentIndex
        property alias divemasterIndex: divemasterBox.currentIndex
+       property alias cylinderIndex: cylinderBox.currentIndex
        property alias notesText: txtNotes.text
        property alias durationText: txtDuration.text
        property alias depthText: txtDepth.text
@@ -29,13 +30,14 @@ Item {
        property alias suitModel: suitBox.model
        property alias divemasterModel: divemasterBox.model
        property alias buddyModel: buddyBox.model
+       property alias cylinderModel: cylinderBox.model
 
        function saveData() {
                // apply the changes to the dive_table
                manager.commitChanges(dive_id, detailsEdit.dateText, 
detailsEdit.locationText, detailsEdit.gpsText, detailsEdit.durationText,
-                                     detailsEdit.depthText, 
detailsEdit.airtempText, detailsEdit.watertempText, suitBox.editText,
-                                     buddyBox.editText, 
divemasterBox.editText, detailsEdit.weightText, detailsEdit.notesText,
-                                     detailsEdit.startpressureText, 
detailsEdit.endpressureText, detailsEdit.gasmixText)
+                                     detailsEdit.depthText, 
detailsEdit.airtempText, detailsEdit.watertempText, suitBox.editText, 
buddyBox.editText,
+                                     divemasterBox.editText, 
detailsEdit.weightText, detailsEdit.notesText, detailsEdit.startpressureText,
+                                     detailsEdit.endpressureText, 
detailsEdit.gasmixText, cylinderBox.editText)
                // trigger the profile to be redrawn
                QMLProfile.diveId = dive_id
 
@@ -53,6 +55,7 @@ Item {
                diveDetailsListView.currentItem.modelData.suit = 
suitBox.currentText
                diveDetailsListView.currentItem.modelData.buddy = 
buddyBox.currentText
                diveDetailsListView.currentItem.modelData.divemaster = 
divemasterBox.currentText
+               diveDetailsListView.currentItem.modelData.cylinder = 
cylinderBox.currentText
                diveDetailsListView.currentItem.modelData.notes = 
detailsEdit.notesText
                diveDetailsPage.state = "view"
                Qt.inputMethod.hide()
@@ -210,6 +213,21 @@ Item {
 
                        Kirigami.Label {
                                Layout.alignment: Qt.AlignRight
+                               text: qsTr("Cylinder:")
+                       }
+                       ComboBox {
+                               id: cylinderBox
+                               editable: true
+                               model: 
diveDetailsListView.currentItem.modelData.dive.cylinderList
+                               inputMethodHints: Qt.ImhNoPredictiveText
+                               Layout.fillWidth: true
+                               style: ComboBoxStyle {
+                                       dropDownButtonWidth: 0
+                               }
+                       }
+                       
+                       Kirigami.Label {
+                               Layout.alignment: Qt.AlignRight
                                text: qsTr("Gas mix:")
                        }
                        StyledTextField {
diff --git a/mobile-widgets/qmlmanager.cpp b/mobile-widgets/qmlmanager.cpp
index 89873fb..c9f0f02 100644
--- a/mobile-widgets/qmlmanager.cpp
+++ b/mobile-widgets/qmlmanager.cpp
@@ -22,6 +22,7 @@
 #include "core/cloudstorage.h"
 #include "core/subsurface-qt/SettingsObjectWrapper.h"
 #include "core/membuffer.h"
+#include "qt-models/tankinfomodel.h"
 
 QMLManager *QMLManager::m_instance = NULL;
 
@@ -778,7 +779,7 @@ bool QMLManager::checkDepth(DiveObjectHelper *myDive, dive 
*d, QString depth)
 // update the dive and return the notes field, stripped of the HTML junk
 void QMLManager::commitChanges(QString diveId, QString date, QString location, 
QString gps, QString duration, QString depth,
                               QString airtemp, QString watertemp, QString 
suit, QString buddy, QString diveMaster, QString weight, QString notes,
-                              QString startpressure, QString endpressure, 
QString gasmix)
+                              QString startpressure, QString endpressure, 
QString gasmix, QString cylinder)
 {
        struct dive *d = get_dive_by_uniq_id(diveId.toInt());
        DiveObjectHelper *myDive = new DiveObjectHelper(d);
@@ -840,6 +841,27 @@ void QMLManager::commitChanges(QString diveId, QString 
date, QString location, Q
                        d->cylinder[0].gasmix.he.permille = he;
                }
        }
+       // info for first cylinder
+       if (myDive->getCylinder() != cylinder) {
+               diveChanged = true;
+               int i, size, wp;
+               for (i = 0; i < sizeof(tank_info) && tank_info[i].name != NULL; 
i++) {
+                       if (tank_info[i].name == cylinder ) {
+                               if (tank_info[i].ml > 0){
+                                       size = tank_info[i].ml;
+                                       wp = tank_info[i].bar * 1000;
+                               } else {
+                                       size = cuft_to_l(tank_info[i].cuft) * 
1000 / bar_to_atm(psi_to_bar(tank_info[i].psi));
+                                       wp = psi_to_mbar(tank_info[i].psi);
+                               }
+                               break;
+                       }
+                       
+               }
+               d->cylinder[0].type.description = strdup(qPrintable(cylinder));
+               d->cylinder[0].type.size.mliter = size;
+               d->cylinder[0].type.workingpressure.mbar = wp;
+       }
        if (myDive->suit() != suit) {
                diveChanged = true;
                free(d->suit);
diff --git a/mobile-widgets/qmlmanager.h b/mobile-widgets/qmlmanager.h
index b7be359..8c5b02f 100644
--- a/mobile-widgets/qmlmanager.h
+++ b/mobile-widgets/qmlmanager.h
@@ -124,11 +124,11 @@ public slots:
        void loadDivesWithValidCredentials();
        void loadDiveProgress(int percent);
        void provideAuth(QNetworkReply *reply, QAuthenticator *auth);
-       void commitChanges(QString diveId, QString date, QString location,
-                          QString gps, QString duration, QString depth,
-                          QString airtemp, QString watertemp, QString suit,
-                          QString buddy, QString diveMaster, QString weight, 
QString notes,
-                          QString startpressure, QString endpressure, QString 
gasmix);
+       void commitChanges(QString diveId, QString date, QString location, 
QString gps,
+                          QString duration, QString depth, QString airtemp,
+                          QString watertemp, QString suit, QString buddy,
+                          QString diveMaster, QString weight, QString notes, 
QString startpressure,
+                          QString endpressure, QString gasmix, QString 
cylinder);
        void changesNeedSaving();
        void saveChangesLocal();
        void saveChangesCloud(bool forceRemoteSync);
-- 
2.7.4

_______________________________________________
subsurface mailing list
[email protected]
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to