mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	One more step to make it easyer to port the app to Mobile. Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
		
			
				
	
	
		
			174 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "weightmodel.h"
 | |
| #include "dive.h"
 | |
| #include "gettextfromc.h"
 | |
| #include "metrics.h"
 | |
| #include "helpers.h"
 | |
| #include "weigthsysteminfomodel.h"
 | |
| 
 | |
| WeightModel::WeightModel(QObject *parent) : CleanerTableModel(parent),
 | |
| 	changed(false),
 | |
| 	rows(0)
 | |
| {
 | |
| 	//enum Column {REMOVE, TYPE, WEIGHT};
 | |
| 	setHeaderDataStrings(QStringList() << tr("") << tr("Type") << tr("Weight"));
 | |
| }
 | |
| 
 | |
| weightsystem_t *WeightModel::weightSystemAt(const QModelIndex &index)
 | |
| {
 | |
| 	return &displayed_dive.weightsystem[index.row()];
 | |
| }
 | |
| 
 | |
| void WeightModel::remove(const QModelIndex &index)
 | |
| {
 | |
| 	if (index.column() != REMOVE) {
 | |
| 		return;
 | |
| 	}
 | |
| 	beginRemoveRows(QModelIndex(), index.row(), index.row()); // yah, know, ugly.
 | |
| 	rows--;
 | |
| 	remove_weightsystem(&displayed_dive, index.row());
 | |
| 	changed = true;
 | |
| 	endRemoveRows();
 | |
| }
 | |
| 
 | |
| void WeightModel::clear()
 | |
| {
 | |
| 	if (rows > 0) {
 | |
| 		beginRemoveRows(QModelIndex(), 0, rows - 1);
 | |
| 		endRemoveRows();
 | |
| 	}
 | |
| }
 | |
| 
 | |
| QVariant WeightModel::data(const QModelIndex &index, int role) const
 | |
| {
 | |
| 	QVariant ret;
 | |
| 	if (!index.isValid() || index.row() >= MAX_WEIGHTSYSTEMS)
 | |
| 		return ret;
 | |
| 
 | |
| 	weightsystem_t *ws = &displayed_dive.weightsystem[index.row()];
 | |
| 
 | |
| 	switch (role) {
 | |
| 	case Qt::FontRole:
 | |
| 		ret = defaultModelFont();
 | |
| 		break;
 | |
| 	case Qt::TextAlignmentRole:
 | |
| 		ret = Qt::AlignCenter;
 | |
| 		break;
 | |
| 	case Qt::DisplayRole:
 | |
| 	case Qt::EditRole:
 | |
| 		switch (index.column()) {
 | |
| 		case TYPE:
 | |
| 			ret = gettextFromC::instance()->tr(ws->description);
 | |
| 			break;
 | |
| 		case WEIGHT:
 | |
| 			ret = get_weight_string(ws->weight, true);
 | |
| 			break;
 | |
| 		}
 | |
| 		break;
 | |
| 	case Qt::DecorationRole:
 | |
| 		if (index.column() == REMOVE)
 | |
| 			ret = trashIcon();
 | |
| 		break;
 | |
| 	case Qt::SizeHintRole:
 | |
| 		if (index.column() == REMOVE)
 | |
| 			ret = trashIcon().size();
 | |
| 		break;
 | |
| 	case Qt::ToolTipRole:
 | |
| 		if (index.column() == REMOVE)
 | |
| 			ret = tr("Clicking here will remove this weight system.");
 | |
| 		break;
 | |
| 	}
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| // this is our magic 'pass data in' function that allows the delegate to get
 | |
| // the data here without silly unit conversions;
 | |
| // so we only implement the two columns we care about
 | |
| void WeightModel::passInData(const QModelIndex &index, const QVariant &value)
 | |
| {
 | |
| 	weightsystem_t *ws = &displayed_dive.weightsystem[index.row()];
 | |
| 	if (index.column() == WEIGHT) {
 | |
| 		if (ws->weight.grams != value.toInt()) {
 | |
| 			ws->weight.grams = value.toInt();
 | |
| 			dataChanged(index, index);
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| bool WeightModel::setData(const QModelIndex &index, const QVariant &value, int role)
 | |
| {
 | |
| 	QString vString = value.toString();
 | |
| 	weightsystem_t *ws = &displayed_dive.weightsystem[index.row()];
 | |
| 	switch (index.column()) {
 | |
| 	case TYPE:
 | |
| 		if (!value.isNull()) {
 | |
| 			//TODO: C-function weigth_system_set_description ?
 | |
| 			if (!ws->description || gettextFromC::instance()->tr(ws->description) != vString) {
 | |
| 				// loop over translations to see if one matches
 | |
| 				int i = -1;
 | |
| 				while (ws_info[++i].name) {
 | |
| 					if (gettextFromC::instance()->tr(ws_info[i].name) == vString) {
 | |
| 						ws->description = copy_string(ws_info[i].name);
 | |
| 						break;
 | |
| 					}
 | |
| 				}
 | |
| 				if (ws_info[i].name == NULL) // didn't find a match
 | |
| 					ws->description = strdup(vString.toUtf8().constData());
 | |
| 				changed = true;
 | |
| 			}
 | |
| 		}
 | |
| 		break;
 | |
| 	case WEIGHT:
 | |
| 		if (CHANGED()) {
 | |
| 			ws->weight = string_to_weight(vString.toUtf8().data());
 | |
| 			// now update the ws_info
 | |
| 			changed = true;
 | |
| 			WSInfoModel *wsim = WSInfoModel::instance();
 | |
| 			QModelIndexList matches = wsim->match(wsim->index(0, 0), Qt::DisplayRole, gettextFromC::instance()->tr(ws->description));
 | |
| 			if (!matches.isEmpty())
 | |
| 				wsim->setData(wsim->index(matches.first().row(), WSInfoModel::GR), ws->weight.grams);
 | |
| 		}
 | |
| 		break;
 | |
| 	}
 | |
| 	dataChanged(index, index);
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| Qt::ItemFlags WeightModel::flags(const QModelIndex &index) const
 | |
| {
 | |
| 	if (index.column() == REMOVE)
 | |
| 		return Qt::ItemIsEnabled;
 | |
| 	return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
 | |
| }
 | |
| 
 | |
| int WeightModel::rowCount(const QModelIndex &parent) const
 | |
| {
 | |
| 	return rows;
 | |
| }
 | |
| 
 | |
| void WeightModel::add()
 | |
| {
 | |
| 	if (rows >= MAX_WEIGHTSYSTEMS)
 | |
| 		return;
 | |
| 
 | |
| 	int row = rows;
 | |
| 	beginInsertRows(QModelIndex(), row, row);
 | |
| 	rows++;
 | |
| 	changed = true;
 | |
| 	endInsertRows();
 | |
| }
 | |
| 
 | |
| void WeightModel::updateDive()
 | |
| {
 | |
| 	clear();
 | |
| 	rows = 0;
 | |
| 	for (int i = 0; i < MAX_WEIGHTSYSTEMS; i++) {
 | |
| 		if (!weightsystem_none(&displayed_dive.weightsystem[i])) {
 | |
| 			rows = i + 1;
 | |
| 		}
 | |
| 	}
 | |
| 	if (rows > 0) {
 | |
| 		beginInsertRows(QModelIndex(), 0, rows - 1);
 | |
| 		endInsertRows();
 | |
| 	}
 | |
| }
 |