From 82cbbbb52acf86bf277d91237db69c1f920f6535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20T=C5=AFma?= Date: Tue, 24 May 2016 03:01:22 +0200 Subject: [PATCH] Added basic PDF export settings --- gpxsee.pro | 8 +- lang/gpxsee_cs.ts | 240 ++++++++++++++++++++++++++------------- src/exportdialog.cpp | 115 +++++++++++++++++++ src/exportdialog.h | 30 +++++ src/fileselectwidget.cpp | 27 +++++ src/fileselectwidget.h | 30 +++++ src/gui.cpp | 79 ++++--------- src/gui.h | 3 - 8 files changed, 394 insertions(+), 138 deletions(-) create mode 100644 src/exportdialog.cpp create mode 100644 src/exportdialog.h create mode 100644 src/fileselectwidget.cpp create mode 100644 src/fileselectwidget.h diff --git a/gpxsee.pro b/gpxsee.pro index 154ff20e..d497e3fd 100644 --- a/gpxsee.pro +++ b/gpxsee.pro @@ -40,7 +40,9 @@ HEADERS += src/config.h \ src/cpuarch.h \ src/settings.h \ src/app.h \ - src/trackinfo.h + src/trackinfo.h \ + src/exportdialog.h \ + src/fileselectwidget.h SOURCES += src/main.cpp \ src/gui.cpp \ src/gpx.cpp \ @@ -68,7 +70,9 @@ SOURCES += src/main.cpp \ src/heartrategraph.cpp \ src/range.cpp \ src/app.cpp \ - src/trackinfo.cpp + src/trackinfo.cpp \ + src/exportdialog.cpp \ + src/fileselectwidget.cpp RESOURCES += gpxsee.qrc TRANSLATIONS = lang/gpxsee_cs.ts macx { diff --git a/lang/gpxsee_cs.ts b/lang/gpxsee_cs.ts index 93881291..0aa9faa5 100644 --- a/lang/gpxsee_cs.ts +++ b/lang/gpxsee_cs.ts @@ -56,20 +56,108 @@ Maximum + + ExportDialog + + + Export to PDF + Exportovat do PDF + + + + PDF files (*.pdf);;All files (*) + soubory PDF (*.pdf);;všechny soubory + + + + Portrait + Na výšku + + + + Landscape + Na šířku + + + + Export settings + Nastavení exportu + + + + Page size: + Velikost stránky: + + + + Orientation + Orientace + + + + Output file: + Výstupní soubor: + + + + Export + Exportovat + + + + Cancel + Zrušit + + + + + + Error + Chyba + + + + No output file selected. + Nebyl zvolen žádný výstupní soubor. + + + + The output file is a directory. + Výstupní soubor je adresář. + + + + The output file is not writable. + Výstupní soubor není zapisovatelný. + + + + FileSelectWidget + + + Browse... + Procházet... + + + + Select file + Vybrat soubor + + GUI - + GPXSee is distributed under the terms of the GNU General Public License version 3. For more info about GPXSee visit the project homepage at Program GPXSee je distribuován pod podmínkami licence GNU General Public License verze 3. Pro více informací navštivte stránky programu na adrese - + Open file Otevřít soubor - + Open POI file Otevřít POI soubor @@ -85,36 +173,36 @@ - - + + Keyboard controls Ovládací klávesy - + Close Zavřít - + Reload Znovu načíst - + Show Zobrazit - - + + File Soubor - - + + Data sources Zdroje dat @@ -124,293 +212,291 @@ Tisknout - Export - Exportovat + Exportovat - Export as - Exportovat jako + Exportovat jako - + Load POI file Nahrát POI soubor - + Close POI files Zavřit POI soubory - + Show POIs Zobrazit POI - + Show map Zobrazit mapu - + Clear tile cache Vymazat mezipaměť dlaždic + - - + Next map Následující mapa - + Show graphs Zobrazovat grafy - + Show toolbars Zobrazovat nástrojové lišty - + Metric Metrické - + Imperial Imperiální - + Fullscreen mode Celoobrazovkový režim - + Next Následující - + Previous Předchozí - + Last Poslední - + First První - + Map Mapa - + POI POI - + POI files POI soubory - + Settings Nastavení - + Units Jednotky - + Help Nápověda - + Previous map Předchozí mapa - + Export to PDF Exportovat do PDF - - + + Date Datum - + No GPX files loaded Nejsou načteny žádné GPX soubory - + Elevation Výška - + Speed Rychlost - + Heart rate Tep - + Next file Následující soubor - + Version Verze - + Previous file Předchozí soubor - + First file První soubor - + Last file Poslední soubor - + Append modifier Modifikátor nahradit/přidat - + Map (tiles) source URLs are read on program startup from the following file: URL mapových zdrojů (dlaždic) jsou načteny při startu programu z následujícího souboru: - + The file format is one map entry per line, consisting of the map name and tiles URL delimited by a TAB character. The tile X and Y coordinates are replaced with $x and $y in the URL and the zoom level is replaced with $z. An example map file could look like: Formát souboru je jeden mapový záznam na řádku, kde mapový záznam sestává ze jména mapy a URL dlaždic navzájem oddělených tabulátorem. Souřadnice dlaždice jsou v URL nahrazeny řetězci $x a $y, úroven přiblížení (zoom) pak řetězcem $z. Příklad: - + To make GPXSee load a POI file automatically on startup, add the file to the following directory: POI soubory, které se mají automaticky nahrát při startu programu jsou načítány z následujícího adresáře: - + GPX files (*.gpx);;All files (*) soubory GPX (*.gpx);;všechny soubory (*) - - + + Line: %1 Řádka: %1 - + GPX files (*.gpx);;CSV files (*.csv);;All files (*) soubory GPX (*.gpx);;soubory CSV (*.csv);;všechny soubory (*) - - + + mi mi - + ft ft - + About GPXSee O aplikaci GPXSee - + Navigation Navigace - + Map sources Mapové zdroje - + POIs POI body - - + + Distance Vzdálenost - + Time Čas - + m m - + %1 tracks Počet tras: %1 - - + + km km - - + + Error Chyba - + Error loading GPX file: %1 Soubor GPX nelze otevřít: %1 - + Error loading POI file: %1 Soubor POI nelze otevřít: diff --git a/src/exportdialog.cpp b/src/exportdialog.cpp new file mode 100644 index 00000000..33ad30ca --- /dev/null +++ b/src/exportdialog.cpp @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "fileselectwidget.h" +#include "exportdialog.h" + + +ExportDialog::ExportDialog(QPrinter *printer, QWidget *parent) + : QDialog(parent), _printer(printer) +{ + int index; + + setWindowTitle(tr("Export to PDF")); + + _fileSelect = new FileSelectWidget(); + _fileSelect->setFilter(tr("PDF files (*.pdf);;All files (*)")); + _fileSelect->setFile(QString("%1/export.pdf").arg(QDir::currentPath())); + + _paperSize = new QComboBox(); + _paperSize->addItem("A0", QPrinter::A0); + _paperSize->addItem("A1", QPrinter::A1); + _paperSize->addItem("A2", QPrinter::A2); + _paperSize->addItem("A3", QPrinter::A3); + _paperSize->addItem("A4", QPrinter::A4); + _paperSize->addItem("A5", QPrinter::A5); + _paperSize->addItem("A6", QPrinter::A6); + _paperSize->addItem("Tabloid", QPrinter::Tabloid); + _paperSize->addItem("Legal", QPrinter::Legal); + _paperSize->addItem("Letter", QPrinter::Letter); + index = (QLocale::system().measurementSystem() == QLocale::ImperialSystem) + ? 9 /* Letter */ : 4 /* A4 */; + _paperSize->setCurrentIndex(index); + + _orientation = new QComboBox(); + _orientation->addItem(tr("Portrait"), QPrinter::Portrait); + _orientation->addItem(tr("Landscape"), QPrinter::Landscape); + index = _printer->orientation() == QPrinter::Portrait ? 0 : 1; + _orientation->setCurrentIndex(index); + + QGroupBox *contentBox = new QGroupBox(tr("Export settings")); + QFormLayout *contentLayout = new QFormLayout; + contentLayout->addRow(tr("Page size:"), _paperSize); + contentLayout->addRow(tr("Orientation"), _orientation); + contentLayout->addRow(tr("Output file:"), _fileSelect); + contentBox->setLayout(contentLayout); + + QPushButton *exportButton = new QPushButton(tr("Export")); + exportButton->setAutoDefault(true); + exportButton->setDefault(true); + connect(exportButton, SIGNAL(clicked()), this, SLOT(accept())); + QPushButton *cancelButton = new QPushButton(tr("Cancel")); + connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); + + QHBoxLayout *buttonsLayout = new QHBoxLayout; + buttonsLayout->addStretch(); + buttonsLayout->addWidget(exportButton); + buttonsLayout->addWidget(cancelButton); + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(contentBox); + layout->addLayout(buttonsLayout); + + setLayout(layout); +} + +bool ExportDialog::checkFile() +{ + if (_fileSelect->file().isNull()) { + QMessageBox::warning(this, tr("Error"), tr("No output file selected.")); + return false; + } + + QFileInfo fi(_fileSelect->file()); + + if (fi.isDir()) { + QMessageBox::warning(this, tr("Error"), + tr("The output file is a directory.")); + return false; + } + + QFileInfo di(fi.path()); + if (!di.isWritable()) { + QMessageBox::warning(this, tr("Error"), + tr("The output file is not writable.")); + return false; + } + + return true; +} + +void ExportDialog::accept() +{ + if (!checkFile()) + return; + + QPrinter::Orientation orientation = static_cast + (_orientation->itemData(_orientation->currentIndex()).toInt()); + QPrinter::PaperSize paperSize = static_cast + (_paperSize->itemData(_paperSize->currentIndex()).toInt()); + + _printer->setOutputFormat(QPrinter::PdfFormat); + _printer->setOutputFileName(_fileSelect->file()); + _printer->setPaperSize(paperSize); + _printer->setOrientation(orientation); + + QDialog::accept(); +} diff --git a/src/exportdialog.h b/src/exportdialog.h new file mode 100644 index 00000000..fe1fd33d --- /dev/null +++ b/src/exportdialog.h @@ -0,0 +1,30 @@ +#ifndef EXPORTDIALOG_H +#define EXPORTDIALOG_H + +#include + +class QPrinter; +class QComboBox; +class FileSelectWidget; + +class ExportDialog : public QDialog +{ + Q_OBJECT + +public: + ExportDialog(QPrinter *printer, QWidget *parent = 0); + +public slots: + void accept(); + +private: + bool checkFile(); + + QPrinter *_printer; + + FileSelectWidget *_fileSelect; + QComboBox *_paperSize; + QComboBox *_orientation; +}; + +#endif // EXPORTDIALOG_H diff --git a/src/fileselectwidget.cpp b/src/fileselectwidget.cpp new file mode 100644 index 00000000..0df1a6b3 --- /dev/null +++ b/src/fileselectwidget.cpp @@ -0,0 +1,27 @@ +#include +#include +#include +#include "fileselectwidget.h" + + +FileSelectWidget::FileSelectWidget(QWidget *parent) : QWidget(parent) +{ + _edit = new QLineEdit(); + _button = new QPushButton(tr("Browse...")); + connect(_button, SIGNAL(clicked()), this, SLOT(browse())); + + QHBoxLayout *layout = new QHBoxLayout(); + layout->setMargin(0); + layout->addWidget(_edit); + layout->addWidget(_button); + setLayout(layout); +} + +void FileSelectWidget::browse() +{ + QString fileName = QFileDialog::getSaveFileName(this, tr("Select file"), + QDir::currentPath(), _filter); + + if (!fileName.isEmpty()) + _edit->setText(fileName); +} diff --git a/src/fileselectwidget.h b/src/fileselectwidget.h new file mode 100644 index 00000000..02ad0e81 --- /dev/null +++ b/src/fileselectwidget.h @@ -0,0 +1,30 @@ +#ifndef FILESELECTWIDGET_H +#define FILESELECTWIDGET_H + +#include +#include + +class QPushButton; + +class FileSelectWidget : public QWidget +{ + Q_OBJECT + +public: + FileSelectWidget(QWidget *parent = 0); + + QString file() {return _edit->text().isEmpty() ? QString() : _edit->text();} + void setFile(const QString &file) {_edit->setText(file);} + void setFilter(const QString &filter) {_filter = filter;} + +private slots: + void browse(); + +private: + QLineEdit *_edit; + QPushButton *_button; + + QString _filter; +}; + +#endif // FILESELECTWIDGET_H diff --git a/src/gui.cpp b/src/gui.cpp index 7492c199..2e44c22e 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -33,6 +33,7 @@ #include "trackinfo.h" #include "filebrowser.h" #include "cpuarch.h" +#include "exportdialog.h" #include "gui.h" @@ -204,15 +205,11 @@ void GUI::createActions() connect(_printFileAction, SIGNAL(triggered()), this, SLOT(printFile())); addAction(_printFileAction); _exportFileAction = new QAction(QIcon(QPixmap(EXPORT_FILE_ICON)), - tr("Export"), this); + tr("Export to PDF"), this); _exportFileAction->setShortcut(EXPORT_SHORTCUT); _exportFileAction->setActionGroup(_fileActionGroup); connect(_exportFileAction, SIGNAL(triggered()), this, SLOT(exportFile())); addAction(_exportFileAction); - _exportAsAction = new QAction(QIcon(QPixmap(EXPORT_FILE_ICON)), - tr("Export as"), this); - _exportAsAction->setActionGroup(_fileActionGroup); - connect(_exportAsAction, SIGNAL(triggered()), this, SLOT(exportAs())); _closeFileAction = new QAction(QIcon(QPixmap(CLOSE_FILE_ICON)), tr("Close"), this); _closeFileAction->setShortcut(CLOSE_SHORTCUT); @@ -322,7 +319,6 @@ void GUI::createMenus() _fileMenu->addSeparator(); _fileMenu->addAction(_printFileAction); _fileMenu->addAction(_exportFileAction); - _fileMenu->addAction(_exportAsAction); _fileMenu->addSeparator(); _fileMenu->addAction(_reloadFileAction); _fileMenu->addSeparator(); @@ -642,46 +638,28 @@ void GUI::closePOIFiles() void GUI::printFile() { QPrinter printer(QPrinter::HighResolution); - QPrintDialog printDialog(&printer, this); + QPrintDialog dialog(&printer, this); - if (printDialog.exec() == QDialog::Accepted) + if (dialog.exec() == QDialog::Accepted) plot(&printer); } -void GUI::exportAs() -{ - QString fileName = QFileDialog::getSaveFileName(this, tr("Export to PDF"), - QString(), "*.pdf"); - - if (!fileName.isEmpty()) { - exportFile(fileName); - _exportFileName = fileName; - } -} - void GUI::exportFile() -{ - if (_exportFileName.isEmpty()) - emit exportAs(); - else - exportFile(_exportFileName); -} - -void GUI::exportFile(const QString &fileName) { QPrinter printer(QPrinter::HighResolution); - printer.setPageSize(QPrinter::A4); printer.setOrientation(_track->orientation()); - printer.setOutputFormat(QPrinter::PdfFormat); - printer.setOutputFileName(fileName); + ExportDialog dialog(&printer, this); - plot(&printer); + if (dialog.exec() == QDialog::Accepted) + plot(&printer); } void GUI::plot(QPrinter *printer) { QPainter p(printer); TrackInfo info; + qreal ih, gh, mh; + if (_dateRange.first.isValid()) { if (_dateRange.first == _dateRange.second) { @@ -707,37 +685,26 @@ void GUI::plot(QPrinter *printer) info.insert(tr("Time"), timeSpan(_time)); - qreal ratio = p.paintEngine()->paintDevice()->logicalDpiX() / SCREEN_DPI; - qreal ih = info.contentSize().height() * ratio; - qreal mh = ih / 2; - -#define GRR(printer) \ - (((printer)->width() > (printer)->height()) \ - ? 0.15 * ((qreal)((printer)->width()) / (qreal)((printer)->height())) \ - : 0.15) -#define TRR(printer) \ - (1.0 - GRR(printer)) - if (info.isEmpty()) { - if (_trackGraphs->isVisible()) - _track->plot(&p, QRectF(0, 0, printer->width(), - (TRR(printer) * printer->height()))); - else - _track->plot(&p, QRectF(0, 0, printer->width(), printer->height())); + ih = 0; + mh = 0; } else { + qreal r = p.paintEngine()->paintDevice()->logicalDpiX() / SCREEN_DPI; + ih = info.contentSize().height() * r; + mh = ih / 2; info.plot(&p, QRectF(0, 0, printer->width(), ih)); - if (_trackGraphs->isVisible()) - _track->plot(&p, QRectF(0, ih + mh, printer->width(), - (TRR(printer) * printer->height()) - (ih + 2*mh))); - else - _track->plot(&p, QRectF(0, ih + mh, printer->width(), - printer->height() - (ih + mh))); } if (_trackGraphs->isVisible()) { + qreal r = (((qreal)(printer)->width()) / (qreal)(printer->height())); + gh = (printer->width() > printer->height()) + ? 0.15 * r * (printer->height() - ih - 2*mh) + : 0.15 * (printer->height() - ih - 2*mh); GraphView *gv = static_cast(_trackGraphs->currentWidget()); - gv->plot(&p, QRectF(0, TRR(printer) * printer->height(), - printer->width(), printer->height() * GRR(printer))); - } + gv->plot(&p, QRectF(0, printer->height() - gh, printer->width(), gh)); + } else + gh = 0; + _track->plot(&p, QRectF(0, ih + mh, printer->width(), printer->height() + - (ih + 2*mh + gh))); } void GUI::reloadFile() diff --git a/src/gui.h b/src/gui.h index 2f44713b..22e04c45 100644 --- a/src/gui.h +++ b/src/gui.h @@ -39,7 +39,6 @@ private slots: void dataSources(); void printFile(); void exportFile(); - void exportAs(); void openFile(); void closeAll(); void reloadFile(); @@ -125,7 +124,6 @@ private: QAction *_aboutQtAction; QAction *_printFileAction; QAction *_exportFileAction; - QAction *_exportAsAction; QAction *_openFileAction; QAction *_closeFileAction; QAction *_reloadFileAction; @@ -165,7 +163,6 @@ private: FileBrowser *_browser; QList _files; - QString _exportFileName; Map *_currentMap; int _trackCount;