From 674d8331f5c15a8c3095afd1deca2b087fd82464 Mon Sep 17 00:00:00 2001 From: Joakim Bygdell Date: Tue, 30 Aug 2016 16:24:19 +0200 Subject: QML UI: Enable cylinder edit 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 Signed-off-by: Dirk Hohndel --- 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 768d4a860..87fae7c06 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 c685690cf..8650f7a98 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 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 cylinderObjects() const; diff --git a/mobile-widgets/qml/DiveDetails.qml b/mobile-widgets/qml/DiveDetails.qml index a66968ad1..b85b59391 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 ad62997df..b3907c616 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() @@ -208,6 +211,21 @@ Item { Layout.fillWidth: true } + 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:") diff --git a/mobile-widgets/qmlmanager.cpp b/mobile-widgets/qmlmanager.cpp index 89873fbb3..871f93866 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 b7be359ed..8c5b02fa1 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); -- cgit v1.2.3-70-g09d2