mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 05:00:20 +00:00
Diveplan with entered and computed waypoints to UI
Recently Robert Helling provided a patch "Distinguish between entered and calculated waypoints" in an attempt to distinguish between entered and calculated stops. This patch is an independent (content wise) extension of the above patch and is built relative to it which adds new table to display computed waypoints in plan mode. Currently table includes only two columns "Comp. Depth" and "Comp. Duration", which can extended to show further information. This is only a start to the UI interaction in PLAN mode. In addition to this there are many TODO things that diveplan feature demands TODO: 1. Show more details through "Computed Waypoints" table. 2. Remove tooltip from "Computed Waypoints" table widget. 3. Make contents in "Computed Waypoints" table widget non-editable. 4. Fix error when trying to save dive plan without using cylinder data. 5. Make dive plan editable after saving it. 6. Improvise dive planner graphics window. Signed-off-by: Lakshman Anumolu <acrlakshman@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
30bdfc8160
commit
18ec989ef5
3 changed files with 181 additions and 2 deletions
|
@ -42,6 +42,124 @@ QString dpGasToStr(const divedatapoint &p)
|
|||
return gasToStr(p.o2, p.he);
|
||||
}
|
||||
|
||||
static DivePlannerDisplay *plannerDisplay = DivePlannerDisplay::instance();
|
||||
|
||||
DivePlannerDisplay::DivePlannerDisplay(QObject *parent) : QAbstractTableModel(parent)
|
||||
{
|
||||
}
|
||||
|
||||
DivePlannerDisplay *DivePlannerDisplay::instance()
|
||||
{
|
||||
static QScopedPointer<DivePlannerDisplay> self(new DivePlannerDisplay());
|
||||
return self.data();
|
||||
}
|
||||
|
||||
int DivePlannerDisplay::size()
|
||||
{
|
||||
return computedPoints.size();
|
||||
}
|
||||
|
||||
int DivePlannerDisplay::columnCount(const QModelIndex &parent) const
|
||||
{
|
||||
return COLUMNS;
|
||||
}
|
||||
|
||||
QVariant DivePlannerDisplay::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (role == Qt::DisplayRole) {
|
||||
computedPoint p = computedPoints.at(index.row());
|
||||
switch (index.column()) {
|
||||
case COMPUTED_DEPTH:
|
||||
return rint(get_depth_units(p.computedDepth, NULL, NULL));
|
||||
case COMPUTED_DURATION:
|
||||
return p.computedTime / 60;
|
||||
}
|
||||
} else if (role == Qt::DecorationRole) {
|
||||
switch (index.column()) {
|
||||
}
|
||||
} else if (role == Qt::FontRole) {
|
||||
return defaultModelFont();
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
bool DivePlannerDisplay::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||
{
|
||||
if (role == Qt::EditRole) {
|
||||
computedPoint &p = computedPoints[index.row()];
|
||||
switch (index.column()) {
|
||||
case COMPUTED_DEPTH:
|
||||
p.computedDepth = units_to_depth(value.toInt());
|
||||
break;
|
||||
case COMPUTED_DURATION:
|
||||
p.computedTime = value.toInt() * 60;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return QAbstractItemModel::setData(index, value, role);
|
||||
}
|
||||
|
||||
QVariant DivePlannerDisplay::headerData(int section, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
|
||||
switch (section) {
|
||||
case COMPUTED_DEPTH:
|
||||
return tr("Comp. Depth");
|
||||
case COMPUTED_DURATION:
|
||||
return tr("Comp. Duration");
|
||||
}
|
||||
} else if (role == Qt::FontRole) {
|
||||
return defaultModelFont();
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
Qt::ItemFlags DivePlannerDisplay::flags(const QModelIndex &index) const
|
||||
{
|
||||
return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
|
||||
}
|
||||
|
||||
int DivePlannerDisplay::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
return computedPoints.size();
|
||||
}
|
||||
|
||||
struct computedPoint DivePlannerDisplay::at(int row)
|
||||
{
|
||||
return computedPoints.at(row);
|
||||
}
|
||||
|
||||
void DivePlannerDisplay::clear()
|
||||
{
|
||||
if (rowCount() > 0) {
|
||||
beginRemoveRows(QModelIndex(), 0, rowCount() - 1);
|
||||
computedPoints.clear();
|
||||
endRemoveRows();
|
||||
}
|
||||
}
|
||||
|
||||
void DivePlannerDisplay::removeStops()
|
||||
{
|
||||
if (rowCount() > 0) {
|
||||
beginRemoveRows(QModelIndex(), 0, rowCount() - 1);
|
||||
endRemoveRows();
|
||||
}
|
||||
}
|
||||
|
||||
void DivePlannerDisplay::addStops()
|
||||
{
|
||||
int rows = computedPoints.size();
|
||||
if (rows > 0) {
|
||||
beginInsertRows(QModelIndex(), 0, rows - 1);
|
||||
endInsertRows();
|
||||
}
|
||||
}
|
||||
|
||||
void DivePlannerDisplay::insertPoint(const struct computedPoint &p)
|
||||
{
|
||||
computedPoints.append(p);
|
||||
}
|
||||
|
||||
static DivePlannerPointsModel *plannerModel = DivePlannerPointsModel::instance();
|
||||
|
||||
DivePlannerGraphics::DivePlannerGraphics(QWidget *parent) : QGraphicsView(parent),
|
||||
|
@ -511,6 +629,7 @@ void DivePlannerGraphics::drawProfile()
|
|||
QPolygonF poly;
|
||||
poly.append(QPointF(lastx, lasty));
|
||||
|
||||
plannerDisplay->clear();
|
||||
for (dp = diveplan.dp; dp != NULL; dp = dp->next) {
|
||||
if (dp->time == 0) // magic entry for available tank
|
||||
continue;
|
||||
|
@ -521,8 +640,11 @@ void DivePlannerGraphics::drawProfile()
|
|||
item->setPen(QPen(QBrush(Qt::red), 0));
|
||||
scene()->addItem(item);
|
||||
lines << item;
|
||||
if (dp->depth)
|
||||
if (dp->depth) {
|
||||
qDebug() << "Time: " << dp->time / 60 << " depth: " << dp->depth / 1000;
|
||||
computedPoint p(dp->time, dp->depth);
|
||||
plannerDisplay->insertPoint(p);
|
||||
}
|
||||
}
|
||||
lastx = xpos;
|
||||
lasty = ypos;
|
||||
|
@ -530,6 +652,7 @@ void DivePlannerGraphics::drawProfile()
|
|||
}
|
||||
|
||||
qDebug() << " ";
|
||||
plannerDisplay->addStops();
|
||||
|
||||
diveBg->setPolygon(poly);
|
||||
QRectF b = poly.boundingRect();
|
||||
|
@ -937,6 +1060,8 @@ DivePlannerWidget::DivePlannerWidget(QWidget *parent, Qt::WindowFlags f) : QWidg
|
|||
ui.tableWidget->setTitle(tr("Dive Planner Points"));
|
||||
ui.tableWidget->setModel(DivePlannerPointsModel::instance());
|
||||
ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::GAS, new AirTypesDelegate(this));
|
||||
ui.tableWidgetComp->setTitle(tr("Computed Waypoints"));
|
||||
ui.tableWidgetComp->setModel(DivePlannerDisplay::instance());
|
||||
ui.cylinderTableWidget->setTitle(tr("Available Gases"));
|
||||
ui.cylinderTableWidget->setModel(CylindersModel::instance());
|
||||
QTableView *view = ui.cylinderTableWidget->view();
|
||||
|
@ -956,6 +1081,7 @@ DivePlannerWidget::DivePlannerWidget(QWidget *parent, Qt::WindowFlags f) : QWidg
|
|||
GasSelectionModel::instance(), SLOT(repopulate()));
|
||||
|
||||
ui.tableWidget->setBtnToolTip(tr("add dive data point"));
|
||||
ui.tableWidgetComp->setBtnToolTip(tr("This does nothing, and should be removed"));
|
||||
connect(ui.startTime, SIGNAL(timeChanged(QTime)), plannerModel, SLOT(setStartTime(QTime)));
|
||||
connect(ui.ATMPressure, SIGNAL(textChanged(QString)), this, SLOT(atmPressureChanged(QString)));
|
||||
connect(ui.bottomSAC, SIGNAL(textChanged(QString)), this, SLOT(bottomSacChanged(QString)));
|
||||
|
|
|
@ -12,6 +12,43 @@
|
|||
class QListView;
|
||||
class QModelIndex;
|
||||
|
||||
struct computedPoint {
|
||||
int computedTime;
|
||||
unsigned int computedDepth;
|
||||
computedPoint(int computedTime_, unsigned int computedDepth_) {
|
||||
computedTime = computedTime_;
|
||||
computedDepth = computedDepth_;
|
||||
};
|
||||
computedPoint() {};
|
||||
};
|
||||
|
||||
class DivePlannerDisplay : public QAbstractTableModel {
|
||||
Q_OBJECT
|
||||
private:
|
||||
explicit DivePlannerDisplay(QObject *parent = 0);
|
||||
QVector<computedPoint> computedPoints;
|
||||
|
||||
public:
|
||||
static DivePlannerDisplay *instance();
|
||||
enum Sections {
|
||||
COMPUTED_DEPTH,
|
||||
COMPUTED_DURATION,
|
||||
COLUMNS
|
||||
};
|
||||
virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
|
||||
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
|
||||
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
|
||||
virtual Qt::ItemFlags flags(const QModelIndex &index) const;
|
||||
void clear();
|
||||
computedPoint at(int row);
|
||||
int size();
|
||||
void removeStops();
|
||||
void addStops();
|
||||
void insertPoint(const struct computedPoint &p);
|
||||
};
|
||||
|
||||
class DivePlannerPointsModel : public QAbstractTableModel {
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
|
|
@ -142,7 +142,7 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0" colspan="2">
|
||||
<item row="8" column="0" colspan="1">
|
||||
<widget class="TableView" name="tableWidget" native="true">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
|
||||
|
@ -158,6 +158,22 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="1" colspan="1">
|
||||
<widget class="TableView" name="tableWidgetComp" native="true">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>50</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="0" colspan="2">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="standardButtons">
|
||||
|
|
Loading…
Reference in a new issue