source: subsurface/desktop-widgets/divelogexportdialog.cpp @ 7be962b

android_test
Last change on this file since 7be962b was 7be962b, checked in by Dirk Hohndel <dirk@…>, 21 months ago

Move subsurface-core to core and qt-mobile to mobile-widgets

Having subsurface-core as a directory name really messes with
autocomplete and is obviously redundant. Simmilarly, qt-mobile caused an
autocomplete conflict and also was inconsistent with the desktop-widget
name for the directory containing the "other" UI.

And while cleaning up the resulting change in the path name for include
files, I decided to clean up those even more to make them consistent
overall.

This could have been handled in more commits, but since this requires a
make clean before the build, it seemed more sensible to do it all in one.

Signed-off-by: Dirk Hohndel <dirk@…>

  • Property mode set to 100644
File size: 8.7 KB
Line 
1#include <QFileDialog>
2#include <QShortcut>
3#include <QSettings>
4#include <QtConcurrent>
5
6#include "desktop-widgets/divelogexportdialog.h"
7#include "core/divelogexportlogic.h"
8#include "desktop-widgets/diveshareexportdialog.h"
9#include "ui_divelogexportdialog.h"
10#include "desktop-widgets/subsurfacewebservices.h"
11#include "core/worldmap-save.h"
12#include "core/save-html.h"
13#include "desktop-widgets/mainwindow.h"
14
15#define GET_UNIT(name, field, f, t)                   \
16        v = settings.value(QString(name));            \
17        if (v.isValid())                              \
18                field = (v.toInt() == 0) ? (t) : (f); \
19        else                                          \
20                field = default_prefs.units.field
21
22DiveLogExportDialog::DiveLogExportDialog(QWidget *parent) : QDialog(parent),
23        ui(new Ui::DiveLogExportDialog)
24{
25        ui->setupUi(this);
26        showExplanation();
27        QShortcut *quit = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q), this);
28        connect(quit, SIGNAL(activated()), MainWindow::instance(), SLOT(close()));
29        QShortcut *close = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), this);
30        connect(close, SIGNAL(activated()), this, SLOT(close()));
31
32        /* the names are not the actual values exported to the json files,The font-family property should hold several
33        font names as a "fallback" system, to ensure maximum compatibility between browsers/operating systems */
34        ui->fontSelection->addItem("Arial", "Arial, Helvetica, sans-serif");
35        ui->fontSelection->addItem("Impact", "Impact, Charcoal, sans-serif");
36        ui->fontSelection->addItem("Georgia", "Georgia, serif");
37        ui->fontSelection->addItem("Courier", "Courier, monospace");
38        ui->fontSelection->addItem("Verdana", "Verdana, Geneva, sans-serif");
39
40        QSettings settings;
41        settings.beginGroup("HTML");
42        if (settings.contains("fontSelection")) {
43                ui->fontSelection->setCurrentIndex(settings.value("fontSelection").toInt());
44        }
45        if (settings.contains("fontSizeSelection")) {
46                ui->fontSizeSelection->setCurrentIndex(settings.value("fontSizeSelection").toInt());
47        }
48        if (settings.contains("themeSelection")) {
49                ui->themeSelection->setCurrentIndex(settings.value("themeSelection").toInt());
50        }
51        if (settings.contains("subsurfaceNumbers")) {
52                ui->exportSubsurfaceNumber->setChecked(settings.value("subsurfaceNumbers").toBool());
53        }
54        if (settings.contains("yearlyStatistics")) {
55                ui->exportStatistics->setChecked(settings.value("yearlyStatistics").toBool());
56        }
57        if (settings.contains("listOnly")) {
58                ui->exportListOnly->setChecked(settings.value("listOnly").toBool());
59        }
60        if (settings.contains("exportPhotos")) {
61                ui->exportPhotos->setChecked(settings.value("exportPhotos").toBool());
62        }
63        settings.endGroup();
64}
65
66DiveLogExportDialog::~DiveLogExportDialog()
67{
68        delete ui;
69}
70
71void DiveLogExportDialog::showExplanation()
72{
73        if (ui->exportUDDF->isChecked()) {
74                ui->description->setText(tr("Generic format that is used for data exchange between a variety of diving related programs."));
75        } else if (ui->exportCSV->isChecked()) {
76                ui->description->setText(tr("Comma separated values describing the dive profile."));
77        } else if (ui->exportCSVDetails->isChecked()) {
78                ui->description->setText(tr("Comma separated values of the dive information. This includes most of the dive details but no profile information."));
79        } else if (ui->exportDivelogs->isChecked()) {
80                ui->description->setText(tr("Send the dive data to divelogs.de website."));
81        } else if (ui->exportDiveshare->isChecked()) {
82                ui->description->setText(tr("Send the dive data to dive-share.appspot.com website"));
83        } else if (ui->exportWorldMap->isChecked()) {
84                ui->description->setText(tr("HTML export of the dive locations, visualized on a world map."));
85        } else if (ui->exportSubsurfaceXML->isChecked()) {
86                ui->description->setText(tr("Subsurface native XML format."));
87        } else if (ui->exportImageDepths->isChecked()) {
88                ui->description->setText(tr("Write depths of images to file."));
89        }
90}
91
92void DiveLogExportDialog::exportHtmlInit(const QString &filename)
93{
94        struct htmlExportSetting hes;
95        hes.themeFile = (ui->themeSelection->currentText() == tr("Light")) ? "light.css" : "sand.css";
96        hes.exportPhotos = ui->exportPhotos->isChecked();
97        hes.selectedOnly = ui->exportSelectedDives->isChecked();
98        hes.listOnly = ui->exportListOnly->isChecked();
99        hes.fontFamily = ui->fontSelection->itemData(ui->fontSelection->currentIndex()).toString();
100        hes.fontSize = ui->fontSizeSelection->currentText();
101        hes.themeSelection = ui->themeSelection->currentIndex();
102        hes.subsurfaceNumbers = ui->exportSubsurfaceNumber->isChecked();
103        hes.yearlyStatistics = ui->exportStatistics->isChecked();
104
105        exportHtmlInitLogic(filename, hes);
106}
107
108void DiveLogExportDialog::on_exportGroup_buttonClicked(QAbstractButton *button)
109{
110        Q_UNUSED(button)
111        showExplanation();
112}
113
114void DiveLogExportDialog::on_buttonBox_accepted()
115{
116        QString filename;
117        QString stylesheet;
118        QSettings settings;
119        QString lastDir = QDir::homePath();
120
121        settings.beginGroup("FileDialog");
122        if (settings.contains("LastDir")) {
123                if (QDir::setCurrent(settings.value("LastDir").toString())) {
124                        lastDir = settings.value("LastDir").toString();
125                }
126        }
127        settings.endGroup();
128
129        switch (ui->tabWidget->currentIndex()) {
130        case 0:
131                if (ui->exportUDDF->isChecked()) {
132                        stylesheet = "uddf-export.xslt";
133                        filename = QFileDialog::getSaveFileName(this, tr("Export UDDF file as"), lastDir,
134                                                                tr("UDDF files (*.uddf *.UDDF)"));
135                } else if (ui->exportCSV->isChecked()) {
136                        stylesheet = "xml2csv.xslt";
137                        filename = QFileDialog::getSaveFileName(this, tr("Export CSV file as"), lastDir,
138                                                                tr("CSV files (*.csv *.CSV)"));
139                } else if (ui->exportCSVDetails->isChecked()) {
140                        stylesheet = "xml2manualcsv.xslt";
141                        filename = QFileDialog::getSaveFileName(this, tr("Export CSV file as"), lastDir,
142                                                                tr("CSV files (*.csv *.CSV)"));
143                } else if (ui->exportDivelogs->isChecked()) {
144                        DivelogsDeWebServices::instance()->prepareDivesForUpload(ui->exportSelected->isChecked());
145                } else if (ui->exportDiveshare->isChecked()) {
146                        DiveShareExportDialog::instance()->prepareDivesForUpload(ui->exportSelected->isChecked());
147                } else if (ui->exportWorldMap->isChecked()) {
148                        filename = QFileDialog::getSaveFileName(this, tr("Export world map"), lastDir,
149                                                                tr("HTML files (*.html)"));
150                        if (!filename.isNull() && !filename.isEmpty())
151                                export_worldmap_HTML(filename.toUtf8().data(), ui->exportSelected->isChecked());
152                } else if (ui->exportSubsurfaceXML->isChecked()) {
153                        filename = QFileDialog::getSaveFileName(this, tr("Export Subsurface XML"), lastDir,
154                                                                tr("XML files (*.xml *.ssrf)"));
155                        if (!filename.isNull() && !filename.isEmpty()) {
156                                if (!filename.contains('.'))
157                                        filename.append(".ssrf");
158                                QByteArray bt = QFile::encodeName(filename);
159                                save_dives_logic(bt.data(), ui->exportSelected->isChecked());
160                        }
161                } else if (ui->exportImageDepths->isChecked()) {
162                        filename = QFileDialog::getSaveFileName(this, tr("Save image depths"), lastDir);
163                        if (!filename.isNull() && !filename.isEmpty())
164                                export_depths(filename.toUtf8().data(), ui->exportSelected->isChecked());
165                }
166                break;
167        case 1:
168                filename = QFileDialog::getSaveFileName(this, tr("Export HTML files as"), lastDir,
169                                                        tr("HTML files (*.html)"));
170                if (!filename.isNull() && !filename.isEmpty())
171                        exportHtmlInit(filename);
172                break;
173        }
174
175        if (!filename.isNull() && !filename.isEmpty()) {
176                // remember the last export path
177                QFileInfo fileInfo(filename);
178                settings.beginGroup("FileDialog");
179                settings.setValue("LastDir", fileInfo.dir().path());
180                settings.endGroup();
181                // the non XSLT exports are called directly above, the XSLT based ons are called here
182                if (!stylesheet.isEmpty()) {
183                        future = QtConcurrent::run(export_dives_xslt, filename.toUtf8(), ui->exportSelected->isChecked(), ui->CSVUnits_2->currentIndex(), stylesheet.toUtf8());
184                        MainWindow::instance()->getNotificationWidget()->showNotification(tr("Please wait, exporting..."), KMessageWidget::Information);
185                        MainWindow::instance()->getNotificationWidget()->setFuture(future);
186                }
187        }
188}
189
190void DiveLogExportDialog::export_depths(const char *filename, const bool selected_only)
191{
192        FILE *f;
193        struct dive *dive;
194        depth_t depth;
195        int i;
196        const char *unit = NULL;
197
198        struct membuffer buf = {};
199
200        for_each_dive (i, dive) {
201                if (selected_only && !dive->selected)
202                        continue;
203
204                FOR_EACH_PICTURE (dive) {
205                        int n = dive->dc.samples;
206                        struct sample *s = dive->dc.sample;
207                        depth.mm = 0;
208                        while (--n >= 0 && (int32_t)s->time.seconds <= picture->offset.seconds) {
209                                depth.mm = s->depth.mm;
210                                s++;
211                        }
212                        put_format(&buf, "%s\t%.1f", picture->filename, get_depth_units(depth.mm, NULL, &unit));
213                        put_format(&buf, "%s\n", unit);
214                }
215        }
216
217        f = subsurface_fopen(filename, "w+");
218        if (!f) {
219                report_error(tr("Can't open file %s").toUtf8().data(), filename);
220        } else {
221                flush_buffer(&buf, f); /*check for writing errors? */
222                fclose(f);
223        }
224        free_buffer(&buf);
225}
Note: See TracBrowser for help on using the repository browser.