2017-04-18 15:32:10 +00:00
|
|
|
#include "diveimportedmodel.h"
|
|
|
|
#include "core/helpers.h"
|
|
|
|
|
|
|
|
DiveImportedModel::DiveImportedModel(QObject *o) : QAbstractTableModel(o),
|
|
|
|
firstIndex(0),
|
|
|
|
lastIndex(-1),
|
2017-04-18 17:14:03 +00:00
|
|
|
checkStates(nullptr),
|
|
|
|
diveTable(nullptr)
|
2017-04-18 15:32:10 +00:00
|
|
|
{
|
2017-05-26 15:53:25 +00:00
|
|
|
// Defaults to downloadTable, can be changed later.
|
|
|
|
diveTable = &downloadTable;
|
2017-04-18 15:32:10 +00:00
|
|
|
}
|
|
|
|
|
2018-05-21 15:53:42 +00:00
|
|
|
int DiveImportedModel::columnCount(const QModelIndex&) const
|
2017-04-18 15:32:10 +00:00
|
|
|
{
|
|
|
|
return 3;
|
|
|
|
}
|
|
|
|
|
2018-05-21 15:53:42 +00:00
|
|
|
int DiveImportedModel::rowCount(const QModelIndex&) const
|
2017-04-18 15:32:10 +00:00
|
|
|
{
|
|
|
|
return lastIndex - firstIndex + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
QVariant DiveImportedModel::headerData(int section, Qt::Orientation orientation, int role) const
|
|
|
|
{
|
|
|
|
if (orientation == Qt::Vertical)
|
|
|
|
return QVariant();
|
2017-05-26 15:53:25 +00:00
|
|
|
|
|
|
|
// widgets access the model via index.column(), qml via role.
|
|
|
|
int column = section;
|
|
|
|
if (role == DateTime || role == Duration || role == Depth) {
|
|
|
|
column = role - DateTime;
|
|
|
|
role = Qt::DisplayRole;
|
|
|
|
}
|
|
|
|
|
2017-04-18 15:32:10 +00:00
|
|
|
if (role == Qt::DisplayRole) {
|
2017-05-26 15:53:25 +00:00
|
|
|
switch (column) {
|
2017-04-18 15:32:10 +00:00
|
|
|
case 0:
|
|
|
|
return QVariant(tr("Date/time"));
|
|
|
|
case 1:
|
|
|
|
return QVariant(tr("Duration"));
|
|
|
|
case 2:
|
|
|
|
return QVariant(tr("Depth"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return QVariant();
|
|
|
|
}
|
|
|
|
|
2017-04-18 17:14:03 +00:00
|
|
|
void DiveImportedModel::setDiveTable(struct dive_table* table)
|
|
|
|
{
|
2017-05-26 15:53:25 +00:00
|
|
|
diveTable = table;
|
2017-04-18 17:14:03 +00:00
|
|
|
}
|
|
|
|
|
2017-04-18 15:32:10 +00:00
|
|
|
QVariant DiveImportedModel::data(const QModelIndex &index, int role) const
|
|
|
|
{
|
|
|
|
if (!index.isValid())
|
|
|
|
return QVariant();
|
|
|
|
|
|
|
|
if (index.row() + firstIndex > lastIndex)
|
|
|
|
return QVariant();
|
|
|
|
|
2017-04-18 17:14:03 +00:00
|
|
|
struct dive *d = get_dive_from_table(index.row() + firstIndex, diveTable);
|
2017-04-18 15:32:10 +00:00
|
|
|
if (!d)
|
|
|
|
return QVariant();
|
2017-05-26 15:53:25 +00:00
|
|
|
|
|
|
|
// widgets access the model via index.column(), qml via role.
|
|
|
|
int column = index.column();
|
2017-06-04 12:40:25 +00:00
|
|
|
if (role >= DateTime) {
|
2017-05-26 15:53:25 +00:00
|
|
|
column = role - DateTime;
|
|
|
|
role = Qt::DisplayRole;
|
|
|
|
}
|
|
|
|
|
2017-04-18 15:32:10 +00:00
|
|
|
if (role == Qt::DisplayRole) {
|
2017-05-26 15:53:25 +00:00
|
|
|
switch (column) {
|
2017-04-18 15:32:10 +00:00
|
|
|
case 0:
|
|
|
|
return QVariant(get_short_dive_date_string(d->when));
|
|
|
|
case 1:
|
2017-06-12 10:08:34 +00:00
|
|
|
return QVariant(get_dive_duration_string(d->duration.seconds, tr("h"), tr("min")));
|
2017-04-18 15:32:10 +00:00
|
|
|
case 2:
|
|
|
|
return QVariant(get_depth_string(d->maxdepth.mm, true, false));
|
2017-06-04 12:40:25 +00:00
|
|
|
case 3:
|
|
|
|
return checkStates[index.row()];
|
2017-04-18 15:32:10 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (role == Qt::CheckStateRole) {
|
|
|
|
if (index.column() == 0)
|
|
|
|
return checkStates[index.row()] ? Qt::Checked : Qt::Unchecked;
|
|
|
|
}
|
|
|
|
return QVariant();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DiveImportedModel::changeSelected(QModelIndex clickedIndex)
|
|
|
|
{
|
|
|
|
checkStates[clickedIndex.row()] = !checkStates[clickedIndex.row()];
|
2017-06-04 12:40:25 +00:00
|
|
|
dataChanged(index(clickedIndex.row(), 0), index(clickedIndex.row(), 0), QVector<int>() << Qt::CheckStateRole << Selected);
|
2017-04-18 15:32:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void DiveImportedModel::selectAll()
|
|
|
|
{
|
|
|
|
memset(checkStates, true, lastIndex - firstIndex + 1);
|
2017-06-04 12:40:25 +00:00
|
|
|
dataChanged(index(0, 0), index(lastIndex - firstIndex, 0), QVector<int>() << Qt::CheckStateRole << Selected);
|
2017-04-18 15:32:10 +00:00
|
|
|
}
|
|
|
|
|
2017-05-29 18:36:00 +00:00
|
|
|
void DiveImportedModel::selectRow(int row)
|
|
|
|
{
|
|
|
|
checkStates[row] = !checkStates[row];
|
2017-06-04 12:40:25 +00:00
|
|
|
dataChanged(index(row, 0), index(row, 0), QVector<int>() << Qt::CheckStateRole << Selected);
|
2017-05-29 18:36:00 +00:00
|
|
|
}
|
|
|
|
|
2017-04-18 15:32:10 +00:00
|
|
|
void DiveImportedModel::selectNone()
|
|
|
|
{
|
|
|
|
memset(checkStates, false, lastIndex - firstIndex + 1);
|
2017-06-04 12:40:25 +00:00
|
|
|
dataChanged(index(0, 0), index(lastIndex - firstIndex,0 ), QVector<int>() << Qt::CheckStateRole << Selected);
|
2017-04-18 15:32:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Qt::ItemFlags DiveImportedModel::flags(const QModelIndex &index) const
|
|
|
|
{
|
|
|
|
if (index.column() != 0)
|
|
|
|
return QAbstractTableModel::flags(index);
|
|
|
|
return QAbstractTableModel::flags(index) | Qt::ItemIsUserCheckable;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DiveImportedModel::clearTable()
|
|
|
|
{
|
2017-06-24 19:06:19 +00:00
|
|
|
if (lastIndex < firstIndex) {
|
|
|
|
// just to be sure it's the right numbers
|
|
|
|
// but don't call RemoveRows or Qt in debug mode with trigger an ASSERT
|
|
|
|
lastIndex = -1;
|
|
|
|
firstIndex = 0;
|
|
|
|
return;
|
|
|
|
}
|
2017-04-18 15:32:10 +00:00
|
|
|
beginRemoveRows(QModelIndex(), 0, lastIndex - firstIndex);
|
|
|
|
lastIndex = -1;
|
|
|
|
firstIndex = 0;
|
|
|
|
endRemoveRows();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DiveImportedModel::setImportedDivesIndexes(int first, int last)
|
|
|
|
{
|
|
|
|
if (lastIndex >= firstIndex) {
|
|
|
|
beginRemoveRows(QModelIndex(), 0, lastIndex - firstIndex);
|
|
|
|
endRemoveRows();
|
|
|
|
}
|
2017-07-09 23:04:31 +00:00
|
|
|
if (last >= first)
|
|
|
|
beginInsertRows(QModelIndex(), 0, last - first);
|
2017-04-18 15:32:10 +00:00
|
|
|
lastIndex = last;
|
|
|
|
firstIndex = first;
|
|
|
|
delete[] checkStates;
|
|
|
|
checkStates = new bool[last - first + 1];
|
|
|
|
memset(checkStates, true, last - first + 1);
|
2017-07-09 23:04:31 +00:00
|
|
|
if (last >= first)
|
|
|
|
endInsertRows();
|
2017-04-18 15:32:10 +00:00
|
|
|
}
|
2017-05-26 15:53:25 +00:00
|
|
|
|
|
|
|
void DiveImportedModel::repopulate()
|
|
|
|
{
|
2017-07-09 23:04:31 +00:00
|
|
|
setImportedDivesIndexes(0, diveTable->nr-1);
|
2017-05-26 15:53:25 +00:00
|
|
|
}
|
|
|
|
|
2017-05-28 18:48:30 +00:00
|
|
|
void DiveImportedModel::recordDives()
|
|
|
|
{
|
2017-06-29 21:27:45 +00:00
|
|
|
if (diveTable->nr == 0)
|
|
|
|
// nothing to do, just exit
|
|
|
|
return;
|
|
|
|
|
2017-05-29 17:32:32 +00:00
|
|
|
// walk the table of imported dives and record the ones that the user picked
|
|
|
|
// clearing out the table as we go
|
2017-05-28 18:48:30 +00:00
|
|
|
for (int i = 0; i < rowCount(); i++) {
|
2017-05-29 17:32:32 +00:00
|
|
|
struct dive *d = diveTable->dives[i];
|
|
|
|
if (d && checkStates[i]) {
|
|
|
|
record_dive(d);
|
|
|
|
} else {
|
|
|
|
// we should free the dives that weren't recorded
|
|
|
|
clear_dive(d);
|
2017-05-29 17:48:20 +00:00
|
|
|
free(d);
|
2017-05-28 18:48:30 +00:00
|
|
|
}
|
2017-05-29 17:32:32 +00:00
|
|
|
diveTable->dives[i] = NULL;
|
2017-05-28 18:48:30 +00:00
|
|
|
}
|
|
|
|
diveTable->nr = 0;
|
2017-05-29 17:34:25 +00:00
|
|
|
process_dives(true, true);
|
2017-11-25 16:11:41 +00:00
|
|
|
if (autogroup)
|
|
|
|
autogroup_dives();
|
2017-05-28 18:48:30 +00:00
|
|
|
}
|
|
|
|
|
2017-05-26 15:53:25 +00:00
|
|
|
QHash<int, QByteArray> DiveImportedModel::roleNames() const {
|
|
|
|
static QHash<int, QByteArray> roles = {
|
|
|
|
{ DateTime, "datetime"},
|
|
|
|
{ Depth, "depth"},
|
2017-05-29 18:36:00 +00:00
|
|
|
{ Duration, "duration"},
|
2017-06-04 12:40:25 +00:00
|
|
|
{ Selected, "selected"}
|
2017-05-29 18:36:00 +00:00
|
|
|
};
|
2017-05-26 15:53:25 +00:00
|
|
|
return roles;
|
|
|
|
}
|