From daf4ef894c00fc0b1020109ce9ca5394bfbd039f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20T=C5=AFma?= Date: Sat, 21 May 2016 16:10:24 +0200 Subject: [PATCH] Yet another bunch of print/PDF export improvements --- lang/gpxsee_cs.ts | 207 ++++++++++++++++++++-------------------------- src/graphview.cpp | 6 +- src/gui.cpp | 92 +++++++++++++-------- src/gui.h | 5 +- src/infoitem.h | 1 + src/trackinfo.cpp | 5 ++ src/trackinfo.h | 1 + 7 files changed, 159 insertions(+), 158 deletions(-) diff --git a/lang/gpxsee_cs.ts b/lang/gpxsee_cs.ts index ab38b7d4..93881291 100644 --- a/lang/gpxsee_cs.ts +++ b/lang/gpxsee_cs.ts @@ -59,385 +59,358 @@ 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 - + Open Otevřít - + Quit Ukončit - - - + + + Keyboard controls Ovládací klávesy - + Close Zavřít - + Reload Znovu načíst - + Show Zobrazit - - + + File Soubor - - - + + + Data sources Zdroje dat - + Print Tisknout - + Export Exportovat - + Export as 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 - - - Maximum - Maximum - - - - - Minimum - Minimum - - - - + + About GPXSee O aplikaci GPXSee - + Navigation Navigace - + Map sources Mapové zdroje - + POIs POI body - - + + Distance Vzdálenost - - + Time Čas - - - Ascent - Stoupání - - - - - - - + m m - - - Descent - Klesání - - - + %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: @@ -495,22 +468,22 @@ QObject - + mi mi - + ft ft - + km km - + m m diff --git a/src/graphview.cpp b/src/graphview.cpp index 84334b6a..be85dba9 100644 --- a/src/graphview.cpp +++ b/src/graphview.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include "config.h" #include "axisitem.h" #include "slideritem.h" @@ -244,10 +243,9 @@ void GraphView::plot(QPainter *painter, const QRectF &target) setUpdatesEnabled(false); redraw(canvas); - _slider->hide(); - _scene->removeItem(_info); + if (_slider->pos().x() == _slider->area().left()) + _slider->hide(); _scene->render(painter, target, _scene->itemsBoundingRect()); - _scene->addItem(_info); _slider->show(); redraw(); setUpdatesEnabled(true); diff --git a/src/gui.cpp b/src/gui.cpp index dbe2122f..2c914e1c 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -33,6 +33,10 @@ #include "gui.h" +#define PLOT_INFO_HEIGHT 200 +#define PLOT_MARGIN 100 +#define PLOT_GRAPH_RATIO 0.2 + static QString timeSpan(qreal time) { unsigned h, m, s; @@ -45,7 +49,6 @@ static QString timeSpan(qreal time) .arg(s, 2, 10, QChar('0')); } - GUI::GUI(QWidget *parent) : QMainWindow(parent) { loadMaps(); @@ -569,6 +572,11 @@ bool GUI::loadFile(const QString &fileName) for (int i = 0; i < gpx.trackCount(); i++) { _distance += gpx.track(i).distance(); _time += gpx.track(i).time(); + const QDate &date = gpx.track(i).date().date(); + if (_dateRange.first.isNull() || _dateRange.first > date) + _dateRange.first = date; + if (_dateRange.second.isNull() || _dateRange.second < date) + _dateRange.second = date; } _trackCount += gpx.trackCount(); @@ -674,45 +682,53 @@ void GUI::exportFile(const QString &fileName) void GUI::plot(QPrinter *printer) { QPainter p(printer); - TrackInfo info; - if (_imperialUnitsAction->isChecked()) { - info.insert(tr("Distance"), QString::number(_distance * M2MI, 'f', 1) - + UNIT_SPACE + tr("mi")); - info.insert(tr("Time"), timeSpan(_time)); - info.insert(tr("Ascent"), QString::number(_elevationGraph->ascent() - * M2FT, 'f', 0) + UNIT_SPACE + tr("ft")); - info.insert(tr("Descent"), QString::number(_elevationGraph->descent() - * M2FT, 'f', 0) + UNIT_SPACE + tr("ft")); - info.insert(tr("Maximum"), QString::number(_elevationGraph->max() - * M2FT, 'f', 0) + UNIT_SPACE + tr("ft")); - info.insert(tr("Minimum"), QString::number(_elevationGraph->min() - * M2FT, 'f', 0) + UNIT_SPACE + tr("ft")); - } else { - info.insert(tr("Distance"), QString::number(_distance * M2KM, 'f', 1) - + UNIT_SPACE + tr("km")); - info.insert(tr("Time"), timeSpan(_time)); - info.insert(tr("Ascent"), QString::number(_elevationGraph->ascent(), - 'f', 0) + UNIT_SPACE + tr("m")); - info.insert(tr("Descent"), QString::number(_elevationGraph->descent(), - 'f', 0) + UNIT_SPACE + tr("m")); - info.insert(tr("Maximum"), QString::number(_elevationGraph->max(), 'f', - 0) + UNIT_SPACE + tr("m")); - info.insert(tr("Minimum"), QString::number(_elevationGraph->min(), 'f', - 0) + UNIT_SPACE + tr("m")); + if (_dateRange.first.isValid()) { + if (_dateRange.first == _dateRange.second) { + QString format = QLocale::system().dateFormat(QLocale::LongFormat); + info.insert(tr("Date"), _dateRange.first.toString(format)); + } else { + QString format = QLocale::system().dateFormat(QLocale::ShortFormat); + info.insert(tr("Date"), QString("%1 - %2") + .arg(_dateRange.first.toString(format), + _dateRange.second.toString(format))); + } } + if (_distance > 0) { + if (_imperialUnitsAction->isChecked()) { + info.insert(tr("Distance"), QString::number(_distance * M2MI, 'f', + 1) + UNIT_SPACE + tr("mi")); + } else { + info.insert(tr("Distance"), QString::number(_distance * M2KM, 'f', + 1) + UNIT_SPACE + tr("km")); + } + } + if (_time > 0) + info.insert(tr("Time"), timeSpan(_time)); - if (_elevationGraph->count()) { - _track->plot(&p, QRectF(0, 300, printer->width(), - (0.80 * printer->height()) - 400)); - _elevationGraph->plot(&p, QRectF(0, 0.80 * printer->height(), - printer->width(), printer->height() * 0.20)); - info.plot(&p, QRectF(0, 0, printer->width(), 200)); + + if (info.isEmpty()) { + if (_trackGraphs->isVisible()) + _track->plot(&p, QRectF(0, 0, printer->width(), + ((1.0 - PLOT_GRAPH_RATIO) * printer->height()))); + else + _track->plot(&p, QRectF(0, 0, printer->width(), printer->height())); } else { - _track->plot(&p, QRectF(0, 300, printer->width(), - printer->height() - 300)); - info.plot(&p, QRectF(0, 0, printer->width(), 200)); + info.plot(&p, QRectF(0, 0, printer->width(), PLOT_INFO_HEIGHT)); + if (_trackGraphs->isVisible()) + _track->plot(&p, QRectF(0, PLOT_INFO_HEIGHT + PLOT_MARGIN, + printer->width(), ((1.0 - PLOT_GRAPH_RATIO) * printer->height()) + - (PLOT_INFO_HEIGHT + 2*PLOT_MARGIN))); + else + _track->plot(&p, QRectF(0, PLOT_INFO_HEIGHT + PLOT_MARGIN, + printer->width(), printer->height() + - (PLOT_INFO_HEIGHT + PLOT_MARGIN))); + } + if (_trackGraphs->isVisible()) { + GraphView *gv = static_cast(_trackGraphs->currentWidget()); + gv->plot(&p, QRectF(0, (1.0 - PLOT_GRAPH_RATIO) * printer->height(), + printer->width(), printer->height() * PLOT_GRAPH_RATIO)); } } @@ -720,6 +736,7 @@ void GUI::reloadFile() { _distance = 0; _time = 0; + _dateRange = DateRange(QDate(), QDate()); _trackCount = 0; _elevationGraph->clear(); @@ -748,6 +765,7 @@ void GUI::closeFiles() { _distance = 0; _time = 0; + _dateRange = DateRange(QDate(), QDate()); _trackCount = 0; _sliderPos = 0; @@ -1127,7 +1145,9 @@ void GUI::readSettings() settings.endGroup(); settings.beginGroup(SETTINGS_SETTINGS_GROUP); - if (settings.value(UNITS_SETTING, Metric).toInt() == Imperial) { + Units u = QLocale::system().measurementSystem() == QLocale::ImperialSystem + ? Imperial : Metric; + if (settings.value(UNITS_SETTING, u).toInt() == Imperial) { setImperialUnits(); _imperialUnitsAction->setChecked(true); } else diff --git a/src/gui.h b/src/gui.h index af8ed76f..2f44713b 100644 --- a/src/gui.h +++ b/src/gui.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "poi.h" class QMenu; @@ -69,6 +70,7 @@ private slots: private: typedef QPair GraphTab; + typedef QPair DateRange; void loadMaps(); void loadPOIs(); @@ -166,9 +168,10 @@ private: QString _exportFileName; Map *_currentMap; + int _trackCount; qreal _distance; qreal _time; - int _trackCount; + DateRange _dateRange; qreal _sliderPos; diff --git a/src/infoitem.h b/src/infoitem.h index 74fa6fcc..f99ad9b7 100644 --- a/src/infoitem.h +++ b/src/infoitem.h @@ -15,6 +15,7 @@ public: void insert(const QString &key, const QString &value); void clear(); + bool isEmpty() {return _list.isEmpty();} private: void updateBoundingRect(); diff --git a/src/trackinfo.cpp b/src/trackinfo.cpp index 0079178d..6c68cc19 100644 --- a/src/trackinfo.cpp +++ b/src/trackinfo.cpp @@ -16,3 +16,8 @@ void TrackInfo::plot(QPainter *painter, const QRectF &target) { render(painter, target); } + +bool TrackInfo::isEmpty() +{ + return _info->isEmpty(); +} diff --git a/src/trackinfo.h b/src/trackinfo.h index 5df931f7..71bfd245 100644 --- a/src/trackinfo.h +++ b/src/trackinfo.h @@ -14,6 +14,7 @@ public: void insert(const QString &key, const QString &value); void plot(QPainter *painter, const QRectF &target); + bool isEmpty(); private: InfoItem *_info;