1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-07-01 05:19:15 +02:00

Compare commits

..

55 Commits

Author SHA1 Message Date
a8299050c5 Added support for "data defined" styles 2022-09-23 02:35:09 +02:00
e8e1e98775 Version++ 2022-09-14 22:31:53 +02:00
6768647070 Fixed broken zoom 0 on HiDPI displays 2022-09-14 00:21:50 +02:00
de63009edd Enabled Catalan localization 2022-09-06 09:31:27 +02:00
raf
125f99e8f4 Translated using Weblate (Catalan)
Currently translated at 100.0% (464 of 464 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ca/
2022-09-06 00:36:06 +02:00
raf
092929a967 Translated using Weblate (Catalan)
Currently translated at 63.3% (294 of 464 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ca/
2022-09-02 23:20:28 +02:00
fafe6c4b03 Various KML/KMZ parsing fixes and code cleanup 2022-09-02 22:53:38 +02:00
b156e25023 Properly handle PhotoOverlay icon URLs 2022-09-02 09:55:11 +02:00
e15deccfca Added Catalan localization stub 2022-09-02 08:42:28 +02:00
9b24bccfed Added PhotoOverlay support
+ non-shared styles
2022-09-02 08:36:58 +02:00
589c602d21 Document styles are not inherited 2022-09-01 00:49:21 +02:00
b7df3cbe0e Added support for KMZ data files + KML icons
fixes #312
2022-09-01 00:28:00 +02:00
f08f5893a3 Only offset the waypoint icons when they are using the symbol icons 2022-09-01 00:25:48 +02:00
1d5f7db12f Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (464 of 464 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2022-08-30 08:58:07 +02:00
532a1eb69f Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.7% (458 of 464 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2022-08-20 11:22:56 +02:00
1efb4e494d Properly abort the connections on timeout 2022-08-17 01:50:24 +02:00
4653f771a6 Code cleanup 2022-08-15 09:12:37 +02:00
22e5ffaa0c Added support for non-SQL Orux maps
+ error handling fixes/improvements
2022-08-11 23:39:36 +02:00
9a4514a464 Version++ 2022-08-11 23:38:48 +02:00
7d47f243ea Added Orux maps to supported offline maps 2022-08-11 01:02:58 +02:00
18c2613302 Updated Qt6 version to Qt 6.3 2022-08-11 00:11:40 +02:00
e2bdc1aae6 Added support for RD grid and Ellipsoidal mercator projections
+ removed (aparently) unsupported projections
2022-08-11 00:04:45 +02:00
a245043573 Merge remote-tracking branch 'weblate/master' 2022-08-08 23:28:04 +02:00
42dbc91143 Translated using Weblate (German)
Currently translated at 100.0% (464 of 464 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/de/
2022-08-08 23:27:19 +02:00
23a7c6d4eb Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (464 of 464 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/zh_Hans/
2022-08-08 23:26:40 +02:00
b6b4319f89 Translated using Weblate (Esperanto)
Currently translated at 92.8% (431 of 464 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/eo/
2022-08-08 23:26:39 +02:00
8673c00a23 Translated using Weblate (Hungarian)
Currently translated at 100.0% (464 of 464 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/hu/
2022-08-08 23:26:39 +02:00
90280fb018 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (464 of 464 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/uk/
2022-08-08 23:26:39 +02:00
285022c17a Translated using Weblate (Turkish)
Currently translated at 100.0% (464 of 464 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/tr/
2022-08-08 23:26:39 +02:00
e76bb40d10 Translated using Weblate (Swedish)
Currently translated at 100.0% (464 of 464 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2022-08-08 23:26:38 +02:00
bbf5c09377 Translated using Weblate (Russian)
Currently translated at 100.0% (464 of 464 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2022-08-08 23:26:38 +02:00
e1c7ad18e6 Translated using Weblate (Finnish)
Currently translated at 97.4% (452 of 464 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2022-08-08 23:26:38 +02:00
99792f2984 Translated using Weblate (Czech)
Currently translated at 100.0% (464 of 464 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/cs/
2022-08-08 23:26:19 +02:00
6d2e6f64d3 Added support for LAEA projections to Orux maps 2022-08-08 23:24:33 +02:00
183cb4825c Fixed cut&paste errors 2022-08-08 10:11:19 +02:00
7b8fff7440 Properly sort the Orux maps zoom levels 2022-08-08 00:21:24 +02:00
a01ff33768 Add another alias for WGS84 2022-08-08 00:20:30 +02:00
c3117bb3ac Fixed projection parameters parsing in Orux maps 2022-08-07 23:44:48 +02:00
20fe804293 Localization update 2022-08-07 22:34:36 +02:00
525f70f15e Fixed PNG/PDF export dialogues on Android 2022-08-07 22:31:10 +02:00
209df67380 Orux maps desktop integration 2022-08-07 22:30:38 +02:00
6e40d8cbc7 Handle Orux maps as directories
(there can not be two Orux maps in the same directory)
2022-08-05 08:40:38 +02:00
0ef28cda0f Fixed map calibration 2022-08-05 08:34:16 +02:00
1b83f88b27 Switch to macos-latest as macos-10.15 was cancelled 2022-08-04 00:13:10 +02:00
a40ed633ae Version++ 2022-08-04 00:07:41 +02:00
399299d192 Added support for Orux maps 2022-08-04 00:06:36 +02:00
ec68557de5 NDK root, again... 2022-07-31 17:10:32 +02:00
c68fc72387 Another atempt to set the NDK path... 2022-07-31 16:51:39 +02:00
3c9da66a51 Added missing NDK path 2022-07-31 16:43:32 +02:00
22e56e06fd Back to qt install @v2 2022-07-31 14:22:51 +02:00
2e9d173f53 Added missing Java distribution 2022-07-31 14:05:46 +02:00
84b7da13f0 Some more CI tools version updates 2022-07-31 14:00:51 +02:00
ed74d0c069 Updated Qt/Qt install action versions 2022-07-31 13:51:27 +02:00
218eb3be56 Added GEMF and Osmdroid SQLite maps support info 2022-07-31 13:43:46 +02:00
5795395107 Added missing GEMF icon resource entry 2022-07-31 13:22:33 +02:00
67 changed files with 4630 additions and 634 deletions

View File

@ -1,4 +1,4 @@
version: 11.2.{build}
version: 11.5.{build}
configuration:
- Release
@ -11,7 +11,7 @@ environment:
OPENSSLDIR: C:\OpenSSL-v111-Win64\bin
matrix:
- QTDIR: C:\Qt\5.15\msvc2019_64
- QTDIR: C:\Qt\6.2\msvc2019_64
- QTDIR: C:\Qt\6.3\msvc2019_64
NSISDEF: /DQT6
install:

View File

@ -11,10 +11,11 @@ jobs:
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: set up JDK 11
uses: actions/setup-java@v1
uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: '11'
- name: Setup Android SDK
uses: android-actions/setup-android@v2
@ -22,16 +23,18 @@ jobs:
run: ${ANDROID_HOME}/tools/bin/sdkmanager --update
- name: Install android platform, platform-tools, build-tools and ndk
run: ${ANDROID_HOME}/tools/bin/sdkmanager --install "cmdline-tools;latest" "platform-tools" "platforms;android-31" "build-tools;31.0.0" "ndk;22.1.7171670"
- name: Setup NDK path
run: echo "ANDROID_NDK_ROOT=${ANDROID_HOME}/ndk/22.1.7171670/" >> $GITHUB_ENV
- name: Install Qt (Desktop)
uses: jurplel/install-qt-action@v2
with:
aqtversion: '==2.1.0'
version: '6.3.0'
version: '6.3.1'
- name: Install Qt (Android)
uses: jurplel/install-qt-action@v2
with:
aqtversion: '==2.1.0'
version: '6.3.0'
version: '6.3.1'
target: 'android'
arch: 'android_armv7'
modules: qtpositioning qt5compat
@ -40,7 +43,7 @@ jobs:
- name: Create localization
run: lrelease gpxsee.pro
- name: Configure build
run: qmake gpxsee.pro OPENSSL_PATH=android_openssl
run: qmake gpxsee.pro OPENSSL_PATH=android_openssl
- name: Build project
run: make -j2 apk
- name: Upload artifacts

View File

@ -8,7 +8,7 @@ on:
jobs:
qt5:
name: GPXSee Qt5 build
runs-on: macos-10.15
runs-on: macos-latest
steps:
- name: Set environment variables
run: echo "PATH=/usr/local/opt/qt@5/bin:$PATH" >> $GITHUB_ENV

View File

@ -11,7 +11,8 @@ GPS log file formats.
* Offline maps (MBTiles, OziExplorer maps, TrekBuddy maps/atlases,
Garmin IMG/GMAP & JNX maps, TwoNav RMaps, GeoTIFF images, BSB charts, KMZ maps,
AlpineQuest maps, Locus/OsmAnd/RMaps SQLite maps, Mapsforge vector maps,
QCT maps, ESRI World-File georeferenced images).
QCT maps, GEMF maps, Osmdroid SQLite maps, Orux maps,
ESRI World-File georeferenced images).
* Elevation, speed, heart rate, cadence, power, temperature and gear ratio/shifts
graphs.
* Support for DEM files (SRTM HGT).

View File

@ -3,7 +3,7 @@ unix:!macx:!android {
} else {
TARGET = GPXSee
}
VERSION = 11.2
VERSION = 11.5
QT += core \
gui \
@ -114,9 +114,11 @@ HEADERS += src/common/config.h \
src/GUI/pngexportdialog.h \
src/GUI/timezoneinfo.h \
src/GUI/passwordedit.h \
src/data/style.h \
src/data/twonavparser.h \
src/map/IMG/section.h \
src/map/gemfmap.h \
src/map/oruxmap.h \
src/map/osmdroidmap.h \
src/map/proj/polyconic.h \
src/map/proj/webmercator.h \
@ -321,6 +323,7 @@ SOURCES += src/main.cpp \
src/GUI/passwordedit.cpp \
src/data/twonavparser.cpp \
src/map/gemfmap.cpp \
src/map/oruxmap.cpp \
src/map/osmdroidmap.cpp \
src/map/proj/polyconic.cpp \
src/map/proj/webmercator.cpp \
@ -455,7 +458,8 @@ TRANSLATIONS = lang/gpxsee_en.ts \
lang/gpxsee_hu.ts \
lang/gpxsee_it.ts \
lang/gpxsee_eo.ts \
lang/gpxsee_zh.ts
lang/gpxsee_zh.ts \
lang/gpxsee_ca.ts
macx {
ICON = icons/app/gpxsee.icns
@ -506,7 +510,8 @@ win32 {
icons/formats/omd.ico \
icons/formats/ghp.ico \
icons/formats/qct.ico \
icons/formats/trk.ico
icons/formats/trk.ico \
icons/formats/gemf.ico
DEFINES += _USE_MATH_DEFINES \
NOGDI
}

2523
lang/gpxsee_ca.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Vybrat soubor</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Nebyl zvolen žádný výstupní soubor.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 je adresář.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 nelze zapsat.</translation>
</message>
@ -1204,97 +1205,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Podporované soubory</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>MBTiles mapy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Garmin JNX mapy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation>AlpineQuest mapy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Garmin IMG mapy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>BSB námořní mapy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation>GEMF mapy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation>KMZ mapy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation>Mapsforge mapy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>OziExplorer mapy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation>Orux mapy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation>QuickChart mapy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation>Osmdroid SQLite mapy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>TrekBuddy mapy/atlasy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>GeoTIFF obrázky</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation>Všechny soubory</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>TwoNav mapy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation>Locus/OsmAnd/RMaps SQLite mapy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation>Georeferencované obrázky - world-file</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Online mapové zdroje</translation>
</message>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Vælg fil</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Ingen uddatafil valgt.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 er en mappe.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 er skrivebeskyttet.</translation>
</message>
@ -1203,97 +1204,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Understøttede filer</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Garmin JNX-kort</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Garmin IMG-kort</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>OziExplorer-kort</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>QuickChart maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Osmdroid SQLite maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>TrekBuddy maps/atlases</source>
<translation>TrekBuddy kort/atlas</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>GeoTIFF images</source>
<translation>GeoTIFF billeder</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>All files</source>
<translation type="unfinished">Alle filer</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>TwoNav maps</source>
<source>Orux maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>TrekBuddy kort/atlas</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>GeoTIFF billeder</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation type="unfinished">Alle filer</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Online-kort kilder</translation>
</message>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Datei auswählen</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Keine Ausgabedatei ausgewählt.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 ist ein Verzeichnis.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 ist nicht beschreibbar.</translation>
</message>
@ -1203,97 +1204,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Unterstützte Dateien</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>MBTiles-Karten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Garmin JNX-Karten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation>AlpineQuest-Karten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Garmin IMG-Karten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>BSB-Seekarten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation>GEMF-Karten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation>KMZ-Karten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation>Mapsforge-Karten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>OziExplorer-Karten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation>Orux-Karten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation>QuickChart-Karten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation>Osmdroid SQLite-Karten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>TrekBuddy-Karten/Atlanten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>GeoTIFF-Bilder</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation>Alle Dateien</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>TwoNav-Karten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation>Locus/OsmAnd/RMaps SQLite-Karten</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation>World-File georeferenzierte Bilder</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Online-Kartenquellen</translation>
</message>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Elekti dosieron</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Neniu eligdosiero estas elektita.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 estas dosierujo.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 ne estas skribebla.</translation>
</message>
@ -1203,97 +1204,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Subtenataj dosieroj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation>AlpineQuest-mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Garmin IMG -mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Garmin JNX -mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>BSB -maraj mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation>GEMF-mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation>KMZ-mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation>Mapsforge-mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>OziExplorer-mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>MBTiles-mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation>Orux-mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation>QuickChart-mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation>Osmdroid SQLite -mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>TrekBuddy-mapoj/maparoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>GeoTIFF-bildoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation>Ĉiuj dosieroj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>TwoNav-mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation>Locus/OsmAnd/RMaps SQLite -mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Fontoj de Online-mapoj</translation>
</message>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Escoger archivo</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Falta nombre de archivo.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 es una carpeta.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 es de solo lectura.</translation>
</message>
@ -1203,97 +1204,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Formatos admitidos</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>Mapas MBTiles</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Mapas Garmin JNX</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Mapas Garmin IMG</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>Mapas OziExplorer</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>Mapas/atlas TrekBuddy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>Imágenes GeoTIFF</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation type="unfinished">Todos los archivos</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>Mapas TwoNav</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Fuentes de mapas en línea</translation>
</message>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Valitse tiedosto</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Ei tulostustiedostoa valittu.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 on hakemisto.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 ei voi kirjoittaa.</translation>
</message>
@ -1203,97 +1204,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Tuetut tiedostot</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>MBTiles-kartat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Garmin JNX -kartat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation>AlpineQuest-kartat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Garmin IMG -kartat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>BSB-merikartat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation>GEMF-kartat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation>KMZ-kartat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation>Mapsforge-kartat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>OziExplorer-kartat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation>Orux-kartat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation>QuickChart-kartat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation>Osmdroid SQLite -kartat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>TrekBuddy-kartat/kartastot</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>GeoTIFF -kuvat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation>Kaikki tiedostot</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>TwoNav-kartat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation>Locus/OsmAnd/RMaps SQLite -kartat</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Online-karttojen lähteet</translation>
</message>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Sélectionner un fichier</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Auncun fichier sélectionné.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 est un dossier.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 n&apos;est pas inscriptible.</translation>
</message>
@ -1203,97 +1204,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Formats pris en charge</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>Cartes MBTiles</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Cartes Garmin JNX</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation>Cartes AlpineQuest</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Cartes Garmin IMG</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>Cartes marines BSB</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation>Cartes KMZ</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation>Cartes Mapsforge</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>Cartes OziExplorer</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation>Cartes QuickChart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>Cartes ou atlas TrekBuddy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>Images GeoTIFF</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation type="unfinished">Tous les fichiers</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>Cartes TwoNav</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation>Cartes SQLite Locus, OsmAnd ou RMaps</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation>Images de carte positionnées par world file</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Cartes en ligne</translation>
</message>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Fájl választása</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Nincs kiválasztott kimeneti fájl.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>A(z) %1 egy mappa.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>A(z) %1 írásvédett.</translation>
</message>
@ -1013,7 +1014,6 @@
<source>%n files</source>
<translation>
<numerusform>%n fájl</numerusform>
<numerusform>%n fájl</numerusform>
</translation>
</message>
</context>
@ -1203,97 +1203,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Támogatott fájltípusok</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation>AlpineQuest térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Garmin IMG térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Garmin JNX térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>BSB tengeri térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation>GEMF térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation>KMZ térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation>Mapsforge térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>OziExplorer térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>MBTiles térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation>Orux térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation>QuickChart térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation>Osmdroid SQLite térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>TrekBuddy térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>GeoTIFF képek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation>Minden fájl</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>TwoNav térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation>Locus/OsmAnd/RMaps SQLite térképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation>Georeferált világ-fájlképek</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Online térképforrások</translation>
</message>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Seleziona file</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Nessun file di output selezionato.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 è una cartella.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 non è scrivibile.</translation>
</message>
@ -1203,97 +1204,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>File supportati</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation>Mappe AlpineQuest</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Mappe Garmin IMG</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Mappe Garmin JNX</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>Carte nautiche BSB</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation>Mappe KMZ</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation>Mappe Mapsforge</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>Mappe OziExplorer</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>Mappe MBTiles</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>Mappe/Atlanti TrekBuddy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>Immagini GeoTIFF</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation type="unfinished">Tutti i file</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>Mappe TwoNav</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation>Mappe Locus/OsmAnd/RMaps o SQLite</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Mappe online</translation>
</message>

View File

@ -200,13 +200,13 @@
<location filename="../src/GUI/elevationgraph.cpp" line="60"/>
<source>Up</source>
<extracomment>Use an Unicode arrow (U+2197) when there is no abbreviation or extremly short term for &quot;Up&quot; in your language</extracomment>
<translation type="unfinished">Opp</translation>
<translation>Opp</translation>
</message>
<message>
<location filename="../src/GUI/elevationgraph.cpp" line="64"/>
<source>Down</source>
<extracomment>Use an Unicode arrow (U+2198) when there is no abbreviation or extremly short term for &quot;Down&quot; in your language</extracomment>
<translation type="unfinished">Ned</translation>
<translation>Ned</translation>
</message>
<message>
<location filename="../src/GUI/elevationgraph.cpp" line="67"/>
@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Velg fil</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Ingen utdatafil valgt.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 er en mappe.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 er skrivebeskyttet.</translation>
</message>
@ -373,7 +374,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="219"/>
<source>Open directory...</source>
<translation type="unfinished">Åpne mappe </translation>
<translation>Åpne mappe </translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="224"/>
@ -597,7 +598,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="477"/>
<source>Show tabs</source>
<translation type="unfinished"></translation>
<translation>Vis faner</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="486"/>
@ -711,7 +712,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="955"/>
<source>Open directory</source>
<translation type="unfinished">Åpne mappe</translation>
<translation>Åpne mappe</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="1959"/>
@ -1028,7 +1029,7 @@
<message>
<location filename="../src/GUI/gearratiograph.cpp" line="28"/>
<source>Top</source>
<translation type="unfinished">Topp</translation>
<translation>Topp</translation>
</message>
<message>
<location filename="../src/GUI/gearratiograph.cpp" line="30"/>
@ -1203,97 +1204,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Støttede filer</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>MBTiles-kart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Garmin JNX-kart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation>AlpineQuest-kart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Garmin IMG-kart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>BSB-sjøkart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation type="unfinished"></translation>
<translation>GEMF-kart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation>KMZ-kart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation>Mapsforge-kart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>OziExplorer-kart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation>Orux-kart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation>QuickChart-kart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation type="unfinished"></translation>
<translation>Osmdroid SQLite-kart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation>Locus/OsmAnd/RMaps-SQLite-kart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>TrekBuddy-kart/atlas</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>GeoTIFF-bilder</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation type="unfinished">Alle filer</translation>
<translation>Alle filer</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>TwoNav-kart</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation>World-file georefererte bilder</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Nettbaserte kartkilder</translation>
</message>
@ -1915,7 +1921,7 @@
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="779"/>
<source>Initial paths</source>
<translation type="unfinished">Forvalgte stier</translation>
<translation>Forvalgte stier</translation>
</message>
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="814"/>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Wybierz plik</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Nie wybrano pliku docelowego.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 jest katalogiem.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 nie jest zapisywalny.</translation>
</message>
@ -1204,97 +1205,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Obsługiwane pliki</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>Mapy MBTiles</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Mapy Garmin JNX</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation>Mapy AlpineQuest</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Mapy Garmin IMG</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>Mapy morskie BSB</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation>Mapy KMZ</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation>Mapy Mapsforge</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>Mapy OziExplorer</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>Mapy/atlasy TrekBuddy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>Obrazy GeoTIFF</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation type="unfinished">Wszystkie pliki</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>Mapy TwoNav</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation>Mapy Locus/OsmAnd/RMaps SQLite</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation>Obrazy georeferencyjne z plikami ze świata</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Źródła map online</translation>
</message>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Selecionar arquivo</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Nenhum arquivo de saída selecionado.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 é uma pasta.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 é apenas para leitura.</translation>
</message>
@ -1203,97 +1204,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Formatos suportados</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>Mapas MBTiles</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Mapas Garmin JNX</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Mapas Garmin IMG</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>Cartas náuticas BSB</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>Mapas OziExplorer</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>Mapas/Atlas TrekBuddy</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>Imagens GeoTIFF</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation type="unfinished">Todos os arquivos</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>Mapas TwoNav</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Mapas online</translation>
</message>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Выбрать файл</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Не выбран файл вывода.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 - это директория.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 не доступен для записи.</translation>
</message>
@ -1204,97 +1205,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Все поддерживаемые файлы</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>MBTiles карты</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Garmin JNX карты</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation>AlpineQuest карты</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Garmin IMG карты</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>BSB навигационные карты</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation>GEMF карты</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation>KMZ карты</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation>Карты Mapsforge</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>OziExplorer карты</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation>Orux карты</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation>QuickChart карты</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation>Osmdroid SQLite карты</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>TrekBuddy карты/атласы</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>GeoTIFF изображения</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation>Все файлы</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>TwoNav карты</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation>Locus/OsmAnd/RMaps SQLite карты</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation>Изображения с геопривязкой World-файлe</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Источники онлайн карт</translation>
</message>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Välj fil</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Ingen utdatafil vald.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 är en mapp.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 är skrivskyddad.</translation>
</message>
@ -1203,97 +1204,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Filer som stöds</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>MBTiles-kartor</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Garmin JNX-kartor</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation>AlpineQuest kartor</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Garmin IMG-kartor</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>BSB nautiska sjökort</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation>GEMF-kartor</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation>KMZ-kartor</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation>Mapsforge-kartor</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>OziExplorer-kartor</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation>Orux-kartor</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation>QuickChart-kartor</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation>Osmdroid SQLite-kartor</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>TrekBuddy-kartor/-atlaser</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>GeoTIFF-bilder</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation>Alla filer</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>TwoNav-kartor</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation>Locus/OsmAnd/RMaps SQLite-kartor</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation>Georefererade bilder i världsfil</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Online-kartkällor</translation>
</message>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Dosya seç</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Çıktı dosyası seçilmedi.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 bir dizin.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 yazılabilir değil.</translation>
</message>
@ -1202,97 +1203,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Desteklenen dosyalar</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>MBTiles haritaları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Garmin JNX haritaları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation>AlpineQuest haritaları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Garmin IMG haritaları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>BSB denizcilik haritaları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation>GEMF haritaları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation>KMZ haritaları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation>Mapsforge haritaları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>OziExplorer haritaları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation>Orux haritaları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation>QuickChart haritaları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation>Osmdroid SQLite haritaları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>TrekBuddy haritaları/atlasları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>GeoTIFF görüntüleri</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation>Tüm dosyalar</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>TwoNav haritaları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation>Locus/OsmAnd/RMaps SQLite haritaları</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation>World-file coğrafi referanslı görüntüleri</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Çevrim içi harita kaynakları</translation>
</message>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation>Вибрати файл</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation>Не обрано вихідний файл.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 є каталогом.</translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 недоступний для запису.</translation>
</message>
@ -1204,97 +1205,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation>Всі підтримувані формати</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation>AlpineQuest мапи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation>Garmin IMG мапи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation>Garmin JNX мапи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>BSB навігаційні мапи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation>GEMF мапи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation>KMZ мапи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation>Mapsforge мапи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>OziExplorer мапи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>MBTiles мапи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation>Orux мапи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation>QuickChart мапи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation>Osmdroid SQLite мапи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>TrekBuddy мапи/атласи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>GeoTIFF зображення</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation>Всі файли</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>TwoNav мапи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation>Locus/OsmAnd/RMaps SQLite мапи</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation>Зображення з геопривязками World-файлу</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>Онлайнові джерела мап</translation>
</message>

View File

@ -287,22 +287,23 @@
<context>
<name>FileSelectWidget</name>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="41"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="44"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="49"/>
<source>Select file</source>
<translation></translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="51"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="59"/>
<source>No output file selected.</source>
<translation></translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="61"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="69"/>
<source>%1 is a directory.</source>
<translation>%1 </translation>
</message>
<message>
<location filename="../src/GUI/fileselectwidget.cpp" line="65"/>
<location filename="../src/GUI/fileselectwidget.cpp" line="73"/>
<source>%1 is not writable.</source>
<translation>%1 </translation>
</message>
@ -1202,97 +1203,102 @@
<context>
<name>MapList</name>
<message>
<location filename="../src/map/maplist.cpp" line="152"/>
<location filename="../src/map/maplist.cpp" line="154"/>
<source>Supported files</source>
<translation></translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="154"/>
<location filename="../src/map/maplist.cpp" line="156"/>
<source>AlpineQuest maps</source>
<translation>AlpineQuest </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="155"/>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Garmin IMG maps</source>
<translation> IMG </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="157"/>
<location filename="../src/map/maplist.cpp" line="160"/>
<source>Garmin JNX maps</source>
<translation> JNX </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<location filename="../src/map/maplist.cpp" line="161"/>
<source>BSB nautical charts</source>
<translation>BSB </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="159"/>
<location filename="../src/map/maplist.cpp" line="157"/>
<source>GEMF maps</source>
<translation>GEMF </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="160"/>
<location filename="../src/map/maplist.cpp" line="162"/>
<source>KMZ maps</source>
<translation>KMZ </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="161"/>
<location filename="../src/map/maplist.cpp" line="163"/>
<source>Mapsforge maps</source>
<translation>Mapsforge </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="162"/>
<location filename="../src/map/maplist.cpp" line="164"/>
<source>OziExplorer maps</source>
<translation>OziExplorer </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="163"/>
<location filename="../src/map/maplist.cpp" line="165"/>
<source>MBTiles maps</source>
<translation>MBTiles </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="164"/>
<location filename="../src/map/maplist.cpp" line="166"/>
<source>Orux maps</source>
<translation>Orux </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<source>QuickChart maps</source>
<translation>QuickChart </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>
<location filename="../src/map/maplist.cpp" line="168"/>
<source>TwoNav maps</source>
<translation>TwoNav </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="166"/>
<location filename="../src/map/maplist.cpp" line="169"/>
<source>Osmdroid SQLite maps</source>
<translation>Osmdroid SQLite </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="167"/>
<location filename="../src/map/maplist.cpp" line="170"/>
<source>Locus/OsmAnd/RMaps SQLite maps</source>
<translation>Locus/OsmAnd/RMaps SQLite </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="169"/>
<location filename="../src/map/maplist.cpp" line="172"/>
<source>TrekBuddy maps/atlases</source>
<translation>TrekBuddy /</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="170"/>
<location filename="../src/map/maplist.cpp" line="173"/>
<source>GeoTIFF images</source>
<translation>GeoTIFF </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="171"/>
<location filename="../src/map/maplist.cpp" line="174"/>
<source>World-file georeferenced images</source>
<translation>World-file georeferenced </translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="173"/>
<location filename="../src/map/maplist.cpp" line="176"/>
<source>Online map sources</source>
<translation>线</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="174"/>
<location filename="../src/map/maplist.cpp" line="177"/>
<source>All files</source>
<translation></translation>
</message>

View File

@ -462,6 +462,20 @@
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>xml</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.orux.map+xml</string>
</array>
<key>CFBundleTypeName</key>
<string>Orux Map File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
@ -1524,6 +1538,27 @@
<string>application/vnd.twonav.trk</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.oruxmap.xml</string>
<key>UTTypeReferenceURL</key>
<string>https://www.oruxmaps.com/OruxMapsManual-9.0_en.pdf</string>
<key>UTTypeDescription</key>
<string>Orux Map File</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.xml</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>xml</string>
</array>
<key>public.mime-type</key>
<string>application/vnd.orux.map+xml</string>
</dict>
</dict>
</array>
<key>UTExportedTypeDeclarations</key>

View File

@ -22,7 +22,8 @@
TwoNav RMaps, Garmin IMG &amp; JNX maps, GeoTIFF images,
BSB nautical charts, KMZ maps, AlpineQuest maps,
Locus/OsmAnd/RMaps SQLite maps, Osmdroid SQLite maps,
Mapsforge maps, QCT maps, ESRI world files).</li>
Mapsforge maps, QCT maps, GEMF maps, Orux maps,
ESRI world files).</li>
<li>Elevation, speed, heart rate, cadence, power, temperature and
gear ratio graphs.</li>
<li>Support for multiple tracks in one view.</li>
@ -105,5 +106,6 @@
<mimetype>application/vnd.twonav.rte</mimetype>
<mimetype>application/vnd.twonav.wpt</mimetype>
<mimetype>application/vnd.cgtk.gemf</mimetype>
<mimetype>application/vnd.orux.map+xml</mimetype>
</mimetypes>
</component>

View File

@ -15,4 +15,4 @@ Icon=gpxsee
Terminal=false
Type=Application
Categories=Graphics;Viewer;Education;Geography;Maps;Sports;Qt
MimeType=application/gpx+xml;application/vnd.garmin.tcx+xml;application/vnd.ant.fit;application/vnd.google-earth.kml+xml;application/vnd.fai.igc;application/vnd.nmea.nmea;application/vnd.oziexplorer.plt;application/vnd.oziexplorer.rte;application/vnd.oziexplorer.wpt;application/vnd.groundspeak.loc+xml;application/vnd.sigma.slf+xml;application/geo+json;application/vnd.naviter.seeyou.cup;application/vnd.garmin.gpi;application/vnd.suunto.sml+xml;image/jpeg;text/csv;application/vnd.garmin.img;application/vnd.garmin.jnx;application/vnd.garmin.gmap+xml;image/vnd.maptech.kap;application/vnd.oziexplorer.map;application/vnd.mapbox.mbtiles;application/vnd.twonav.rmap;application/vnd.trekbuddy.tba;application/vnd.gpxsee.map+xml;application/x-tar;image/tiff;application/vnd.google-earth.kmz;application/vnd.alpinequest.aqm;application/vnd.cgtk.gemf;application/vnd.rmaps.sqlite;application/vnd.osmdroid.sqlite;application/vnd.mapsforge.map;application/vnd.tomtom.ov2;application/vnd.tomtom.itn;application/vnd.esri.wld;application/vnd.onmove.omd;application/vnd.onmove.ghp;application/vnd.memory-map.qct;application/vnd.twonav.trk;application/vnd.twonav.rte;application/vnd.twonav.wpt
MimeType=application/gpx+xml;application/vnd.garmin.tcx+xml;application/vnd.ant.fit;application/vnd.google-earth.kml+xml;application/vnd.fai.igc;application/vnd.nmea.nmea;application/vnd.oziexplorer.plt;application/vnd.oziexplorer.rte;application/vnd.oziexplorer.wpt;application/vnd.groundspeak.loc+xml;application/vnd.sigma.slf+xml;application/geo+json;application/vnd.naviter.seeyou.cup;application/vnd.garmin.gpi;application/vnd.suunto.sml+xml;image/jpeg;text/csv;application/vnd.garmin.img;application/vnd.garmin.jnx;application/vnd.garmin.gmap+xml;image/vnd.maptech.kap;application/vnd.oziexplorer.map;application/vnd.mapbox.mbtiles;application/vnd.twonav.rmap;application/vnd.trekbuddy.tba;application/vnd.gpxsee.map+xml;application/x-tar;image/tiff;application/vnd.google-earth.kmz;application/vnd.alpinequest.aqm;application/vnd.cgtk.gemf;application/vnd.rmaps.sqlite;application/vnd.osmdroid.sqlite;application/vnd.mapsforge.map;application/vnd.tomtom.ov2;application/vnd.tomtom.itn;application/vnd.esri.wld;application/vnd.onmove.omd;application/vnd.onmove.ghp;application/vnd.memory-map.qct;application/vnd.twonav.trk;application/vnd.twonav.rte;application/vnd.twonav.wpt;application/vnd.orux.map+xml

View File

@ -331,4 +331,12 @@
<glob pattern="*.qct"/>
</mime-type>
<mime-type type="application/vnd.orux.map+xml">
<comment>Orux Map File</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="application-xml"/>
<root-XML namespaceURI="http://oruxtracker.com/app/res/calibration" localName="OruxTracker"/>
<glob pattern="*.otrk2.xml"/>
</mime-type>
</mime-info>

View File

@ -37,7 +37,7 @@ Unicode true
; The name of the installer
Name "GPXSee"
; Program version
!define VERSION "11.2"
!define VERSION "11.5"
; The file to write
OutFile "GPXSee-${VERSION}_x64.exe"
@ -313,6 +313,7 @@ SectionEnd
!endif
SectionGroup "Localization" SEC_LOCALIZATION
!insertmacro LOCALIZATION "Catalan" "ca"
!insertmacro LOCALIZATION "Chinese (Simplified)" "zh"
!insertmacro LOCALIZATION "Czech" "cs"
!insertmacro LOCALIZATION "Danish" "da"

View File

@ -28,10 +28,17 @@ AreaItem::AreaItem(const Area &area, Map *map, GraphicsItem *parent)
_map = map;
_digitalZoom = 0;
_width = 2;
_opacity = 0.5;
QBrush brush(Qt::SolidPattern);
_pen = QPen(brush, _width);
if (_area.style().isValid()) {
_width = (_area.style().pen().style() == Qt::NoPen)
? 0 : _area.style().pen().width();
_pen = _area.style().pen();
_brush = _area.style().brush();
} else {
_width = 2;
_opacity = 0.5;
QBrush brush(Qt::SolidPattern);
_pen = QPen(brush, _width);
}
updatePainterPath();
@ -91,6 +98,8 @@ void AreaItem::setMap(Map *map)
void AreaItem::setColor(const QColor &color)
{
if (_area.style().isValid())
return;
if (_pen.color() == color)
return;
@ -104,6 +113,8 @@ void AreaItem::setColor(const QColor &color)
void AreaItem::setOpacity(qreal opacity)
{
if (_area.style().isValid())
return;
if (_opacity == opacity)
return;
@ -117,6 +128,8 @@ void AreaItem::setOpacity(qreal opacity)
void AreaItem::setWidth(qreal width)
{
if (_area.style().isValid())
return;
if (_width == width)
return;
@ -128,6 +141,8 @@ void AreaItem::setWidth(qreal width)
void AreaItem::setStyle(Qt::PenStyle style)
{
if (_area.style().isValid())
return;
if (_pen.style() == style)
return;

View File

@ -5,13 +5,16 @@
#include <QFileInfo>
#include <QApplication>
#include <QFontMetrics>
#include "common/util.h"
#include "fileselectwidget.h"
FileSelectWidget::FileSelectWidget(QWidget *parent) : QWidget(parent)
{
_edit = new QLineEdit();
#ifndef Q_OS_ANDROID
#ifdef Q_OS_ANDROID
_edit->setDisabled(true);
#else // Q_OS_ANDROID
QFontMetrics fm(QApplication::font());
_edit->setMinimumWidth(fm.averageCharWidth() * (QDir::homePath().length()
+ 12));
@ -37,39 +40,44 @@ FileSelectWidget::FileSelectWidget(QWidget *parent) : QWidget(parent)
void FileSelectWidget::browse()
{
#ifdef Q_OS_ANDROID
_fileName = QFileDialog::getSaveFileName(this, tr("Select file"));
if (!_fileName.isEmpty())
_edit->setText(Util::displayName(_fileName));
#else // Q_OS_ANDROID
QFileInfo fi(_edit->text());
QString fileName = QFileDialog::getSaveFileName(this, tr("Select file"),
fi.dir().absolutePath(), _filter);
if (!fileName.isEmpty())
_edit->setText(fileName);
#endif // Q_OS_ANDROID
}
bool FileSelectWidget::checkFile(QString &error) const
{
if (_edit->text().isEmpty()) {
if (file().isEmpty()) {
error = tr("No output file selected.");
return false;
}
QFile file(_edit->text());
QFileInfo fi(file);
QFile f(file());
QFileInfo fi(f);
bool exists = fi.exists();
bool opened = false;
if (exists && fi.isDir()) {
error = tr("%1 is a directory.").arg(file.fileName());
error = tr("%1 is a directory.").arg(f.fileName());
return false;
} else if ((exists && !fi.isWritable())
|| !(opened = file.open(QFile::Append))) {
error = tr("%1 is not writable.").arg(file.fileName());
|| !(opened = f.open(QFile::Append))) {
error = tr("%1 is not writable.").arg(f.fileName());
return false;
}
if (opened) {
file.close();
f.close();
if (!exists)
file.remove();
f.remove();
}
return true;

View File

@ -14,9 +14,13 @@ class FileSelectWidget : public QWidget
public:
FileSelectWidget(QWidget *parent = 0);
#ifdef Q_OS_ANDROID
QString file() const {return _fileName;}
#else // Q_OS_ANDROID
QString file() const {return _edit->text();}
void setFile(const QString &file) {_edit->setText(file);}
void setFilter(const QString &filter) {_filter = filter;}
#endif // Q_OS_ANDROID
bool checkFile(QString &error) const;
private slots:
@ -29,8 +33,11 @@ private:
#else // Q_OS_WIN32
QToolButton *_button;
#endif // Q_OS_WIN32
#ifdef Q_OS_ANDROID
QString _fileName;
#else // Q_OS_ANDROID
QString _filter;
#endif // Q_OS_ANDROID
};
#endif // FILESELECTWIDGET_H

View File

@ -11,7 +11,8 @@ GraphItem::GraphItem(const Graph &graph, GraphType type, int width,
Q_ASSERT(_graph.isValid());
_units = Metric;
_pen = QPen(color, width, style, Qt::FlatCap);
_pen = QPen(graph.color().isValid() ? graph.color() : color, width, style,
Qt::FlatCap);
_sx = 0; _sy = 0;
_time = _graph.hasTime();
setZValue(2.0);
@ -54,6 +55,8 @@ void GraphItem::setGraphType(GraphType type)
void GraphItem::setColor(const QColor &color)
{
if (_graph.color().isValid())
return;
if (_pen.color() == color)
return;

View File

@ -32,15 +32,16 @@ static inline unsigned segments(qreal distance)
Units PathItem::_units = Metric;
QTimeZone PathItem::_timeZone = QTimeZone::utc();
PathItem::PathItem(const Path &path, Map *map, QGraphicsItem *parent)
: GraphicsItem(parent), _path(path), _map(map), _graph(0)
PathItem::PathItem(const Path &path, const LineStyle &style, Map *map,
QGraphicsItem *parent) : GraphicsItem(parent), _path(path), _style(style),
_map(map), _graph(0)
{
Q_ASSERT(_path.isValid());
_digitalZoom = 0;
_width = 3;
QBrush brush(Qt::SolidPattern);
_pen = QPen(brush, _width);
_width = (_style.width() >= 0) ? _style.width() : 3;
_pen = _style.color().isValid()
? QPen(_style.color(), _width) : QPen(QBrush(Qt::SolidPattern), _width);
_showMarker = true;
_showTicks = false;
_markerInfoType = MarkerInfoItem::None;
@ -153,6 +154,8 @@ void PathItem::setMap(Map *map)
void PathItem::setColor(const QColor &color)
{
if (_style.color().isValid())
return;
if (_pen.color() == color)
return;
@ -166,6 +169,8 @@ void PathItem::setColor(const QColor &color)
void PathItem::setWidth(qreal width)
{
if (_style.color().isValid())
return;
if (_width == width)
return;

View File

@ -5,6 +5,8 @@
#include <QPen>
#include <QTimeZone>
#include "data/path.h"
#include "data/link.h"
#include "data/style.h"
#include "graphicsscene.h"
#include "markerinfoitem.h"
#include "units.h"
@ -19,7 +21,8 @@ class PathItem : public QObject, public GraphicsItem
Q_OBJECT
public:
PathItem(const Path &path, Map *map, QGraphicsItem *parent = 0);
PathItem(const Path &path, const LineStyle &style, Map *map,
QGraphicsItem *parent = 0);
virtual ~PathItem() {}
QPainterPath shape() const {return _shape;}
@ -66,6 +69,11 @@ protected:
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
QString _name;
QString _desc;
QString _comment;
QVector<Link> _links;
static Units _units;
static QTimeZone _timeZone;
@ -81,6 +89,7 @@ private:
unsigned tickSize() const;
Path _path;
LineStyle _style;
Map *_map;
QList<GraphItem *> _graphs;
GraphItem *_graph;

View File

@ -27,8 +27,8 @@ PDFExportDialog::PDFExportDialog(PDFExport &exp, Units units, QWidget *parent)
#ifndef Q_OS_ANDROID
_fileSelect->setFilter(tr("PDF files") + " (*.pdf);;" + tr("All files")
+ " (*)");
#endif // Q_OS_ANDROID
_fileSelect->setFile(_export.fileName);
#endif // Q_OS_ANDROID
_paperSize = new QComboBox();
_paperSize->addItem("A2", QPageSize::PageSizeId::A2);

View File

@ -24,8 +24,8 @@ PNGExportDialog::PNGExportDialog(PNGExport &exp, QWidget *parent)
#ifndef Q_OS_ANDROID
_fileSelect->setFilter(tr("PNG files") + " (*.png);;" + tr("All files")
+ " (*)");
#endif // Q_OS_ANDROID
_fileSelect->setFile(_export.fileName);
#endif // Q_OS_ANDROID
_width = new QSpinBox();
_width->setMinimum(256);

View File

@ -36,7 +36,7 @@ ToolTip RouteItem::info() const
}
RouteItem::RouteItem(const Route &route, Map *map, QGraphicsItem *parent)
: PathItem(route.path(), map, parent)
: PathItem(route.path(), route.style(), map, parent)
{
const RouteData &waypoints = route.data();

View File

@ -1,7 +1,6 @@
#ifndef ROUTEITEM_H
#define ROUTEITEM_H
#include "data/link.h"
#include "pathitem.h"
class Map;
@ -26,11 +25,6 @@ public:
QDateTime date() const {return QDateTime();}
private:
QString _name;
QString _desc;
QString _comment;
QVector<Link> _links;
QVector<WaypointItem*> _waypoints;
};

View File

@ -41,7 +41,7 @@ ToolTip TrackItem::info() const
}
TrackItem::TrackItem(const Track &track, Map *map, QGraphicsItem *parent)
: PathItem(track.path(), map, parent)
: PathItem(track.path(), track.style(), map, parent)
{
_name = track.name();
_desc = track.description();

View File

@ -2,7 +2,6 @@
#define TRACKITEM_H
#include <QDateTime>
#include "data/link.h"
#include "pathitem.h"
class Map;
@ -19,10 +18,6 @@ public:
QDateTime date() const {return _date;}
private:
QString _name;
QString _desc;
QString _comment;
QVector<Link> _links;
QDateTime _date;
qreal _time;
qreal _movingTime;

View File

@ -77,12 +77,14 @@ WaypointItem::WaypointItem(const Waypoint &waypoint, Map *map,
_waypoint = waypoint;
_showLabel = true;
_showIcon = false;
_size = 8;
_color = Qt::black;
_size = (_waypoint.style().size() >= 0)
? _waypoint.style().size() : 8;
_color = (_waypoint.style().color().isValid())
? _waypoint.style().color() : Qt::black;
_icon = (_waypoint.icon().isNull())
_icon = (_waypoint.style().icon().isNull())
? Waypoint::symbolIcon(_waypoint.symbol())
: &_waypoint.icon();
: &_waypoint.style().icon();
_font.setPixelSize(FS(_size));
_font.setFamily(FONT_FAMILY);
@ -98,19 +100,28 @@ void WaypointItem::updateCache()
{
QPainterPath p;
qreal pointSize = _font.bold() ? HS(_size) : _size;
const QPixmap &icon = _waypoint.style().icon();
if (_showLabel) {
if (_showLabel && !_waypoint.name().isEmpty()) {
QFontMetrics fm(_font);
_labelBB = fm.tightBoundingRect(_waypoint.name());
if (_showIcon && _icon) {
if (_font.bold())
p.addRect(-_icon->width() * 0.625, -_icon->height() * 1.25,
p.addRect(-_icon->width() * 0.625, icon.isNull()
? -_icon->height() * 1.25 : -_icon->height() * 0.625,
_icon->width() * 1.25, _icon->height() * 1.25);
else
p.addRect(-_icon->width()/2.0, -_icon->height(), _icon->width(),
p.addRect(-_icon->width()/2.0, icon.isNull()
? -_icon->height() : -_icon->height()/2, _icon->width(),
_icon->height());
p.addRect(0, 0, _labelBB.width(), _labelBB.height() + fm.descent());
if (icon.isNull())
p.addRect(0, 0, _labelBB.width(), _labelBB.height()
+ fm.descent());
else
p.addRect(_icon->width()/2, _icon->height()/2, _labelBB.width(),
_labelBB.height() + fm.descent());
} else {
p.addRect(-pointSize/2, -pointSize/2, pointSize, pointSize);
p.addRect(pointSize/2, pointSize/2, _labelBB.width(),
@ -119,10 +130,12 @@ void WaypointItem::updateCache()
} else {
if (_showIcon && _icon) {
if (_font.bold())
p.addRect(-_icon->width() * 0.625, -_icon->height() * 1.25,
p.addRect(-_icon->width() * 0.625, icon.isNull()
? -_icon->height() * 1.25 : -_icon->height() * 0.625,
_icon->width() * 1.25, _icon->height() * 1.25);
else
p.addRect(-_icon->width()/2, -_icon->height(), _icon->width(),
p.addRect(-_icon->width()/2, icon.isNull()
? -_icon->height() : -_icon->height()/2, _icon->width(),
_icon->height());
} else
p.addRect(-pointSize/2, -pointSize/2, pointSize, pointSize);
@ -137,15 +150,20 @@ void WaypointItem::paint(QPainter *painter,
Q_UNUSED(option);
Q_UNUSED(widget);
qreal pointSize = _font.bold() ? HS(_size) : _size;
const QPixmap &icon = _waypoint.style().icon();
painter->setPen(_color);
if (_showLabel) {
if (_showLabel && !_waypoint.name().isEmpty()) {
painter->setFont(_font);
if (_showIcon && _icon)
painter->drawText(-qMax(_labelBB.x(), 0), _labelBB.height(),
_waypoint.name());
else
if (_showIcon && _icon) {
if (icon.isNull())
painter->drawText(-qMax(_labelBB.x(), 0), _labelBB.height(),
_waypoint.name());
else
painter->drawText(_icon->width()/2 - qMax(_labelBB.x(), 0),
_icon->height()/2 + _labelBB.height(), _waypoint.name());
} else
painter->drawText(pointSize/2 - qMax(_labelBB.x(), 0), pointSize/2
+ _labelBB.height(), _waypoint.name());
}
@ -153,11 +171,13 @@ void WaypointItem::paint(QPainter *painter,
painter->setBrush(QBrush(_color, Qt::SolidPattern));
if (_showIcon && _icon) {
if (_font.bold())
painter->drawPixmap(-_icon->width() * 0.625, -_icon->height() * 1.25,
painter->drawPixmap(-_icon->width() * 0.625, icon.isNull()
? -_icon->height() * 1.25 : -_icon->height() * 0.625,
_icon->scaled(_icon->width() * 1.25, _icon->height() * 1.25,
Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
else
painter->drawPixmap(-_icon->width()/2.0, -_icon->height(), *_icon);
painter->drawPixmap(-_icon->width()/2.0, icon.isNull()
? -_icon->height() : -_icon->height()/2, *_icon);
} else
painter->drawEllipse(-pointSize/2, -pointSize/2, pointSize, pointSize);
@ -168,6 +188,8 @@ void WaypointItem::paint(QPainter *painter,
void WaypointItem::setSize(int size)
{
if (_waypoint.style().size() >= 0)
return;
if (_size == size)
return;
@ -179,6 +201,8 @@ void WaypointItem::setSize(int size)
void WaypointItem::setColor(const QColor &color)
{
if (_waypoint.style().color().isValid())
return;
if (_color == color)
return;

View File

@ -68,7 +68,7 @@ void NetworkTimeout::timerEvent(QTimerEvent *ev)
return;
QNetworkReply *reply = static_cast<QNetworkReply*>(parent());
if (reply->isRunning())
reply->close();
reply->abort();
_timer.stop();
}

View File

@ -1,6 +1,7 @@
#include <cctype>
#include <cmath>
#include <QFileInfo>
#include <QTemporaryDir>
#ifdef Q_OS_ANDROID
#include <QUrl>
#include <QCoreApplication>
@ -139,3 +140,9 @@ QString Util::displayName(const QString &path)
return path;
#endif // Q_OS_ANDROID
}
const QTemporaryDir &Util::tempDir()
{
static QTemporaryDir dir;
return dir;
}

View File

@ -3,12 +3,15 @@
#include <QString>
class QTemporaryDir;
namespace Util
{
int str2int(const char *str, int len);
double niceNum(double x, bool round);
QString file2name(const QString &path);
QString displayName(const QString &path);
const QTemporaryDir &tempDir();
}
#endif // UTIL_H

View File

@ -4,6 +4,7 @@
#include <QString>
#include <QList>
#include "common/polygon.h"
#include "style.h"
class Area
{
@ -27,6 +28,7 @@ public:
const QString &description() const {return _desc;}
const QList<Polygon> &polygons() const {return _polygons;}
const RectC &boundingRect() const {return _boundingRect;}
const PolygonStyle &style() const {return _style;}
bool isValid() const
{
@ -47,11 +49,13 @@ public:
void setName(const QString &name) {_name = name;}
void setDescription(const QString &desc) {_desc = desc;}
void setStyle(const PolygonStyle &style) {_style = style;}
private:
QList<Polygon> _polygons;
QString _name;
QString _desc;
PolygonStyle _style;
RectC _boundingRect;
};

View File

@ -53,6 +53,7 @@ static QMultiMap<QString, Parser*> parsers()
map.insert("gpx", &gpx);
map.insert("tcx", &tcx);
map.insert("kml", &kml);
map.insert("kmz", &kml);
map.insert("fit", &fit);
map.insert("csv", &csv);
map.insert("igc", &igc);
@ -162,7 +163,7 @@ QString Data::formats()
+ qApp->translate("Data", "IGC files") + " (*.igc);;"
+ qApp->translate("Data", "ITN files") + " (*.itn);;"
+ qApp->translate("Data", "JPEG images") + " (*.jpg *.jpeg);;"
+ qApp->translate("Data", "KML files") + " (*.kml);;"
+ qApp->translate("Data", "KML files") + " (*.kml *.kmz);;"
+ qApp->translate("Data", "LOC files") + " (*.loc);;"
+ qApp->translate("Data", "NMEA files") + " (*.nmea);;"
+ qApp->translate("Data", "ONmove files") + " (*.omd *.ghp);;"

View File

@ -2,6 +2,109 @@
#include <QJsonArray>
#include "geojsonparser.h"
#define MARKER_SIZE_MEDIUM 12
#define MARKER_SIZE_SMALL 8
#define MARKER_SIZE_LARGE 16
static int markerSize(const QString &str)
{
if (str == "small")
return MARKER_SIZE_SMALL;
else if (str == "medium")
return MARKER_SIZE_MEDIUM;
else if (str == "large")
return MARKER_SIZE_LARGE;
else
return -1;
}
static void setAreaProperties(Area &area, const QJsonValue &properties)
{
if (!properties.isObject())
return;
QJsonObject o(properties.toObject());
if (o["name"].isString())
area.setName(o["name"].toString());
if (o["title"].isString())
area.setName(o["title"].toString());
if (o["description"].isString())
area.setDescription(o["description"].toString());
QColor strokeColor(0x55, 0x55, 0x55);
QColor fillColor(0x55, 0x55, 0x55);
double strokeWidth = 2;
if (o["stroke"].isString())
strokeColor = QColor(o["stroke"].toString());
if (o["stroke-opacity"].isDouble())
strokeColor.setAlphaF(o["stroke-opacity"].toDouble());
if (o["stroke-width"].isDouble())
strokeWidth = o["stroke-width"].toDouble();
if (o["fill"].isString())
fillColor = QColor(o["fill"].toString());
if (o["fill-opacity"].isDouble())
fillColor.setAlphaF(o["fill-opacity"].toDouble());
else
fillColor.setAlphaF(0.6);
area.setStyle(PolygonStyle(QPen(strokeColor, strokeWidth),
QBrush(fillColor)));
}
static void setTrackProperties(TrackData &track, const QJsonValue &properties)
{
if (!properties.isObject())
return;
QJsonObject o(properties.toObject());
if (o["name"].isString())
track.setName(o["name"].toString());
if (o["title"].isString())
track.setName(o["title"].toString());
if (o["description"].isString())
track.setDescription(o["description"].toString());
QColor color(0x55, 0x55, 0x55);
double width = 2;
if (o["stroke"].isString())
color = QColor(o["stroke"].toString());
if (o["stroke-opacity"].isDouble())
color.setAlphaF(o["stroke-opacity"].toDouble());
if (o["stroke-width"].isDouble())
width = o["stroke-width"].toDouble();
track.setStyle(LineStyle(color, width));
}
static void setWaypointProperties(Waypoint &waypoint,
const QJsonValue &properties)
{
if (!properties.isObject())
return;
QJsonObject o(properties.toObject());
if (o["name"].isString())
waypoint.setName(o["name"].toString());
if (o["title"].isString())
waypoint.setName(o["title"].toString());
if (o["description"].isString())
waypoint.setDescription(o["description"].toString());
QColor color(0x7e, 0x7e, 0x7e);
int size = MARKER_SIZE_MEDIUM;
if (o["marker-color"].isString())
color = QColor(o["marker-color"].toString());
if (o["marker-symbol"].isString())
waypoint.setSymbol(o["marker-symbol"].toString());
if (o["marker-size"].isString())
size = markerSize(o["marker-size"].toString());
waypoint.setStyle(PointStyle(QPixmap(), color, size));
}
GeoJSONParser::Type GeoJSONParser::type(const QJsonObject &json)
{
@ -30,7 +133,7 @@ GeoJSONParser::Type GeoJSONParser::type(const QJsonObject &json)
}
bool GeoJSONParser::point(const QJsonArray &coordinates, Waypoint &waypoint,
const QJsonObject &properties)
const QJsonValue &properties)
{
if (coordinates.count() < 2 || !coordinates.at(0).isDouble()
|| !coordinates.at(1).isDouble()) {
@ -38,23 +141,18 @@ bool GeoJSONParser::point(const QJsonArray &coordinates, Waypoint &waypoint,
return false;
}
setWaypointProperties(waypoint, properties);
waypoint.setCoordinates(Coordinates(coordinates.at(0).toDouble(),
coordinates.at(1).toDouble()));
if (coordinates.count() == 3 && coordinates.at(2).isDouble())
waypoint.setElevation(coordinates.at(2).toDouble());
if (properties.contains("title") && properties["title"].isString())
waypoint.setName(properties["title"].toString());
if (properties.contains("name") && properties["name"].isString())
waypoint.setName(properties["name"].toString());
if (properties.contains("description")
&& properties["description"].isString())
waypoint.setDescription(properties["description"].toString());
return true;
}
bool GeoJSONParser::multiPoint(const QJsonArray &coordinates,
QVector<Waypoint> &waypoints, const QJsonObject &properties)
QVector<Waypoint> &waypoints, const QJsonValue &properties)
{
for (int i = 0; i < coordinates.size(); i++) {
if (!coordinates.at(i).isArray()) {
@ -92,15 +190,9 @@ bool GeoJSONParser::lineString(const QJsonArray &coordinates,
}
bool GeoJSONParser::lineString(const QJsonArray &coordinates, TrackData &track,
const QJsonObject &properties)
const QJsonValue &properties)
{
if (properties.contains("title") && properties["title"].isString())
track.setName(properties["title"].toString());
if (properties.contains("name") && properties["name"].isString())
track.setName(properties["name"].toString());
if (properties.contains("description")
&& properties["description"].isString())
track.setDescription(properties["description"].toString());
setTrackProperties(track, properties);
track.append(SegmentData());
@ -110,15 +202,9 @@ bool GeoJSONParser::lineString(const QJsonArray &coordinates, TrackData &track,
}
bool GeoJSONParser::multiLineString(const QJsonArray &coordinates,
TrackData &track, const QJsonObject &properties)
TrackData &track, const QJsonValue &properties)
{
if (properties.contains("title") && properties["title"].isString())
track.setName(properties["title"].toString());
if (properties.contains("name") && properties["name"].isString())
track.setName(properties["name"].toString());
if (properties.contains("description")
&& properties["description"].isString())
track.setDescription(properties["description"].toString());
setTrackProperties(track, properties);
for (int i = 0; i < coordinates.size(); i++) {
if (!coordinates.at(i).isArray()) {
@ -163,15 +249,9 @@ bool GeoJSONParser::polygon(const QJsonArray &coordinates, ::Polygon &pg)
}
bool GeoJSONParser::polygon(const QJsonArray &coordinates, Area &area,
const QJsonObject &properties)
const QJsonValue &properties)
{
if (properties.contains("title") && properties["title"].isString())
area.setName(properties["title"].toString());
if (properties.contains("name") && properties["name"].isString())
area.setName(properties["name"].toString());
if (properties.contains("description")
&& properties["description"].isString())
area.setDescription(properties["description"].toString());
setAreaProperties(area, properties);
::Polygon p;
if (!polygon(coordinates, p))
@ -182,15 +262,9 @@ bool GeoJSONParser::polygon(const QJsonArray &coordinates, Area &area,
}
bool GeoJSONParser::multiPolygon(const QJsonArray &coordinates,
Area &area, const QJsonObject &properties)
Area &area, const QJsonValue &properties)
{
if (properties.contains("title") && properties["title"].isString())
area.setName(properties["title"].toString());
if (properties.contains("name") && properties["name"].isString())
area.setName(properties["name"].toString());
if (properties.contains("description")
&& properties["description"].isString())
area.setDescription(properties["description"].toString());
setAreaProperties(area, properties);
for (int i = 0; i < coordinates.size(); i++) {
if (!coordinates.at(i).isArray()) {
@ -209,7 +283,7 @@ bool GeoJSONParser::multiPolygon(const QJsonArray &coordinates,
bool GeoJSONParser::geometryCollection(const QJsonObject &json,
QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints, const QJsonObject &properties)
QVector<Waypoint> &waypoints, const QJsonValue &properties)
{
if (!json.contains("geometries") || !json["geometries"].isArray()) {
_errorString = "Invalid/missing GeometryCollection geometries array";
@ -273,7 +347,7 @@ bool GeoJSONParser::geometryCollection(const QJsonObject &json,
bool GeoJSONParser::feature(const QJsonObject &json, QList<TrackData> &tracks,
QList<Area> &areas, QVector<Waypoint> &waypoints)
{
QJsonObject properties(json["properties"].toObject());
QJsonValue properties(json["properties"]);
QJsonObject geometry(json["geometry"].toObject());
switch (type(geometry)) {

View File

@ -31,22 +31,22 @@ private:
Type type(const QJsonObject &json);
bool point(const QJsonArray &coordinates, Waypoint &waypoint,
const QJsonObject &properties = QJsonObject());
const QJsonValue &properties = QJsonValue());
bool multiPoint(const QJsonArray &coordinates,
QVector<Waypoint> &waypoints, const QJsonObject &properties = QJsonObject());
QVector<Waypoint> &waypoints, const QJsonValue &properties = QJsonValue());
bool lineString(const QJsonArray &coordinates, SegmentData &segment);
bool lineString(const QJsonArray &coordinates, TrackData &track,
const QJsonObject &properties = QJsonObject());
const QJsonValue &properties = QJsonValue());
bool multiLineString(const QJsonArray &coordinates,
TrackData &track, const QJsonObject &properties = QJsonObject());
TrackData &track, const QJsonValue &properties = QJsonValue());
bool polygon(const QJsonArray &coordinates, ::Polygon &pg);
bool polygon(const QJsonArray &coordinates, Area &area,
const QJsonObject &properties = QJsonObject());
const QJsonValue &properties = QJsonValue());
bool multiPolygon(const QJsonArray &coordinates, Area &area,
const QJsonObject &properties = QJsonObject());
const QJsonValue &properties = QJsonValue());
bool geometryCollection(const QJsonObject &json, QList<TrackData> &tracks,
QList<Area> &areas, QVector<Waypoint> &waypoints,
const QJsonObject &properties = QJsonObject());
const QJsonValue &properties = QJsonValue());
bool feature(const QJsonObject &json, QList<TrackData> &tracks,
QList<Area> &areas, QVector<Waypoint> &waypoints);
bool featureCollection(const QJsonObject &json, QList<TrackData> &tracks,

View File

@ -11,6 +11,7 @@
#include "common/garmin.h"
#include "common/textcodec.h"
#include "common/color.h"
#include "common/util.h"
#include "address.h"
#include "gpiparser.h"
@ -388,12 +389,6 @@ static quint32 readAddress(DataStream &stream, Waypoint &waypoint)
return rs + rh.size;
}
static const QTemporaryDir &tempDir()
{
static QTemporaryDir dir;
return dir;
}
static quint32 readImageInfo(DataStream &stream, Waypoint &waypoint,
const QString &fileName, int &imgId)
{
@ -408,12 +403,12 @@ static quint32 readImageInfo(DataStream &stream, Waypoint &waypoint,
ba.resize(size);
stream.readRawData(ba.data(), ba.size());
if (tempDir().isValid()) {
if (Util::tempDir().isValid()) {
QBuffer buf(&ba);
QImageReader ir(&buf);
QByteArray id(fileName.toUtf8() + QByteArray::number(imgId++));
QFile imgFile(tempDir().path() + "/" + QString("%0.%1").arg(
QFile imgFile(Util::tempDir().path() + "/" + QString("%0.%1").arg(
QCryptographicHash::hash(id, QCryptographicHash::Sha1).toHex(),
QString(ir.format())));
imgFile.open(QIODevice::WriteOnly);
@ -700,7 +695,7 @@ static void readPOIDatabase(DataStream &stream, QVector<Waypoint> &waypoints,
for (int i = 0; i < il.size(); i++) {
const QPair<int, quint16> &e = il.at(i);
if (e.second < icons.size())
waypoints[e.first].setIcon(icons.at(e.second));
waypoints[e.first].setStyle(icons.at(e.second));
}
if (ds != rh.size)

View File

@ -228,6 +228,26 @@ void GPXParser::trackpoints(SegmentData &segment)
}
}
void GPXParser::routeExtension(RouteData &route)
{
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("DisplayColor"))
route.setStyle(LineStyle(QColor(_reader.readElementText())));
else
_reader.skipCurrentElement();
}
}
void GPXParser::routeExtensions(RouteData &track)
{
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("RouteExtension"))
routeExtension(track);
else
_reader.skipCurrentElement();
}
}
void GPXParser::routepoints(RouteData &route, QList<TrackData> &tracks)
{
TrackData autoRoute;
@ -253,6 +273,8 @@ void GPXParser::routepoints(RouteData &route, QList<TrackData> &tracks)
link10.setURL(_reader.readElementText());
else if (_reader.name() == QLatin1String("urlname"))
link10.setText(_reader.readElementText());
else if (_reader.name() == QLatin1String("extensions"))
routeExtensions(route);
else
_reader.skipCurrentElement();
}
@ -267,6 +289,26 @@ void GPXParser::routepoints(RouteData &route, QList<TrackData> &tracks)
}
}
void GPXParser::trackExtension(TrackData &track)
{
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("DisplayColor"))
track.setStyle(LineStyle(QColor(_reader.readElementText())));
else
_reader.skipCurrentElement();
}
}
void GPXParser::trackExtensions(TrackData &track)
{
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("TrackExtension"))
trackExtension(track);
else
_reader.skipCurrentElement();
}
}
void GPXParser::track(TrackData &track)
{
Link link10;
@ -289,6 +331,8 @@ void GPXParser::track(TrackData &track)
link10.setURL(_reader.readElementText());
else if (_reader.name() == QLatin1String("urlname"))
link10.setText(_reader.readElementText());
else if (_reader.name() == QLatin1String("extensions"))
trackExtensions(track);
else
_reader.skipCurrentElement();
}

View File

@ -25,6 +25,10 @@ private:
void waypointExtensions(Waypoint &waypoint, SegmentData *autoRoute);
void area(Area &area);
void gpxExtensions(QList<Area> &areas);
void trackExtensions(TrackData &track);
void trackExtension(TrackData &track);
void routeExtensions(RouteData &route);
void routeExtension(RouteData &route);
void trackpointData(Trackpoint &trackpoint);
void waypointData(Waypoint &waypoint, SegmentData *autoRoute = 0);
void address(Waypoint &waypoint);

View File

@ -65,6 +65,12 @@ public:
}
return true;
}
const QColor &color() const {return _color;}
void setColor(const QColor &color) {_color = color;}
private:
QColor _color;
};
class GraphPair

View File

@ -1,5 +1,33 @@
/*
WARNING: This code uses internal Qt API - the QZipReader class for reading
ZIP files - and things may break if Qt changes the API. For Qt5 this is not
a problem as we can "see the future" now and there are no changes in all
the supported Qt5 versions up to the last one (5.15). In Qt6 the class
might change or even disappear in the future, but this is very unlikely
as there were no changes for several years and The Qt Company's policy
is: "do not invest any resources into any desktop related stuff unless
absolutely necessary". There is an issue (QTBUG-3897) since the year 2009 to
include the ZIP reader into the public API, which aptly illustrates the
effort The Qt Company is willing to make about anything desktop related...
*/
#include <QFileInfo>
#include <QTemporaryDir>
#include <QCryptographicHash>
#include <QtEndian>
#include <QUrl>
#include <QRegularExpression>
#include <private/qzipreader_p.h>
#include "common/util.h"
#include "kmlparser.h"
static bool isZIP(QFile *file)
{
quint32 magic;
return (file->read((char *)&magic, sizeof(magic)) == (qint64)sizeof(magic)
&& qFromLittleEndian(magic) == 0x04034b50);
}
qreal KMLParser::number()
{
@ -463,6 +491,9 @@ void KMLParser::multiGeometry(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints, const QString &name, const QString &desc,
const QDateTime &timestamp)
{
TrackData *tp = 0;
Area *ap = 0;
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Point")) {
waypoints.append(Waypoint());
@ -472,28 +503,92 @@ void KMLParser::multiGeometry(QList<TrackData> &tracks, QList<Area> &areas,
w.setTimestamp(timestamp);
point(w);
} else if (_reader.name() == QLatin1String("LineString")) {
tracks.append(TrackData());
TrackData &t = tracks.last();
t.append(SegmentData());
t.setName(name);
t.setDescription(desc);
lineString(t.last());
if (!tp) {
tracks.append(TrackData());
tp = &tracks.last();
tp->setName(name);
tp->setDescription(desc);
}
tp->append(SegmentData());
lineString(tp->last());
} else if (_reader.name() == QLatin1String("Polygon")) {
areas.append(Area());
Area &a = areas.last();
a.setName(name);
a.setDescription(desc);
polygon(a);
if (!ap) {
areas.append(Area());
ap = &areas.last();
ap->setName(name);
ap->setDescription(desc);
}
polygon(*ap);
} else
_reader.skipCurrentElement();
}
}
void KMLParser::placemark(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints)
void KMLParser::photoOverlay(const Ctx &ctx, QVector<Waypoint> &waypoints,
PointStyleMap &pointStyles)
{
QString name, desc, phone, address;
QString img, id;
Waypoint w;
QMap<QString, PolygonStyle> unused;
QMap<QString, LineStyle> unused2;
static QRegularExpression re("\\$\\[[^\\]]+\\]");
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("name"))
w.setName(_reader.readElementText());
else if (_reader.name() == QLatin1String("description"))
w.setDescription(_reader.readElementText());
else if (_reader.name() == QLatin1String("phoneNumber"))
w.setPhone(_reader.readElementText());
else if (_reader.name() == QLatin1String("address"))
w.setAddress(_reader.readElementText());
else if (_reader.name() == QLatin1String("TimeStamp"))
w.setTimestamp(timeStamp());
else if (_reader.name() == QLatin1String("Style")) {
style(ctx.dir, pointStyles, unused, unused2);
id = QString();
} else if (_reader.name() == QLatin1String("StyleMap"))
styleMap(pointStyles, unused, unused2);
else if (_reader.name() == QLatin1String("Icon"))
img = icon();
else if (_reader.name() == QLatin1String("Point"))
point(w);
else if (_reader.name() == QLatin1String("styleUrl"))
id = styleUrl();
else
_reader.skipCurrentElement();
}
if (!w.coordinates().isNull()) {
w.setStyle(pointStyles.value(id));
img.replace(re, "0");
if (!QUrl(img).scheme().isEmpty())
w.addLink(Link(img, "Photo Overlay"));
else if (ctx.zip && Util::tempDir().isValid()) {
QFileInfo fi(img);
QByteArray id(ctx.path.toUtf8() + img.toUtf8());
QString path(Util::tempDir().path() + "/" + QString("%0.%1")
.arg(QCryptographicHash::hash(id, QCryptographicHash::Sha1)
.toHex(), QString(fi.suffix())));
QFile::rename(ctx.dir.absoluteFilePath(img), path);
w.addImage(path);
} else if (!ctx.zip)
w.addImage(ctx.dir.absoluteFilePath(img));
waypoints.append(w);
}
}
void KMLParser::placemark(const Ctx &ctx, QList<TrackData> &tracks,
QList<Area> &areas, QVector<Waypoint> &waypoints, PointStyleMap &pointStyles,
PolygonStyleMap &polyStyles, LineStyleMap &lineStyles)
{
QString name, desc, phone, address, id;
QDateTime timestamp;
Waypoint *wp = 0;
TrackData *tp = 0;
Area *ap = 0;
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("name"))
@ -506,87 +601,256 @@ void KMLParser::placemark(QList<TrackData> &tracks, QList<Area> &areas,
address = _reader.readElementText();
else if (_reader.name() == QLatin1String("TimeStamp"))
timestamp = timeStamp();
else if (_reader.name() == QLatin1String("Style")) {
style(ctx.dir, pointStyles, polyStyles, lineStyles);
id = QString();
} else if (_reader.name() == QLatin1String("StyleMap"))
styleMap(pointStyles, polyStyles, lineStyles);
else if (_reader.name() == QLatin1String("MultiGeometry"))
multiGeometry(tracks, areas, waypoints, name, desc, timestamp);
else if (_reader.name() == QLatin1String("Point")) {
waypoints.append(Waypoint());
Waypoint &w = waypoints.last();
w.setName(name);
w.setDescription(desc);
w.setTimestamp(timestamp);
w.setAddress(address);
w.setPhone(phone);
point(w);
wp = &waypoints.last();
point(*wp);
} else if (_reader.name() == QLatin1String("LineString")
|| _reader.name() == QLatin1String("LinearRing")) {
tracks.append(TrackData());
TrackData &t = tracks.last();
t.append(SegmentData());
t.setName(name);
t.setDescription(desc);
lineString(t.last());
tp = &tracks.last();
tp->append(SegmentData());
lineString(tp->last());
} else if (_reader.name() == QLatin1String("Track")) {
tracks.append(TrackData());
TrackData &t = tracks.last();
t.append(SegmentData());
t.setName(name);
t.setDescription(desc);
track(t.last());
tp = &tracks.last();
tp->append(SegmentData());
track(tp->last());
} else if (_reader.name() == QLatin1String("MultiTrack")) {
tracks.append(TrackData());
TrackData &t = tracks.last();
t.setName(name);
t.setDescription(desc);
multiTrack(t);
tp = &tracks.last();
multiTrack(*tp);
} else if (_reader.name() == QLatin1String("Polygon")) {
areas.append(Area());
Area &a = areas.last();
a.setName(name);
a.setDescription(desc);
polygon(a);
} else
ap = &areas.last();
polygon(*ap);
} else if (_reader.name() == QLatin1String("styleUrl"))
id = styleUrl();
else
_reader.skipCurrentElement();
}
if (wp) {
wp->setName(name);
wp->setDescription(desc);
wp->setTimestamp(timestamp);
wp->setAddress(address);
wp->setPhone(phone);
wp->setStyle(pointStyles.value(id));
} else if (tp) {
tp->setName(name);
tp->setDescription(desc);
tp->setStyle(lineStyles.value(id));
} else if (ap) {
ap->setName(name);
ap->setDescription(desc);
ap->setStyle(polyStyles.value(id));
}
}
void KMLParser::folder(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints)
QString KMLParser::icon()
{
QString path;
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Placemark"))
placemark(tracks, areas, waypoints);
else if (_reader.name() == QLatin1String("Folder"))
folder(tracks, areas, waypoints);
if (_reader.name() == QLatin1String("href"))
path = _reader.readElementText();
else
_reader.skipCurrentElement();
}
return path;
}
QString KMLParser::styleUrl()
{
QString id(_reader.readElementText());
return (id.at(0) == '#') ? id.right(id.size() - 1) : QString();
}
void KMLParser::iconStyle(const QDir &dir, const QString &id,
PointStyleMap &styles)
{
QPixmap img;
QColor color(Qt::white);
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Icon"))
img = QPixmap(dir.absoluteFilePath(icon()));
else if (_reader.name() == QLatin1String("color"))
color = QColor("#" + _reader.readElementText());
else
_reader.skipCurrentElement();
}
styles.insert(id, PointStyle(img, color));
}
void KMLParser::polyStyle(const QString &id, PolygonStyleMap &styles)
{
QColor color(Qt::white);
uint fill = 1, outline = 1;
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("color"))
color = QColor("#" + _reader.readElementText());
else if (_reader.name() == QLatin1String("fill"))
fill = _reader.readElementText().toUInt();
else if (_reader.name() == QLatin1String("outline"))
outline = _reader.readElementText().toUInt();
else
_reader.skipCurrentElement();
}
QPen pen = (color.isValid() && outline)
? QPen(color) : QPen(Qt::NoPen);
QBrush brush = (color.isValid() && fill)
? QBrush(color) : QBrush(Qt::NoBrush);
styles.insert(id, PolygonStyle(pen, brush));
}
void KMLParser::lineStyle(const QString &id, LineStyleMap &styles)
{
QColor color(Qt::white);
uint width = 1;
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("color"))
color = QColor("#" + _reader.readElementText());
else if (_reader.name() == QLatin1String("width"))
width = _reader.readElementText().toUInt();
else
_reader.skipCurrentElement();
}
styles.insert(id, LineStyle(color, width));
}
void KMLParser::styleMapPair(const QString &id, PointStyleMap &pointStyles,
PolygonStyleMap &polyStyles, LineStyleMap &lineStyles)
{
QString key, url;
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("key"))
key = _reader.readElementText();
else if (_reader.name() == QLatin1String("styleUrl"))
url = styleUrl();
else
_reader.skipCurrentElement();
}
if (key == "normal") {
pointStyles.insert(id, pointStyles.value(url));
polyStyles.insert(id, polyStyles.value(url));
lineStyles.insert(id, lineStyles.value(url));
}
}
void KMLParser::styleMap(PointStyleMap &pointStyles,
PolygonStyleMap &polyStyles, LineStyleMap &lineStyles)
{
QString id = _reader.attributes().value("id").toString();
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Pair"))
styleMapPair(id, pointStyles, polyStyles, lineStyles);
else
_reader.skipCurrentElement();
}
}
void KMLParser::document(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints)
void KMLParser::style(const QDir &dir, PointStyleMap &pointStyles,
PolygonStyleMap &polyStyles, LineStyleMap &lineStyles)
{
QString id = _reader.attributes().value("id").toString();
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Document"))
document(tracks, areas, waypoints);
else if (_reader.name() == QLatin1String("Placemark"))
placemark(tracks, areas, waypoints);
else if (_reader.name() == QLatin1String("Folder"))
folder(tracks, areas, waypoints);
if (_reader.name() == QLatin1String("IconStyle"))
iconStyle(dir, id, pointStyles);
else if (_reader.name() == QLatin1String("PolyStyle"))
polyStyle(id, polyStyles);
else if (_reader.name() == QLatin1String("LineStyle"))
lineStyle(id, lineStyles);
else
_reader.skipCurrentElement();
}
}
void KMLParser::kml(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints)
void KMLParser::folder(const Ctx &ctx, QList<TrackData> &tracks,
QList<Area> &areas, QVector<Waypoint> &waypoints,
PointStyleMap &pointStyles, PolygonStyleMap &polyStyles,
LineStyleMap &lineStyles)
{
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Document"))
document(tracks, areas, waypoints);
else if (_reader.name() == QLatin1String("Placemark"))
placemark(tracks, areas, waypoints);
document(ctx, tracks, areas, waypoints);
else if (_reader.name() == QLatin1String("Folder"))
folder(tracks, areas, waypoints);
folder(ctx, tracks, areas, waypoints, pointStyles, polyStyles,
lineStyles);
else if (_reader.name() == QLatin1String("Placemark"))
placemark(ctx, tracks, areas, waypoints, pointStyles, polyStyles,
lineStyles);
else if (_reader.name() == QLatin1String("PhotoOverlay"))
photoOverlay(ctx, waypoints, pointStyles);
else
_reader.skipCurrentElement();
}
}
void KMLParser::document(const Ctx &ctx, QList<TrackData> &tracks,
QList<Area> &areas, QVector<Waypoint> &waypoints)
{
PointStyleMap pointStyles;
PolygonStyleMap polyStyles;
LineStyleMap lineStyles;
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Document"))
document(ctx, tracks, areas, waypoints);
else if (_reader.name() == QLatin1String("Folder"))
folder(ctx, tracks, areas, waypoints, pointStyles, polyStyles,
lineStyles);
else if (_reader.name() == QLatin1String("Placemark"))
placemark(ctx, tracks, areas, waypoints, pointStyles, polyStyles,
lineStyles);
else if (_reader.name() == QLatin1String("PhotoOverlay"))
photoOverlay(ctx, waypoints, pointStyles);
else if (_reader.name() == QLatin1String("Style"))
style(ctx.dir, pointStyles, polyStyles, lineStyles);
else if (_reader.name() == QLatin1String("StyleMap"))
styleMap(pointStyles, polyStyles, lineStyles);
else
_reader.skipCurrentElement();
}
}
void KMLParser::kml(const Ctx &ctx, QList<TrackData> &tracks,
QList<Area> &areas, QVector<Waypoint> &waypoints)
{
PointStyleMap pointStyles;
PolygonStyleMap polyStyles;
LineStyleMap lineStyles;
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Document"))
document(ctx, tracks, areas, waypoints);
else if (_reader.name() == QLatin1String("Folder"))
folder(ctx, tracks, areas, waypoints, pointStyles, polyStyles,
lineStyles);
else if (_reader.name() == QLatin1String("Placemark"))
placemark(ctx, tracks, areas, waypoints, pointStyles, polyStyles,
lineStyles);
else if (_reader.name() == QLatin1String("PhotoOverlay"))
photoOverlay(ctx, waypoints, pointStyles);
else
_reader.skipCurrentElement();
}
@ -596,15 +860,50 @@ bool KMLParser::parse(QFile *file, QList<TrackData> &tracks,
QList<RouteData> &routes, QList<Area> &areas, QVector<Waypoint> &waypoints)
{
Q_UNUSED(routes);
QFileInfo fi(*file);
_reader.clear();
_reader.setDevice(file);
if (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("kml"))
kml(tracks, areas, waypoints);
else
_reader.raiseError("Not a KML file");
if (isZIP(file)) {
QZipReader zip(fi.absoluteFilePath(), QIODevice::ReadOnly);
QTemporaryDir tempDir;
if (!tempDir.isValid() || !zip.extractAll(tempDir.path()))
_reader.raiseError("Error extracting ZIP file");
else {
QDir zipDir(tempDir.path());
QFileInfoList files(zipDir.entryInfoList(QStringList("*.kml"),
QDir::Files));
if (files.isEmpty())
_reader.raiseError("No KML file found in ZIP file");
else {
QFile kmlFile(files.first().absoluteFilePath());
if (!kmlFile.open(QIODevice::ReadOnly))
_reader.raiseError("Error opening KML file");
else {
_reader.setDevice(&kmlFile);
if (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("kml"))
kml(Ctx(fi.absoluteFilePath(), zipDir, true),
tracks, areas, waypoints);
else
_reader.raiseError("Not a KML file");
}
}
}
}
} else {
file->reset();
_reader.setDevice(file);
if (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("kml"))
kml(Ctx(fi.absoluteFilePath(), fi.absoluteDir(), false), tracks,
areas, waypoints);
else
_reader.raiseError("Not a KML file");
}
}
return !_reader.error();

View File

@ -3,6 +3,7 @@
#include <QXmlStreamReader>
#include <QDateTime>
#include <QDir>
#include "parser.h"
class KMLParser : public Parser
@ -14,17 +15,34 @@ public:
int errorLine() const {return _reader.lineNumber();}
private:
void kml(QList<TrackData> &tracks, QList<Area> &areas,
struct Ctx {
Ctx(const QString &path, const QDir &dir, bool zip)
: path(path), dir(dir), zip(zip) {}
QString path;
QDir dir;
bool zip;
};
typedef QMap<QString, PointStyle> PointStyleMap;
typedef QMap<QString, PolygonStyle> PolygonStyleMap;
typedef QMap<QString, LineStyle> LineStyleMap;
void kml(const Ctx &ctx, QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints);
void document(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints);
void folder(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints);
void placemark(QList<TrackData> &tracks, QList<Area> &areas,
void document(const Ctx &ctx, QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints);
void folder(const Ctx &ctx, QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints, PointStyleMap &pointStyles,
PolygonStyleMap &polyStyles, LineStyleMap &lineStyles);
void placemark(const Ctx &ctx, QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints, PointStyleMap &pointStyles,
PolygonStyleMap &polyStyles, LineStyleMap &lineStyles);
void multiGeometry(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints, const QString &name, const QString &desc,
const QDateTime &timestamp);
void photoOverlay(const Ctx &ctx, QVector<Waypoint> &waypoints,
PointStyleMap &pointStyles);
void track(SegmentData &segment);
void multiTrack(TrackData &t);
void lineString(SegmentData &segment);
@ -45,6 +63,17 @@ private:
QDateTime timeStamp();
qreal number();
QDateTime time();
QString icon();
QString styleUrl();
void style(const QDir &dir, PointStyleMap &pointStyles,
PolygonStyleMap &polyStyles, LineStyleMap &lineStyles);
void styleMapPair(const QString &id, PointStyleMap &pointStyles,
PolygonStyleMap &polyStyles, LineStyleMap &lineStyles);
void styleMap(PointStyleMap &pointStyles, PolygonStyleMap &polyStyles,
LineStyleMap &lineStyles);
void iconStyle(const QDir &dir, const QString &id, PointStyleMap &style);
void polyStyle(const QString &id, PolygonStyleMap &styles);
void lineStyle(const QString &id, LineStyleMap &styles);
QXmlStreamReader _reader;
};

View File

@ -38,6 +38,9 @@ Graph Route::gpsElevation() const
if (_data.at(i).hasElevation())
gs.append(GraphPoint(_distance.at(i), NAN, _data.at(i).elevation()));
if (_data.style().color().isValid())
graph.setColor(_data.style().color());
return graph;
}
@ -53,6 +56,9 @@ Graph Route::demElevation() const
gs.append(GraphPoint(_distance.at(i), NAN, dem));
}
if (_data.style().color().isValid())
graph.setColor(_data.style().color());
return graph;
}

View File

@ -20,6 +20,7 @@ public:
const QString &description() const {return _data.description();}
const QString &comment() const {return _data.comment();}
const QVector<Link> &links() const {return _data.links();}
const LineStyle &style() const {return _data.style();}
bool isValid() const {return _data.size() >= 2;}

View File

@ -5,6 +5,7 @@
#include <QString>
#include "waypoint.h"
#include "link.h"
#include "style.h"
class RouteData : public QVector<Waypoint>
{
@ -13,17 +14,20 @@ public:
const QString &description() const {return _desc;}
const QString &comment() const {return _comment;}
const QVector<Link> &links() const {return _links;}
const LineStyle &style() const {return _style;}
void setName(const QString &name) {_name = name;}
void setDescription(const QString &desc) {_desc = desc;}
void setComment(const QString &comment) {_comment = comment;}
void addLink(const Link &link) {_links.append(link);}
void setStyle(const LineStyle &style) {_style = style;}
private:
QString _name;
QString _desc;
QString _comment;
QVector<Link> _links;
LineStyle _style;
};
#endif // ROUTEDATA_H

56
src/data/style.h Normal file
View File

@ -0,0 +1,56 @@
#ifndef STYLE_H
#define STYLE_H
#include <QPen>
#include <QBrush>
#include <QPixmap>
class PointStyle {
public:
PointStyle() : _size(-1) {}
PointStyle(const QPixmap &icon, const QColor &color = QColor(), int size = -1)
: _icon(icon), _color(color), _size(size) {}
const QColor &color() const {return _color;}
const QPixmap &icon() const {return _icon;}
int size() const {return _size;}
private:
QPixmap _icon;
QColor _color;
int _size;
};
class PolygonStyle {
public:
PolygonStyle()
: _pen(QPen(Qt::NoPen)), _brush(QBrush(Qt::NoBrush)) {}
PolygonStyle(const QPen &pen, const QBrush &brush)
: _pen(pen), _brush(brush) {}
const QPen &pen() const {return _pen;}
const QBrush &brush() const {return _brush;}
bool isValid() const
{return _pen.style() != Qt::NoPen || _brush.style() != Qt::NoBrush;}
private:
QPen _pen;
QBrush _brush;
};
class LineStyle {
public:
LineStyle() : _width(-1) {}
LineStyle(const QColor &color, int width = -1)
: _color(color), _width(width) {}
const QColor &color() const {return _color;}
int width() const {return _width;}
private:
QColor _color;
int _width;
};
#endif // STYLE_H

View File

@ -254,6 +254,9 @@ Graph Track::gpsElevation() const
ret.append(filter(gs, _elevationWindow));
}
if (_data.style().color().isValid())
ret.setColor(_data.style().color());
return ret;
}
@ -278,6 +281,9 @@ Graph Track::demElevation() const
ret.append(filter(gs, _elevationWindow));
}
if (_data.style().color().isValid())
ret.setColor(_data.style().color());
return ret;
}
@ -330,6 +336,9 @@ Graph Track::computedSpeed() const
filtered[stop.at(j)].setY(0);
}
if (_data.style().color().isValid())
ret.setColor(_data.style().color());
return ret;
}
@ -365,6 +374,9 @@ Graph Track::reportedSpeed() const
filtered[stop.at(j)].setY(0);
}
if (_data.style().color().isValid())
ret.setColor(_data.style().color());
return ret;
}
@ -406,6 +418,9 @@ Graph Track::heartRate() const
ret.append(filter(gs, _heartRateWindow));
}
if (_data.style().color().isValid())
ret.setColor(_data.style().color());
return ret;
}
@ -429,6 +444,9 @@ Graph Track::temperature() const
ret.append(gs);
}
if (_data.style().color().isValid())
ret.setColor(_data.style().color());
return ret;
}
@ -451,6 +469,9 @@ Graph Track::ratio() const
ret.append(gs);
}
if (_data.style().color().isValid())
ret.setColor(_data.style().color());
return ret;
}
@ -486,6 +507,9 @@ Graph Track::cadence() const
filtered[stop.at(j)].setY(0);
}
if (_data.style().color().isValid())
ret.setColor(_data.style().color());
return ret;
}
@ -522,6 +546,9 @@ Graph Track::power() const
filtered[stop.at(j)].setY(0);
}
if (_data.style().color().isValid())
ret.setColor(_data.style().color());
return ret;
}

