mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +00:00
764aa6c512
The way the starting time of a new plan was set was bonkers: 1) PlannerWidgets::planDive() invokes DivePlannerPointsModel:: createSimpleDive(). 2) createSimpleDive() calls DivePlannerPointsModel:: setupStartTime() 3) setupStartTime() emits a signal startTimeChanged() 4) startTimeChanged is caught by PlannerWidget and sets the UI field 5) change of the UI field emits a timeChanged() signal which is connected to DivePlannerPointsModel::setStartTime() 6) setStartTime() sets the time of the plan and displayed_dive and emits dataChanged() 7) dataChanged() replots the dive() 8) Back in DivePlannerPointsModel::createSimpleDive() the diveplan start time is overwritten with displayed_dive (the value are equal owing to 6) Wow! But it gets worse: 9) The initial dive plan is set up in createSimpleDive(). Since the profile is drawn in 7) after clearing the displayed_dive and before constructing the initial plan, the profile is shown on a dive without samples. It therefore generates a dummy profile. To make this somewhat less insane, remove the startTimeChanged() signal in 3), explicitly set the start time of plan and dive to the one calculated by setupStartTime() and explicitly set the UI filed in the plannerWidget. This still indirectly draws the profile via signals in a convoluted way, but at it straightens out things somewhat. Most importantly, the profile doesn't have to generate a fake DC. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
142 lines
4.2 KiB
C++
142 lines
4.2 KiB
C++
// SPDX-License-Identifier: GPL-2.0
|
|
#ifndef DIVEPLANNERMODEL_H
|
|
#define DIVEPLANNERMODEL_H
|
|
|
|
#include <QAbstractTableModel>
|
|
#include <QDateTime>
|
|
|
|
#include "core/deco.h"
|
|
#include "core/planner.h"
|
|
#include "qt-models/cylindermodel.h"
|
|
|
|
class DivePlannerPointsModel : public QAbstractTableModel {
|
|
Q_OBJECT
|
|
public:
|
|
static DivePlannerPointsModel *instance();
|
|
enum Sections {
|
|
REMOVE,
|
|
DEPTH,
|
|
DURATION,
|
|
RUNTIME,
|
|
GAS,
|
|
CCSETPOINT,
|
|
DIVEMODE,
|
|
COLUMNS
|
|
};
|
|
enum Mode {
|
|
NOTHING,
|
|
PLAN,
|
|
ADD
|
|
};
|
|
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
|
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
|
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
|
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
|
|
Qt::ItemFlags flags(const QModelIndex &index) const override;
|
|
void gasChange(const QModelIndex &index, int newcylinderid);
|
|
void cylinderRenumber(int mapping[]);
|
|
void removeSelectedPoints(const QVector<int> &rows);
|
|
void setPlanMode(Mode mode);
|
|
bool isPlanner();
|
|
void createSimpleDive();
|
|
void setupStartTime();
|
|
void clear();
|
|
Mode currentMode() const;
|
|
bool setRecalc(bool recalc);
|
|
bool recalcQ();
|
|
bool tankInUse(int cylinderid);
|
|
void setupCylinders();
|
|
bool updateMaxDepth();
|
|
CylindersModel *cylindersModel();
|
|
|
|
int ascrate75Display();
|
|
int ascrate50Display();
|
|
int ascratestopsDisplay();
|
|
int ascratelast6mDisplay();
|
|
int descrateDisplay();
|
|
|
|
/**
|
|
* @return the row number.
|
|
*/
|
|
void editStop(int row, divedatapoint newData);
|
|
divedatapoint at(int row);
|
|
int size();
|
|
struct diveplan &getDiveplan();
|
|
int lastEnteredPoint();
|
|
void removeDeco();
|
|
static bool addingDeco;
|
|
struct deco_state final_deco_state;
|
|
|
|
public
|
|
slots:
|
|
int addStop(int millimeters = 0, int seconds = 0, int cylinderid_in = -1, int ccpoint = 0, bool entered = true, enum divemode_t = UNDEF_COMP_TYPE);
|
|
void addCylinder_clicked();
|
|
void setGFHigh(const int gfhigh);
|
|
void setGFLow(const int gflow);
|
|
void setVpmbConservatism(int level);
|
|
void setSurfacePressure(int pressure);
|
|
void setSalinity(int salinity);
|
|
int getSurfacePressure();
|
|
void setBottomSac(double sac);
|
|
void setDecoSac(double sac);
|
|
void setStartTime(const QTime &t);
|
|
void setStartDate(const QDate &date);
|
|
void setLastStop6m(bool value);
|
|
void setDropStoneMode(bool value);
|
|
void setVerbatim(bool value);
|
|
void setDisplayRuntime(bool value);
|
|
void setDisplayDuration(bool value);
|
|
void setDisplayTransitions(bool value);
|
|
void setDisplayVariations(bool value);
|
|
void setDecoMode(int mode);
|
|
void setSafetyStop(bool value);
|
|
void savePlan();
|
|
void saveDuplicatePlan();
|
|
void remove(const QModelIndex &index);
|
|
void cancelPlan();
|
|
void createTemporaryPlan();
|
|
void deleteTemporaryPlan();
|
|
void loadFromDive(dive *d);
|
|
void emitDataChanged();
|
|
void setRebreatherMode(int mode);
|
|
void setReserveGas(int reserve);
|
|
void setSwitchAtReqStop(bool value);
|
|
void setMinSwitchDuration(int duration);
|
|
void setSurfaceSegment(int duration);
|
|
void setSacFactor(double factor);
|
|
void setProblemSolvingTime(int minutes);
|
|
void setAscrate75Display(int rate);
|
|
void setAscrate50Display(int rate);
|
|
void setAscratestopsDisplay(int rate);
|
|
void setAscratelast6mDisplay(int rate);
|
|
void setDescrateDisplay(int rate);
|
|
|
|
signals:
|
|
void planCreated();
|
|
void planCanceled();
|
|
void cylinderModelEdited();
|
|
void recreationChanged(bool);
|
|
void calculatedPlanNotes(QString);
|
|
void variationsComputed(QString);
|
|
|
|
private:
|
|
explicit DivePlannerPointsModel(QObject *parent = 0);
|
|
void createPlan(bool replanCopy);
|
|
struct diveplan diveplan;
|
|
struct divedatapoint *cloneDiveplan(struct diveplan *plan_src, struct diveplan *plan_copy);
|
|
void computeVariationsDone(QString text);
|
|
void computeVariations(struct diveplan *diveplan, const struct deco_state *ds);
|
|
void computeVariationsFreeDeco(struct diveplan *diveplan, struct deco_state *ds);
|
|
int analyzeVariations(struct decostop *min, struct decostop *mid, struct decostop *max, const char *unit);
|
|
CylindersModel cylinders;
|
|
Mode mode;
|
|
bool recalc;
|
|
QVector<divedatapoint> divepoints;
|
|
QDateTime startTime;
|
|
int instanceCounter = 0;
|
|
struct deco_state ds_after_previous_dives;
|
|
duration_t preserved_until;
|
|
};
|
|
|
|
#endif
|