aboutsummaryrefslogtreecommitdiffstats
path: root/qt-ui
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2014-03-31 22:18:00 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-03-31 22:18:00 -0700
commit0de21c24fa0bfdad5a828a39821c7761ecc2f946 (patch)
tree30d6a5bb9bc3bd8a1ddeae731ce72d749b002030 /qt-ui
parent45767961e88c85eb3bf3f8cbff1c9c675eca4904 (diff)
parent18ec989ef51b5357d76db85d467626141d5e2429 (diff)
downloadsubsurface-0de21c24fa0bfdad5a828a39821c7761ecc2f946.tar.gz
Merge branch 'planner-mods'
Nothing exciting here, just a few independent changes close to each other. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-ui')
-rw-r--r--qt-ui/diveplanner.cpp148
-rw-r--r--qt-ui/diveplanner.h39
-rw-r--r--qt-ui/diveplanner.ui18
-rw-r--r--qt-ui/mainwindow.cpp2
4 files changed, 196 insertions, 11 deletions
diff --git a/qt-ui/diveplanner.cpp b/qt-ui/diveplanner.cpp
index ac2662c2b..a7d5ee7c6 100644
--- a/qt-ui/diveplanner.cpp
+++ b/qt-ui/diveplanner.cpp
@@ -41,6 +41,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),
@@ -391,16 +509,16 @@ void DivePlannerGraphics::mouseDoubleClickEvent(QMouseEvent *event)
int minutes = rint(timeLine->valueAt(mappedPos));
int milimeters = rint(depthLine->valueAt(mappedPos) / M_OR_FT(1, 1)) * M_OR_FT(1, 1);
- plannerModel->addStop(milimeters, minutes * 60, -1, 0, 0);
+ plannerModel->addStop(milimeters, minutes * 60, -1, 0, 0, true);
}
void DivePlannerPointsModel::createSimpleDive()
{
// plannerModel->addStop(0, 0, O2_IN_AIR, 0, 0);
- plannerModel->addStop(M_OR_FT(15, 45), 1 * 60, O2_IN_AIR, 0, 0);
- plannerModel->addStop(M_OR_FT(15, 45), 40 * 60, O2_IN_AIR, 0, 0);
- plannerModel->addStop(M_OR_FT(5, 15), 42 * 60, O2_IN_AIR, 0, 0);
- plannerModel->addStop(M_OR_FT(5, 15), 45 * 60, O2_IN_AIR, 0, 0);
+ plannerModel->addStop(M_OR_FT(15, 45), 1 * 60, O2_IN_AIR, 0, 0, true);
+ plannerModel->addStop(M_OR_FT(15, 45), 40 * 60, O2_IN_AIR, 0, 0, true);
+ plannerModel->addStop(M_OR_FT(5, 15), 42 * 60, O2_IN_AIR, 0, 0, true);
+ plannerModel->addStop(M_OR_FT(5, 15), 45 * 60, O2_IN_AIR, 0, 0, true);
}
void DivePlannerPointsModel::loadFromDive(dive *d)
@@ -421,7 +539,7 @@ void DivePlannerPointsModel::loadFromDive(dive *d)
if (s.time.seconds == 0)
continue;
get_gas_from_events(&backupDive.dc, lasttime, &o2, &he);
- plannerModel->addStop(s.depth.mm, s.time.seconds, o2, he, 0);
+ plannerModel->addStop(s.depth.mm, s.time.seconds, o2, he, 0, true);
lasttime = s.time.seconds;
}
}
@@ -510,6 +628,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;
@@ -520,12 +639,20 @@ void DivePlannerGraphics::drawProfile()
item->setPen(QPen(QBrush(Qt::red), 0));
scene()->addItem(item);
lines << item;
+ 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;
poly.append(QPointF(lastx, lasty));
}
+ qDebug() << " ";
+ plannerDisplay->addStops();
+
diveBg->setPolygon(poly);
QRectF b = poly.boundingRect();
QLinearGradient pat(
@@ -932,6 +1059,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();
@@ -952,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)));
@@ -1186,7 +1316,7 @@ bool DivePlannerPointsModel::addGas(int o2, int he)
return false;
}
-int DivePlannerPointsModel::addStop(int milimeters, int seconds, int o2, int he, int ccpoint)
+int DivePlannerPointsModel::addStop(int milimeters, int seconds, int o2, int he, int ccpoint, bool entered)
{
int row = divepoints.count();
if (seconds == 0 && milimeters == 0 && row != 0) {
@@ -1253,6 +1383,7 @@ int DivePlannerPointsModel::addStop(int milimeters, int seconds, int o2, int he,
point.o2 = o2;
point.he = he;
point.po2 = ccpoint;
+ point.entered = entered;
divepoints.append(point);
std::sort(divepoints.begin(), divepoints.end(), divePointsLessThan);
endInsertRows();
@@ -1410,7 +1541,8 @@ void DivePlannerPointsModel::createTemporaryPlan()
divedatapoint p = at(i);
int deltaT = lastIndex != -1 ? p.time - at(lastIndex).time : p.time;
lastIndex = i;
- plan_add_segment(&diveplan, deltaT, p.depth, p.o2, p.he, p.po2);
+ p.entered = true;
+ plan_add_segment(&diveplan, deltaT, p.depth, p.o2, p.he, p.po2, true);
}
char *cache = NULL;
tempDive = NULL;
diff --git a/qt-ui/diveplanner.h b/qt-ui/diveplanner.h
index 4679d0660..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:
@@ -57,7 +94,7 @@ public:
public
slots:
- int addStop(int millimeters = 0, int seconds = 0, int o2 = 0, int he = 0, int ccpoint = 0);
+ int addStop(int millimeters = 0, int seconds = 0, int o2 = 0, int he = 0, int ccpoint = 0, bool entered = true);
void addCylinder_clicked();
void setGFHigh(const int gfhigh);
void setGFLow(const int ghflow);
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">
diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp
index 53f7a15df..b63225295 100644
--- a/qt-ui/mainwindow.cpp
+++ b/qt-ui/mainwindow.cpp
@@ -85,7 +85,7 @@ MainWindow::MainWindow() : QMainWindow(),
ui.divePlannerWidget->settingsChanged();
#ifndef ENABLE_PLANNER
- ui.menuLog->removeAction(ui.actionDivePlanner);
+// ui.menuLog->removeAction(ui.actionDivePlanner);
#endif
#ifdef NO_MARBLE
ui.layoutWidget->hide();