summaryrefslogtreecommitdiffstats
path: root/desktop-widgets/divelogexportdialog.cpp
diff options
context:
space:
mode:
authorGravatar Tomaz Canabrava <tomaz.canabrava@intel.com>2015-09-03 14:20:19 -0300
committerGravatar Dirk Hohndel <dirk@hohndel.org>2015-10-30 10:36:49 -0700
commite49d6213ad129284a45d53c3fcdc03249e84efe2 (patch)
tree2946a666ab38af3375e7bb2b8c5dd887d4a7f9a1 /desktop-widgets/divelogexportdialog.cpp
parent588abd019fb2ed3f607682f2b6c7fe86a7a5bb90 (diff)
downloadsubsurface-e49d6213ad129284a45d53c3fcdc03249e84efe2.tar.gz
Move qt-ui to desktop-widgets
Since we have now destkop and mobile versions, 'qt-ui' was a very poor name choice for a folder that contains only destkop-enabled widgets. Also, move the graphicsview-common.h/cpp to subsurface-core because it doesn't depend on qgraphicsview, it merely implements all the colors that we use throughout Subsurface, and we will use colors on both desktop and mobile versions Same thing applies for metrics.h/cpp Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'desktop-widgets/divelogexportdialog.cpp')
-rw-r--r--desktop-widgets/divelogexportdialog.cpp240
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);
+}