diff options
-rw-r--r-- | mobile-widgets/qml/DiveList.qml | 32 | ||||
-rw-r--r-- | mobile-widgets/qml/main.qml | 3 | ||||
-rw-r--r-- | qt-models/divelistmodel.cpp | 13 | ||||
-rw-r--r-- | qt-models/divelistmodel.h | 5 |
4 files changed, 52 insertions, 1 deletions
diff --git a/mobile-widgets/qml/DiveList.qml b/mobile-widgets/qml/DiveList.qml index ac9f6f391..b81cc9ac8 100644 --- a/mobile-widgets/qml/DiveList.qml +++ b/mobile-widgets/qml/DiveList.qml @@ -336,6 +336,7 @@ Kirigami.ScrollablePage { prefs.credentialStatus === CloudStatus.CS_NOCLOUD) { page.actions.main = page.downloadFromDCAction page.actions.right = page.addDiveAction + page.actions.left = page.filterToggleAction page.title = qsTr("Dive list") if (diveListView.count === 0) showPassiveNotification(qsTr("Please tap the '+' button to add a dive (or download dives from a supported dive computer)"), 3000) @@ -363,6 +364,20 @@ Kirigami.ScrollablePage { visible: diveListView.visible && diveListView.count === 0 } + Component { + id: filterHeader + Controls.TextField { + id: sitefilter + visible: (opacity > 0) && rootItem.filterToggle + text: "" + placeholderText: "Dive site name" + onTextChanged: { + rootItem.filterPattern = text + diveModel.setFilter(text) + } + } + } + ListView { id: diveListView anchors.fill: parent @@ -371,6 +386,7 @@ Kirigami.ScrollablePage { model: diveModel currentIndex: -1 delegate: diveDelegate + header: filterHeader boundsBehavior: Flickable.DragOverBounds maximumFlickVelocity: parent.height * 5 bottomMargin: Kirigami.Units.iconSizes.medium + Kirigami.Units.gridUnit @@ -420,6 +436,22 @@ Kirigami.ScrollablePage { } } + property QtObject filterToggleAction: Kirigami.Action { + icon { + name: ":icons/ic_filter_list" + } + text: qsTr("Filter dives") + onTriggered: { + rootItem.filterToggle = !rootItem.filterToggle + if (rootItem.filterToggle) { + diveModel.setFilter(rootItem.filterPattern) + } else { + diveModel.resetFilter() + rootItem.filterPattern = "" + } + } + } + onBackRequested: { if (startPage.visible && diveListView.count > 0 && prefs.credentialStatus !== CloudStatus.CS_INCORRECT_USER_PASSWD) { diff --git a/mobile-widgets/qml/main.qml b/mobile-widgets/qml/main.qml index 73f7712d9..e58c83689 100644 --- a/mobile-widgets/qml/main.qml +++ b/mobile-widgets/qml/main.qml @@ -32,6 +32,9 @@ Kirigami.ApplicationWindow { property alias pluggedInDeviceName: manager.pluggedInDeviceName property alias showPin: prefs.showPin property alias defaultCylinderIndex: settingsWindow.defaultCylinderIndex + property bool filterToggle: false + property string filterPattern: "" + onNotificationTextChanged: { if (notificationText != "") { // there's a risk that we have a >5 second gap in update events; diff --git a/qt-models/divelistmodel.cpp b/qt-models/divelistmodel.cpp index 8dc119ad8..76c0db7e3 100644 --- a/qt-models/divelistmodel.cpp +++ b/qt-models/divelistmodel.cpp @@ -8,6 +8,17 @@ DiveListSortModel::DiveListSortModel(QObject *parent) : QSortFilterProxyModel(pa } +void DiveListSortModel::setFilter(QString f) +{ + setFilterRole(DiveListModel::DiveSiteRole); + setFilterRegExp(f); +} + +void DiveListSortModel::resetFilter() +{ + setFilterRegExp(""); +} + int DiveListSortModel::getDiveId(int idx) { DiveListModel *mySourceModel = qobject_cast<DiveListModel *>(sourceModel()); @@ -151,6 +162,7 @@ QVariant DiveListModel::data(const QModelIndex &index, int role) const switch(role) { case DiveRole: return QVariant::fromValue<QObject*>(curr_dive); case DiveDateRole: return (qlonglong)curr_dive->timestamp(); + case DiveSiteRole: return curr_dive->location(); } return QVariant(); @@ -161,6 +173,7 @@ QHash<int, QByteArray> DiveListModel::roleNames() const QHash<int, QByteArray> roles; roles[DiveRole] = "dive"; roles[DiveDateRole] = "date"; + roles[DiveSiteRole] = "site"; return roles; } diff --git a/qt-models/divelistmodel.h b/qt-models/divelistmodel.h index d7988f2d9..2773ce33d 100644 --- a/qt-models/divelistmodel.h +++ b/qt-models/divelistmodel.h @@ -17,6 +17,8 @@ public: public slots: int getDiveId(int idx); int getIdxForId(int id); + void setFilter(QString f); + void resetFilter(); }; class DiveListModel : public QAbstractListModel @@ -26,7 +28,8 @@ public: enum DiveListRoles { DiveRole = Qt::UserRole + 1, - DiveDateRole + DiveDateRole, + DiveSiteRole }; static DiveListModel *instance(); |