#include "divecomputermodel.h" #include "dive.h" #include "divelist.h" DiveComputerModel::DiveComputerModel(QMultiMap &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 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 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 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 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; }