summaryrefslogtreecommitdiffstats
path: root/desktop-widgets/diveplanner.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'desktop-widgets/diveplanner.cpp')
-rw-r--r--desktop-widgets/diveplanner.cpp124
1 files changed, 114 insertions, 10 deletions
diff --git a/desktop-widgets/diveplanner.cpp b/desktop-widgets/diveplanner.cpp
index 95375643f..e4f572498 100644
--- a/desktop-widgets/diveplanner.cpp
+++ b/desktop-widgets/diveplanner.cpp
@@ -19,6 +19,11 @@
#include <QMessageBox>
#include <QSettings>
#include <QShortcut>
+#ifndef NO_PRINTING
+#include <QPrintDialog>
+#include <QPrinter>
+#include <QBuffer>
+#endif
#define TIME_INITIAL_MAX 30
@@ -149,7 +154,6 @@ DivePlannerWidget::DivePlannerWidget(QWidget *parent) : QWidget(parent, QFlag(0)
connect(cylinders, &CylindersModel::dataChanged, plannerModel, &DivePlannerPointsModel::cylinderModelEdited);
connect(cylinders, &CylindersModel::rowsInserted, plannerModel, &DivePlannerPointsModel::cylinderModelEdited);
connect(cylinders, &CylindersModel::rowsRemoved, plannerModel, &DivePlannerPointsModel::cylinderModelEdited);
- connect(plannerModel, &DivePlannerPointsModel::calculatedPlanNotes, MainWindow::instance(), &MainWindow::setPlanNotes);
ui.tableWidget->setBtnToolTip(tr("Add dive data point"));
@@ -182,6 +186,8 @@ DivePlannerWidget::DivePlannerWidget(QWidget *parent) : QWidget(parent, QFlag(0)
ui.ATMPressure->setValue(1013);
ui.atmHeight->setValue(0);
+ settingsChanged();
+
setMinimumWidth(0);
setMinimumHeight(0);
}
@@ -423,11 +429,6 @@ void PlannerSettingsWidget::disableBackgasBreaks(bool enabled)
}
}
-void DivePlannerWidget::printDecoPlan()
-{
- MainWindow::instance()->printPlan();
-}
-
PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent) : QWidget(parent, QFlag(0))
{
ui.setupUi(this);
@@ -603,10 +604,6 @@ void PlannerSettingsWidget::settingsChanged()
ui.descRate->setSuffix(vs);
}
-void PlannerSettingsWidget::printDecoPlan()
-{
-}
-
void PlannerSettingsWidget::setBackgasBreaks(bool dobreaks)
{
PlannerShared::set_doo2breaks(dobreaks);
@@ -621,4 +618,111 @@ void PlannerSettingsWidget::setBailoutVisibility(int mode)
PlannerDetails::PlannerDetails(QWidget *parent) : QWidget(parent)
{
ui.setupUi(this);
+#ifdef NO_PRINTING
+ ui.printPlan->hide();
+#endif
+}
+
+void PlannerDetails::setPlanNotes(QString plan)
+{
+ ui.divePlanOutput->setHtml(plan);
+}
+
+PlannerWidgets::PlannerWidgets()
+{
+ connect(plannerDetails.printPlan(), &QPushButton::pressed, this, &PlannerWidgets::printDecoPlan);
+ connect(DivePlannerPointsModel::instance(), &DivePlannerPointsModel::calculatedPlanNotes,
+ &plannerDetails, &PlannerDetails::setPlanNotes);
+}
+
+void PlannerWidgets::planDive()
+{
+ DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::PLAN);
+
+ MainWindow::instance()->graphics->setPlanState();
+ dc_number = 0;
+
+ // create a simple starting dive, using the first gas from the just copied cylinders
+ DivePlannerPointsModel::instance()->createSimpleDive();
+
+ // plan the dive in the same mode as the currently selected one
+ if (current_dive) {
+ plannerSettingsWidget.setDiveMode(current_dive->dc.divemode);
+ plannerSettingsWidget.setBailoutVisibility(current_dive->dc.divemode);
+ if (current_dive->salinity)
+ plannerWidget.setSalinity(current_dive->salinity);
+ else // No salinity means salt water
+ plannerWidget.setSalinity(SEAWATER_SALINITY);
+ }
+ plannerWidget.setReplanButton(false);
+}
+
+void PlannerWidgets::replanDive()
+{
+ DivePlannerPointsModel::instance()->clear();
+ DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::PLAN);
+
+ MainWindow::instance()->graphics->setPlanState();
+ MainWindow::instance()->graphics->clearHandlers();
+
+ plannerWidget.setReplanButton(true);
+ plannerWidget.setupStartTime(timestampToDateTime(current_dive->when));
+ if (current_dive->surface_pressure.mbar)
+ plannerWidget.setSurfacePressure(current_dive->surface_pressure.mbar);
+ if (current_dive->salinity)
+ plannerWidget.setSalinity(current_dive->salinity);
+ DivePlannerPointsModel::instance()->loadFromDive(current_dive);
+ reset_cylinders(&displayed_dive, true);
+ DivePlannerPointsModel::instance()->cylindersModel()->updateDive(&displayed_dive);
+}
+
+void PlannerWidgets::printDecoPlan()
+{
+#ifndef NO_PRINTING
+ char *disclaimer = get_planner_disclaimer_formatted();
+ // Prepend a logo and a disclaimer to the plan.
+ // Save the old plan so that it can be restored at the end of the function.
+ QString origPlan = plannerDetails.divePlanOutput()->toHtml();
+ QString diveplan = QStringLiteral("<img height=50 src=\":subsurface-icon\"> ") +
+ QString(disclaimer) + origPlan;
+ free(disclaimer);
+
+ QPrinter printer;
+ QPrintDialog *dialog = new QPrintDialog(&printer, MainWindow::instance());
+ dialog->setWindowTitle(tr("Print runtime table"));
+ if (dialog->exec() != QDialog::Accepted)
+ return;
+
+ /* render the profile as a pixmap that is inserted as base64 data into a HTML <img> tag
+ * make it fit a page width defined by 2 cm margins via QTextDocument->print() (cannot be changed?)
+ * the height of the profile is 40% of the page height.
+ */
+ QSizeF renderSize = printer.pageRect(QPrinter::Inch).size();
+ const qreal marginsInch = 1.57480315; // = (2 x 2cm) / 2.45cm/inch
+ renderSize.setWidth((renderSize.width() - marginsInch) * printer.resolution());
+ renderSize.setHeight(((renderSize.height() - marginsInch) * printer.resolution()) / 2.5);
+
+ QPixmap pixmap(renderSize.toSize());
+ QPainter painter(&pixmap);
+ painter.setRenderHint(QPainter::Antialiasing);
+ painter.setRenderHint(QPainter::SmoothPixmapTransform);
+
+ ProfileWidget2 *profile = MainWindow::instance()->graphics;
+ QSize origSize = profile->size();
+ profile->resize(renderSize.toSize());
+ profile->setPrintMode(true);
+ profile->render(&painter);
+ profile->resize(origSize);
+ profile->setPrintMode(false);
+
+ QByteArray byteArray;
+ QBuffer buffer(&byteArray);
+ pixmap.save(&buffer, "PNG");
+ QString profileImage = QString("<img src=\"data:image/png;base64,") + byteArray.toBase64() + "\"/><br><br>";
+ diveplan = profileImage + diveplan;
+
+ plannerDetails.divePlanOutput()->setHtml(diveplan);
+ plannerDetails.divePlanOutput()->print(&printer);
+ plannerDetails.divePlanOutput()->setHtml(origPlan); // restore original plan
+#endif
}