source: subsurface/qt-models/diveimportedmodel.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: 4.0 KB
Line 
1#include "diveimportedmodel.h"
2#include "core/helpers.h"
3
4DiveImportedModel::DiveImportedModel(QObject *o) : QAbstractTableModel(o),
5        firstIndex(0),
6        lastIndex(-1),
7        checkStates(nullptr),
8        diveTable(nullptr)
9{
10        // Defaults to downloadTable, can be changed later.
11        diveTable = &downloadTable;
12}
13
14int DiveImportedModel::columnCount(const QModelIndex &model) const
15{
16        Q_UNUSED(model)
17        return 3;
18}
19
20int DiveImportedModel::rowCount(const QModelIndex &model) const
21{
22        Q_UNUSED(model)
23        return lastIndex - firstIndex + 1;
24}
25
26QVariant DiveImportedModel::headerData(int section, Qt::Orientation orientation, int role) const
27{
28        if (orientation == Qt::Vertical)
29                return QVariant();
30
31        // widgets access the model via index.column(), qml via role.
32        int column = section;
33        if (role == DateTime || role == Duration || role == Depth) {
34                column = role - DateTime;
35                role = Qt::DisplayRole;
36        }
37
38        if (role == Qt::DisplayRole) {
39                switch (column) {
40                case 0:
41                        return QVariant(tr("Date/time"));
42                case 1:
43                        return QVariant(tr("Duration"));
44                case 2:
45                        return QVariant(tr("Depth"));
46                }
47        }
48        return QVariant();
49}
50
51void DiveImportedModel::setDiveTable(struct dive_table* table)
52{
53        diveTable = table;
54}
55
56QVariant DiveImportedModel::data(const QModelIndex &index, int role) const
57{
58        if (!index.isValid())
59                return QVariant();
60
61        if (index.row() + firstIndex > lastIndex)
62                return QVariant();
63
64        struct dive *d = get_dive_from_table(index.row() + firstIndex, diveTable);
65        if (!d)
66                return QVariant();
67
68        // widgets access the model via index.column(), qml via role.
69        int column = index.column();
70        if (role == DateTime || role == Duration || role == Depth) {
71                column = role - DateTime;
72                role = Qt::DisplayRole;
73        }
74
75        if (role == Qt::DisplayRole) {
76                switch (column) {
77                case 0:
78                        return QVariant(get_short_dive_date_string(d->when));
79                case 1:
80                        return QVariant(get_dive_duration_string(d->duration.seconds, tr("h:"), tr("min")));
81                case 2:
82                        return QVariant(get_depth_string(d->maxdepth.mm, true, false));
83                }
84        }
85        if (role == Qt::CheckStateRole) {
86                if (index.column() == 0)
87                        return checkStates[index.row()] ? Qt::Checked : Qt::Unchecked;
88        }
89        return QVariant();
90}
91
92void DiveImportedModel::changeSelected(QModelIndex clickedIndex)
93{
94        checkStates[clickedIndex.row()] = !checkStates[clickedIndex.row()];
95        dataChanged(index(clickedIndex.row(), 0), index(clickedIndex.row(), 0), QVector<int>() << Qt::CheckStateRole);
96}
97
98void DiveImportedModel::selectAll()
99{
100        memset(checkStates, true, lastIndex - firstIndex + 1);
101        dataChanged(index(0, 0), index(lastIndex - firstIndex, 0), QVector<int>() << Qt::CheckStateRole);
102}
103
104void DiveImportedModel::selectNone()
105{
106        memset(checkStates, false, lastIndex - firstIndex + 1);
107        dataChanged(index(0, 0), index(lastIndex - firstIndex,0 ), QVector<int>() << Qt::CheckStateRole);
108}
109
110Qt::ItemFlags DiveImportedModel::flags(const QModelIndex &index) const
111{
112        if (index.column() != 0)
113                return QAbstractTableModel::flags(index);
114        return QAbstractTableModel::flags(index) | Qt::ItemIsUserCheckable;
115}
116
117void DiveImportedModel::clearTable()
118{
119        beginRemoveRows(QModelIndex(), 0, lastIndex - firstIndex);
120        lastIndex = -1;
121        firstIndex = 0;
122        endRemoveRows();
123}
124
125void DiveImportedModel::setImportedDivesIndexes(int first, int last)
126{
127        Q_ASSERT(last >= first);
128        if (lastIndex >= firstIndex) {
129                beginRemoveRows(QModelIndex(), 0, lastIndex - firstIndex);
130                endRemoveRows();
131        }
132        beginInsertRows(QModelIndex(), 0, last - first);
133        lastIndex = last;
134        firstIndex = first;
135        delete[] checkStates;
136        checkStates = new bool[last - first + 1];
137        memset(checkStates, true, last - first + 1);
138        endInsertRows();
139}
140
141void DiveImportedModel::repopulate()
142{
143        setImportedDivesIndexes(0, diveTable->nr-1);
144}
145
146void DiveImportedModel::recordDives()
147{
148        for (int i = 0; i < rowCount(); i++) {
149                if (diveTable->dives[i] && checkStates[i]) {
150                        record_dive(diveTable->dives[i]);
151                        diveTable->dives[i] = NULL;
152                }
153        }
154        diveTable->nr = 0;
155}
156
157QHash<int, QByteArray> DiveImportedModel::roleNames() const {
158        static QHash<int, QByteArray> roles = {
159                { DateTime, "datetime"},
160                { Depth, "depth"},
161                { Duration, "duration"}};
162        return roles;
163}
Note: See TracBrowser for help on using the repository browser.