View File

@ -34,6 +34,7 @@ public:
const QString &description() const {return _data.description();}
const QString &comment() const {return _data.comment();}
const QVector<Link> &links() const {return _data.links();}
const LineStyle &style() const {return _data.style();}
bool isValid() const;

View File

@ -6,6 +6,7 @@
#include <QString>
#include "trackpoint.h"
#include "link.h"
#include "style.h"
typedef QVector<Trackpoint> SegmentData;
@ -16,17 +17,20 @@ public:
const QString &description() const {return _desc;}
const QString &comment() const {return _comment;}
const QVector<Link> &links() const {return _links;}
const LineStyle &style() const {return _style;}
void setName(const QString &name) {_name = name;}
void setDescription(const QString &desc) {_desc = desc;}
void setComment(const QString &comment) {_comment = comment;}
void addLink(const Link &link) {_links.append(link);}
void setStyle(const LineStyle &style) {_style = style;}
private:
QString _name;
QString _desc;
QString _comment;
QVector<Link> _links;
LineStyle _style;
};
#endif // TRACKDATA_H

View File

@ -10,6 +10,7 @@
#include "common/config.h"
#include "common/coordinates.h"
#include "link.h"
#include "style.h"
class Waypoint
{
@ -30,7 +31,7 @@ public:
const QVector<Link> &links() const {return _links;}
const QDateTime &timestamp() const {return _timestamp;}
qreal elevation() const {return _elevation;}
const QPixmap &icon() const {return _icon;}
const PointStyle &style() const {return _style;}
QPair<qreal, qreal> elevations() const;
@ -47,7 +48,7 @@ public:
void setElevation(qreal elevation) {_elevation = elevation;}
void addImage(const QString &path) {_images.append(path);}
void addLink(const Link &link) {_links.append(link);}
void setIcon(const QPixmap &icon) {_icon = icon;}
void setStyle(const PointStyle &style) {_style = style;}
bool hasElevation() const {return !std::isnan(_elevation);}
@ -74,7 +75,7 @@ private:
QVector<Link> _links;
QDateTime _timestamp;
qreal _elevation;
QPixmap _icon;
PointStyle _style;
static bool _useDEM;
static bool _show2ndElevation;

View File

@ -53,6 +53,7 @@ const GCS &GCS::WGS84()
QList<GCS::Entry> GCS::defaults()
{
QList<GCS::Entry> list;
list.append(GCS::Entry(4326, 6326, "WGS 1984", WGS84()));
list.append(GCS::Entry(4326, 6326, "WGS 84", WGS84()));
list.append(GCS::Entry(4326, 6326, "WGS84", WGS84()));
return list;

View File

@ -18,6 +18,7 @@
#include "qctmap.h"
#include "osmdroidmap.h"
#include "gemfmap.h"
#include "oruxmap.h"
#include "invalidmap.h"
#include "maplist.h"
@ -52,6 +53,7 @@ MapList::ParserMap MapList::parsers()
map.insert("qct", &QCTMap::create);
map.insert("sqlite", &OsmdroidMap::create);
map.insert("gemf", &GEMFMap::create);
map.insert("otrk2.xml", &OruxMap::create);
return map;
}
@ -62,7 +64,7 @@ Map *MapList::loadFile(const QString &path, const Projection &proj, bool *isDir)
{
ParserMap::iterator it;
QFileInfo fi(path);
QString suffix(fi.suffix().toLower());
QString suffix(fi.completeSuffix().toLower());
Map *map = 0;
QStringList errors;
@ -161,6 +163,7 @@ QString MapList::formats()
+ qApp->translate("MapList", "Mapsforge maps") + " (*.map);;"
+ qApp->translate("MapList", "OziExplorer maps") + " (*.map);;"
+ qApp->translate("MapList", "MBTiles maps") + " (*.mbtiles);;"
+ qApp->translate("MapList", "Orux maps") + " (*.otrk2.xml);;"
+ qApp->translate("MapList", "QuickChart maps") + " (*.qct);;"
+ qApp->translate("MapList", "TwoNav maps") + " (*.rmap *.rtmap);;"
+ qApp->translate("MapList", "Osmdroid SQLite maps") + " (*.sqlite);;"

View File

@ -98,15 +98,17 @@ qreal OnlineMap::tileSize() const
void OnlineMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
{
qreal scale = OSM::zoom2scale(_zoom, _tileSize);
QRectF b(bounds());
QPoint tile = OSM::mercator2tile(QPointF(rect.topLeft().x() * scale,
-rect.topLeft().y() * scale) * coordinatesRatio(), _zoom);
QPointF tl(floor(rect.left() / tileSize())
* tileSize(), floor(rect.top() / tileSize()) * tileSize());
QSizeF s(rect.right() - tl.x(), rect.bottom() - tl.y());
int width = _zoom ? qCeil(s.width() / tileSize()) : 1;
int height = _zoom ? qCeil(s.height() / tileSize()) : 1;
QSizeF s(qMin(rect.right() - tl.x(), b.width()),
qMin(rect.bottom() - tl.y(), b.height()));
int width = ceil(s.width() / tileSize());
int height = ceil(s.height() / tileSize());
QVector<FetchTile> tiles;
tiles.reserve(width * height);
@ -122,10 +124,9 @@ void OnlineMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
for (int i = 0; i < tiles.count(); i++) {
FetchTile &t = tiles[i];
QPointF tp = _zoom ? QPointF(tl.x() + (t.xy().x() - tile.x())
* tileSize(), tl.y() + ((_invertY ? (1<<_zoom) - t.xy().y() - 1 :
t.xy().y()) - tile.y()) * tileSize())
: QPointF(-_tileSize/2, -_tileSize/2);
QPointF tp(qMax(tl.x(), b.left()) + (t.xy().x() - tile.x()) * tileSize(),
qMax(tl.y(), b.top()) + ((_invertY ? (1<<_zoom) - t.xy().y() - 1 :
t.xy().y()) - tile.y()) * tileSize());
if (!t.pixmap().isNull()) {
t.pixmap().setDevicePixelRatio(imageRatio());

603
src/map/oruxmap.cpp Normal file
View File

@ -0,0 +1,603 @@
#include <QPainter>
#include <QPixmapCache>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlField>
#include <QFile>
#include <QFileInfo>
#include <QDir>
#include <QXmlStreamReader>
#include "pcs.h"
#include "utm.h"
#include "oruxmap.h"
#define META_TYPE(type) static_cast<QMetaType::Type>(type)
static bool intAttr(QXmlStreamReader &reader, const QXmlStreamAttributes &attr,
const QString &name, int &val)
{
bool ok;
if (!attr.hasAttribute(name)) {
reader.raiseError(QString("Missing %1 attribute").arg(name));
return false;
}
val = attr.value(name).toInt(&ok);
if (!ok) {
reader.raiseError(QString("Invalid %1 attribute").arg(name));
return false;
}
return true;
}
static bool dblAttr(QXmlStreamReader &reader, const QXmlStreamAttributes &attr,
const QString &name, double &val)
{
bool ok;
if (!attr.hasAttribute(name)) {
reader.raiseError(QString("Missing %1 attribute").arg(name));
return false;
}
val = attr.value(name).toDouble(&ok);
if (!ok) {
reader.raiseError(QString("Invalid %1 attribute").arg(name));
return false;
}
return true;
}
static bool strAttr(QXmlStreamReader &reader, const QXmlStreamAttributes &attr,
const QString &name, QString &val)
{
if (!attr.hasAttribute(name)) {
reader.raiseError(QString("Missing %1 attribute").arg(name));
return false;
}
val = attr.value(name).toString();
return true;
}
static PointD corner2point(const QString &name, const QSize &size)
{
if (name == "TL")
return PointD(0, 0);
else if (name == "BR")
return PointD(size.width(), size.height());
else if (name == "TR")
return PointD(size.width(), 0);
else if (name == "BL")
return PointD(0, size.height());
else
return PointD();
}
static Projection::Setup lcc2setup(const QStringList &list)
{
double params[6];
bool ok;
if (list.size() < 7)
return Projection::Setup();
for (int i = 1; i < 7; i++) {
params[i - 1] = list.at(i).toDouble(&ok);
if (!ok)
return Projection::Setup();
}
return Projection::Setup(params[0], params[1], NAN, params[4],
params[5], params[2], params[3]);
}
static Projection::Setup laea2setup(const QStringList &list)
{
double params[2];
bool ok;
if (list.size() < 3)
return Projection::Setup();
for (int i = 1; i < 3; i++) {
params[i - 1] = list.at(i).toDouble(&ok);
if (!ok)
return Projection::Setup();
}
return Projection::Setup(params[1], params[0], NAN, 0, 0, NAN, NAN);
}
static Projection::Setup polyconic2setup(const QStringList &list)
{
double params[3];
bool ok;
if (list.size() < 4)
return Projection::Setup();
for (int i = 1; i < 4; i++) {
params[i - 1] = list.at(i).toDouble(&ok);
if (!ok)
return Projection::Setup();
}
return Projection::Setup(NAN, params[0], NAN, params[1], params[2], NAN,
NAN);
}
static Projection::Setup tm2setup(const QStringList &list)
{
double params[5];
bool ok;
if (list.size() < 6)
return Projection::Setup();
for (int i = 1; i < 6; i++) {
params[i - 1] = list.at(i).toDouble(&ok);
if (!ok)
return Projection::Setup();
}
return Projection::Setup(params[1], params[0], params[2], params[3],
params[4], NAN, NAN);
}
static Projection::Setup utm2setup(const QStringList &list)
{
bool ok;
if (list.size() < 2)
return Projection::Setup();
int zone = list.at(1).toInt(&ok);
return ok ? UTM::setup(zone) : Projection::Setup();
}
static Projection::Setup mercator2setup(const QStringList &list)
{
double lon;
bool ok;
if (list.size() < 2)
return Projection::Setup(0, 0, NAN, 0, 0, NAN, NAN);
lon = list.at(1).toDouble(&ok);
return ok ? Projection::Setup(0, lon, NAN, 0, 0, NAN, NAN)
: Projection::Setup();
}
static GCS createGCS(const QString &datum)
{
QStringList dl(datum.split(':'));
return (GCS::gcs(dl.first()));
}
static Projection createProjection(const GCS &gcs, const QString &name)
{
PCS pcs;
QStringList pl(name.split(','));
if (pl.first() == "Latitude/Longitude")
return Projection(gcs);
else if (pl.first() == "UTM")
pcs = PCS(gcs, 9807, utm2setup(pl), 9001);
else if (pl.first() == "Mercator")
pcs = PCS(gcs, 1024, Projection::Setup(), 9001);
else if (pl.first() == "Mercator Ellipsoidal")
pcs = PCS(gcs, 9804, mercator2setup(pl), 9001);
else if (pl.first() == "Transverse Mercator")
pcs = PCS(gcs, 9807, tm2setup(pl), 9001);
else if (pl.first() == "Lambert Conformal Conic")
pcs = PCS(gcs, 9802, lcc2setup(pl), 9001);
else if (pl.first() == "(A)Lambert Azimuthual Equal Area")
pcs = PCS(gcs, 9820, laea2setup(pl), 9001);
else if (pl.first() == "Polyconic (American)")
pcs = PCS(gcs, 9818, polyconic2setup(pl), 9001);
else if (pl.first() == "(IG) Irish Grid")
pcs = PCS(gcs, 9807, Projection::Setup(53.5, -8, 1.000035, 200000,
250000, NAN, NAN), 9001);
else if (pl.first() == "(SUI) Swiss Grid")
pcs = PCS(gcs, 9815, Projection::Setup(46.570866, 7.26225, 1.0, 600000,
200000, 90.0, 90.0), 9001);
else if (pl.first() == "Rijksdriehoeksmeting")
pcs = PCS(gcs, 9809, Projection::Setup(52.1561605555556,
5.38763888888889, 0.9999079, 155000, 463000, NAN, NAN), 9001);
else
return Projection();
return Projection(pcs);
}
static Transform computeTransformation(const Projection &proj,
const QList<CalibrationPoint> &points)
{
QList<ReferencePoint> rp;
for (int i = 0; i < points.size(); i++)
rp.append(points.at(i).rp(proj));
return Transform(rp);
}
void OruxMap::calibrationPoints(QXmlStreamReader &reader, const QSize &size,
QList<CalibrationPoint> &points)
{
while (reader.readNextStartElement()) {
if (reader.name() == QLatin1String("CalibrationPoint")) {
double lon, lat;
QString corner;
QXmlStreamAttributes attr = reader.attributes();
if (!dblAttr(reader, attr, "lat", lat))
return;
if (!dblAttr(reader, attr, "lon", lon))
return;
if (!strAttr(reader, attr, "corner", corner))
return;
CalibrationPoint p(corner2point(corner, size), Coordinates(lon, lat));
if (!p.isValid()) {
reader.raiseError(QString("invalid calibration point"));
return;
}
points.append(p);
reader.readElementText();
} else
reader.skipCurrentElement();
}
}
void OruxMap::mapCalibration(QXmlStreamReader &reader, const QString &dir,
int level)
{
int zoom;
QSize tileSize, size, calibrationSize;
QString fileName;
Projection proj;
Transform t;
QXmlStreamAttributes attr = reader.attributes();
if (!intAttr(reader, attr, "layerLevel", zoom))
return;
while (reader.readNextStartElement()) {
if (reader.name() == QLatin1String("OruxTracker"))
oruxTracker(reader, dir, level + 1);
else if (reader.name() == QLatin1String("MapName")) {
QString name(reader.readElementText());
if (!level && dir.isEmpty())
_name = name;
} else if (reader.name() == QLatin1String("MapChunks")) {
int xMax, yMax, width, height;
QString datum, projection;
QXmlStreamAttributes attr = reader.attributes();
if (!intAttr(reader, attr, "xMax", xMax))
return;
if (!intAttr(reader, attr, "yMax", yMax))
return;
if (!intAttr(reader, attr, "img_width", width))
return;
if (!intAttr(reader, attr, "img_height", height))
return;
if (!strAttr(reader, attr, "datum", datum))
return;
if (!strAttr(reader, attr, "projection", projection))
return;
if (!strAttr(reader, attr, "file_name", fileName))
return;
tileSize = QSize(width, height);
size = QSize(xMax * width, yMax * height);
calibrationSize = size;
GCS gcs(createGCS(datum));
if (!gcs.isValid()) {
reader.raiseError(QString("%1: invalid/unknown datum")
.arg(datum));
return;
}
proj = createProjection(gcs, projection);
if (!proj.isValid()) {
reader.raiseError(QString("%1: invalid/unknown projection")
.arg(projection));
return;
}
reader.readElementText();
} else if (reader.name() == QLatin1String("MapDimensions")) {
int height, width;
QXmlStreamAttributes attr = reader.attributes();
if (!intAttr(reader, attr, "height", height))
return;
if (!intAttr(reader, attr, "width", width))
return;
calibrationSize = QSize(width, height);
reader.readElementText();
} else if (reader.name() == QLatin1String("CalibrationPoints")) {
QList<CalibrationPoint> points;
calibrationPoints(reader, calibrationSize, points);
t = computeTransformation(proj, points);
if (!t.isValid()) {
reader.raiseError(t.errorString());
return;
}
} else
reader.skipCurrentElement();
}
if (tileSize.isValid()) {
if (!t.isValid()) {
reader.raiseError("Invalid map calibration");
return;
}
QDir mapDir(QFileInfo(path()).absoluteDir());
QDir subDir = dir.isEmpty()
? mapDir : QDir(mapDir.absoluteFilePath(dir));
QString set(subDir.absoluteFilePath("set"));
_zooms.append(Zoom(zoom, tileSize, size, proj, t, fileName, set));
}
}
void OruxMap::oruxTracker(QXmlStreamReader &reader, const QString &dir,
int level)
{
if (level > 1 || (level && !dir.isEmpty())) {
reader.raiseError("invalid map nesting");
return;
}
while (reader.readNextStartElement()) {
if (reader.name() == QLatin1String("MapCalibration"))
mapCalibration(reader, dir, level);
else
reader.skipCurrentElement();
}
}
bool OruxMap::readXML(const QString &path, const QString &dir)
{
QFile file(path);
if (!file.open(QFile::ReadOnly | QFile::Text))
return false;
QXmlStreamReader reader(&file);
if (reader.readNextStartElement()) {
if (reader.name() == QLatin1String("OruxTracker"))
oruxTracker(reader, dir, 0);
else
reader.raiseError("Not a Orux map calibration file");
}
if (reader.error()) {
_errorString = QString("%1: %2").arg(reader.lineNumber())
.arg(reader.errorString());
return false;
}
return true;
}
OruxMap::OruxMap(const QString &fileName, QObject *parent)
: Map(fileName, parent), _zoom(0), _mapRatio(1.0), _valid(false)
{
QFileInfo fi(fileName);
QDir dir(fi.absoluteDir());
if (!readXML(fileName))
return;
if (_zooms.isEmpty()) {
QStringList list(dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot));
for (int i = 0; i < list.size(); i++) {
QDir subDir(dir.absoluteFilePath(list.at(i)));
if (!readXML(subDir.absoluteFilePath(list.at(i) + ".otrk2.xml"),
list.at(i))) {
_errorString = list.at(i) + ": " + _errorString;
return;
}
}
if (_zooms.isEmpty()) {
_errorString = "No usable zoom level found";
return;
}
}
std::sort(_zooms.begin(), _zooms.end());
if (dir.exists("OruxMapsImages.db")) {
QString dbFile(dir.absoluteFilePath("OruxMapsImages.db"));
_db = QSqlDatabase::addDatabase("QSQLITE", dbFile);
_db.setDatabaseName(dbFile);
_db.setConnectOptions("QSQLITE_OPEN_READONLY");
if (!_db.open()) {
_errorString = "Error opening database file";
return;
}
QSqlRecord r = _db.record("tiles");
if (r.isEmpty()
|| r.field(0).name() != "x"
|| META_TYPE(r.field(0).type()) != QMetaType::Int
|| r.field(1).name() != "y"
|| META_TYPE(r.field(1).type()) != QMetaType::Int
|| r.field(2).name() != "z"
|| META_TYPE(r.field(2).type()) != QMetaType::Int
|| r.field(3).name() != "image"
|| META_TYPE(r.field(3).type()) != QMetaType::QByteArray) {
_errorString = "Invalid table format";
return;
}
_db.close();
} else {
for (int i = 0; i < _zooms.size(); i++) {
if (!_zooms.at(i).set.exists()) {
_errorString = "missing set directory (level "
+ QString::number(_zooms.at(i).zoom) + ")";
return;
}
}
}
_valid = true;
}
int OruxMap::zoomFit(const QSize &size, const RectC &rect)
{
if (!rect.isValid())
_zoom = _zooms.size() - 1;
else {
for (int i = 1; i < _zooms.size(); i++) {
_zoom = i;
QRect sbr(QPoint(ll2xy(rect.topLeft()).toPoint()),
QPoint(ll2xy(rect.bottomRight()).toPoint()));
if (sbr.size().width() >= size.width() || sbr.size().height()
>= size.height()) {
_zoom--;
break;
}
}
}
return _zoom;
}
int OruxMap::zoomIn()
{
_zoom = qMin(_zoom + 1, _zooms.size() - 1);
return _zoom;
}
int OruxMap::zoomOut()
{
_zoom = qMax(_zoom - 1, 0);
return _zoom;
}
void OruxMap::load()
{
if (_db.isValid())
_db.open();
}
void OruxMap::unload()
{
if (_db.isValid())
_db.close();
}
void OruxMap::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
{
Q_UNUSED(deviceRatio);
_mapRatio = mapRatio;
}
QPixmap OruxMap::tile(const Zoom &z, int x, int y) const
{
if (_db.isValid()) {
QSqlQuery query(_db);
query.prepare("SELECT image FROM tiles WHERE z=:z AND x=:x AND y=:y");
query.bindValue(":z", z.zoom);
query.bindValue(":x", x);
query.bindValue(":y", y);
query.exec();
if (!query.first()) {
qWarning("%s: SQL %d-%d-%d: not found", qPrintable(name()), z.zoom,
x, y);
return QPixmap();
} else {
QImage img(QImage::fromData(query.value(0).toByteArray()));
return QPixmap::fromImage(img);
}
} else {
QString fileName(z.fileName + "_" + QString::number(x) + "_"
+ QString::number(y) + ".omc2");
QString path(z.set.absoluteFilePath(fileName));
if (!QFileInfo::exists(path)) {
qWarning("%s: %s: not found", qPrintable(name()),
qPrintable(fileName));
return QPixmap();
} else {
QImage img(path);
return QPixmap::fromImage(img);
}
}
}
void OruxMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
{
Q_UNUSED(flags);
const Zoom &z = _zooms.at(_zoom);
QSizeF ts(z.tileSize.width() / _mapRatio, z.tileSize.height() / _mapRatio);
QPointF tl(floor(rect.left() / ts.width()) * ts.width(),
floor(rect.top() / ts.height()) * ts.height());
QSizeF s(rect.right() - tl.x(), rect.bottom() - tl.y());
for (int i = 0; i < ceil(s.width() / ts.width()); i++) {
for (int j = 0; j < ceil(s.height() / ts.height()); j++) {
int x = round(tl.x() * _mapRatio + i * z.tileSize.width());
int y = round(tl.y() * _mapRatio + j * z.tileSize.height());
QPixmap pixmap;
QString key = path() + "/" + QString::number(z.zoom)
+ "_" + QString::number(x/z.tileSize.width())
+ "_" + QString::number(y/z.tileSize.height());
if (!QPixmapCache::find(key, &pixmap)) {
pixmap = tile(z, x/z.tileSize.width(), y/z.tileSize.height());
if (!pixmap.isNull())
QPixmapCache::insert(key, pixmap);
}
if (!pixmap.isNull()) {
pixmap.setDevicePixelRatio(_mapRatio);
QPointF tp(tl.x() + i * ts.width(), tl.y() + j * ts.height());
painter->drawPixmap(tp, pixmap);
}
}
}
}
QRectF OruxMap::bounds()
{
const Zoom &z = _zooms.at(_zoom);
return QRectF(QPointF(0, 0), z.size / _mapRatio);
}
QPointF OruxMap::ll2xy(const Coordinates &c)
{
const Zoom &z = _zooms.at(_zoom);
QPointF p(z.transform.proj2img(z.projection.ll2xy(c)));
return (p / _mapRatio);
}
Coordinates OruxMap::xy2ll(const QPointF &p)
{
const Zoom &z = _zooms.at(_zoom);
return z.projection.xy2ll(z.transform.img2proj(p * _mapRatio));
}
Map *OruxMap::create(const QString &path, const Projection &, bool *isDir)
{
if (isDir)
*isDir = true;
return new OruxMap(path);
}
#ifndef QT_NO_DEBUG
QDebug operator<<(QDebug dbg, const OruxMap::Zoom &zoom)
{
dbg.nospace() << "Zoom(" << zoom.zoom << ", " << zoom.tileSize << ", "
<< zoom.size << ")";
return dbg.space();
}
#endif // QT_NO_DEBUG

83
src/map/oruxmap.h Normal file
View File

@ -0,0 +1,83 @@
#ifndef ORUXMAP_H
#define ORUXMAP_H
#include <QDebug>
#include <QSqlDatabase>
#include <QDir>
#include "map.h"
#include "projection.h"
#include "transform.h"
#include "calibrationpoint.h"
class QXmlStreamReader;
class OruxMap : public Map
{
Q_OBJECT
public:
OruxMap(const QString &fileName, QObject *parent = 0);
QString name() const {return _name;}
QRectF bounds();
int zoom() const {return _zoom;}
void setZoom(int zoom) {_zoom = zoom;}
int zoomFit(const QSize &size, const RectC &rect);
int zoomIn();
int zoomOut();
QPointF ll2xy(const Coordinates &c);
Coordinates xy2ll(const QPointF &p);
void draw(QPainter *painter, const QRectF &rect, Flags flags);
void setDevicePixelRatio(qreal deviceRatio, qreal mapRatio);
void load();
void unload();
bool isValid() const {return _valid;}
QString errorString() const {return _errorString;}
static Map *create(const QString &path, const Projection &, bool *isDir);
private:
struct Zoom {
Zoom(int zoom, const QSize &tileSize, const QSize &size,
const Projection &proj, const Transform &transform,
const QString &fileName, const QString &set)
: zoom(zoom), tileSize(tileSize), size(size), projection(proj),
transform(transform), fileName(fileName), set(set) {}
bool operator<(const Zoom &other) const
{return zoom < other.zoom;}
int zoom;
QSize tileSize;
QSize size;
Projection projection;
Transform transform;
QString fileName;
QDir set;
};
bool readXML(const QString &path, const QString &dir = QString());
void oruxTracker(QXmlStreamReader &reader, const QString &dir, int level);
void mapCalibration(QXmlStreamReader &reader, const QString &dir, int level);
void calibrationPoints(QXmlStreamReader &reader, const QSize &size,
QList<CalibrationPoint> &points);
QPixmap tile(const Zoom &z, int x, int y) const;
friend QDebug operator<<(QDebug dbg, const Zoom &zoom);
QString _name;
QList<Zoom> _zooms;
QSqlDatabase _db;
int _zoom;
qreal _mapRatio;
bool _valid;
QString _errorString;
};
#endif // ORUXMAP_H