mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Another attempt to make it easyer to create the mobile version of Subsurface. Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
		
			
				
	
	
		
			108 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "divecomputermodel.h"
 | |
| #include "dive.h"
 | |
| #include "divelist.h"
 | |
| 
 | |
| DiveComputerModel::DiveComputerModel(QMultiMap<QString, DiveComputerNode> &dcMap, QObject *parent) : CleanerTableModel()
 | |
| {
 | |
| 	setHeaderDataStrings(QStringList() << "" << tr("Model") << tr("Device ID") << tr("Nickname"));
 | |
| 	dcWorkingMap = dcMap;
 | |
| 	numRows = 0;
 | |
| }
 | |
| 
 | |
| QVariant DiveComputerModel::data(const QModelIndex &index, int role) const
 | |
| {
 | |
| 	QList<DiveComputerNode> values = dcWorkingMap.values();
 | |
| 	DiveComputerNode node = values.at(index.row());
 | |
| 
 | |
| 	QVariant ret;
 | |
| 	if (role == Qt::DisplayRole || role == Qt::EditRole) {
 | |
| 		switch (index.column()) {
 | |
| 		case ID:
 | |
| 			ret = QString("0x").append(QString::number(node.deviceId, 16));
 | |
| 			break;
 | |
| 		case MODEL:
 | |
| 			ret = node.model;
 | |
| 			break;
 | |
| 		case NICKNAME:
 | |
| 			ret = node.nickName;
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if (index.column() == REMOVE) {
 | |
| 		switch (role) {
 | |
| 		case Qt::DecorationRole:
 | |
| 			ret = trashIcon();
 | |
| 			break;
 | |
| 		case Qt::SizeHintRole:
 | |
| 			ret = trashIcon().size();
 | |
| 			break;
 | |
| 		case Qt::ToolTipRole:
 | |
| 			ret = tr("Clicking here will remove this dive computer.");
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| int DiveComputerModel::rowCount(const QModelIndex &parent) const
 | |
| {
 | |
| 	return numRows;
 | |
| }
 | |
| 
 | |
| void DiveComputerModel::update()
 | |
| {
 | |
| 	QList<DiveComputerNode> values = dcWorkingMap.values();
 | |
| 	int count = values.count();
 | |
| 
 | |
| 	if (numRows) {
 | |
| 		beginRemoveRows(QModelIndex(), 0, numRows - 1);
 | |
| 		numRows = 0;
 | |
| 		endRemoveRows();
 | |
| 	}
 | |
| 
 | |
| 	if (count) {
 | |
| 		beginInsertRows(QModelIndex(), 0, count - 1);
 | |
| 		numRows = count;
 | |
| 		endInsertRows();
 | |
| 	}
 | |
| }
 | |
| 
 | |
| Qt::ItemFlags DiveComputerModel::flags(const QModelIndex &index) const
 | |
| {
 | |
| 	Qt::ItemFlags flags = QAbstractItemModel::flags(index);
 | |
| 	if (index.column() == NICKNAME)
 | |
| 		flags |= Qt::ItemIsEditable;
 | |
| 	return flags;
 | |
| }
 | |
| 
 | |
| bool DiveComputerModel::setData(const QModelIndex &index, const QVariant &value, int role)
 | |
| {
 | |
| 	QList<DiveComputerNode> values = dcWorkingMap.values();
 | |
| 	DiveComputerNode node = values.at(index.row());
 | |
| 	dcWorkingMap.remove(node.model, node);
 | |
| 	node.nickName = value.toString();
 | |
| 	dcWorkingMap.insert(node.model, node);
 | |
| 	emit dataChanged(index, index);
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| void DiveComputerModel::remove(const QModelIndex &index)
 | |
| {
 | |
| 	QList<DiveComputerNode> values = dcWorkingMap.values();
 | |
| 	DiveComputerNode node = values.at(index.row());
 | |
| 	dcWorkingMap.remove(node.model, node);
 | |
| 	update();
 | |
| }
 | |
| 
 | |
| void DiveComputerModel::dropWorkingList()
 | |
| {
 | |
| 	// how do I prevent the memory leak ?
 | |
| }
 | |
| 
 | |
| void DiveComputerModel::keepWorkingList()
 | |
| {
 | |
| 	if (dcList.dcMap != dcWorkingMap)
 | |
| 		mark_divelist_changed(true);
 | |
| 	dcList.dcMap = dcWorkingMap;
 | |
| }
 |