diff options
-rw-r--r-- | Documentation/Makefile | 8 | ||||
-rw-r--r-- | Documentation/user-manual.txt | 4 | ||||
-rw-r--r-- | planner.c | 3 | ||||
-rw-r--r-- | qt-ui/diveplanner.cpp | 12 | ||||
-rw-r--r-- | qt-ui/diveplanner.h | 2 | ||||
-rw-r--r-- | qt-ui/maintab.cpp | 2 | ||||
-rw-r--r-- | qt-ui/mainwindow.cpp | 86 | ||||
-rw-r--r-- | qt-ui/mainwindow.h | 3 | ||||
-rw-r--r-- | qt-ui/models.cpp | 6 | ||||
-rw-r--r-- | qt-ui/models.h | 2 | ||||
-rw-r--r-- | qt-ui/profile/profilewidget2.cpp | 21 | ||||
-rw-r--r-- | subsurface.pro | 10 |
12 files changed, 87 insertions, 72 deletions
diff --git a/Documentation/Makefile b/Documentation/Makefile index 611bd2fb0..204aeb8e8 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -15,10 +15,6 @@ A2X = a2x BROWSER = firefox THEME = compact_subsurface PWD = $(realpath .) -ENABLE_PLANNER := 0 -ifeq ($(ENABLE_PLANNER), 1) -ENABLE_PLANNER_ATTR=-a ENABLE_PLANNER=$(ENABLE_PLANNER) -endif all: doc $(addprefix $(DOCNAME).,pdf text) @@ -33,11 +29,11 @@ $(OUT)$(DOCNAME).pdf: $(DOCSOURCE) $(OUT)$(HTMLDOC): $(DOCSOURCE) @echo "if asciidoc isn't found the html file included in the sources is copied" $(ASCIIDOC) -a toc -a toclevels=3 -a themedir=$(PWD) -a theme=$(THEME) -a stylesdir=$(PWD) \ - $(ENABLE_PLANNER_ATTR) -o $(OUT)$(HTMLDOC) $< || cp $(HTMLDOC).git $(OUT)$(HTMLDOC) + -o $(OUT)$(HTMLDOC) $< || cp $(HTMLDOC).git $(OUT)$(HTMLDOC) # Alternatively:: $(OUT)$(DOCNAME).xhtml: $(DOCSOURCE) - $(A2X) $(ENABLE_PLANNER_ATTR) --icons -f xhtml $< + $(A2X) --icons -f xhtml $< show: $(HTMLDOC) $(BROWSER) $< diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt index 748a8c21f..697df1190 100644 --- a/Documentation/user-manual.txt +++ b/Documentation/user-manual.txt @@ -1889,7 +1889,6 @@ language / country settings as the underlying OS. If this is for some reason undesirable users can uncheck this checkbox and pick a language / country combination from the list of included localizations. -ifdef::ENABLE_PLANNER[] [[S_DivePlanner]] == The Subsurface dive planner The dive planner is accessed by selecting _Log -> Plan Dive_ from the main menu. This @@ -1983,7 +1982,6 @@ there is no provision for any reserve gas. image::images/Planner2.jpg["FIGURE: Planning a dive: evaluation",align="center"] This part of the software is in active development. -endif::ENABLE_PLANNER[] == Description of the Subsurface Main Menu items @@ -2023,9 +2021,7 @@ from _www.Divelogs.de_. - <<S_EnterData,_Add Dive_>> - Manually add a new dive to the *Dive List* panel. - <<S_Renumber,_Renumber_>> - Renumber the dives listed in the *Dive List* panel. -ifdef::ENABLE_PLANNER[] -_Plan Dive_ - This experimental feature allows planning of simple dives. -endif::ENABLE_PLANNER[] - <<S_Group,_Auto Group_>> - Group the dives in the *Dive List* panel into dive trips. - _Edit Device Names_ - Edit the names of dive computers. @@ -678,7 +678,8 @@ void plan(struct diveplan *diveplan, char **cached_datap, struct dive **divep, b /* We will break out when we hit the surface */ do { /* Ascend to next stop depth */ - assert(deco_allowed_depth(tissue_tolerance, diveplan->surface_pressure / 1000.0, dive, 1) < depth); + if (deco_allowed_depth(tissue_tolerance, diveplan->surface_pressure / 1000.0, dive, 1) < depth) + fprintf(stderr, "user provided way point above ceiling\n"); int deltad = ascend_velocity(depth, avg_depth, bottom_time) * TIMESTEP; if (ascend_velocity(depth, avg_depth, bottom_time) != last_ascend_rate) { plan_add_segment(diveplan, clock - previous_point_time, depth, o2, he, po2, false); diff --git a/qt-ui/diveplanner.cpp b/qt-ui/diveplanner.cpp index 312a5ffff..c26aa9569 100644 --- a/qt-ui/diveplanner.cpp +++ b/qt-ui/diveplanner.cpp @@ -59,13 +59,15 @@ void DivePlannerPointsModel::removeSelectedPoints(const QVector<int> &rows) endRemoveRows(); } -void DivePlannerPointsModel::createSimpleDive() +void DivePlannerPointsModel::createSimpleDive(bool planner) { // plannerModel->addStop(0, 0, 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); + if (!planner) { + 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) @@ -215,9 +217,7 @@ DivePlannerWidget::DivePlannerWidget(QWidget *parent, Qt::WindowFlags f) : QWidg QTableView *view = ui.cylinderTableWidget->view(); view->setColumnHidden(CylindersModel::START, true); view->setColumnHidden(CylindersModel::END, true); -#ifdef ENABLE_PLANNER view->setColumnHidden(CylindersModel::DEPTH, false); -#endif view->setItemDelegateForColumn(CylindersModel::TYPE, new TankInfoDelegate(this)); connect(ui.cylinderTableWidget, SIGNAL(addButtonClicked()), DivePlannerPointsModel::instance(), SLOT(addCylinder_clicked())); connect(ui.tableWidget, SIGNAL(addButtonClicked()), DivePlannerPointsModel::instance(), SLOT(addStop())); @@ -783,7 +783,7 @@ void DivePlannerPointsModel::createTemporaryPlan() #endif if (plannerModel->recalcQ()) plan(&diveplan, &cache, &tempDive, isPlanner()); - if (mode == ADD) { + if (mode == ADD || mode == PLAN) { // copy the samples and events, but don't overwrite the cylinders copy_samples(tempDive, current_dive); copy_events(tempDive, current_dive); diff --git a/qt-ui/diveplanner.h b/qt-ui/diveplanner.h index 4aa5f0094..781d7c741 100644 --- a/qt-ui/diveplanner.h +++ b/qt-ui/diveplanner.h @@ -39,7 +39,7 @@ public: void removeSelectedPoints(const QVector<int> &rows); void setPlanMode(Mode mode); bool isPlanner(); - void createSimpleDive(); + void createSimpleDive(bool planner = false); void clear(); Mode currentMode() const; bool setRecalc(bool recalc); diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp index 2bb261448..34be53a90 100644 --- a/qt-ui/maintab.cpp +++ b/qt-ui/maintab.cpp @@ -88,9 +88,7 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent), ui.cylinders->view()->setItemDelegateForColumn(CylindersModel::TYPE, new TankInfoDelegate(this)); ui.weights->view()->setItemDelegateForColumn(WeightModel::TYPE, new WSInfoDelegate(this)); -#ifdef ENABLE_PLANNER ui.cylinders->view()->setColumnHidden(CylindersModel::DEPTH, true); -#endif completers.buddy = new QCompleter(&buddyModel, ui.buddy); completers.divemaster = new QCompleter(&diveMasterModel, ui.divemaster); completers.location = new QCompleter(&locationModel, ui.location); diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index 19a16a886..63abd1d30 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -20,6 +20,7 @@ #include <QStringList> #include <QSettings> #include <QShortcut> +#include <fcntl.h> #include "divelistview.h" #include "starwidget.h" @@ -87,9 +88,6 @@ MainWindow::MainWindow() : QMainWindow(), ui.ListWidget->scrollTo(ui.ListWidget->model()->index(0, 0), QAbstractItemView::PositionAtCenter); ui.divePlannerWidget->settingsChanged(); -#ifndef ENABLE_PLANNER - ui.menuLog->removeAction(ui.actionDivePlanner); -#endif #ifdef NO_MARBLE ui.layoutWidget->hide(); ui.menuView->removeAction(ui.actionViewGlobe); @@ -298,29 +296,6 @@ void MainWindow::enableDcShortcuts() ui.actionNextDC->setShortcut(Qt::Key_Right); } -void MainWindow::on_actionDivePlanner_triggered() -{ - int i; - struct dive *dive; - if (DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || - ui.InfoWidget->isEditing()) { - QMessageBox::warning(this, tr("Warning"), tr("Please save or cancel the current dive edit before trying to plan a dive.")); - return; - } - disableDcShortcuts(); - DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::PLAN); - DivePlannerPointsModel::instance()->clear(); - CylindersModel::instance()->clear(); - for_each_dive (i, dive) { - if (dive->selected) { - DivePlannerPointsModel::instance()->copyCylindersFrom(dive); - CylindersModel::instance()->copyFromDive(dive); - break; - } - } - ui.infoPane->setCurrentIndex(PLANNERWIDGET); -} - void MainWindow::showProfile() { enableDcShortcuts(); @@ -381,18 +356,18 @@ void MainWindow::on_actionEditDeviceNames_triggered() DiveComputerManagementDialog::instance()->show(); } -void MainWindow::on_actionAddDive_triggered() +bool MainWindow::plannerStateClean() { if (DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || ui.InfoWidget->isEditing()) { QMessageBox::warning(this, tr("Warning"), tr("Please save or cancel the current dive edit before trying to add a dive.")); - return; + return false; } - dive_list()->rememberSelection(); - dive_list()->unselectDives(); - disableDcShortcuts(); - DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::ADD); + return true; +} +void MainWindow::createFakeDiveForAddAndPlan() +{ // now cheat - create one dive that we use to store the info tab data in //TODO: C-function create_temporary_dive ? struct dive *dive = alloc_dive(); @@ -405,8 +380,53 @@ void MainWindow::on_actionAddDive_triggered() // this isn't in the UI yet, so let's call the C helper function - we'll fix this up when // accepting the dive select_dive(get_divenr(dive)); - ui.InfoWidget->setCurrentIndex(0); ui.InfoWidget->updateDiveInfo(selected_dive); +} + +void MainWindow::on_actionDivePlanner_triggered() +{ + if(!plannerStateClean()) + return; + + dive_list()->rememberSelection(); + dive_list()->unselectDives(); + + DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::ADD); + DivePlannerPointsModel::instance()->clear(); + CylindersModel::instance()->clear(); + int i; + struct dive *dive; + for_each_dive (i, dive) { + if (dive->selected) { + DivePlannerPointsModel::instance()->copyCylindersFrom(dive); + CylindersModel::instance()->copyFromDive(dive); + break; + } + } + createFakeDiveForAddAndPlan(); + + ui.InfoWidget->setCurrentIndex(0); + ui.infoPane->setCurrentIndex(MAINTAB); + + ui.newProfile->setPlanState(); + ui.infoPane->setCurrentIndex(PLANNERWIDGET); + DivePlannerPointsModel::instance()->clear(); + DivePlannerPointsModel::instance()->createSimpleDive(true); + ui.ListWidget->reload(DiveTripModel::CURRENT); +} + +void MainWindow::on_actionAddDive_triggered() +{ + if(!plannerStateClean()) + return; + + dive_list()->rememberSelection(); + dive_list()->unselectDives(); + DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::ADD); + + createFakeDiveForAddAndPlan(); + + ui.InfoWidget->setCurrentIndex(0); ui.InfoWidget->addDiveStarted(); ui.infoPane->setCurrentIndex(MAINTAB); diff --git a/qt-ui/mainwindow.h b/qt-ui/mainwindow.h index a658fe3cc..8bb62b933 100644 --- a/qt-ui/mainwindow.h +++ b/qt-ui/mainwindow.h @@ -172,6 +172,9 @@ private: void updateLastUsedDir(const QString &s); bool filesAsArguments; UpdateManager *updateManager; + + bool plannerStateClean(); + void createFakeDiveForAddAndPlan(); }; #endif // MAINWINDOW_H diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index 2bc690eb9..4d9e19190 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -67,9 +67,7 @@ CylindersModel::CylindersModel(QObject *parent) : current(0), rows(0) { // enum {REMOVE, TYPE, SIZE, WORKINGPRESS, START, END, O2, HE, DEPTH}; setHeaderDataStrings(QStringList() << "" << tr("Type") << tr("Size") << tr("WorkPress") << tr("StartPress") << tr("EndPress") << trUtf8("O" UTF8_SUBSCRIPT_2 "%") << tr("He%") -#ifdef ENABLE_PLANNER << tr("Switch at") -#endif ); } @@ -145,11 +143,9 @@ QVariant CylindersModel::data(const QModelIndex &index, int role) const case HE: ret = percent_string(cyl->gasmix.he); break; -#ifdef ENABLE_PLANNER case DEPTH: ret = get_depth_string(cyl->depth, true); break; -#endif } break; case Qt::DecorationRole: @@ -265,13 +261,11 @@ bool CylindersModel::setData(const QModelIndex &index, const QVariant &value, in changed = true; } break; -#ifdef ENABLE_PLANNER case DEPTH: if (CHANGED()) { cyl->depth = string_to_depth(vString.toUtf8().data()); changed = true; } -#endif } dataChanged(index, index); if (addDiveMode) diff --git a/qt-ui/models.h b/qt-ui/models.h index 34d7d4827..17be8cbc9 100644 --- a/qt-ui/models.h +++ b/qt-ui/models.h @@ -102,9 +102,7 @@ public: END, O2, HE, -#ifdef ENABLE_PLANNER DEPTH, -#endif COLUMNS }; diff --git a/qt-ui/profile/profilewidget2.cpp b/qt-ui/profile/profilewidget2.cpp index 2de64e71f..28a07404f 100644 --- a/qt-ui/profile/profilewidget2.cpp +++ b/qt-ui/profile/profilewidget2.cpp @@ -363,7 +363,7 @@ void ProfileWidget2::plotDives(QList<dive *> dives) //TODO: This is a temporary hack to help me understand the Planner. // It seems that each time the 'createTemporaryPlan' runs, a new // dive is created, and thus, we can plot that. hm... - if (currentState == ADD) { + if (currentState == ADD || currentState == PLAN) { DivePlannerPointsModel *plannerModel = DivePlannerPointsModel::instance(); plannerModel->createTemporaryPlan(); if (!plannerModel->getDiveplan().dp) { @@ -509,7 +509,7 @@ void ProfileWidget2::plotDives(QList<dive *> dives) prefs.animation = animSpeedBackup; } - if (currentState == ADD) { // TODO: figure a way to move this from here. + if (currentState == ADD || currentState == PLAN) { // TODO: figure a way to move this from here. repositionDiveHandlers(); DivePlannerPointsModel *model = DivePlannerPointsModel::instance(); model->deleteTemporaryPlan(); @@ -770,8 +770,25 @@ void ProfileWidget2::setPlanState() { if (currentState == PLAN) return; + setProfileState(); disconnectTemporaryConnections(); + //TODO: Move this method to another place, shouldn't be on mainwindow. + MainWindow::instance()->disableDcShortcuts(); + actionsForKeys[Qt::Key_Left]->setShortcut(Qt::Key_Left); + actionsForKeys[Qt::Key_Right]->setShortcut(Qt::Key_Right); + actionsForKeys[Qt::Key_Up]->setShortcut(Qt::Key_Up); + actionsForKeys[Qt::Key_Down]->setShortcut(Qt::Key_Down); + actionsForKeys[Qt::Key_Escape]->setShortcut(Qt::Key_Escape); + actionsForKeys[Qt::Key_Delete]->setShortcut(Qt::Key_Delete); + + DivePlannerPointsModel *plannerModel = DivePlannerPointsModel::instance(); + connect(plannerModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(replot())); + connect(plannerModel, SIGNAL(cylinderModelEdited()), this, SLOT(replot())); + connect(plannerModel, SIGNAL(rowsInserted(const QModelIndex &, int, int)), + this, SLOT(pointInserted(const QModelIndex &, int, int))); + connect(plannerModel, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), + this, SLOT(pointsRemoved(const QModelIndex &, int, int))); /* show the same stuff that the profile shows. */ currentState = PLAN; /* enable the add state. */ setBackgroundBrush(QColor(Qt::green).light()); diff --git a/subsurface.pro b/subsurface.pro index 83dea66a4..d7189377a 100644 --- a/subsurface.pro +++ b/subsurface.pro @@ -15,11 +15,6 @@ else: TARGET = subsurface VERSION = 4.1.0 -# enable or disable the dive planner -planner { - DEFINES += ENABLE_PLANNER -} - HEADERS = \ color.h \ deco.h \ @@ -237,10 +232,7 @@ QTTRANSLATIONS = \ qt_sv.qm \ qt_zh_TW.qm -# Should we enable the planner sections in the manual? -planner: ENABLE_PLANNER=1 -else: ENABLE_PLANNER=0 -doc.commands += $(CHK_DIR_EXISTS) $$OUT_PWD/Documentation || $(MKDIR) $$OUT_PWD/Documentation $$escape_expand(\\n\\t)$(MAKE) -C $$PWD/Documentation OUT=$$OUT_PWD/Documentation/ ENABLE_PLANNER=$$ENABLE_PLANNER doc +doc.commands += $(CHK_DIR_EXISTS) $$OUT_PWD/Documentation || $(MKDIR) $$OUT_PWD/Documentation $$escape_expand(\\n\\t)$(MAKE) -C $$PWD/Documentation OUT=$$OUT_PWD/Documentation/ doc all.depends += doc QMAKE_EXTRA_TARGETS += doc all |