mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	This way they get correctly prepared and derived data fields get populated. For example, the dive number gets updated if these are indeed the newest dives. Fixes #408 Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
		
			
				
	
	
		
			174 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "diveimportedmodel.h"
 | |
| #include "core/helpers.h"
 | |
| 
 | |
| DiveImportedModel::DiveImportedModel(QObject *o) : QAbstractTableModel(o),
 | |
| 	firstIndex(0),
 | |
| 	lastIndex(-1),
 | |
| 	checkStates(nullptr),
 | |
| 	diveTable(nullptr)
 | |
| {
 | |
| 	// Defaults to downloadTable, can be changed later.
 | |
| 	diveTable = &downloadTable;
 | |
| }
 | |
| 
 | |
| int DiveImportedModel::columnCount(const QModelIndex &model) const
 | |
| {
 | |
| 	Q_UNUSED(model)
 | |
| 	return 3;
 | |
| }
 | |
| 
 | |
| int DiveImportedModel::rowCount(const QModelIndex &model) const
 | |
| {
 | |
| 	Q_UNUSED(model)
 | |
| 	return lastIndex - firstIndex + 1;
 | |
| }
 | |
| 
 | |
| QVariant DiveImportedModel::headerData(int section, Qt::Orientation orientation, int role) const
 | |
| {
 | |
| 	if (orientation == Qt::Vertical)
 | |
| 		return QVariant();
 | |
| 
 | |
| 	// 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;
 | |
| 	}
 | |
| 
 | |
| 	if (role == Qt::DisplayRole) {
 | |
| 		switch (column) {
 | |
| 		case 0:
 | |
| 			return QVariant(tr("Date/time"));
 | |
| 		case 1:
 | |
| 			return QVariant(tr("Duration"));
 | |
| 		case 2:
 | |
| 			return QVariant(tr("Depth"));
 | |
| 		}
 | |
| 	}
 | |
| 	return QVariant();
 | |
| }
 | |
| 
 | |
| void DiveImportedModel::setDiveTable(struct dive_table* table)
 | |
| {
 | |
| 	diveTable = table;
 | |
| }
 | |
| 
 | |
| QVariant DiveImportedModel::data(const QModelIndex &index, int role) const
 | |
| {
 | |
| 	if (!index.isValid())
 | |
| 		return QVariant();
 | |
| 
 | |
| 	if (index.row() + firstIndex > lastIndex)
 | |
| 		return QVariant();
 | |
| 
 | |
| 	struct dive *d = get_dive_from_table(index.row() + firstIndex, diveTable);
 | |
| 	if (!d)
 | |
| 		return QVariant();
 | |
| 
 | |
| 	// widgets access the model via index.column(), qml via role.
 | |
| 	int column = index.column();
 | |
| 	if (role == DateTime || role == Duration || role == Depth) {
 | |
| 		column = role - DateTime;
 | |
| 		role = Qt::DisplayRole;
 | |
| 	}
 | |
| 
 | |
| 	if (role == Qt::DisplayRole) {
 | |
| 		switch (column) {
 | |
| 		case 0:
 | |
| 			return QVariant(get_short_dive_date_string(d->when));
 | |
| 		case 1:
 | |
| 			return QVariant(get_dive_duration_string(d->duration.seconds, tr("h:"), tr("min")));
 | |
| 		case 2:
 | |
| 			return QVariant(get_depth_string(d->maxdepth.mm, true, false));
 | |
| 		}
 | |
| 	}
 | |
| 	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()];
 | |
| 	dataChanged(index(clickedIndex.row(), 0), index(clickedIndex.row(), 0), QVector<int>() << Qt::CheckStateRole);
 | |
| }
 | |
| 
 | |
| void DiveImportedModel::selectAll()
 | |
| {
 | |
| 	memset(checkStates, true, lastIndex - firstIndex + 1);
 | |
| 	dataChanged(index(0, 0), index(lastIndex - firstIndex, 0), QVector<int>() << Qt::CheckStateRole);
 | |
| }
 | |
| 
 | |
| void DiveImportedModel::selectNone()
 | |
| {
 | |
| 	memset(checkStates, false, lastIndex - firstIndex + 1);
 | |
| 	dataChanged(index(0, 0), index(lastIndex - firstIndex,0 ), QVector<int>() << Qt::CheckStateRole);
 | |
| }
 | |
| 
 | |
| 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()
 | |
| {
 | |
| 	beginRemoveRows(QModelIndex(), 0, lastIndex - firstIndex);
 | |
| 	lastIndex = -1;
 | |
| 	firstIndex = 0;
 | |
| 	endRemoveRows();
 | |
| }
 | |
| 
 | |
| void DiveImportedModel::setImportedDivesIndexes(int first, int last)
 | |
| {
 | |
| 	Q_ASSERT(last >= first);
 | |
| 	if (lastIndex >= firstIndex) {
 | |
| 		beginRemoveRows(QModelIndex(), 0, lastIndex - firstIndex);
 | |
| 		endRemoveRows();
 | |
| 	}
 | |
| 	beginInsertRows(QModelIndex(), 0, last - first);
 | |
| 	lastIndex = last;
 | |
| 	firstIndex = first;
 | |
| 	delete[] checkStates;
 | |
| 	checkStates = new bool[last - first + 1];
 | |
| 	memset(checkStates, true, last - first + 1);
 | |
| 	endInsertRows();
 | |
| }
 | |
| 
 | |
| void DiveImportedModel::repopulate()
 | |
| {
 | |
| 	if (diveTable->nr)
 | |
| 		setImportedDivesIndexes(0, diveTable->nr-1);
 | |
| 	else
 | |
| 		setImportedDivesIndexes(0, 0);
 | |
| }
 | |
| 
 | |
| void DiveImportedModel::recordDives()
 | |
| {
 | |
| 	// walk the table of imported dives and record the ones that the user picked
 | |
| 	// clearing out the table as we go
 | |
| 	for (int i = 0; i < rowCount(); i++) {
 | |
| 		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);
 | |
| 			free(d)
 | |
| 		}
 | |
| 		diveTable->dives[i] = NULL;
 | |
| 	}
 | |
| 	diveTable->nr = 0;
 | |
| 	process_dives(true, true);
 | |
| }
 | |
| 
 | |
| QHash<int, QByteArray> DiveImportedModel::roleNames() const {
 | |
| 	static QHash<int, QByteArray> roles = {
 | |
| 		{ DateTime, "datetime"},
 | |
| 		{ Depth, "depth"},
 | |
| 		{ Duration, "duration"}};
 | |
| 	return roles;
 | |
| }
 |