diff options
Diffstat (limited to 'desktop-widgets/divelogexportdialog.cpp')
-rw-r--r-- | desktop-widgets/divelogexportdialog.cpp | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/desktop-widgets/divelogexportdialog.cpp b/desktop-widgets/divelogexportdialog.cpp new file mode 100644 index 000000000..7a406b982 --- /dev/null +++ b/desktop-widgets/divelogexportdialog.cpp @@ -0,0 +1,240 @@ +#include <QFileDialog> +#include <QShortcut> +#include <QSettings> +#include <QtConcurrent> + +#include "divelogexportdialog.h" +#include "divelogexportlogic.h" +#include "diveshareexportdialog.h" +#include "ui_divelogexportdialog.h" +#include "subsurfacewebservices.h" +#include "worldmap-save.h" +#include "save-html.h" +#include "mainwindow.h" + +#define GET_UNIT(name, field, f, t) \ + v = settings.value(QString(name)); \ + if (v.isValid()) \ + field = (v.toInt() == 0) ? (t) : (f); \ + else \ + field = default_prefs.units.field + +DiveLogExportDialog::DiveLogExportDialog(QWidget *parent) : QDialog(parent), + ui(new Ui::DiveLogExportDialog) +{ + ui->setupUi(this); + showExplanation(); + QShortcut *quit = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q), this); + connect(quit, SIGNAL(activated()), MainWindow::instance(), SLOT(close())); + QShortcut *close = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), this); + connect(close, SIGNAL(activated()), this, SLOT(close())); + + /* the names are not the actual values exported to the json files,The font-family property should hold several + font names as a "fallback" system, to ensure maximum compatibility between browsers/operating systems */ + ui->fontSelection->addItem("Arial", "Arial, Helvetica, sans-serif"); + ui->fontSelection->addItem("Impact", "Impact, Charcoal, sans-serif"); + ui->fontSelection->addItem("Georgia", "Georgia, serif"); + ui->fontSelection->addItem("Courier", "Courier, monospace"); + ui->fontSelection->addItem("Verdana", "Verdana, Geneva, sans-serif"); + + QSettings settings; + settings.beginGroup("HTML"); + if (settings.contains("fontSelection")) { + ui->fontSelection->setCurrentIndex(settings.value("fontSelection").toInt()); + } + if (settings.contains("fontSizeSelection")) { + ui->fontSizeSelection->setCurrentIndex(settings.value("fontSizeSelection").toInt()); + } + if (settings.contains("themeSelection")) { + ui->themeSelection->setCurrentIndex(settings.value("themeSelection").toInt()); + } + if (settings.contains("subsurfaceNumbers")) { + ui->exportSubsurfaceNumber->setChecked(settings.value("subsurfaceNumbers").toBool()); + } + if (settings.contains("yearlyStatistics")) { + ui->exportStatistics->setChecked(settings.value("yearlyStatistics").toBool()); + } + if (settings.contains("listOnly")) { + ui->exportListOnly->setChecked(settings.value("listOnly").toBool()); + } + if (settings.contains("exportPhotos")) { + ui->exportPhotos->setChecked(settings.value("exportPhotos").toBool()); + } + settings.endGroup(); +} + +DiveLogExportDialog::~DiveLogExportDialog() +{ + delete ui; +} + +void DiveLogExportDialog::showExplanation() +{ + if (ui->exportUDDF->isChecked()) { + ui->description->setText(tr("Generic format that is used for data exchange between a variety of diving related programs.")); + } else if (ui->exportCSV->isChecked()) { + ui->description->setText(tr("Comma separated values describing the dive profile.")); + } else if (ui->exportCSVDetails->isChecked()) { + ui->description->setText(tr("Comma separated values of the dive information. This includes most of the dive details but no profile information.")); + } else if (ui->exportDivelogs->isChecked()) { + ui->description->setText(tr("Send the dive data to divelogs.de website.")); + } else if (ui->exportDiveshare->isChecked()) { + ui->description->setText(tr("Send the dive data to dive-share.appspot.com website")); + } else if (ui->exportWorldMap->isChecked()) { + ui->description->setText(tr("HTML export of the dive locations, visualized on a world map.")); + } else if (ui->exportSubsurfaceXML->isChecked()) { + ui->description->setText(tr("Subsurface native XML format.")); + } else if (ui->exportImageDepths->isChecked()) { + ui->description->setText(tr("Write depths of images to file.")); + } +} + +void DiveLogExportDialog::exportHtmlInit(const QString &filename) +{ + struct htmlExportSetting hes; + hes.themeFile = (ui->themeSelection->currentText() == tr("Light")) ? "light.css" : "sand.css"; + hes.exportPhotos = ui->exportPhotos->isChecked(); + hes.selectedOnly = ui->exportSelectedDives->isChecked(); + hes.listOnly = ui->exportListOnly->isChecked(); + hes.fontFamily = ui->fontSelection->itemData(ui->fontSelection->currentIndex()).toString(); + hes.fontSize = ui->fontSizeSelection->currentText(); + hes.themeSelection = ui->themeSelection->currentIndex(); + hes.subsurfaceNumbers = ui->exportSubsurfaceNumber->isChecked(); + hes.yearlyStatistics = ui->exportStatistics->isChecked(); + + exportHtmlInitLogic(filename, hes); +} + +void DiveLogExportDialog::exportHTMLsettings(const QString &filename) +{ + QSettings settings; + settings.beginGroup("HTML"); + settings.setValue("fontSelection", ui->fontSelection->currentIndex()); + settings.setValue("fontSizeSelection", ui->fontSizeSelection->currentIndex()); + settings.setValue("themeSelection", ui->themeSelection->currentIndex()); + settings.setValue("subsurfaceNumbers", ui->exportSubsurfaceNumber->isChecked()); + settings.setValue("yearlyStatistics", ui->exportStatistics->isChecked()); + settings.setValue("listOnly", ui->exportListOnly->isChecked()); + settings.setValue("exportPhotos", ui->exportPhotos->isChecked()); + settings.endGroup(); + +} + + +void DiveLogExportDialog::on_exportGroup_buttonClicked(QAbstractButton *button) +{ + showExplanation(); +} + +void DiveLogExportDialog::on_buttonBox_accepted() +{ + QString filename; + QString stylesheet; + QSettings settings; + QString lastDir = QDir::homePath(); + + settings.beginGroup("FileDialog"); + if (settings.contains("LastDir")) { + if (QDir::setCurrent(settings.value("LastDir").toString())) { + lastDir = settings.value("LastDir").toString(); + } + } + settings.endGroup(); + + switch (ui->tabWidget->currentIndex()) { + case 0: + if (ui->exportUDDF->isChecked()) { + stylesheet = "uddf-export.xslt"; + filename = QFileDialog::getSaveFileName(this, tr("Export UDDF file as"), lastDir, + tr("UDDF files (*.uddf *.UDDF)")); + } else if (ui->exportCSV->isChecked()) { + stylesheet = "xml2csv.xslt"; + filename = QFileDialog::getSaveFileName(this, tr("Export CSV file as"), lastDir, + tr("CSV files (*.csv *.CSV)")); + } else if (ui->exportCSVDetails->isChecked()) { + stylesheet = "xml2manualcsv.xslt"; + filename = QFileDialog::getSaveFileName(this, tr("Export CSV file as"), lastDir, + tr("CSV files (*.csv *.CSV)")); + } else if (ui->exportDivelogs->isChecked()) { + DivelogsDeWebServices::instance()->prepareDivesForUpload(ui->exportSelected->isChecked()); + } else if (ui->exportDiveshare->isChecked()) { + DiveShareExportDialog::instance()->prepareDivesForUpload(ui->exportSelected->isChecked()); + } else if (ui->exportWorldMap->isChecked()) { + filename = QFileDialog::getSaveFileName(this, tr("Export world map"), lastDir, + tr("HTML files (*.html)")); + if (!filename.isNull() && !filename.isEmpty()) + export_worldmap_HTML(filename.toUtf8().data(), ui->exportSelected->isChecked()); + } else if (ui->exportSubsurfaceXML->isChecked()) { + filename = QFileDialog::getSaveFileName(this, tr("Export Subsurface XML"), lastDir, + tr("XML files (*.xml *.ssrf)")); + if (!filename.isNull() && !filename.isEmpty()) { + if (!filename.contains('.')) + filename.append(".ssrf"); + QByteArray bt = QFile::encodeName(filename); + save_dives_logic(bt.data(), ui->exportSelected->isChecked()); + } + } else if (ui->exportImageDepths->isChecked()) { + filename = QFileDialog::getSaveFileName(this, tr("Save image depths"), lastDir); + if (!filename.isNull() && !filename.isEmpty()) + export_depths(filename.toUtf8().data(), ui->exportSelected->isChecked()); + } + break; + case 1: + filename = QFileDialog::getSaveFileName(this, tr("Export HTML files as"), lastDir, + tr("HTML files (*.html)")); + if (!filename.isNull() && !filename.isEmpty()) + exportHtmlInit(filename); + break; + } + + if (!filename.isNull() && !filename.isEmpty()) { + // remember the last export path + QFileInfo fileInfo(filename); + settings.beginGroup("FileDialog"); + settings.setValue("LastDir", fileInfo.dir().path()); + settings.endGroup(); + // the non XSLT exports are called directly above, the XSLT based ons are called here + if (!stylesheet.isEmpty()) { + future = QtConcurrent::run(export_dives_xslt, filename.toUtf8(), ui->exportSelected->isChecked(), ui->CSVUnits_2->currentIndex(), stylesheet.toUtf8()); + MainWindow::instance()->getNotificationWidget()->showNotification(tr("Please wait, exporting..."), KMessageWidget::Information); + MainWindow::instance()->getNotificationWidget()->setFuture(future); + } + } +} + +void DiveLogExportDialog::export_depths(const char *filename, const bool selected_only) +{ + FILE *f; + struct dive *dive; + depth_t depth; + int i; + const char *unit = NULL; + + struct membuffer buf = { 0 }; + + for_each_dive (i, dive) { + if (selected_only && !dive->selected) + continue; + + FOR_EACH_PICTURE (dive) { + int n = dive->dc.samples; + struct sample *s = dive->dc.sample; + depth.mm = 0; + while (--n >= 0 && (int32_t)s->time.seconds <= picture->offset.seconds) { + depth.mm = s->depth.mm; + s++; + } + put_format(&buf, "%s\t%.1f", picture->filename, get_depth_units(depth.mm, NULL, &unit)); + put_format(&buf, "%s\n", unit); + } + } + + f = subsurface_fopen(filename, "w+"); + if (!f) { + report_error(tr("Can't open file %s").toUtf8().data(), filename); + } else { + flush_buffer(&buf, f); /*check for writing errors? */ + fclose(f); + } + free_buffer(&buf); +} |