Allow editing sensors through equipment tab

Add a column to the equipment table that shows if a sensor is attached to a
tank, or which sensors would be available to attach to a tank that currently
doesn't have a pressure sensor associated with it.

Changing the sensor assignement can be undone.

This column is hidden by default as this is a somewhat unusual activity.

Signed-off-by: Michael Andreen <michael@andreen.dev>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Michael Andreen 2022-02-19 18:47:25 +01:00 committed by Dirk Hohndel
parent ec96cbaab5
commit 9b4263aa87
10 changed files with 130 additions and 3 deletions

View file

@ -314,6 +314,11 @@ int editCylinder(int index, cylinder_t cyl, EditCylinderType type, bool currentD
return execute_edit(new EditCylinder(index, cyl, type, currentDiveOnly));
}
void editSensors(int toCylinder, const int fromCylinder)
{
execute(new EditSensors(toCylinder, fromCylinder));
}
// Trip editing related commands
void editTripLocation(dive_trip *trip, const QString &s)
{

View file

@ -111,6 +111,7 @@ enum class EditCylinderType {
GASMIX
};
int editCylinder(int index, cylinder_t cyl, EditCylinderType type, bool currentDiveOnly);
void editSensors(int toCylinder, const int fromCylinder);
#ifdef SUBSURFACE_MOBILE
// Edits a dive and creates a divesite (if createDs != NULL) or edits a divesite (if changeDs != NULL).
// Takes ownership of newDive and createDs!

View file

@ -4,6 +4,7 @@
#include "core/divelist.h"
#include "core/fulltext.h"
#include "core/qthelper.h" // for copy_qstring
#include "core/sample.h"
#include "core/selection.h"
#include "core/subsurface-string.h"
#include "core/tag.h"
@ -1360,6 +1361,43 @@ void EditCylinder::undo()
redo();
}
EditSensors::EditSensors(int toCylinderIn, int fromCylinderIn)
: dc(current_dc), d(current_dive), toCylinder(toCylinderIn), fromCylinder(fromCylinderIn)
{
if (!d || !dc)
return;
setText(Command::Base::tr("Edit sensors"));
}
void EditSensors::mapSensors(int toCyl, int fromCyl)
{
for (int i = 0; i < dc->samples; ++i) {
for (int s = 0; s < MAX_SENSORS; ++s) {
if (dc->sample[i].pressure[s].mbar && dc->sample[i].sensor[s] == fromCyl)
dc->sample[i].sensor[s] = toCyl;
}
}
emit diveListNotifier.diveComputerEdited(dc);
invalidate_dive_cache(d); // Ensure that dive is written in git_save()
}
void EditSensors::undo()
{
mapSensors(fromCylinder, toCylinder);
}
void EditSensors::redo()
{
mapSensors(toCylinder, fromCylinder);
}
bool EditSensors::workToBeDone()
{
return d && dc;
}
#ifdef SUBSURFACE_MOBILE
EditDive::EditDive(dive *oldDiveIn, dive *newDiveIn, dive_site *createDs, dive_site *editDs, location_t dsLocationIn)

View file

@ -440,6 +440,22 @@ private:
void redo() override;
};
class EditSensors : public Base
{
public:
EditSensors(int cylIndex, int fromCylinder);
private:
struct divecomputer *dc;
struct dive *d;
int toCylinder;
int fromCylinder;
void mapSensors(int toCyl, int fromCyl);
void undo() override;
void redo() override;
bool workToBeDone() override;
};
#ifdef SUBSURFACE_MOBILE
// Edit a full dive. This is used on mobile where we don't have per-field granularity.
// It may add or edit a dive site.