diff options
-rw-r--r-- | qt-ui/diveplanner.cpp | 128 | ||||
-rw-r--r-- | qt-ui/diveplanner.h | 37 | ||||
-rw-r--r-- | qt-ui/diveplanner.ui | 18 |
3 files changed, 181 insertions, 2 deletions
diff --git a/qt-ui/diveplanner.cpp b/qt-ui/diveplanner.cpp index 03b1a2043..ad950f262 100644 --- a/qt-ui/diveplanner.cpp +++ b/qt-ui/diveplanner.cpp @@ -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))); diff --git a/qt-ui/diveplanner.h b/qt-ui/diveplanner.h index 1393d9f78..84ac4a817 100644 --- a/qt-ui/diveplanner.h +++ b/qt-ui/diveplanner.h @@ -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: diff --git a/qt-ui/diveplanner.ui b/qt-ui/diveplanner.ui index 558be069d..986f1b9d5 100644 --- a/qt-ui/diveplanner.ui +++ b/qt-ui/diveplanner.ui @@ -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"> |