mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
crash fix: Don't cast to CylindersModel or CylindersModelFiltered
The tank-info-delegate cast its model to CylindersModelFiltered, since this is what the equipment-tab uses since implementing the filtering of unused cylinders. However, the planner users the same delegate and still uses the unfiltered CylindersModel. This means that the (dynamic) cast returns a null pointer and crashes. One possibility would be to derive CylindersModelFiltered and CylindersModel from the same class that defines virtual functions and cast to that class. This is a different attempt: don't cast (i.e. stay with a QAbstractItemModel and play it via Qt's model-view system. Firstly, replace the passInData function by a role to setData(). Secondly, read the working-pressure and size via new columns using data(). Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
9214bdb3c5
commit
cb80ff746b
3 changed files with 44 additions and 40 deletions
|
@ -236,6 +236,10 @@ QVariant CylindersModel::data(const QModelIndex &index, int role) const
|
|||
break;
|
||||
case USE:
|
||||
return gettextFromC::tr(cylinderuse_text[cyl->cylinder_use]);
|
||||
case WORKINGPRESS_INT:
|
||||
return static_cast<int>(cyl->type.workingpressure.mbar);
|
||||
case SIZE_INT:
|
||||
return static_cast<int>(cyl->type.size.mliter);
|
||||
}
|
||||
break;
|
||||
case Qt::DecorationRole:
|
||||
|
@ -283,33 +287,35 @@ cylinder_t *CylindersModel::cylinderAt(const QModelIndex &index)
|
|||
return get_cylinder(&displayed_dive, index.row());
|
||||
}
|
||||
|
||||
// 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 CylindersModel::passInData(const QModelIndex &index, const QVariant &value)
|
||||
{
|
||||
cylinder_t *cyl = cylinderAt(index);
|
||||
switch (index.column()) {
|
||||
case SIZE:
|
||||
if (cyl->type.size.mliter != value.toInt()) {
|
||||
cyl->type.size.mliter = value.toInt();
|
||||
dataChanged(index, index);
|
||||
}
|
||||
break;
|
||||
case WORKINGPRESS:
|
||||
if (cyl->type.workingpressure.mbar != value.toInt()) {
|
||||
cyl->type.workingpressure.mbar = value.toInt();
|
||||
dataChanged(index, index);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool CylindersModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||
{
|
||||
QString vString;
|
||||
|
||||
cylinder_t *cyl = cylinderAt(index);
|
||||
if (!cyl)
|
||||
return false;
|
||||
|
||||
if (role == PASS_IN_ROLE) {
|
||||
// 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
|
||||
switch (index.column()) {
|
||||
case SIZE:
|
||||
if (cyl->type.size.mliter != value.toInt()) {
|
||||
cyl->type.size.mliter = value.toInt();
|
||||
dataChanged(index, index);
|
||||
}
|
||||
return true;
|
||||
case WORKINGPRESS:
|
||||
if (cyl->type.workingpressure.mbar != value.toInt()) {
|
||||
cyl->type.workingpressure.mbar = value.toInt();
|
||||
dataChanged(index, index);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (index.column()) {
|
||||
case TYPE:
|
||||
if (!value.isNull()) {
|
||||
|
@ -641,11 +647,6 @@ void CylindersModelFiltered::remove(QModelIndex index)
|
|||
source.remove(mapToSource(index));
|
||||
}
|
||||
|
||||
void CylindersModelFiltered::passInData(const QModelIndex &index, const QVariant &value)
|
||||
{
|
||||
source.passInData(mapToSource(index), value);
|
||||
}
|
||||
|
||||
cylinder_t *CylindersModelFiltered::cylinderAt(const QModelIndex &index)
|
||||
{
|
||||
return source.cylinderAt(mapToSource(index));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue