source: subsurface/qt-models/divelistmodel.cpp @ 3f0d210

Last change on this file since 3f0d210 was 3f0d210, checked in by Dirk Hohndel <dirk@…>, 7 months ago

QML UI: add downloaded dives to dive list

This already takes into account which of those dives were selected.
Right now all we have is select all or none - this needs actual support
in the UI, but once that's there, it will just work (famous last words).

Signed-off-by: Dirk Hohndel <dirk@…>

  • Property mode set to 100644
File size: 3.9 KB
Line 
1// SPDX-License-Identifier: GPL-2.0
2#include "qt-models/divelistmodel.h"
3#include "core/helpers.h"
4#include <QDateTime>
5
6DiveListSortModel::DiveListSortModel(QObject *parent) : QSortFilterProxyModel(parent)
7{
8
9}
10
11int DiveListSortModel::getDiveId(int idx)
12{
13        DiveListModel *mySourceModel = qobject_cast<DiveListModel *>(sourceModel());
14        return mySourceModel->getDiveId(mapToSource(index(idx,0)).row());
15}
16
17int DiveListSortModel::getIdxForId(int id)
18{
19        for (int i = 0; i < rowCount(); i++) {
20                QVariant v = data(index(i, 0), DiveListModel::DiveRole);
21                DiveObjectHelper *d = v.value<DiveObjectHelper *>();
22                if (d->id() == id)
23                        return i;
24        }
25        return -1;
26}
27
28void DiveListSortModel::clear()
29{
30        DiveListModel *mySourceModel = qobject_cast<DiveListModel *>(sourceModel());
31        mySourceModel->clear();
32}
33
34void DiveListSortModel::addAllDives()
35{
36        DiveListModel *mySourceModel = qobject_cast<DiveListModel *>(sourceModel());
37        mySourceModel->addAllDives();
38}
39
40DiveListModel *DiveListModel::m_instance = NULL;
41
42DiveListModel::DiveListModel(QObject *parent) : QAbstractListModel(parent)
43{
44        m_instance = this;
45}
46
47void DiveListModel::addDive(QList<dive *>listOfDives)
48{
49        if (listOfDives.isEmpty())
50                return;
51        beginInsertRows(QModelIndex(), rowCount(), rowCount() + listOfDives.count() - 1);
52        foreach (dive *d, listOfDives) {
53                m_dives.append(new DiveObjectHelper(d));
54        }
55        endInsertRows();
56}
57
58void DiveListModel::addAllDives()
59{
60        QList<dive *>listOfDives;
61        int i;
62        struct dive *d;
63        for_each_dive (i, d)
64                listOfDives.append(d);
65        addDive(listOfDives);
66
67}
68
69void DiveListModel::insertDive(int i, DiveObjectHelper *newDive)
70{
71        beginInsertRows(QModelIndex(), i, i);
72        m_dives.insert(i, newDive);
73        endInsertRows();
74}
75
76void DiveListModel::removeDive(int i)
77{
78        beginRemoveRows(QModelIndex(), i, i);
79        m_dives.removeAt(i);
80        endRemoveRows();
81}
82
83void DiveListModel::removeDiveById(int id)
84{
85        for (int i = 0; i < rowCount(); i++) {
86                if (m_dives.at(i)->id() == id) {
87                        removeDive(i);
88                        return;
89                }
90        }
91}
92
93void DiveListModel::updateDive(int i, dive *d)
94{
95        DiveObjectHelper *newDive = new DiveObjectHelper(d);
96        removeDive(i);
97        insertDive(i, newDive);
98}
99
100void DiveListModel::clear()
101{
102        if (m_dives.count()) {
103                beginRemoveRows(QModelIndex(), 0, m_dives.count() - 1);
104                qDeleteAll(m_dives);
105                m_dives.clear();
106                endRemoveRows();
107        }
108}
109
110int DiveListModel::rowCount(const QModelIndex &) const
111{
112        return m_dives.count();
113}
114
115int DiveListModel::getDiveId(int idx) const
116{
117        if (idx < 0 || idx >= m_dives.count())
118                return -1;
119        return m_dives[idx]->id();
120}
121
122int DiveListModel::getDiveIdx(int id) const
123{
124        int i;
125        for (i = 0; i < m_dives.count(); i++) {
126                if (m_dives.at(i)->id() == id)
127                        return i;
128        }
129        return -1;
130}
131
132QVariant DiveListModel::data(const QModelIndex &index, int role) const
133{
134        if(index.row() < 0 || index.row() > m_dives.count())
135                return QVariant();
136
137        DiveObjectHelper *curr_dive = m_dives[index.row()];
138        switch(role) {
139        case DiveRole: return QVariant::fromValue<QObject*>(curr_dive);
140        case DiveDateRole: return (qlonglong)curr_dive->timestamp();
141        }
142        return QVariant();
143
144}
145
146QHash<int, QByteArray> DiveListModel::roleNames() const
147{
148        QHash<int, QByteArray> roles;
149        roles[DiveRole] = "dive";
150        roles[DiveDateRole] = "date";
151        return roles;
152}
153
154// create a new dive. set the current time and add it to the end of the dive list
155QString DiveListModel::startAddDive()
156{
157        struct dive *d;
158        d = alloc_dive();
159        d->when = QDateTime::currentMSecsSinceEpoch() / 1000L + gettimezoneoffset();
160
161        // find the highest dive nr we have and pick the next one
162        struct dive *pd;
163        int i, nr = 0;
164        for_each_dive(i, pd) {
165                if (pd->number > nr)
166                        nr = pd->number;
167        }
168        nr++;
169        d->number = nr;
170        d->dc.model = strdup("manually added dive");
171        add_single_dive(-1, d);
172        insertDive(get_idx_by_uniq_id(d->id), new DiveObjectHelper(d));
173        return QString::number(d->id);
174}
175
176DiveListModel *DiveListModel::instance()
177{
178        return m_instance;
179}
180
181DiveObjectHelper* DiveListModel::at(int i)
182{
183        return m_dives.at(i);
184}
Note: See TracBrowser for help on using the repository browser.