Compare commits
194 Commits
Author | SHA1 | Date | |
---|---|---|---|
51e38bf4d8 | |||
3b480fbd23 | |||
c523ddbfac | |||
3be4227de9 | |||
17dbcf3e10 | |||
57b2f431c1 | |||
52b081ea59 | |||
dc97061c8e | |||
b59e6d5d79 | |||
9386fa587c | |||
9a459dc365 | |||
2bbf75cb0b | |||
f697c6b693 | |||
6d8ccd2216 | |||
3033bc680d | |||
c95e9abd65 | |||
591560c0eb | |||
e473b5dc2d | |||
7217f9acfc | |||
8f39ce3be5 | |||
fba7a0b40f | |||
fb261a1513 | |||
925ddffba5 | |||
6891999139 | |||
14a9c0a8cb | |||
6103788008 | |||
cb8c19a2bc | |||
dadf095cc1 | |||
f4ee36a173 | |||
7555c89f0c | |||
ae1e357fb7 | |||
05e8cccb3a | |||
1468528a62 | |||
30e6f624b6 | |||
a568efadd2 | |||
aca258da05 | |||
815071fc55 | |||
35ff0f8d55 | |||
7a664342b6 | |||
34b5323fb6 | |||
0a5480ba2c | |||
ef6dff42b7 | |||
cec8946d86 | |||
1b842ab2f0 | |||
0ac6b697bb | |||
4cb369d2f3 | |||
f7b44b64b0 | |||
895b2219c5 | |||
0ec265e4ea | |||
d9e5fc6a74 | |||
c3f345c7f9 | |||
1f9bff6a9b | |||
7e39a34d0e | |||
a941a7315e | |||
cf4f9b6f98 | |||
3d89d0d7da | |||
9b3ed7ef1d | |||
796107b1ab | |||
a7e9c95ba2 | |||
cd54d2d952 | |||
bafbb825fc | |||
031ed4907c | |||
7cdbad3e79 | |||
b62ec2429a | |||
10032000b1 | |||
fd19d9c5a4 | |||
60bb42d708 | |||
6201ba1c67 | |||
85d6357cb9 | |||
26cbbee135 | |||
e200d1597d | |||
cd46a9cb0a | |||
1ba1ae498c | |||
31429b6344 | |||
5719cb5a35 | |||
73aab44848 | |||
e2360f8fb2 | |||
08fc8ff6c4 | |||
78d6ae6838 | |||
0ae55e1511 | |||
e0be482d65 | |||
4f22c50510 | |||
3bc5adec73 | |||
a17110782a | |||
1d5f5ccffd | |||
e1e3800f72 | |||
a1a67fd03f | |||
b12eef7366 | |||
a3071eb022 | |||
821790fa91 | |||
4d0cf66925 | |||
598d21077e | |||
763d634934 | |||
336f3741d8 | |||
b6357cfab6 | |||
248695ac04 | |||
ab4944b296 | |||
d116508d73 | |||
efec3ce4f4 | |||
23c7d8e585 | |||
ec86692ea9 | |||
3237146b78 | |||
fbf81e8861 | |||
5bf9ee7bec | |||
652d6cf97c | |||
a36068c207 | |||
8e5fcfa0b2 | |||
f1375fb7f8 | |||
c98315a7b7 | |||
b90dfc963f | |||
a7bbfb0995 | |||
eca7ca44ee | |||
56a68689b4 | |||
16e7de8a0d | |||
977ba58570 | |||
0d8e46cad0 | |||
14cf94d393 | |||
88763ba1ca | |||
d74693327d | |||
dde8e9a22c | |||
50d4ca1690 | |||
07894f3a55 | |||
86dd6ed772 | |||
d01a5a7e42 | |||
97bea8c56c | |||
b5972c8328 | |||
4fd0ca0b11 | |||
84d5673e17 | |||
e40836e6bb | |||
88aef38f9d | |||
7d8dcec88b | |||
561d8362a9 | |||
7f9fde76e9 | |||
239e571358 | |||
44b28e3d4d | |||
4cef089c81 | |||
05ac5ccedb | |||
22fb6071f7 | |||
2c78772a67 | |||
0f03ef4af7 | |||
351cc49ec9 | |||
743a937f41 | |||
033225502f | |||
75b8b9eab0 | |||
e76e7b71ed | |||
41ea07d020 | |||
4bad086152 | |||
8be088be0a | |||
73021bec01 | |||
7584116168 | |||
59b734c402 | |||
8168d52f09 | |||
74796e3e41 | |||
676024854a | |||
10e1b5c4fb | |||
54570ed97e | |||
07fa377e38 | |||
2b8c3f64ac | |||
a60cccb57e | |||
c2e50e5213 | |||
0ea8e008c2 | |||
082435c83d | |||
e63ad7a244 | |||
32a4365543 | |||
abd1dc2450 | |||
5674534efd | |||
33287f9d76 | |||
1dfe84c4af | |||
7fe8d204bc | |||
5080247e10 | |||
13d6c7c643 | |||
547d7a5f23 | |||
9e03d85b7a | |||
b811132394 | |||
ca33328d99 | |||
41c8a4d935 | |||
acd09400be | |||
16bfd593c7 | |||
9e70a1ffbb | |||
1b590fbf76 | |||
8d52dbf59f | |||
c6fd32fc61 | |||
af6082425e | |||
785123f005 | |||
df3ee11f42 | |||
6af1ff35ab | |||
8423fc1230 | |||
a62d84da67 | |||
2431f432d4 | |||
6c4ebc40ca | |||
0cc6908b30 | |||
becf57e4eb | |||
96733883cb | |||
973c086029 |
@ -1,32 +1,39 @@
|
|||||||
version: 7.37.{build}
|
version: 8.2.{build}
|
||||||
|
|
||||||
configuration:
|
configuration:
|
||||||
- Release
|
- Release
|
||||||
|
|
||||||
image:
|
image:
|
||||||
- Visual Studio 2017
|
- Visual Studio 2019
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
NSISDIR: C:\Program Files (x86)\NSIS
|
NSISDIR: C:\Program Files (x86)\NSIS
|
||||||
matrix:
|
matrix:
|
||||||
- QTDIR: C:\Qt\5.13\msvc2017
|
- QTDIR: C:\Qt\5.15\msvc2019
|
||||||
NSI: gpxsee.nsi
|
NSI: gpxsee.nsi
|
||||||
VCVARS: vcvars32.bat
|
VCVARS: vcvars32.bat
|
||||||
OPENSSLDIR: C:\OpenSSL-v111-Win32\bin
|
OPENSSLDIR: C:\OpenSSL-v111-Win32\bin
|
||||||
LIBCRYPTO: libssl-1_1.dll
|
LIBCRYPTO: libssl-1_1.dll
|
||||||
LIBSSL: libcrypto-1_1.dll
|
LIBSSL: libcrypto-1_1.dll
|
||||||
- QTDIR: C:\Qt\5.13\msvc2017_64
|
- QTDIR: C:\Qt\5.15\msvc2019_64
|
||||||
NSI: gpxsee64.nsi
|
NSI: gpxsee64.nsi
|
||||||
VCVARS: vcvars64.bat
|
VCVARS: vcvars64.bat
|
||||||
OPENSSLDIR: C:\OpenSSL-v111-Win64\bin
|
OPENSSLDIR: C:\OpenSSL-v111-Win64\bin
|
||||||
LIBCRYPTO: libssl-1_1-x64.dll
|
LIBCRYPTO: libssl-1_1-x64.dll
|
||||||
LIBSSL: libcrypto-1_1-x64.dll
|
LIBSSL: libcrypto-1_1-x64.dll
|
||||||
|
- QTDIR: C:\Qt\6.0\msvc2019_64
|
||||||
|
NSI: gpxsee64.nsi
|
||||||
|
VCVARS: vcvars64.bat
|
||||||
|
OPENSSLDIR: C:\OpenSSL-v111-Win64\bin
|
||||||
|
LIBCRYPTO: libssl-1_1-x64.dll
|
||||||
|
LIBSSL: libcrypto-1_1-x64.dll
|
||||||
|
NSISDEF: /DQT6
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- cmd: >-
|
- cmd: >-
|
||||||
set PATH=%QTDIR%\bin;%NSISDIR%;%PATH%
|
set PATH=%QTDIR%\bin;%NSISDIR%;%PATH%
|
||||||
|
|
||||||
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\"%VCVARS%
|
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\"%VCVARS%
|
||||||
|
|
||||||
build_script:
|
build_script:
|
||||||
- cmd: >-
|
- cmd: >-
|
||||||
@ -60,6 +67,6 @@ build_script:
|
|||||||
copy %OPENSSLDIR%\%LIBSSL% installer
|
copy %OPENSSLDIR%\%LIBSSL% installer
|
||||||
|
|
||||||
|
|
||||||
makensis.exe installer\%NSI%
|
makensis.exe %NSISDEF% installer\%NSI%
|
||||||
artifacts:
|
artifacts:
|
||||||
- path: installer\GPXSee-*.exe
|
- path: installer\GPXSee-*.exe
|
||||||
|
@ -4,13 +4,15 @@ os:
|
|||||||
- linux
|
- linux
|
||||||
- osx
|
- osx
|
||||||
|
|
||||||
|
dist: focal
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get -qq update; fi
|
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get -qq update; fi
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi
|
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install qt; fi
|
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install qt; fi
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install libqt4-dev libqt4-opengl-dev; fi
|
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install qtbase5-dev qtbase5-private-dev libqt5opengl5-dev qttools5-dev-tools; fi
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then PATH=/usr/local/opt/qt/bin/:${PATH}; fi
|
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then PATH=/usr/local/opt/qt/bin/:${PATH}; fi
|
||||||
|
11
README.md
@ -4,7 +4,7 @@ GPXSee is a Qt-based GPS log file viewer and analyzer that supports all common G
|
|||||||
## Features
|
## Features
|
||||||
* Opens GPX, TCX, FIT, KML, NMEA, IGC, CUP, SIGMA SLF, Suunto SML, LOC, GeoJSON, OziExplorer (PLT, RTE, WPT), Garmin GPI&CSV and geotagged JPEG files.
|
* Opens GPX, TCX, FIT, KML, NMEA, IGC, CUP, SIGMA SLF, Suunto SML, LOC, GeoJSON, OziExplorer (PLT, RTE, WPT), Garmin GPI&CSV and geotagged JPEG files.
|
||||||
* User-definable online maps (OpenStreetMap/Google tiles, WMTS, WMS, TMS, QuadTiles).
|
* User-definable online maps (OpenStreetMap/Google tiles, WMTS, WMS, TMS, QuadTiles).
|
||||||
* Offline maps (MBTiles, OziExplorer maps, TrekBuddy maps/atlases, Garmin IMG/GMAP & JNX maps, TwoNav RMaps, GeoTIFF images).
|
* Offline maps (MBTiles, OziExplorer maps, TrekBuddy maps/atlases, Garmin IMG/GMAP & JNX maps, TwoNav RMaps, GeoTIFF images, BSB charts, KMZ maps).
|
||||||
* Elevation, speed, heart rate, cadence, power, temperature and gear ratio/shifts graphs.
|
* Elevation, speed, heart rate, cadence, power, temperature and gear ratio/shifts graphs.
|
||||||
* Support for DEM files (SRTM HGT).
|
* Support for DEM files (SRTM HGT).
|
||||||
* Support for multiple tracks in one view.
|
* Support for multiple tracks in one view.
|
||||||
@ -18,8 +18,8 @@ GPXSee is a Qt-based GPS log file viewer and analyzer that supports all common G
|
|||||||
|
|
||||||
## Build
|
## Build
|
||||||
Build requirements:
|
Build requirements:
|
||||||
* Qt 4.8 or QT 5.x (Qt >= 5.10.1 recommended for all features)
|
* Qt5 >= 5.11 or Qt 6.x
|
||||||
* C++03 or newer compiler (tested: msvc2015, gcc >= 4.8, clang/Apple LLVM version 8.1.0)
|
* C++11 or newer compiler (tested: msvc2017, gcc 7.5.0, clang/Apple LLVM version 10.0.0)
|
||||||
|
|
||||||
Build steps:
|
Build steps:
|
||||||
```shell
|
```shell
|
||||||
@ -51,6 +51,7 @@ licenses:
|
|||||||
* [Mapbox Maki icons](icons/POI) - CC0
|
* [Mapbox Maki icons](icons/POI) - CC0
|
||||||
* [RTree implementation](src/common/rtree.h) - Public domain
|
* [RTree implementation](src/common/rtree.h) - Public domain
|
||||||
* [Albers](src/map/albersequal.cpp), [Geocentric](src/map/geocentric.cpp), [LCC](src/map/lambertconic.cpp),
|
* [Albers](src/map/albersequal.cpp), [Geocentric](src/map/geocentric.cpp), [LCC](src/map/lambertconic.cpp),
|
||||||
[Mercator](src/map/mercator.cpp), [Polar Stereographic](src/map/polarstereographic.cpp)
|
[Mercator](src/map/mercator.cpp), [Polar Stereographic](src/map/polarstereographic.cpp),
|
||||||
and [Transverse Mercator](src/map/transversemercator.cpp) projections - NIMA Source Code Disclaimer
|
[Polyconic](src/map/polyconic.cpp) and [Transverse Mercator](src/map/transversemercator.cpp)
|
||||||
|
projections - NIMA Source Code Disclaimer
|
||||||
* [Projection parameters CSV files](pkg/csv) - BSD/EPSG/Public domain
|
* [Projection parameters CSV files](pkg/csv) - BSD/EPSG/Public domain
|
||||||
|
68
gpxsee.pro
@ -3,32 +3,32 @@ unix:!macx {
|
|||||||
} else {
|
} else {
|
||||||
TARGET = GPXSee
|
TARGET = GPXSee
|
||||||
}
|
}
|
||||||
VERSION = 7.37
|
VERSION = 8.2
|
||||||
|
|
||||||
QT += core \
|
QT += core \
|
||||||
gui \
|
gui \
|
||||||
|
gui-private \
|
||||||
network \
|
network \
|
||||||
sql \
|
sql \
|
||||||
concurrent
|
concurrent \
|
||||||
greaterThan(QT_MAJOR_VERSION, 4) {
|
widgets \
|
||||||
QT += widgets
|
printsupport
|
||||||
QT += printsupport
|
greaterThan(QT_MAJOR_VERSION, 5) {QT += openglwidgets}
|
||||||
}
|
|
||||||
lessThan(QT_MAJOR_VERSION, 5) {QT += opengl}
|
|
||||||
equals(QT_MAJOR_VERSION, 5) : lessThan(QT_MINOR_VERSION, 4) {QT += opengl}
|
|
||||||
|
|
||||||
INCLUDEPATH += ./src
|
INCLUDEPATH += ./src
|
||||||
HEADERS += src/common/config.h \
|
HEADERS += src/common/config.h \
|
||||||
src/GUI/axislabelitem.h \
|
src/GUI/axislabelitem.h \
|
||||||
src/GUI/graphicsscene.h \
|
src/GUI/graphicsscene.h \
|
||||||
src/GUI/mapaction.h \
|
src/GUI/mapaction.h \
|
||||||
|
src/GUI/mapitem.h \
|
||||||
src/GUI/marginswidget.h \
|
src/GUI/marginswidget.h \
|
||||||
|
src/GUI/planeitem.h \
|
||||||
src/GUI/popup.h \
|
src/GUI/popup.h \
|
||||||
src/common/garmin.h \
|
src/common/garmin.h \
|
||||||
src/common/staticassert.h \
|
|
||||||
src/common/coordinates.h \
|
src/common/coordinates.h \
|
||||||
src/common/range.h \
|
src/common/range.h \
|
||||||
src/common/rectc.h \
|
src/common/rectc.h \
|
||||||
|
src/common/textcodec.h \
|
||||||
src/common/wgs84.h \
|
src/common/wgs84.h \
|
||||||
src/common/util.h \
|
src/common/util.h \
|
||||||
src/common/rtree.h \
|
src/common/rtree.h \
|
||||||
@ -56,7 +56,6 @@ HEADERS += src/common/config.h \
|
|||||||
src/GUI/heartrategraph.h \
|
src/GUI/heartrategraph.h \
|
||||||
src/GUI/trackinfo.h \
|
src/GUI/trackinfo.h \
|
||||||
src/GUI/fileselectwidget.h \
|
src/GUI/fileselectwidget.h \
|
||||||
src/GUI/margins.h \
|
|
||||||
src/GUI/temperaturegraph.h \
|
src/GUI/temperaturegraph.h \
|
||||||
src/GUI/graphtab.h \
|
src/GUI/graphtab.h \
|
||||||
src/GUI/trackitem.h \
|
src/GUI/trackitem.h \
|
||||||
@ -72,7 +71,6 @@ HEADERS += src/common/config.h \
|
|||||||
src/GUI/optionsdialog.h \
|
src/GUI/optionsdialog.h \
|
||||||
src/GUI/colorbox.h \
|
src/GUI/colorbox.h \
|
||||||
src/GUI/stylecombobox.h \
|
src/GUI/stylecombobox.h \
|
||||||
src/GUI/opengl.h \
|
|
||||||
src/GUI/timetype.h \
|
src/GUI/timetype.h \
|
||||||
src/GUI/percentslider.h \
|
src/GUI/percentslider.h \
|
||||||
src/GUI/elevationgraphitem.h \
|
src/GUI/elevationgraphitem.h \
|
||||||
@ -84,7 +82,6 @@ HEADERS += src/common/config.h \
|
|||||||
src/GUI/gearratiographitem.h \
|
src/GUI/gearratiographitem.h \
|
||||||
src/GUI/oddspinbox.h \
|
src/GUI/oddspinbox.h \
|
||||||
src/GUI/settings.h \
|
src/GUI/settings.h \
|
||||||
src/GUI/cpuarch.h \
|
|
||||||
src/GUI/searchpointer.h \
|
src/GUI/searchpointer.h \
|
||||||
src/GUI/mapview.h \
|
src/GUI/mapview.h \
|
||||||
src/GUI/font.h \
|
src/GUI/font.h \
|
||||||
@ -103,6 +100,10 @@ HEADERS += src/common/config.h \
|
|||||||
src/map/IMG/rastertile.h \
|
src/map/IMG/rastertile.h \
|
||||||
src/map/IMG/textpathitem.h \
|
src/map/IMG/textpathitem.h \
|
||||||
src/map/IMG/textpointitem.h \
|
src/map/IMG/textpointitem.h \
|
||||||
|
src/map/bsbmap.h \
|
||||||
|
src/map/invalidmap.h \
|
||||||
|
src/map/kmzmap.h \
|
||||||
|
src/map/polyconic.h \
|
||||||
src/map/projection.h \
|
src/map/projection.h \
|
||||||
src/map/ellipsoid.h \
|
src/map/ellipsoid.h \
|
||||||
src/map/datum.h \
|
src/map/datum.h \
|
||||||
@ -203,14 +204,19 @@ HEADERS += src/common/config.h \
|
|||||||
src/data/address.h \
|
src/data/address.h \
|
||||||
src/data/smlparser.h \
|
src/data/smlparser.h \
|
||||||
src/GUI/pdfexportdialog.h \
|
src/GUI/pdfexportdialog.h \
|
||||||
src/GUI/pngexportdialog.h
|
src/GUI/pngexportdialog.h \
|
||||||
|
src/data/geojsonparser.h \
|
||||||
|
src/GUI/timezoneinfo.h
|
||||||
|
|
||||||
SOURCES += src/main.cpp \
|
SOURCES += src/main.cpp \
|
||||||
src/GUI/axislabelitem.cpp \
|
src/GUI/axislabelitem.cpp \
|
||||||
|
src/GUI/mapitem.cpp \
|
||||||
src/GUI/marginswidget.cpp \
|
src/GUI/marginswidget.cpp \
|
||||||
src/GUI/popup.cpp \
|
src/GUI/popup.cpp \
|
||||||
src/common/coordinates.cpp \
|
src/common/coordinates.cpp \
|
||||||
src/common/rectc.cpp \
|
src/common/rectc.cpp \
|
||||||
src/common/range.cpp \
|
src/common/range.cpp \
|
||||||
|
src/common/textcodec.cpp \
|
||||||
src/common/util.cpp \
|
src/common/util.cpp \
|
||||||
src/common/greatcircle.cpp \
|
src/common/greatcircle.cpp \
|
||||||
src/common/programpaths.cpp \
|
src/common/programpaths.cpp \
|
||||||
@ -271,11 +277,14 @@ SOURCES += src/main.cpp \
|
|||||||
src/map/IMG/rastertile.cpp \
|
src/map/IMG/rastertile.cpp \
|
||||||
src/map/IMG/textpathitem.cpp \
|
src/map/IMG/textpathitem.cpp \
|
||||||
src/map/IMG/textpointitem.cpp \
|
src/map/IMG/textpointitem.cpp \
|
||||||
|
src/map/bsbmap.cpp \
|
||||||
|
src/map/kmzmap.cpp \
|
||||||
src/map/maplist.cpp \
|
src/map/maplist.cpp \
|
||||||
src/map/onlinemap.cpp \
|
src/map/onlinemap.cpp \
|
||||||
src/map/downloader.cpp \
|
src/map/downloader.cpp \
|
||||||
src/map/emptymap.cpp \
|
src/map/emptymap.cpp \
|
||||||
src/map/ozimap.cpp \
|
src/map/ozimap.cpp \
|
||||||
|
src/map/polyconic.cpp \
|
||||||
src/map/tar.cpp \
|
src/map/tar.cpp \
|
||||||
src/map/atlas.cpp \
|
src/map/atlas.cpp \
|
||||||
src/map/ozf.cpp \
|
src/map/ozf.cpp \
|
||||||
@ -354,19 +363,11 @@ SOURCES += src/main.cpp \
|
|||||||
src/data/gpiparser.cpp \
|
src/data/gpiparser.cpp \
|
||||||
src/data/smlparser.cpp \
|
src/data/smlparser.cpp \
|
||||||
src/GUI/pdfexportdialog.cpp \
|
src/GUI/pdfexportdialog.cpp \
|
||||||
src/GUI/pngexportdialog.cpp
|
src/GUI/pngexportdialog.cpp \
|
||||||
|
src/data/geojsonparser.cpp
|
||||||
greaterThan(QT_MAJOR_VERSION, 4) {
|
|
||||||
HEADERS += src/data/geojsonparser.h
|
|
||||||
SOURCES += src/data/geojsonparser.cpp
|
|
||||||
}
|
|
||||||
equals(QT_MAJOR_VERSION, 5):greaterThan(QT_MINOR_VERSION, 4) {
|
|
||||||
HEADERS += src/GUI/timezoneinfo.h
|
|
||||||
}
|
|
||||||
|
|
||||||
DEFINES += APP_VERSION=\\\"$$VERSION\\\" \
|
DEFINES += APP_VERSION=\\\"$$VERSION\\\" \
|
||||||
QT_NO_DEPRECATED_WARNINGS
|
QT_NO_DEPRECATED_WARNINGS
|
||||||
DEFINES *= QT_USE_QSTRINGBUILDER
|
|
||||||
|
|
||||||
RESOURCES += gpxsee.qrc
|
RESOURCES += gpxsee.qrc
|
||||||
TRANSLATIONS = lang/gpxsee_en.ts \
|
TRANSLATIONS = lang/gpxsee_en.ts \
|
||||||
@ -384,7 +385,8 @@ TRANSLATIONS = lang/gpxsee_en.ts \
|
|||||||
lang/gpxsee_pt_BR.ts \
|
lang/gpxsee_pt_BR.ts \
|
||||||
lang/gpxsee_uk.ts \
|
lang/gpxsee_uk.ts \
|
||||||
lang/gpxsee_hu.ts \
|
lang/gpxsee_hu.ts \
|
||||||
lang/gpxsee_it.ts
|
lang/gpxsee_it.ts \
|
||||||
|
lang/gpxsee_eo.ts
|
||||||
|
|
||||||
macx {
|
macx {
|
||||||
ICON = icons/app/gpxsee.icns
|
ICON = icons/app/gpxsee.icns
|
||||||
@ -425,7 +427,13 @@ macx {
|
|||||||
icons/formats/json.icns \
|
icons/formats/json.icns \
|
||||||
icons/formats/cup.icns \
|
icons/formats/cup.icns \
|
||||||
icons/formats/gpi.icns \
|
icons/formats/gpi.icns \
|
||||||
icons/formats/sml.icns
|
icons/formats/sml.icns \
|
||||||
|
icons/formats/img.icns \
|
||||||
|
icons/formats/jnx.icns \
|
||||||
|
icons/formats/kap.icns \
|
||||||
|
icons/formats/mbts.icns \
|
||||||
|
icons/formats/rmap.icns \
|
||||||
|
icons/formats/tba.icns
|
||||||
QMAKE_BUNDLE_DATA += locale maps icons csv
|
QMAKE_BUNDLE_DATA += locale maps icons csv
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -445,14 +453,20 @@ win32 {
|
|||||||
icons/formats/json.ico \
|
icons/formats/json.ico \
|
||||||
icons/formats/cup.ico \
|
icons/formats/cup.ico \
|
||||||
icons/formats/gpi.ico \
|
icons/formats/gpi.ico \
|
||||||
icons/formats/sml.ico
|
icons/formats/sml.ico \
|
||||||
|
icons/formats/img.ico \
|
||||||
|
icons/formats/jnx.ico \
|
||||||
|
icons/formats/kap.ico \
|
||||||
|
icons/formats/map.ico \
|
||||||
|
icons/formats/mbts.ico \
|
||||||
|
icons/formats/rmap.ico \
|
||||||
|
icons/formats/tba.ico
|
||||||
DEFINES += _USE_MATH_DEFINES \
|
DEFINES += _USE_MATH_DEFINES \
|
||||||
NOGDI
|
NOGDI
|
||||||
}
|
}
|
||||||
|
|
||||||
unix:!macx {
|
unix:!macx {
|
||||||
isEmpty(PREFIX):PREFIX = /usr/local
|
isEmpty(PREFIX):PREFIX = /usr/local
|
||||||
DEFINES += PREFIX=\\\"$$PREFIX\\\"
|
|
||||||
|
|
||||||
maps.files = pkg/maps/*
|
maps.files = pkg/maps/*
|
||||||
maps.path = $$PREFIX/share/gpxsee/maps
|
maps.path = $$PREFIX/share/gpxsee/maps
|
||||||
|
Before Width: | Height: | Size: 304 KiB After Width: | Height: | Size: 305 KiB |
Before Width: | Height: | Size: 302 KiB After Width: | Height: | Size: 302 KiB |
Before Width: | Height: | Size: 303 KiB After Width: | Height: | Size: 304 KiB |
Before Width: | Height: | Size: 305 KiB After Width: | Height: | Size: 306 KiB |
Before Width: | Height: | Size: 304 KiB After Width: | Height: | Size: 304 KiB |
BIN
icons/formats/img.icns
Normal file
BIN
icons/formats/img.ico
Normal file
After Width: | Height: | Size: 304 KiB |
BIN
icons/formats/jnx.icns
Normal file
BIN
icons/formats/jnx.ico
Normal file
After Width: | Height: | Size: 304 KiB |
Before Width: | Height: | Size: 306 KiB After Width: | Height: | Size: 307 KiB |
BIN
icons/formats/kap.icns
Normal file
BIN
icons/formats/kap.ico
Normal file
After Width: | Height: | Size: 305 KiB |
Before Width: | Height: | Size: 304 KiB After Width: | Height: | Size: 304 KiB |
Before Width: | Height: | Size: 305 KiB After Width: | Height: | Size: 305 KiB |
BIN
icons/formats/map.icns
Normal file
BIN
icons/formats/map.ico
Normal file
After Width: | Height: | Size: 304 KiB |
BIN
icons/formats/mbts.icns
Normal file
BIN
icons/formats/mbts.ico
Normal file
After Width: | Height: | Size: 305 KiB |
Before Width: | Height: | Size: 305 KiB After Width: | Height: | Size: 305 KiB |
Before Width: | Height: | Size: 302 KiB After Width: | Height: | Size: 302 KiB |
BIN
icons/formats/rmap.icns
Normal file
BIN
icons/formats/rmap.ico
Normal file
After Width: | Height: | Size: 306 KiB |
Before Width: | Height: | Size: 302 KiB After Width: | Height: | Size: 303 KiB |
@ -13,3 +13,10 @@ slf:#881199
|
|||||||
cup:#20a810
|
cup:#20a810
|
||||||
gpi:#fca314
|
gpi:#fca314
|
||||||
sml:#6434eb
|
sml:#6434eb
|
||||||
|
img:#cf0a0a
|
||||||
|
jnx:#aeff00
|
||||||
|
kap:#080045
|
||||||
|
map:#f6ff00
|
||||||
|
mbts:#ff0062
|
||||||
|
rmap:#145cba
|
||||||
|
tba:#367050
|
||||||
|
@ -5,6 +5,6 @@ while read e; do
|
|||||||
|
|
||||||
EXT=`echo $1 | tr /a-z/ /A-Z/`
|
EXT=`echo $1 | tr /a-z/ /A-Z/`
|
||||||
sed -e "s/\$EXTENSION/$EXT/" -e "s/\$COLOR/$2/" icon-template.svg > $1.svg
|
sed -e "s/\$EXTENSION/$EXT/" -e "s/\$COLOR/$2/" icon-template.svg > $1.svg
|
||||||
convert -density 400 $1.svg -define icon:auto-resize $1.ico
|
convert -density 400 -background none $1.svg -define icon:auto-resize $1.ico
|
||||||
rm $1.svg
|
rm $1.svg
|
||||||
done < extensions
|
done < extensions
|
||||||
|
Before Width: | Height: | Size: 304 KiB After Width: | Height: | Size: 304 KiB |
Before Width: | Height: | Size: 304 KiB After Width: | Height: | Size: 305 KiB |
BIN
icons/formats/tba.icns
Normal file
BIN
icons/formats/tba.ico
Normal file
After Width: | Height: | Size: 304 KiB |
Before Width: | Height: | Size: 304 KiB After Width: | Height: | Size: 304 KiB |
Before Width: | Height: | Size: 304 KiB After Width: | Height: | Size: 304 KiB |
2097
lang/gpxsee_eo.ts
Normal file
502
pkg/Info.plist
@ -42,7 +42,7 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>CFBundleTypeMIMETypes</key>
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>application/tcx+xml</string>
|
<string>application/vnd.garmin.tcx+xml</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleTypeIconFile</key>
|
<key>CFBundleTypeIconFile</key>
|
||||||
<string>icons/tcx.icns</string>
|
<string>icons/tcx.icns</string>
|
||||||
@ -67,6 +67,22 @@
|
|||||||
<key>CFBundleTypeRole</key>
|
<key>CFBundleTypeRole</key>
|
||||||
<string>Viewer</string>
|
<string>Viewer</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>kmz</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>application/vnd.google-earth.kmz</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>icons/kml.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>KML geographic compressed data</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>CFBundleTypeExtensions</key>
|
<key>CFBundleTypeExtensions</key>
|
||||||
<array>
|
<array>
|
||||||
@ -74,7 +90,7 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>CFBundleTypeMIMETypes</key>
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>application/loc+xml</string>
|
<string>application/vnd.groundspeak.loc+xml</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleTypeIconFile</key>
|
<key>CFBundleTypeIconFile</key>
|
||||||
<string>icons/loc.icns</string>
|
<string>icons/loc.icns</string>
|
||||||
@ -90,7 +106,7 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>CFBundleTypeMIMETypes</key>
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>application/slf+xml</string>
|
<string>application/vnd.sigma.slf+xml</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleTypeIconFile</key>
|
<key>CFBundleTypeIconFile</key>
|
||||||
<string>icons/slf.icns</string>
|
<string>icons/slf.icns</string>
|
||||||
@ -250,7 +266,7 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>CFBundleTypeMIMETypes</key>
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>application/sml+xml</string>
|
<string>application/vnd.suunto.sml+xml</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleTypeIconFile</key>
|
<key>CFBundleTypeIconFile</key>
|
||||||
<string>icons/sml.icns</string>
|
<string>icons/sml.icns</string>
|
||||||
@ -259,6 +275,193 @@
|
|||||||
<key>CFBundleTypeRole</key>
|
<key>CFBundleTypeRole</key>
|
||||||
<string>Viewer</string>
|
<string>Viewer</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>jpeg</string>
|
||||||
|
<string>jpg</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>image/jpeg</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>JPEG Image</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>csv</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>text/csv</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>Comma-Separated Values (CSV) Files</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>img</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>application/vnd.garmin.img</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>icons/img.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>Garmin IMG Map</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>gmap</string>
|
||||||
|
<string>gmapi</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>application/vnd.garmin.gmap</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>icons/img.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>Garmin Map Product File</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>jnx</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>application/vnd.garmin.jnx</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>icons/jnx.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>Garmin JNX Map</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>kap</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>application/vnd.maptech.kap</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>icons/kap.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>BSB Nautical Charts</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>map</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>application/vnd.oziexplorer.map</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>icons/map.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>OziExplorer Map File</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>rmap</string>
|
||||||
|
<string>rtmap</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>application/vnd.twonav.rmap</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>icons/rmap.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>TwoNav Raster Map File</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>tba</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>application/vnd.trekbuddy.tba</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>icons/tba.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>TrekBuddy Atlas</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>mbtiles</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>application/vnd.mapbox.mbtiles</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>icons/mbts.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>MBTiles Map File</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>tiff</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>image/tiff</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>GeoTIFF Image</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>xml</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>application/vnd.gpxsee.map+xml</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>GPXSee Map Definition File</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
|
|
||||||
<key>UTImportedTypeDeclarations</key>
|
<key>UTImportedTypeDeclarations</key>
|
||||||
@ -302,7 +505,7 @@
|
|||||||
<string>tcx</string>
|
<string>tcx</string>
|
||||||
</array>
|
</array>
|
||||||
<key>public.mime-type</key>
|
<key>public.mime-type</key>
|
||||||
<string>application/tcx+xml</string>
|
<string>application/vnd.garmin.tcx+xml</string>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
@ -326,6 +529,27 @@
|
|||||||
<string>application/vnd.google-earth.kml+xml</string>
|
<string>application/vnd.google-earth.kml+xml</string>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>com.google.kmz</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>https://developers.google.com/kml/documentation/kmlreference</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>KML geographic compressed data</string>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.archive</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict>
|
||||||
|
<key>public.filename-extension</key>
|
||||||
|
<array>
|
||||||
|
<string>kmz</string>
|
||||||
|
</array>
|
||||||
|
<key>public.mime-type</key>
|
||||||
|
<string>application/vnd.google-earth.kmz</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>UTTypeIdentifier</key>
|
<key>UTTypeIdentifier</key>
|
||||||
<string>com.geocaching.loc</string>
|
<string>com.geocaching.loc</string>
|
||||||
@ -344,7 +568,7 @@
|
|||||||
<string>loc</string>
|
<string>loc</string>
|
||||||
</array>
|
</array>
|
||||||
<key>public.mime-type</key>
|
<key>public.mime-type</key>
|
||||||
<string>application/loc+xml</string>
|
<string>application/vnd.groundspeak.loc+xml</string>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
@ -365,7 +589,7 @@
|
|||||||
<string>slf</string>
|
<string>slf</string>
|
||||||
</array>
|
</array>
|
||||||
<key>public.mime-type</key>
|
<key>public.mime-type</key>
|
||||||
<string>application/slf+xml</string>
|
<string>application/vnd.sigma.slf+xml</string>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
@ -575,7 +799,269 @@
|
|||||||
<string>sml</string>
|
<string>sml</string>
|
||||||
</array>
|
</array>
|
||||||
<key>public.mime-type</key>
|
<key>public.mime-type</key>
|
||||||
<string>application/sml+xml</string>
|
<string>application/vnd.suunto.sml+xml</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>public.jpeg</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>http://www.w3.org/Graphics/JPEG/</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>JPEG Image</string>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.image</string>
|
||||||
|
<string>public.data</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict>
|
||||||
|
<key>public.filename-extension</key>
|
||||||
|
<array>
|
||||||
|
<string>jpeg</string>
|
||||||
|
<string>jpg</string>
|
||||||
|
</array>
|
||||||
|
<key>public.mime-type</key>
|
||||||
|
<string>image/jpeg</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>public.csv</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>https://tools.ietf.org/html/rfc4180</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>Comma-Separated Values (CSV) Files</string>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.data</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict>
|
||||||
|
<key>public.filename-extension</key>
|
||||||
|
<array>
|
||||||
|
<string>csv</string>
|
||||||
|
</array>
|
||||||
|
<key>public.mime-type</key>
|
||||||
|
<string>text/csv</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>com.garmin.img</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>https://sourceforge.net/projects/garmin-img/</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>Garmin IMG map</string>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.data</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict>
|
||||||
|
<key>public.filename-extension</key>
|
||||||
|
<array>
|
||||||
|
<string>img</string>
|
||||||
|
</array>
|
||||||
|
<key>public.mime-type</key>
|
||||||
|
<string>application/vnd.garmin.img</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>com.garmin.jnx</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>http://whiter.brinkster.net/en/JNX.shtml</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>Garmin JNX Map</string>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.data</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict>
|
||||||
|
<key>public.filename-extension</key>
|
||||||
|
<array>
|
||||||
|
<string>jnx</string>
|
||||||
|
</array>
|
||||||
|
<key>public.mime-type</key>
|
||||||
|
<string>application/vnd.garmin.jnx</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>com.garmin.gmap</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>https://sourceforge.net/projects/garmin-img/</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>Garmin Map Product 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.garmin.gmap</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>com.maptech.kap</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>http://libbsb.sourceforge.net/bsb_file_format.html</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>BSB Nautical Charts</string>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.image</string>
|
||||||
|
<string>public.data</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict>
|
||||||
|
<key>public.filename-extension</key>
|
||||||
|
<array>
|
||||||
|
<string>kap</string>
|
||||||
|
</array>
|
||||||
|
<key>public.mime-type</key>
|
||||||
|
<string>image/vnd.maptech.kap</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>com.oziexplorer3.map</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>https://www.oziexplorer3.com/eng/help/map_file_format.html</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>OziExplorer Map File</string>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.data</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict>
|
||||||
|
<key>public.filename-extension</key>
|
||||||
|
<array>
|
||||||
|
<string>map</string>
|
||||||
|
</array>
|
||||||
|
<key>public.mime-type</key>
|
||||||
|
<string>application/vnd.oziexplorer.map</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>com.mapbox.mbtiles</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>https://github.com/mapbox/mbtiles-spec</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>MBTiles Map File</string>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.data</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict>
|
||||||
|
<key>public.filename-extension</key>
|
||||||
|
<array>
|
||||||
|
<string>mbtiles</string>
|
||||||
|
</array>
|
||||||
|
<key>public.mime-type</key>
|
||||||
|
<string>application/vnd.mapbox.mbtiles</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>com.twonav.rmap</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>https://wiki.openstreetmap.org/wiki/TwoNav_RMAP</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>TwoNav Raster Map File</string>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.data</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict>
|
||||||
|
<key>public.filename-extension</key>
|
||||||
|
<array>
|
||||||
|
<string>rmap</string>
|
||||||
|
<string>rtmap</string>
|
||||||
|
</array>
|
||||||
|
<key>public.mime-type</key>
|
||||||
|
<string>application/vnd.twonav.rmap</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>net.trekbuddy.tba</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>https://github.com/kruhc/trekbuddy</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>TrekBuddy Atlas</string>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.data</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict>
|
||||||
|
<key>public.filename-extension</key>
|
||||||
|
<array>
|
||||||
|
<string>tba</string>
|
||||||
|
</array>
|
||||||
|
<key>public.mime-type</key>
|
||||||
|
<string>application/vnd.trekbuddy.tba</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>public.tiff</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>https://www.adobe.io/open/standards/TIFF.html</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>TIFF Image</string>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.image</string>
|
||||||
|
<string>public.data</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict>
|
||||||
|
<key>public.filename-extension</key>
|
||||||
|
<array>
|
||||||
|
<string>tiff</string>
|
||||||
|
<string>tif</string>
|
||||||
|
</array>
|
||||||
|
<key>public.mime-type</key>
|
||||||
|
<string>image/tiff</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
|
||||||
|
<key>UTExportedTypeDeclarations</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>org.gpxsee.map</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>http://www.gpxsee.org/map/1.4/</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>GPXSee Map Definition 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.gpxsee.map+xml</string>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
|
@ -18,13 +18,14 @@
|
|||||||
<li>User-definable online maps (OpenStreetMap/Google tiles, WMTS,
|
<li>User-definable online maps (OpenStreetMap/Google tiles, WMTS,
|
||||||
WMS, TMS, QuadTiles).</li>
|
WMS, TMS, QuadTiles).</li>
|
||||||
<li>Offline maps (MBTiles, OziExplorer maps, TrekBuddy maps/atlases,
|
<li>Offline maps (MBTiles, OziExplorer maps, TrekBuddy maps/atlases,
|
||||||
TwoNav RMaps, Garmin IMG & JNX, GeoTIFF images).</li>
|
TwoNav RMaps, Garmin IMG & JNX maps, GeoTIFF images,
|
||||||
|
BSB nautical charts, KMZ maps).</li>
|
||||||
<li>Elevation, speed, heart rate, cadence, power, temperature and
|
<li>Elevation, speed, heart rate, cadence, power, temperature and
|
||||||
gear ratio graphs.</li>
|
gear ratio graphs.</li>
|
||||||
<li>Support for multiple tracks in one view.</li>
|
<li>Support for multiple tracks in one view.</li>
|
||||||
<li>Support for POI files.</li>
|
<li>Support for POI files.</li>
|
||||||
<li>Support for DEM files (SRTM HGT).</li>
|
<li>Support for DEM files (SRTM HGT).</li>
|
||||||
<li>Print/export to PDF.</li>
|
<li>Print/export to PDF & PNG.</li>
|
||||||
<li>Full-screen mode.</li>
|
<li>Full-screen mode.</li>
|
||||||
<li>HiDPI/Retina displays & maps support.</li>
|
<li>HiDPI/Retina displays & maps support.</li>
|
||||||
</ul>
|
</ul>
|
||||||
@ -32,10 +33,10 @@
|
|||||||
|
|
||||||
<screenshots>
|
<screenshots>
|
||||||
<screenshot type="default">
|
<screenshot type="default">
|
||||||
<image>http://www.gpxsee.org/gallery/lin1.png</image>
|
<image>https://www.gpxsee.org/gallery/linux.png</image>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<screenshot>
|
<screenshot>
|
||||||
<image>http://www.gpxsee.org/gallery/lin2.png</image>
|
<image>https://www.gpxsee.org/gallery/poi2.png</image>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
</screenshots>
|
</screenshots>
|
||||||
|
|
||||||
@ -48,7 +49,7 @@
|
|||||||
<category>DataVisualization</category>
|
<category>DataVisualization</category>
|
||||||
</categories>
|
</categories>
|
||||||
|
|
||||||
<url type="homepage">http://www.gpxsee.org</url>
|
<url type="homepage">https://www.gpxsee.org</url>
|
||||||
|
|
||||||
<launchable type="desktop-id">gpxsee.desktop</launchable>
|
<launchable type="desktop-id">gpxsee.desktop</launchable>
|
||||||
|
|
||||||
@ -58,7 +59,7 @@
|
|||||||
|
|
||||||
<mimetypes>
|
<mimetypes>
|
||||||
<mimetype>application/gpx+xml</mimetype>
|
<mimetype>application/gpx+xml</mimetype>
|
||||||
<mimetype>application/tcx+xml</mimetype>
|
<mimetype>application/vnd.garmin.tcx+xml</mimetype>
|
||||||
<mimetype>application/vnd.ant.fit</mimetype>
|
<mimetype>application/vnd.ant.fit</mimetype>
|
||||||
<mimetype>application/vnd.google-earth.kml+xml</mimetype>
|
<mimetype>application/vnd.google-earth.kml+xml</mimetype>
|
||||||
<mimetype>application/vnd.fai.igc</mimetype>
|
<mimetype>application/vnd.fai.igc</mimetype>
|
||||||
@ -66,11 +67,25 @@
|
|||||||
<mimetype>application/vnd.oziexplorer.plt</mimetype>
|
<mimetype>application/vnd.oziexplorer.plt</mimetype>
|
||||||
<mimetype>application/vnd.oziexplorer.rte</mimetype>
|
<mimetype>application/vnd.oziexplorer.rte</mimetype>
|
||||||
<mimetype>application/vnd.oziexplorer.wpt</mimetype>
|
<mimetype>application/vnd.oziexplorer.wpt</mimetype>
|
||||||
<mimetype>application/loc+xml</mimetype>
|
<mimetype>application/vnd.groundspeak.loc+xml</mimetype>
|
||||||
<mimetype>application/slf+xml</mimetype>
|
<mimetype>application/vnd.sigma.slf+xml</mimetype>
|
||||||
<mimetype>application/geo+json</mimetype>
|
<mimetype>application/geo+json</mimetype>
|
||||||
<mimetype>application/vnd.naviter.seeyou.cup</mimetype>
|
<mimetype>application/vnd.naviter.seeyou.cup</mimetype>
|
||||||
<mimetype>application/vnd.garmin.gpi</mimetype>
|
<mimetype>application/vnd.garmin.gpi</mimetype>
|
||||||
<mimetype>application/sml+xml</mimetype>
|
<mimetype>application/vnd.suunto.sml+xml</mimetype>
|
||||||
|
<mimetype>image/jpeg</mimetype>
|
||||||
|
<mimetype>text/csv</mimetype>
|
||||||
|
<mimetype>application/vnd.garmin.img</mimetype>
|
||||||
|
<mimetype>application/vnd.garmin.jnx</mimetype>
|
||||||
|
<mimetype>application/vnd.garmin.gmap+xml</mimetype>
|
||||||
|
<mimetype>image/vnd.maptech.kap</mimetype>
|
||||||
|
<mimetype>application/vnd.oziexplorer.map</mimetype>
|
||||||
|
<mimetype>application/vnd.mapbox.mbtiles</mimetype>
|
||||||
|
<mimetype>application/vnd.twonav.rmap</mimetype>
|
||||||
|
<mimetype>application/vnd.trekbuddy.tba</mimetype>
|
||||||
|
<mimetype>application/vnd.gpxsee.map+xml</mimetype>
|
||||||
|
<mimetype>application/x-tar</mimetype>
|
||||||
|
<mimetype>image/tiff</mimetype>
|
||||||
|
<mimetype>application/vnd.google-earth.kmz</mimetype>
|
||||||
</mimetypes>
|
</mimetypes>
|
||||||
</component>
|
</component>
|
||||||
|
@ -1887,6 +1887,7 @@ CI1971 / Chatham Islands Map Grid,5518,4672,5517,9001,9807,4500,8801,-44,9110,88
|
|||||||
CI1979 / Chatham Islands Map Grid,5519,4673,5517,9001,9807,4500,8801,-44,9110,8802,-176.3,9110,8805,1,9201,8806,350000,9001,8807,650000,9001,,,,,,
|
CI1979 / Chatham Islands Map Grid,5519,4673,5517,9001,9807,4500,8801,-44,9110,8802,-176.3,9110,8805,1,9201,8806,350000,9001,8807,650000,9001,,,,,,
|
||||||
DHDN / 3-degree Gauss-Kruger zone 1,5520,4314,16261,9001,9807,4530,8801,0,9102,8802,3,9102,8805,1,9201,8806,1500000,9001,8807,0,9001,,,,,,
|
DHDN / 3-degree Gauss-Kruger zone 1,5520,4314,16261,9001,9807,4530,8801,0,9102,8802,3,9102,8805,1,9201,8806,1500000,9001,8807,0,9001,,,,,,
|
||||||
WGS 84 / Gabon TM 2011,5523,4326,5522,9001,9807,4499,8801,0,9102,8802,11.3,9110,8805,0.9996,9201,8806,1500000,9001,8807,5500000,9001,,,,,,
|
WGS 84 / Gabon TM 2011,5523,4326,5522,9001,9807,4499,8801,0,9102,8802,11.3,9110,8805,0.9996,9201,8806,1500000,9001,8807,5500000,9001,,,,,,
|
||||||
|
SAD69(96) / Brazil Polyconic,5530,5527,19941,9001,9818,4499,8801,0,9102,8802,-54,9102,8806,5000000,9001,8807,10000000,9001,,,,,,,,,
|
||||||
SAD69(96) / UTM zone 21S,5531,5527,16121,9001,9807,4400,8801,0,9102,8802,-57,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
|
SAD69(96) / UTM zone 21S,5531,5527,16121,9001,9807,4400,8801,0,9102,8802,-57,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
|
||||||
SAD69(96) / UTM zone 22S,5532,4618,16122,9001,9807,4400,8801,0,9102,8802,-51,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
|
SAD69(96) / UTM zone 22S,5532,4618,16122,9001,9807,4400,8801,0,9102,8802,-51,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
|
||||||
SAD69(96) / UTM zone 23S,5533,5527,16123,9001,9807,4400,8801,0,9102,8802,-45,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
|
SAD69(96) / UTM zone 23S,5533,5527,16123,9001,9807,4400,8801,0,9102,8802,-45,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
|
||||||
@ -1970,6 +1971,7 @@ SAD69(96) / UTM zone 18S,5875,5527,16118,9001,9807,4400,8801,0,9102,8802,-75,910
|
|||||||
SAD69(96) / UTM zone 19S,5876,5527,16119,9001,9807,4400,8801,0,9102,8802,-69,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
|
SAD69(96) / UTM zone 19S,5876,5527,16119,9001,9807,4400,8801,0,9102,8802,-69,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
|
||||||
SAD69(96) / UTM zone 20S,5877,5527,16120,9001,9807,4400,8801,0,9102,8802,-63,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
|
SAD69(96) / UTM zone 20S,5877,5527,16120,9001,9807,4400,8801,0,9102,8802,-63,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
|
||||||
Cadastre 1997 / UTM zone 38S,5879,4475,16138,9001,9807,4400,8801,0,9102,8802,45,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
|
Cadastre 1997 / UTM zone 38S,5879,4475,16138,9001,9807,4400,8801,0,9102,8802,45,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
|
||||||
|
SIRGAS 2000 / Brazil Polyconic,5880,4674,19941,9001,9818,4499,8801,0,9102,8802,-54,9102,8806,5000000,9001,8807,10000000,9001,,,,,,,,,
|
||||||
WGS 84 / EPSG Arctic Regional zone A1,5921,4326,5906,9001,9802,4400,8821,81.19020136,9110,8822,-111,9102,8823,85,9102,8824,77,9102,8826,0,9001,8827,0,9001,,,
|
WGS 84 / EPSG Arctic Regional zone A1,5921,4326,5906,9001,9802,4400,8821,81.19020136,9110,8822,-111,9102,8823,85,9102,8824,77,9102,8826,0,9001,8827,0,9001,,,
|
||||||
WGS 84 / EPSG Arctic Regional zone A2,5922,4326,5907,9001,9802,4400,8821,81.19020136,9110,8822,-39,9102,8823,85,9102,8824,77,9102,8826,0,9001,8827,0,9001,,,
|
WGS 84 / EPSG Arctic Regional zone A2,5922,4326,5907,9001,9802,4400,8821,81.19020136,9110,8822,-39,9102,8823,85,9102,8824,77,9102,8826,0,9001,8827,0,9001,,,
|
||||||
WGS 84 / EPSG Arctic Regional zone A3,5923,4326,5908,9001,9802,4400,8821,81.19020136,9110,8822,33,9102,8823,85,9102,8824,77,9102,8826,0,9001,8827,0,9001,,,
|
WGS 84 / EPSG Arctic Regional zone A3,5923,4326,5908,9001,9802,4400,8821,81.19020136,9110,8822,33,9102,8823,85,9102,8824,77,9102,8826,0,9001,8827,0,9001,,,
|
||||||
@ -3046,6 +3048,8 @@ Pulkovo 1942 / Gauss-Kruger 32N,28492,4284,16332,9001,9807,4530,8801,0,9102,8802
|
|||||||
Qatar 1974 / Qatar National Grid,28600,4285,19919,9001,9807,4400,8801,24.27,9110,8802,51.13,9110,8805,0.99999,9201,8806,200000,9001,8807,300000,9001,,,,,,
|
Qatar 1974 / Qatar National Grid,28600,4285,19919,9001,9807,4400,8801,24.27,9110,8802,51.13,9110,8805,0.99999,9201,8806,200000,9001,8807,300000,9001,,,,,,
|
||||||
Amersfoort / RD Old,28991,4289,19913,9001,9809,4499,8801,52.0922178,9110,8802,5.23155,9110,8805,0.9999079,9201,8806,0,9001,8807,0,9001,,,,,,
|
Amersfoort / RD Old,28991,4289,19913,9001,9809,4499,8801,52.0922178,9110,8802,5.23155,9110,8805,0.9999079,9201,8806,0,9001,8807,0,9001,,,,,,
|
||||||
Amersfoort / RD New,28992,4289,19914,9001,9809,4499,8801,52.0922178,9110,8802,5.23155,9110,8805,0.9999079,9201,8806,155000,9001,8807,463000,9001,,,,,,
|
Amersfoort / RD New,28992,4289,19914,9001,9809,4499,8801,52.0922178,9110,8802,5.23155,9110,8805,0.9999079,9201,8806,155000,9001,8807,463000,9001,,,,,,
|
||||||
|
SAD69 / Brazil Polyconic,29100,4291,19941,9001,9818,4499,8801,0,9102,8802,-54,9102,8806,5000000,9001,8807,10000000,9001,,,,,,,,,
|
||||||
|
SAD69 / Brazil Polyconic,29101,4618,19941,9001,9818,4499,8801,0,9102,8802,-54,9102,8806,5000000,9001,8807,10000000,9001,,,,,,,,,
|
||||||
SAD69 / UTM zone 18N,29118,4291,16018,9001,9807,4400,8801,0,9102,8802,-75,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,,
|
SAD69 / UTM zone 18N,29118,4291,16018,9001,9807,4400,8801,0,9102,8802,-75,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,,
|
||||||
SAD69 / UTM zone 19N,29119,4291,16019,9001,9807,4400,8801,0,9102,8802,-69,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,,
|
SAD69 / UTM zone 19N,29119,4291,16019,9001,9807,4400,8801,0,9102,8802,-69,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,,
|
||||||
SAD69 / UTM zone 20N,29120,4291,16020,9001,9807,4400,8801,0,9102,8802,-63,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,,
|
SAD69 / UTM zone 20N,29120,4291,16020,9001,9807,4400,8801,0,9102,8802,-63,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,,
|
||||||
|
Can't render this file because it is too large.
|
@ -15,4 +15,4 @@ Icon=gpxsee
|
|||||||
Terminal=false
|
Terminal=false
|
||||||
Type=Application
|
Type=Application
|
||||||
Categories=Graphics;Viewer;Education;Geography;Maps;Sports;Qt;
|
Categories=Graphics;Viewer;Education;Geography;Maps;Sports;Qt;
|
||||||
MimeType=application/gpx+xml;application/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/loc+xml;application/slf+xml;application/geo+json;application/vnd.naviter.seeyou.cup;application/vnd.garmin.gpi;application/sml+xml;
|
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;
|
||||||
|
107
pkg/gpxsee.nsi
@ -7,7 +7,7 @@
|
|||||||
; The name of the installer
|
; The name of the installer
|
||||||
Name "GPXSee"
|
Name "GPXSee"
|
||||||
; Program version
|
; Program version
|
||||||
!define VERSION "7.37"
|
!define VERSION "8.2"
|
||||||
|
|
||||||
; The file to write
|
; The file to write
|
||||||
OutFile "GPXSee-${VERSION}.exe"
|
OutFile "GPXSee-${VERSION}.exe"
|
||||||
@ -109,14 +109,6 @@ Section "GPXSee" SEC_APP
|
|||||||
|
|
||||||
; Associate file formats
|
; Associate file formats
|
||||||
DetailPrint "Associating file types..."
|
DetailPrint "Associating file types..."
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 8
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 9
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 10
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 11
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 12
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 Data" 13
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 14
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 15
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "wpt" "OziExplorer Waypoint File" 1
|
!insertmacro FILE_ASSOCIATION_ADD "wpt" "OziExplorer Waypoint File" 1
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "loc" "Geocaching.com Waypoint File" 2
|
!insertmacro FILE_ASSOCIATION_ADD "loc" "Geocaching.com Waypoint File" 2
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "slf" "Sigma Log File" 3
|
!insertmacro FILE_ASSOCIATION_ADD "slf" "Sigma Log File" 3
|
||||||
@ -124,6 +116,57 @@ Section "GPXSee" SEC_APP
|
|||||||
!insertmacro FILE_ASSOCIATION_ADD "cup" "SeeYou CUP File" 5
|
!insertmacro FILE_ASSOCIATION_ADD "cup" "SeeYou CUP File" 5
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "gpi" "Garmin POI File" 6
|
!insertmacro FILE_ASSOCIATION_ADD "gpi" "Garmin POI File" 6
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "sml" "Suunto Markup Language" 7
|
!insertmacro FILE_ASSOCIATION_ADD "sml" "Suunto Markup Language" 7
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "img" "Garmin IMG Map" 8
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "jnx" "Garmin JNX Map" 9
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "kap" "BSB Nautical Chart" 10
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 11
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "map" "OziExplorer Map File" 12
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "mbtiles" "MBTiles Map File" 13
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "rmap" "TwoNav Raster Map File" 14
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "tba" "TrekBuddy Atlas" 15
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 16
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 17
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "kmz" "KML geographic compressed data" 17
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 18
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 19
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 Data" 20
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 21
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 22
|
||||||
|
|
||||||
|
WriteRegStr HKCR "Applications\GPXSee.exe\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
|
||||||
|
WriteRegStr HKCR ".gpx\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".tcx\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".kml\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".fit\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".igc\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".nmea\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".plt\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".rte\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".wpt\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".loc\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".slf\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".geojson\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".cup\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".gpi\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".sml\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".csv\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".json\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".jpg\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".jpeg\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".img\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".jnx\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".kap\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".map\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".mbtiles\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".rmap\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".rtmap\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".tar\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".tba\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".tif\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".tiff\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".xml\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".kmz\OpenWithList" "GPXSee.exe" ""
|
||||||
|
|
||||||
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
|
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
|
||||||
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
@ -176,6 +219,7 @@ SectionEnd
|
|||||||
SectionGroup "Localization" SEC_LOCALIZATION
|
SectionGroup "Localization" SEC_LOCALIZATION
|
||||||
!insertmacro LOCALIZATION "Czech" "cs"
|
!insertmacro LOCALIZATION "Czech" "cs"
|
||||||
!insertmacro LOCALIZATION "Danish" "da"
|
!insertmacro LOCALIZATION "Danish" "da"
|
||||||
|
!insertmacro LOCALIZATION "Esperanto" "eo"
|
||||||
!insertmacro LOCALIZATION "Finnish" "fi"
|
!insertmacro LOCALIZATION "Finnish" "fi"
|
||||||
!insertmacro LOCALIZATION "French" "fr"
|
!insertmacro LOCALIZATION "French" "fr"
|
||||||
!insertmacro LOCALIZATION "German" "de"
|
!insertmacro LOCALIZATION "German" "de"
|
||||||
@ -210,7 +254,7 @@ Section "Uninstall"
|
|||||||
Delete "$SMPROGRAMS\$StartMenuFolder\*.*"
|
Delete "$SMPROGRAMS\$StartMenuFolder\*.*"
|
||||||
RMDir "$SMPROGRAMS\$StartMenuFolder"
|
RMDir "$SMPROGRAMS\$StartMenuFolder"
|
||||||
|
|
||||||
; Remove GPX file association
|
; Remove file associations
|
||||||
!insertmacro FILE_ASSOCIATION_REMOVE "gpx"
|
!insertmacro FILE_ASSOCIATION_REMOVE "gpx"
|
||||||
!insertmacro FILE_ASSOCIATION_REMOVE "tcx"
|
!insertmacro FILE_ASSOCIATION_REMOVE "tcx"
|
||||||
!insertmacro FILE_ASSOCIATION_REMOVE "kml"
|
!insertmacro FILE_ASSOCIATION_REMOVE "kml"
|
||||||
@ -226,6 +270,49 @@ Section "Uninstall"
|
|||||||
!insertmacro FILE_ASSOCIATION_REMOVE "cup"
|
!insertmacro FILE_ASSOCIATION_REMOVE "cup"
|
||||||
!insertmacro FILE_ASSOCIATION_REMOVE "gpi"
|
!insertmacro FILE_ASSOCIATION_REMOVE "gpi"
|
||||||
!insertmacro FILE_ASSOCIATION_REMOVE "sml"
|
!insertmacro FILE_ASSOCIATION_REMOVE "sml"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "img"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "jnx"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "kap"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "map"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "mbtiles"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "rmap"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "tba"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "kmz"
|
||||||
|
|
||||||
|
DeleteRegValue HKCR ".gpx\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".tcx\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".kml\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".fit\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".igc\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".nmea\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".plt\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".rte\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".wpt\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".loc\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".slf\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".geojson\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".cup\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".gpi\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".sml\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".csv\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".json\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".jpg\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".jpeg\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".img\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".jnx\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".kap\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".map\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".mbtiles\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".rmap\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".rtmap\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".tar\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".tba\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".tif\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".tiff\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".xml\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".kmz\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegKey HKCR "Applications\GPXSee.exe"
|
||||||
|
|
||||||
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
|
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
|
||||||
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
125
pkg/gpxsee.xml
@ -1,35 +1,41 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
|
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
|
||||||
|
|
||||||
|
<!-- Data files -->
|
||||||
|
|
||||||
<mime-type type="application/gpx+xml">
|
<mime-type type="application/gpx+xml">
|
||||||
<comment>GPS Exchange Format</comment>
|
<comment>GPS Exchange Format</comment>
|
||||||
<sub-class-of type="application/xml"/>
|
<sub-class-of type="application/xml"/>
|
||||||
<generic-icon name="application-xml"/>
|
<generic-icon name="application-xml"/>
|
||||||
|
<root-XML namespaceURI="http://www.topografix.com/GPX/1/0" localName="gpx"/>
|
||||||
|
<root-XML namespaceURI="http://www.topografix.com/GPX/1/1" localName="gpx"/>
|
||||||
<glob pattern="*.gpx"/>
|
<glob pattern="*.gpx"/>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
|
|
||||||
<mime-type type="application/tcx+xml">
|
<mime-type type="application/vnd.garmin.tcx+xml">
|
||||||
<comment>Training Center XML</comment>
|
<comment>Training Center XML</comment>
|
||||||
<sub-class-of type="application/xml"/>
|
<sub-class-of type="application/xml"/>
|
||||||
<generic-icon name="application-xml"/>
|
<generic-icon name="application-xml"/>
|
||||||
|
<root-XML namespaceURI="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" localName="TrainingCenterDatabase"/>
|
||||||
<glob pattern="*.tcx"/>
|
<glob pattern="*.tcx"/>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
|
|
||||||
<mime-type type="application/kml+xml">
|
<mime-type type="application/vnd.google-earth.kml+xml">
|
||||||
<comment>Keyhole Markup Language</comment>
|
<comment>Keyhole Markup Language</comment>
|
||||||
<sub-class-of type="application/xml"/>
|
<sub-class-of type="application/xml"/>
|
||||||
<generic-icon name="application-xml"/>
|
<generic-icon name="application-xml"/>
|
||||||
|
<root-XML namespaceURI="http://www.opengis.net/kml/2.2" localName="kml"/>
|
||||||
<glob pattern="*.kml"/>
|
<glob pattern="*.kml"/>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
|
|
||||||
<mime-type type="application/loc+xml">
|
<mime-type type="application/vnd.groundspeak.loc+xml">
|
||||||
<comment>Geocaching.com Waypoint File</comment>
|
<comment>Geocaching.com Waypoint File</comment>
|
||||||
<sub-class-of type="application/xml"/>
|
<sub-class-of type="application/xml"/>
|
||||||
<generic-icon name="application-xml"/>
|
<generic-icon name="application-xml"/>
|
||||||
<glob pattern="*.loc"/>
|
<glob pattern="*.loc"/>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
|
|
||||||
<mime-type type="application/slf+xml">
|
<mime-type type="application/vnd.sigma.slf+xml">
|
||||||
<comment>Sigma Log Format</comment>
|
<comment>Sigma Log Format</comment>
|
||||||
<sub-class-of type="application/xml"/>
|
<sub-class-of type="application/xml"/>
|
||||||
<generic-icon name="application-xml"/>
|
<generic-icon name="application-xml"/>
|
||||||
@ -40,6 +46,9 @@
|
|||||||
<comment>Flexible and Interoperable Data Transfer</comment>
|
<comment>Flexible and Interoperable Data Transfer</comment>
|
||||||
<sub-class-of type="application/octet-stream"/>
|
<sub-class-of type="application/octet-stream"/>
|
||||||
<generic-icon name="application-octet-stream"/>
|
<generic-icon name="application-octet-stream"/>
|
||||||
|
<magic>
|
||||||
|
<match type="string" offset="8" value=".FIT"/>
|
||||||
|
</magic>
|
||||||
<glob pattern="*.fit"/>
|
<glob pattern="*.fit"/>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
|
|
||||||
@ -61,6 +70,9 @@
|
|||||||
<comment>OziExplorer Track Point File</comment>
|
<comment>OziExplorer Track Point File</comment>
|
||||||
<sub-class-of type="text/plain"/>
|
<sub-class-of type="text/plain"/>
|
||||||
<generic-icon name="text-plain"/>
|
<generic-icon name="text-plain"/>
|
||||||
|
<magic>
|
||||||
|
<match type="string" offset="0" value="OziExplorer Track Point File"/>
|
||||||
|
</magic>
|
||||||
<glob pattern="*.plt"/>
|
<glob pattern="*.plt"/>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
|
|
||||||
@ -68,6 +80,9 @@
|
|||||||
<comment>OziExplorer Route File</comment>
|
<comment>OziExplorer Route File</comment>
|
||||||
<sub-class-of type="text/plain"/>
|
<sub-class-of type="text/plain"/>
|
||||||
<generic-icon name="text-plain"/>
|
<generic-icon name="text-plain"/>
|
||||||
|
<magic>
|
||||||
|
<match type="string" offset="0" value="OziExplorer Route File"/>
|
||||||
|
</magic>
|
||||||
<glob pattern="*.rte"/>
|
<glob pattern="*.rte"/>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
|
|
||||||
@ -75,6 +90,9 @@
|
|||||||
<comment>OziExplorer Waypoint File</comment>
|
<comment>OziExplorer Waypoint File</comment>
|
||||||
<sub-class-of type="text/plain"/>
|
<sub-class-of type="text/plain"/>
|
||||||
<generic-icon name="text-plain"/>
|
<generic-icon name="text-plain"/>
|
||||||
|
<magic>
|
||||||
|
<match type="string" offset="0" value="OziExplorer Waypoint File"/>
|
||||||
|
</magic>
|
||||||
<glob pattern="*.wpt"/>
|
<glob pattern="*.wpt"/>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
|
|
||||||
@ -96,13 +114,110 @@
|
|||||||
<comment>Garmin POI File</comment>
|
<comment>Garmin POI File</comment>
|
||||||
<sub-class-of type="application/octet-stream"/>
|
<sub-class-of type="application/octet-stream"/>
|
||||||
<generic-icon name="application/octet-stream"/>
|
<generic-icon name="application/octet-stream"/>
|
||||||
|
<magic>
|
||||||
|
<match type="string" offset="8" value="GRMREC"/>
|
||||||
|
</magic>
|
||||||
<glob pattern="*.gpi"/>
|
<glob pattern="*.gpi"/>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
|
|
||||||
<mime-type type="application/sml+xml">
|
<mime-type type="application/vnd.suunto.sml+xml">
|
||||||
<comment>Suunto Markup Language</comment>
|
<comment>Suunto Markup Language</comment>
|
||||||
<sub-class-of type="application/xml"/>
|
<sub-class-of type="application/xml"/>
|
||||||
<generic-icon name="application-xml"/>
|
<generic-icon name="application-xml"/>
|
||||||
|
<root-XML namespaceURI="http://www.suunto.com/schemas/sml" localName="sml"/>
|
||||||
<glob pattern="*.sml"/>
|
<glob pattern="*.sml"/>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Maps -->
|
||||||
|
|
||||||
|
<mime-type type="application/vnd.garmin.img">
|
||||||
|
<comment>Garmin IMG Map</comment>
|
||||||
|
<sub-class-of type="application/octet-stream"/>
|
||||||
|
<generic-icon name="application-octet-stream"/>
|
||||||
|
<magic>
|
||||||
|
<match type="string" offset="16" value="DSKIMG"/>
|
||||||
|
</magic>
|
||||||
|
<glob pattern="*.img"/>
|
||||||
|
</mime-type>
|
||||||
|
|
||||||
|
<mime-type type="application/vnd.garmin.jnx">
|
||||||
|
<comment>Garmin JNX Map</comment>
|
||||||
|
<sub-class-of type="application/octet-stream"/>
|
||||||
|
<generic-icon name="application-octet-stream"/>
|
||||||
|
<glob pattern="*.jnx"/>
|
||||||
|
</mime-type>
|
||||||
|
|
||||||
|
<mime-type type="application/vnd.garmin.gmap+xml">
|
||||||
|
<comment>Garmin Map Product File</comment>
|
||||||
|
<sub-class-of type="application/xml"/>
|
||||||
|
<generic-icon name="application-xml"/>
|
||||||
|
<root-XML namespaceURI="http://www.garmin.com/xmlschemas/MapProduct/v1" localName="MapProduct"/>
|
||||||
|
<root-XML namespaceURI="http://www.garmin.com/xmlschemas/MapProduct/v2" localName="MapProduct"/>
|
||||||
|
<glob pattern="*.xml"/>
|
||||||
|
</mime-type>
|
||||||
|
|
||||||
|
<mime-type type="image/vnd.maptech.kap">
|
||||||
|
<comment>BSB Nautical Chart</comment>
|
||||||
|
<generic-icon name="image-x-generic"/>
|
||||||
|
<glob pattern="*.kap"/>
|
||||||
|
</mime-type>
|
||||||
|
|
||||||
|
<mime-type type="application/vnd.oziexplorer.map">
|
||||||
|
<comment>OziExplorer Map File</comment>
|
||||||
|
<sub-class-of type="text/plain"/>
|
||||||
|
<generic-icon name="text-plain"/>
|
||||||
|
<magic>
|
||||||
|
<match type="string" offset="0" value="OziExplorer Map Data File"/>
|
||||||
|
</magic>
|
||||||
|
<glob pattern="*.map"/>
|
||||||
|
</mime-type>
|
||||||
|
|
||||||
|
<mime-type type="application/vnd.mapbox.mbtiles">
|
||||||
|
<comment>MBTiles Map File</comment>
|
||||||
|
<sub-class-of type="application/vnd.sqlite3"/>
|
||||||
|
<generic-icon name="application/octet-stream"/>
|
||||||
|
<glob pattern="*.mbtiles"/>
|
||||||
|
</mime-type>
|
||||||
|
|
||||||
|
<mime-type type="application/vnd.twonav.rmap">
|
||||||
|
<comment>TwoNav Raster Map File</comment>
|
||||||
|
<sub-class-of type="application/octet-stream"/>
|
||||||
|
<generic-icon name="application/octet-stream"/>
|
||||||
|
<magic>
|
||||||
|
<match type="string" offset="0" value="CompeGPSRasterImage"/>
|
||||||
|
</magic>
|
||||||
|
<glob pattern="*.rmap"/>
|
||||||
|
<glob pattern="*.rtmap"/>
|
||||||
|
</mime-type>
|
||||||
|
|
||||||
|
<mime-type type="application/vnd.trekbuddy.tba">
|
||||||
|
<comment>TrekBuddy Atlas</comment>
|
||||||
|
<sub-class-of type="text/plain"/>
|
||||||
|
<generic-icon name="text-plain"/>
|
||||||
|
<magic>
|
||||||
|
<match type="string" offset="0" value="Atlas 1.0"/>
|
||||||
|
</magic>
|
||||||
|
<glob pattern="*.tba"/>
|
||||||
|
</mime-type>
|
||||||
|
|
||||||
|
<mime-type type="application/vnd.gpxsee.map+xml">
|
||||||
|
<comment>GPXSee Map Definition File</comment>
|
||||||
|
<sub-class-of type="application/xml"/>
|
||||||
|
<generic-icon name="application-xml"/>
|
||||||
|
<root-XML namespaceURI="http://www.gpxsee.org/map/1.0" localName="map"/>
|
||||||
|
<root-XML namespaceURI="http://www.gpxsee.org/map/1.1" localName="map"/>
|
||||||
|
<root-XML namespaceURI="http://www.gpxsee.org/map/1.2" localName="map"/>
|
||||||
|
<root-XML namespaceURI="http://www.gpxsee.org/map/1.3" localName="map"/>
|
||||||
|
<root-XML namespaceURI="http://www.gpxsee.org/map/1.4" localName="map"/>
|
||||||
|
<glob pattern="*.xml"/>
|
||||||
|
</mime-type>
|
||||||
|
|
||||||
|
<mime-type type="application/vnd.google-earth.kmz">
|
||||||
|
<comment>KML geographic compressed data</comment>
|
||||||
|
<sub-class-of type="application/zip"/>
|
||||||
|
<generic-icon name="application/zip"/>
|
||||||
|
<glob pattern="*.kmz"/>
|
||||||
|
</mime-type>
|
||||||
|
|
||||||
</mime-info>
|
</mime-info>
|
||||||
|
123
pkg/gpxsee64.nsi
@ -7,7 +7,7 @@
|
|||||||
; The name of the installer
|
; The name of the installer
|
||||||
Name "GPXSee"
|
Name "GPXSee"
|
||||||
; Program version
|
; Program version
|
||||||
!define VERSION "7.37"
|
!define VERSION "8.2"
|
||||||
|
|
||||||
; The file to write
|
; The file to write
|
||||||
OutFile "GPXSee-${VERSION}_x64.exe"
|
OutFile "GPXSee-${VERSION}_x64.exe"
|
||||||
@ -116,14 +116,6 @@ Section "GPXSee" SEC_APP
|
|||||||
|
|
||||||
; Associate file formats
|
; Associate file formats
|
||||||
DetailPrint "Associating file types..."
|
DetailPrint "Associating file types..."
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 8
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 9
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 10
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 11
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 12
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 Data" 13
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 14
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 15
|
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "wpt" "OziExplorer Waypoint File" 1
|
!insertmacro FILE_ASSOCIATION_ADD "wpt" "OziExplorer Waypoint File" 1
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "loc" "Geocaching.com Waypoint File" 2
|
!insertmacro FILE_ASSOCIATION_ADD "loc" "Geocaching.com Waypoint File" 2
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "slf" "Sigma Log File" 3
|
!insertmacro FILE_ASSOCIATION_ADD "slf" "Sigma Log File" 3
|
||||||
@ -131,6 +123,57 @@ Section "GPXSee" SEC_APP
|
|||||||
!insertmacro FILE_ASSOCIATION_ADD "cup" "SeeYou CUP File" 5
|
!insertmacro FILE_ASSOCIATION_ADD "cup" "SeeYou CUP File" 5
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "gpi" "Garmin POI File" 6
|
!insertmacro FILE_ASSOCIATION_ADD "gpi" "Garmin POI File" 6
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "sml" "Suunto Markup Language" 7
|
!insertmacro FILE_ASSOCIATION_ADD "sml" "Suunto Markup Language" 7
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "img" "Garmin IMG Map" 8
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "jnx" "Garmin JNX Map" 9
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "kap" "BSB Nautical Chart" 10
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 11
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "map" "OziExplorer Map File" 12
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "mbtiles" "MBTiles Map File" 13
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "rmap" "TwoNav Raster Map File" 14
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "tba" "TrekBuddy Atlas" 15
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 16
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 17
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "kmz" "KML geographic compressed data" 17
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 18
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 19
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 Data" 20
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 21
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 22
|
||||||
|
|
||||||
|
WriteRegStr HKCR "Applications\GPXSee.exe\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
|
||||||
|
WriteRegStr HKCR ".gpx\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".tcx\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".kml\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".fit\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".igc\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".nmea\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".plt\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".rte\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".wpt\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".loc\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".slf\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".geojson\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".cup\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".gpi\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".sml\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".csv\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".json\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".jpg\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".jpeg\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".img\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".jnx\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".kap\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".map\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".mbtiles\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".rmap\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".rtmap\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".tar\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".tba\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".tif\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".tiff\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".xml\OpenWithList" "GPXSee.exe" ""
|
||||||
|
WriteRegStr HKCR ".kmz\OpenWithList" "GPXSee.exe" ""
|
||||||
|
|
||||||
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
|
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
|
||||||
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
@ -139,6 +182,17 @@ Section "QT framework" SEC_QT
|
|||||||
|
|
||||||
SectionIn RO
|
SectionIn RO
|
||||||
|
|
||||||
|
!ifdef QT6
|
||||||
|
File "Qt6Concurrent.dll"
|
||||||
|
File "Qt6Core.dll"
|
||||||
|
File "Qt6Gui.dll"
|
||||||
|
File "Qt6Network.dll"
|
||||||
|
File "Qt6OpenGL.dll"
|
||||||
|
File "Qt6OpenGLWidgets.dll"
|
||||||
|
File "Qt6PrintSupport.dll"
|
||||||
|
File "Qt6Sql.dll"
|
||||||
|
File "Qt6Widgets.dll"
|
||||||
|
!else
|
||||||
File "Qt5Core.dll"
|
File "Qt5Core.dll"
|
||||||
File "Qt5Gui.dll"
|
File "Qt5Gui.dll"
|
||||||
File "Qt5Widgets.dll"
|
File "Qt5Widgets.dll"
|
||||||
@ -146,9 +200,10 @@ Section "QT framework" SEC_QT
|
|||||||
File "Qt5Network.dll"
|
File "Qt5Network.dll"
|
||||||
File "Qt5Sql.dll"
|
File "Qt5Sql.dll"
|
||||||
File "Qt5Concurrent.dll"
|
File "Qt5Concurrent.dll"
|
||||||
|
File /r "printsupport"
|
||||||
|
!endif
|
||||||
File /r "platforms"
|
File /r "platforms"
|
||||||
File /r "imageformats"
|
File /r "imageformats"
|
||||||
File /r "printsupport"
|
|
||||||
File /r "styles"
|
File /r "styles"
|
||||||
File /r "sqldrivers"
|
File /r "sqldrivers"
|
||||||
|
|
||||||
@ -172,6 +227,7 @@ Section "OpenSSL" SEC_OPENSSL
|
|||||||
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
|
!ifndef QT6
|
||||||
Section "ANGLE" SEC_ANGLE
|
Section "ANGLE" SEC_ANGLE
|
||||||
|
|
||||||
File "libGLESv2.dll"
|
File "libGLESv2.dll"
|
||||||
@ -179,10 +235,12 @@ Section "ANGLE" SEC_ANGLE
|
|||||||
File "D3DCompiler_47.dll"
|
File "D3DCompiler_47.dll"
|
||||||
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
!endif
|
||||||
|
|
||||||
SectionGroup "Localization" SEC_LOCALIZATION
|
SectionGroup "Localization" SEC_LOCALIZATION
|
||||||
!insertmacro LOCALIZATION "Czech" "cs"
|
!insertmacro LOCALIZATION "Czech" "cs"
|
||||||
!insertmacro LOCALIZATION "Danish" "da"
|
!insertmacro LOCALIZATION "Danish" "da"
|
||||||
|
!insertmacro LOCALIZATION "Esperanto" "eo"
|
||||||
!insertmacro LOCALIZATION "Finnish" "fi"
|
!insertmacro LOCALIZATION "Finnish" "fi"
|
||||||
!insertmacro LOCALIZATION "French" "fr"
|
!insertmacro LOCALIZATION "French" "fr"
|
||||||
!insertmacro LOCALIZATION "German" "de"
|
!insertmacro LOCALIZATION "German" "de"
|
||||||
@ -218,7 +276,7 @@ Section "Uninstall"
|
|||||||
Delete "$SMPROGRAMS\$StartMenuFolder\*.*"
|
Delete "$SMPROGRAMS\$StartMenuFolder\*.*"
|
||||||
RMDir "$SMPROGRAMS\$StartMenuFolder"
|
RMDir "$SMPROGRAMS\$StartMenuFolder"
|
||||||
|
|
||||||
; Remove File associations
|
; Remove file associations
|
||||||
!insertmacro FILE_ASSOCIATION_REMOVE "gpx"
|
!insertmacro FILE_ASSOCIATION_REMOVE "gpx"
|
||||||
!insertmacro FILE_ASSOCIATION_REMOVE "tcx"
|
!insertmacro FILE_ASSOCIATION_REMOVE "tcx"
|
||||||
!insertmacro FILE_ASSOCIATION_REMOVE "kml"
|
!insertmacro FILE_ASSOCIATION_REMOVE "kml"
|
||||||
@ -234,6 +292,49 @@ Section "Uninstall"
|
|||||||
!insertmacro FILE_ASSOCIATION_REMOVE "cup"
|
!insertmacro FILE_ASSOCIATION_REMOVE "cup"
|
||||||
!insertmacro FILE_ASSOCIATION_REMOVE "gpi"
|
!insertmacro FILE_ASSOCIATION_REMOVE "gpi"
|
||||||
!insertmacro FILE_ASSOCIATION_REMOVE "sml"
|
!insertmacro FILE_ASSOCIATION_REMOVE "sml"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "img"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "jnx"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "kap"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "map"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "mbtiles"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "rmap"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "tba"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "kmz"
|
||||||
|
|
||||||
|
DeleteRegValue HKCR ".gpx\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".tcx\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".kml\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".fit\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".igc\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".nmea\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".plt\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".rte\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".wpt\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".loc\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".slf\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".geojson\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".cup\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".gpi\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".sml\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".csv\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".json\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".jpg\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".jpeg\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".img\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".jnx\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".kap\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".map\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".mbtiles\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".rmap\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".rtmap\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".tar\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".tba\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".tif\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".tiff\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".xml\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegValue HKCR ".kmz\OpenWithList" "GPXSee.exe"
|
||||||
|
DeleteRegKey HKCR "Applications\GPXSee.exe"
|
||||||
|
|
||||||
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
|
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
|
||||||
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include <QNetworkAccessManager>
|
#include <QNetworkAccessManager>
|
||||||
#include <QLibraryInfo>
|
#include <QLibraryInfo>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
|
#include <QSurfaceFormat>
|
||||||
#include "common/programpaths.h"
|
#include "common/programpaths.h"
|
||||||
#include "common/config.h"
|
#include "common/config.h"
|
||||||
#include "map/downloader.h"
|
#include "map/downloader.h"
|
||||||
@ -13,9 +14,9 @@
|
|||||||
#include "map/gcs.h"
|
#include "map/gcs.h"
|
||||||
#include "map/pcs.h"
|
#include "map/pcs.h"
|
||||||
#include "data/dem.h"
|
#include "data/dem.h"
|
||||||
#include "opengl.h"
|
|
||||||
#include "gui.h"
|
#include "gui.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
|
#include "mapaction.h"
|
||||||
#include "app.h"
|
#include "app.h"
|
||||||
|
|
||||||
|
|
||||||
@ -29,18 +30,18 @@ App::App(int &argc, char **argv) : QApplication(argc, argv)
|
|||||||
setApplicationVersion(APP_VERSION);
|
setApplicationVersion(APP_VERSION);
|
||||||
|
|
||||||
QTranslator *gpxsee = new QTranslator(this);
|
QTranslator *gpxsee = new QTranslator(this);
|
||||||
gpxsee->load(QLocale::system(), "gpxsee", "_",
|
if (gpxsee->load(QLocale::system(), "gpxsee", "_",
|
||||||
ProgramPaths::translationsDir());
|
ProgramPaths::translationsDir()))
|
||||||
installTranslator(gpxsee);
|
installTranslator(gpxsee);
|
||||||
|
|
||||||
QTranslator *qt = new QTranslator(this);
|
QTranslator *qt = new QTranslator(this);
|
||||||
#if defined(Q_OS_WIN32) || defined(Q_OS_MAC)
|
#if defined(Q_OS_WIN32) || defined(Q_OS_MAC)
|
||||||
qt->load(QLocale::system(), "qt", "_", ProgramPaths::translationsDir());
|
if (qt->load(QLocale::system(), "qt", "_", ProgramPaths::translationsDir()))
|
||||||
#else // Q_OS_WIN32 || Q_OS_MAC
|
#else // Q_OS_WIN32 || Q_OS_MAC
|
||||||
qt->load(QLocale::system(), "qt", "_", QLibraryInfo::location(
|
if (qt->load(QLocale::system(), "qt", "_", QLibraryInfo::location(
|
||||||
QLibraryInfo::TranslationsPath));
|
QLibraryInfo::TranslationsPath)))
|
||||||
#endif // Q_OS_WIN32 || Q_OS_MAC
|
#endif // Q_OS_WIN32 || Q_OS_MAC
|
||||||
installTranslator(qt);
|
installTranslator(qt);
|
||||||
|
|
||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
setAttribute(Qt::AA_DontShowIconsInMenus);
|
setAttribute(Qt::AA_DontShowIconsInMenus);
|
||||||
@ -51,17 +52,18 @@ App::App(int &argc, char **argv) : QApplication(argc, argv)
|
|||||||
"QThreadStorage: Thread X exited after QThreadStorage Y destroyed" */
|
"QThreadStorage: Thread X exited after QThreadStorage Y destroyed" */
|
||||||
Downloader::setNetworkManager(new QNetworkAccessManager(this));
|
Downloader::setNetworkManager(new QNetworkAccessManager(this));
|
||||||
DEM::setDir(ProgramPaths::demDir());
|
DEM::setDir(ProgramPaths::demDir());
|
||||||
OPENGL_SET_FORMAT(4, 8);
|
QSurfaceFormat fmt;
|
||||||
|
fmt.setStencilBufferSize(8);
|
||||||
|
fmt.setSamples(4);
|
||||||
|
QSurfaceFormat::setDefaultFormat(fmt);
|
||||||
|
|
||||||
loadDatums();
|
loadDatums();
|
||||||
loadPCSs();
|
loadPCSs();
|
||||||
|
|
||||||
QSettings settings(qApp->applicationName(), qApp->applicationName());
|
QSettings settings(qApp->applicationName(), qApp->applicationName());
|
||||||
settings.beginGroup(OPTIONS_SETTINGS_GROUP);
|
settings.beginGroup(OPTIONS_SETTINGS_GROUP);
|
||||||
#ifdef ENABLE_HTTP2
|
|
||||||
Downloader::enableHTTP2(settings.value(ENABLE_HTTP2_SETTING,
|
Downloader::enableHTTP2(settings.value(ENABLE_HTTP2_SETTING,
|
||||||
ENABLE_HTTP2_DEFAULT).toBool());
|
ENABLE_HTTP2_DEFAULT).toBool());
|
||||||
#endif // ENABLE_HTTP2
|
|
||||||
Downloader::setTimeout(settings.value(CONNECTION_TIMEOUT_SETTING,
|
Downloader::setTimeout(settings.value(CONNECTION_TIMEOUT_SETTING,
|
||||||
CONNECTION_TIMEOUT_DEFAULT).toInt());
|
CONNECTION_TIMEOUT_DEFAULT).toInt());
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
@ -76,11 +78,25 @@ App::~App()
|
|||||||
|
|
||||||
int App::run()
|
int App::run()
|
||||||
{
|
{
|
||||||
|
MapAction *lastReady = 0;
|
||||||
|
QStringList args(arguments());
|
||||||
|
|
||||||
_gui->show();
|
_gui->show();
|
||||||
|
|
||||||
QStringList args(arguments());
|
for (int i = 1; i < args.count(); i++) {
|
||||||
for (int i = 1; i < args.count(); i++)
|
if (!_gui->openFile(args.at(i), true)) {
|
||||||
_gui->openFile(args.at(i));
|
MapAction *a;
|
||||||
|
if (!_gui->loadMap(args.at(i), a, true))
|
||||||
|
_gui->openFile(args.at(i), false);
|
||||||
|
else {
|
||||||
|
if (a)
|
||||||
|
lastReady = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastReady)
|
||||||
|
lastReady->trigger();
|
||||||
|
|
||||||
return exec();
|
return exec();
|
||||||
}
|
}
|
||||||
@ -89,7 +105,18 @@ bool App::event(QEvent *event)
|
|||||||
{
|
{
|
||||||
if (event->type() == QEvent::FileOpen) {
|
if (event->type() == QEvent::FileOpen) {
|
||||||
QFileOpenEvent *e = static_cast<QFileOpenEvent *>(event);
|
QFileOpenEvent *e = static_cast<QFileOpenEvent *>(event);
|
||||||
return _gui->openFile(e->file());
|
|
||||||
|
if (!_gui->openFile(e->file(), true)) {
|
||||||
|
MapAction *a;
|
||||||
|
if (!_gui->loadMap(e->file(), a, true))
|
||||||
|
return _gui->openFile(e->file(), false);
|
||||||
|
else {
|
||||||
|
if (a)
|
||||||
|
a->trigger();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return QApplication::event(event);
|
return QApplication::event(event);
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <QGraphicsSceneMouseEvent>
|
#include <QGraphicsSceneMouseEvent>
|
||||||
#include "map/map.h"
|
#include "map/map.h"
|
||||||
#include "popup.h"
|
#include "popup.h"
|
||||||
|
#include "tooltip.h"
|
||||||
#include "areaitem.h"
|
#include "areaitem.h"
|
||||||
|
|
||||||
|
|
||||||
@ -22,7 +23,7 @@ QString AreaItem::info() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
AreaItem::AreaItem(const Area &area, Map *map, GraphicsItem *parent)
|
AreaItem::AreaItem(const Area &area, Map *map, GraphicsItem *parent)
|
||||||
: GraphicsItem(parent), _area(area)
|
: PlaneItem(parent), _area(area)
|
||||||
{
|
{
|
||||||
_map = map;
|
_map = map;
|
||||||
_digitalZoom = 0;
|
_digitalZoom = 0;
|
||||||
@ -158,7 +159,6 @@ void AreaItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
|
|||||||
Q_UNUSED(event);
|
Q_UNUSED(event);
|
||||||
|
|
||||||
_pen.setWidthF((_width + 1) * pow(2, -_digitalZoom));
|
_pen.setWidthF((_width + 1) * pow(2, -_digitalZoom));
|
||||||
setZValue(zValue() + 1.0);
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,12 +167,5 @@ void AreaItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
|
|||||||
Q_UNUSED(event);
|
Q_UNUSED(event);
|
||||||
|
|
||||||
_pen.setWidthF(_width * pow(2, -_digitalZoom));
|
_pen.setWidthF(_width * pow(2, -_digitalZoom));
|
||||||
setZValue(zValue() - 1.0);
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AreaItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
|
|
||||||
{
|
|
||||||
Popup::show(event->screenPos(), info(), event->widget());
|
|
||||||
QGraphicsItem::mousePressEvent(event);
|
|
||||||
}
|
|
||||||
|
@ -2,12 +2,9 @@
|
|||||||
#define AREAITEM_H
|
#define AREAITEM_H
|
||||||
|
|
||||||
#include "data/area.h"
|
#include "data/area.h"
|
||||||
#include "graphicsscene.h"
|
#include "planeitem.h"
|
||||||
#include "tooltip.h"
|
|
||||||
|
|
||||||
class Map;
|
class AreaItem : public PlaneItem
|
||||||
|
|
||||||
class AreaItem : public GraphicsItem
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AreaItem(const Area &area, Map *map, GraphicsItem *parent = 0);
|
AreaItem(const Area &area, Map *map, GraphicsItem *parent = 0);
|
||||||
@ -19,6 +16,7 @@ public:
|
|||||||
|
|
||||||
const Area &area() const {return _area;}
|
const Area &area() const {return _area;}
|
||||||
|
|
||||||
|
RectC bounds() const {return _area.boundingRect();}
|
||||||
void setMap(Map *map);
|
void setMap(Map *map);
|
||||||
|
|
||||||
void setColor(const QColor &color);
|
void setColor(const QColor &color);
|
||||||
@ -27,17 +25,15 @@ public:
|
|||||||
void setStyle(Qt::PenStyle style);
|
void setStyle(Qt::PenStyle style);
|
||||||
void setDigitalZoom(int zoom);
|
void setDigitalZoom(int zoom);
|
||||||
|
|
||||||
virtual QString info() const;
|
QString info() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
|
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
|
||||||
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
|
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
|
||||||
void mousePressEvent(QGraphicsSceneMouseEvent *event);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QPainterPath painterPath(const Polygon &polygon);
|
QPainterPath painterPath(const Polygon &polygon);
|
||||||
void updatePainterPath();
|
void updatePainterPath();
|
||||||
ToolTip toolTip() const;
|
|
||||||
|
|
||||||
Area _area;
|
Area _area;
|
||||||
Map *_map;
|
Map *_map;
|
||||||
|
@ -29,8 +29,8 @@ private:
|
|||||||
|
|
||||||
Ticks::Ticks(double minValue, double maxValue, int maxCount)
|
Ticks::Ticks(double minValue, double maxValue, int maxCount)
|
||||||
{
|
{
|
||||||
double range = niceNum(maxValue - minValue, false);
|
double range = Util::niceNum(maxValue - minValue, false);
|
||||||
_d = niceNum(range / maxCount, false);
|
_d = Util::niceNum(range / maxCount, false);
|
||||||
_min = ceil(minValue / _d) * _d;
|
_min = ceil(minValue / _d) * _d;
|
||||||
_max = floor(maxValue / _d) * _d;
|
_max = floor(maxValue / _d) * _d;
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,8 @@ void ColorBox::mousePressEvent(QMouseEvent *event)
|
|||||||
if (event->button() != Qt::LeftButton)
|
if (event->button() != Qt::LeftButton)
|
||||||
return;
|
return;
|
||||||
QColorDialog::ColorDialogOptions options = _alpha
|
QColorDialog::ColorDialogOptions options = _alpha
|
||||||
? QColorDialog::ShowAlphaChannel : (QColorDialog::ColorDialogOptions)0;
|
? QColorDialog::ColorDialogOptions(QColorDialog::ShowAlphaChannel)
|
||||||
|
: QColorDialog::ColorDialogOptions();
|
||||||
QColor color = QColorDialog::getColor(_color, this, QString(), options);
|
QColor color = QColorDialog::getColor(_color, this, QString(), options);
|
||||||
if (color.isValid()) {
|
if (color.isValid()) {
|
||||||
_color = color;
|
_color = color;
|
||||||
|
@ -1,42 +0,0 @@
|
|||||||
#ifndef CPUARCH_H
|
|
||||||
#define CPUARCH_H
|
|
||||||
|
|
||||||
#include <QtGlobal>
|
|
||||||
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 0)
|
|
||||||
|
|
||||||
#if defined(__arm64__)
|
|
||||||
#define CPU_ARCH_STR "arm64"
|
|
||||||
#elif defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM)
|
|
||||||
#define CPU_ARCH_STR "arm"
|
|
||||||
#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) \
|
|
||||||
|| defined(_M_X64)
|
|
||||||
#define CPU_ARCH_STR "x86_64"
|
|
||||||
#elif defined(__i386) || defined(__i386__) || defined(_M_IX86)
|
|
||||||
#define CPU_ARCH_STR "i386"
|
|
||||||
#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
|
|
||||||
#define CPU_ARCH_STR "ia64"
|
|
||||||
#elif defined(_MIPS_ARCH_MIPS64) || defined(__mips64)
|
|
||||||
#define CPU_ARCH_STR "mips64"
|
|
||||||
#elif defined(__mips) || defined(__mips__) || defined(_M_MRX000)
|
|
||||||
#define CPU_ARCH_STR "mips"
|
|
||||||
#elif defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__)
|
|
||||||
#define CPU_ARCH_STR "power64"
|
|
||||||
#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \
|
|
||||||
|| defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \
|
|
||||||
|| defined(_M_MPPC) || defined(_M_PPC)
|
|
||||||
#define CPU_ARCH_STR "power"
|
|
||||||
#else
|
|
||||||
#define CPU_ARCH_STR "unknown"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CPU_ARCH QString(CPU_ARCH_STR)
|
|
||||||
|
|
||||||
#else // QT_VERSION < 5.4
|
|
||||||
|
|
||||||
#include <QSysInfo>
|
|
||||||
#define CPU_ARCH QSysInfo::buildCpuArchitecture()
|
|
||||||
|
|
||||||
#endif // QT_VERSION < 5.4
|
|
||||||
|
|
||||||
#endif // CPUARCH_H
|
|
@ -24,7 +24,7 @@ FileSelectWidget::FileSelectWidget(QWidget *parent) : QWidget(parent)
|
|||||||
connect(_button, SIGNAL(clicked()), this, SLOT(browse()));
|
connect(_button, SIGNAL(clicked()), this, SLOT(browse()));
|
||||||
|
|
||||||
QHBoxLayout *layout = new QHBoxLayout();
|
QHBoxLayout *layout = new QHBoxLayout();
|
||||||
layout->setMargin(0);
|
layout->setContentsMargins(QMargins());
|
||||||
layout->addWidget(_edit);
|
layout->addWidget(_edit);
|
||||||
layout->addWidget(_button);
|
layout->addWidget(_button);
|
||||||
setLayout(layout);
|
setLayout(layout);
|
||||||
|
@ -85,7 +85,7 @@ const GraphSegment *GraphItem::segment(qreal x, GraphType type) const
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
qreal GraphItem::yAtX(qreal x)
|
qreal GraphItem::yAtX(qreal x) const
|
||||||
{
|
{
|
||||||
const GraphSegment *seg = segment(x, _type);
|
const GraphSegment *seg = segment(x, _type);
|
||||||
if (!seg)
|
if (!seg)
|
||||||
@ -106,7 +106,7 @@ qreal GraphItem::yAtX(qreal x)
|
|||||||
else if (p.x(_type) < x)
|
else if (p.x(_type) < x)
|
||||||
low = mid + 1;
|
low = mid + 1;
|
||||||
else
|
else
|
||||||
return -p.y();
|
return p.y();
|
||||||
}
|
}
|
||||||
|
|
||||||
QLineF l;
|
QLineF l;
|
||||||
@ -117,11 +117,14 @@ qreal GraphItem::yAtX(qreal x)
|
|||||||
l = QLineF(seg->at(mid-1).x(_type), seg->at(mid-1).y(),
|
l = QLineF(seg->at(mid-1).x(_type), seg->at(mid-1).y(),
|
||||||
seg->at(mid).x(_type), seg->at(mid).y());
|
seg->at(mid).x(_type), seg->at(mid).y());
|
||||||
|
|
||||||
return -l.pointAt((x - l.p1().x()) / (l.p2().x() - l.p1().x())).y();
|
return l.pointAt((x - l.p1().x()) / (l.p2().x() - l.p1().x())).y();
|
||||||
}
|
}
|
||||||
|
|
||||||
qreal GraphItem::distanceAtTime(qreal time)
|
qreal GraphItem::distanceAtTime(qreal time) const
|
||||||
{
|
{
|
||||||
|
if (!_time)
|
||||||
|
return NAN;
|
||||||
|
|
||||||
const GraphSegment *seg = segment(time, Time);
|
const GraphSegment *seg = segment(time, Time);
|
||||||
if (!seg)
|
if (!seg)
|
||||||
return NAN;
|
return NAN;
|
||||||
@ -155,12 +158,42 @@ qreal GraphItem::distanceAtTime(qreal time)
|
|||||||
return l.pointAt((time - l.p1().x()) / (l.p2().x() - l.p1().x())).y();
|
return l.pointAt((time - l.p1().x()) / (l.p2().x() - l.p1().x())).y();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphItem::emitSliderPositionChanged(qreal pos)
|
qreal GraphItem::timeAtDistance(qreal distance) const
|
||||||
{
|
{
|
||||||
if (_type == Time)
|
if (!_time)
|
||||||
emit sliderPositionChanged(_time ? distanceAtTime(pos) : NAN);
|
return NAN;
|
||||||
|
|
||||||
|
const GraphSegment *seg = segment(distance, Distance);
|
||||||
|
if (!seg)
|
||||||
|
return NAN;
|
||||||
|
|
||||||
|
int low = 0;
|
||||||
|
int high = seg->count() - 1;
|
||||||
|
int mid = 0;
|
||||||
|
|
||||||
|
if (!(distance >= seg->at(low).s() && distance <= seg->at(high).s()))
|
||||||
|
return NAN;
|
||||||
|
|
||||||
|
while (low <= high) {
|
||||||
|
mid = low + ((high - low) / 2);
|
||||||
|
const GraphPoint &p = seg->at(mid);
|
||||||
|
if (p.s() > distance)
|
||||||
|
high = mid - 1;
|
||||||
|
else if (p.s() < distance)
|
||||||
|
low = mid + 1;
|
||||||
|
else
|
||||||
|
return seg->at(mid).t();
|
||||||
|
}
|
||||||
|
|
||||||
|
QLineF l;
|
||||||
|
if (seg->at(mid).s() < distance)
|
||||||
|
l = QLineF(seg->at(mid).s(), seg->at(mid).t(), seg->at(mid+1).s(),
|
||||||
|
seg->at(mid+1).t());
|
||||||
else
|
else
|
||||||
emit sliderPositionChanged(pos);
|
l = QLineF(seg->at(mid-1).s(), seg->at(mid-1).t(),
|
||||||
|
seg->at(mid).s(), seg->at(mid).t());
|
||||||
|
|
||||||
|
return l.pointAt((distance - l.p1().x()) / (l.p2().x() - l.p1().x())).y();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphItem::hover(bool hover)
|
void GraphItem::hover(bool hover)
|
||||||
|
@ -23,6 +23,7 @@ public:
|
|||||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
||||||
QWidget *widget);
|
QWidget *widget);
|
||||||
|
|
||||||
|
GraphType graphType() const {return _type;}
|
||||||
const QRectF &bounds() const {return _bounds;}
|
const QRectF &bounds() const {return _bounds;}
|
||||||
|
|
||||||
qreal max() const;
|
qreal max() const;
|
||||||
@ -38,17 +39,16 @@ public:
|
|||||||
GraphItem *secondaryGraph() const {return _secondaryGraph;}
|
GraphItem *secondaryGraph() const {return _secondaryGraph;}
|
||||||
void setSecondaryGraph(GraphItem *graph) {_secondaryGraph = graph;}
|
void setSecondaryGraph(GraphItem *graph) {_secondaryGraph = graph;}
|
||||||
|
|
||||||
qreal yAtX(qreal x);
|
qreal yAtX(qreal x) const;
|
||||||
qreal distanceAtTime(qreal time);
|
qreal distanceAtTime(qreal time) const;
|
||||||
|
qreal timeAtDistance(qreal distance) const;
|
||||||
|
|
||||||
void redraw();
|
void redraw();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void sliderPositionChanged(qreal);
|
|
||||||
void selected(bool);
|
void selected(bool);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void emitSliderPositionChanged(qreal);
|
|
||||||
void hover(bool hover);
|
void hover(bool hover);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#ifndef GRAPHTAB_H
|
#ifndef GRAPHTAB_H
|
||||||
#define GRAPHTAB_H
|
#define GRAPHTAB_H
|
||||||
|
|
||||||
|
#include <QtGlobal>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include "graphview.h"
|
#include "graphview.h"
|
||||||
#include "units.h"
|
#include "units.h"
|
||||||
@ -14,7 +15,12 @@ class GraphTab : public GraphView
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GraphTab(QWidget *parent = 0) : GraphView(parent) {}
|
GraphTab(QWidget *parent = 0) : GraphView(parent)
|
||||||
|
{
|
||||||
|
#if defined(Q_OS_WIN32) || defined(Q_OS_MAC)
|
||||||
|
setFrameShape(QFrame::NoFrame);
|
||||||
|
#endif // Q_OS_WIN32 || Q_OS_MAC
|
||||||
|
}
|
||||||
virtual ~GraphTab() {}
|
virtual ~GraphTab() {}
|
||||||
|
|
||||||
virtual QString label() const = 0;
|
virtual QString label() const = 0;
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
#include <QGraphicsSimpleTextItem>
|
#include <QGraphicsSimpleTextItem>
|
||||||
#include <QPalette>
|
#include <QPalette>
|
||||||
#include <QLocale>
|
#include <QLocale>
|
||||||
|
#include <QOpenGLWidget>
|
||||||
#include "data/graph.h"
|
#include "data/graph.h"
|
||||||
#include "opengl.h"
|
|
||||||
#include "axisitem.h"
|
#include "axisitem.h"
|
||||||
#include "axislabelitem.h"
|
#include "axislabelitem.h"
|
||||||
#include "slideritem.h"
|
#include "slideritem.h"
|
||||||
@ -179,6 +179,13 @@ void GraphView::setGraphType(GraphType type)
|
|||||||
_xLabel = tr("Time");
|
_xLabel = tr("Time");
|
||||||
setXUnits();
|
setXUnits();
|
||||||
|
|
||||||
|
if (singleGraph())
|
||||||
|
_sliderPos = (type == Distance)
|
||||||
|
? _graphs.first()->distanceAtTime(_sliderPos)
|
||||||
|
: _graphs.first()->timeAtDistance(_sliderPos);
|
||||||
|
else
|
||||||
|
_sliderPos = 0;
|
||||||
|
|
||||||
redraw();
|
redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,9 +201,6 @@ void GraphView::showSliderInfo(bool show)
|
|||||||
|
|
||||||
void GraphView::addGraph(GraphItem *graph)
|
void GraphView::addGraph(GraphItem *graph)
|
||||||
{
|
{
|
||||||
connect(this, SIGNAL(sliderPositionChanged(qreal)), graph,
|
|
||||||
SLOT(emitSliderPositionChanged(qreal)));
|
|
||||||
|
|
||||||
_graphs.append(graph);
|
_graphs.append(graph);
|
||||||
if (!graph->bounds().isNull())
|
if (!graph->bounds().isNull())
|
||||||
_scene->addItem(graph);
|
_scene->addItem(graph);
|
||||||
@ -207,9 +211,6 @@ void GraphView::addGraph(GraphItem *graph)
|
|||||||
|
|
||||||
void GraphView::removeGraph(GraphItem *graph)
|
void GraphView::removeGraph(GraphItem *graph)
|
||||||
{
|
{
|
||||||
disconnect(this, SIGNAL(sliderPositionChanged(qreal)), graph,
|
|
||||||
SLOT(emitSliderPositionChanged(qreal)));
|
|
||||||
|
|
||||||
_graphs.removeOne(graph);
|
_graphs.removeOne(graph);
|
||||||
_scene->removeItem(graph);
|
_scene->removeItem(graph);
|
||||||
|
|
||||||
@ -351,23 +352,31 @@ void GraphView::wheelEvent(QWheelEvent *e)
|
|||||||
{
|
{
|
||||||
static int deg = 0;
|
static int deg = 0;
|
||||||
|
|
||||||
deg += e->delta() / 8;
|
deg += e->angleDelta().y() / 8;
|
||||||
if (qAbs(deg) < 15)
|
if (qAbs(deg) < 15)
|
||||||
return;
|
return;
|
||||||
deg = 0;
|
deg = 0;
|
||||||
|
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
||||||
QPointF pos = mapToScene(e->pos());
|
QPointF pos = mapToScene(e->pos());
|
||||||
|
#else // QT 5.15
|
||||||
|
QPointF pos = mapToScene(e->position().toPoint());
|
||||||
|
#endif // QT 5.15
|
||||||
QRectF gr(_grid->boundingRect());
|
QRectF gr(_grid->boundingRect());
|
||||||
QPointF r(pos.x() / gr.width(), pos.y() / gr.height());
|
QPointF r(pos.x() / gr.width(), pos.y() / gr.height());
|
||||||
|
|
||||||
_zoom = (e->delta() > 0) ? _zoom * 1.25 : qMax(_zoom / 1.25, 1.0);
|
_zoom = (e->angleDelta().y() > 0) ? _zoom * 1.25 : qMax(_zoom / 1.25, 1.0);
|
||||||
redraw();
|
redraw();
|
||||||
|
|
||||||
QRectF ngr(_grid->boundingRect());
|
QRectF ngr(_grid->boundingRect());
|
||||||
QPointF npos(mapFromScene(QPointF(r.x() * ngr.width(),
|
QPointF npos(mapFromScene(QPointF(r.x() * ngr.width(),
|
||||||
r.y() * ngr.height())));
|
r.y() * ngr.height())));
|
||||||
QScrollBar *sb = horizontalScrollBar();
|
QScrollBar *sb = horizontalScrollBar();
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
||||||
sb->setSliderPosition(sb->sliderPosition() + npos.x() - e->pos().x());
|
sb->setSliderPosition(sb->sliderPosition() + npos.x() - e->pos().x());
|
||||||
|
#else // QT 5.15
|
||||||
|
sb->setSliderPosition(sb->sliderPosition() + npos.x() - e->position().x());
|
||||||
|
#endif // QT 5.15
|
||||||
|
|
||||||
QGraphicsView::wheelEvent(e);
|
QGraphicsView::wheelEvent(e);
|
||||||
}
|
}
|
||||||
@ -426,12 +435,17 @@ void GraphView::updateSliderPosition()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GraphView::singleGraph() const
|
||||||
|
{
|
||||||
|
return (_graphs.count() == 1
|
||||||
|
|| (_graphs.count() == 2 && _graphs.first()->secondaryGraph()));
|
||||||
|
}
|
||||||
|
|
||||||
void GraphView::updateSliderInfo()
|
void GraphView::updateSliderInfo()
|
||||||
{
|
{
|
||||||
QLocale l(QLocale::system());
|
QLocale l(QLocale::system());
|
||||||
qreal r = 0, y = 0;
|
qreal r = 0, y = 0;
|
||||||
GraphItem *cardinal = (_graphs.count() == 1 || (_graphs.count() == 2
|
GraphItem *cardinal = singleGraph() ? _graphs.first() : 0;
|
||||||
&& _graphs.first()->secondaryGraph())) ? _graphs.first() : 0;
|
|
||||||
|
|
||||||
if (cardinal) {
|
if (cardinal) {
|
||||||
QRectF br(_bounds);
|
QRectF br(_bounds);
|
||||||
@ -439,7 +453,7 @@ void GraphView::updateSliderInfo()
|
|||||||
br.adjust(0, -(_minYRange/2 - br.height()/2), 0,
|
br.adjust(0, -(_minYRange/2 - br.height()/2), 0,
|
||||||
_minYRange/2 - br.height()/2);
|
_minYRange/2 - br.height()/2);
|
||||||
|
|
||||||
y = cardinal->yAtX(_sliderPos);
|
y = -cardinal->yAtX(_sliderPos);
|
||||||
r = (y - br.bottom()) / br.height();
|
r = (y - br.bottom()) / br.height();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -455,9 +469,9 @@ void GraphView::updateSliderInfo()
|
|||||||
QString yText((!cardinal) ? QString() : l.toString(-y * _yScale + _yOffset,
|
QString yText((!cardinal) ? QString() : l.toString(-y * _yScale + _yOffset,
|
||||||
'f', _precision) + UNIT_SPACE + _yUnits);
|
'f', _precision) + UNIT_SPACE + _yUnits);
|
||||||
if (cardinal && cardinal->secondaryGraph()) {
|
if (cardinal && cardinal->secondaryGraph()) {
|
||||||
qreal delta = y - cardinal->secondaryGraph()->yAtX(_sliderPos);
|
qreal delta = y + cardinal->secondaryGraph()->yAtX(_sliderPos);
|
||||||
yText += " " + QChar(0x0394) + l.toString(-delta * _yScale + _yOffset,
|
yText += QString(" ") + QChar(0x0394) + l.toString(-delta * _yScale
|
||||||
'f', _precision) + UNIT_SPACE + _yUnits;
|
+ _yOffset, 'f', _precision) + UNIT_SPACE + _yUnits;
|
||||||
}
|
}
|
||||||
_sliderInfo->setText(xText, yText);
|
_sliderInfo->setText(xText, yText);
|
||||||
}
|
}
|
||||||
@ -537,7 +551,7 @@ void GraphView::setGraphWidth(int width)
|
|||||||
void GraphView::useOpenGL(bool use)
|
void GraphView::useOpenGL(bool use)
|
||||||
{
|
{
|
||||||
if (use)
|
if (use)
|
||||||
setViewport(new OPENGL_WIDGET);
|
setViewport(new QOpenGLWidget);
|
||||||
else
|
else
|
||||||
setViewport(new QWidget);
|
setViewport(new QWidget);
|
||||||
}
|
}
|
||||||
|
@ -43,6 +43,8 @@ public:
|
|||||||
void setSliderPosition(qreal pos);
|
void setSliderPosition(qreal pos);
|
||||||
void setSliderColor(const QColor &color);
|
void setSliderColor(const QColor &color);
|
||||||
|
|
||||||
|
qreal sliderPosition() const {return _sliderPos;}
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void sliderPositionChanged(qreal);
|
void sliderPositionChanged(qreal);
|
||||||
|
|
||||||
@ -91,6 +93,7 @@ private:
|
|||||||
void updateSliderInfo();
|
void updateSliderInfo();
|
||||||
void removeItem(QGraphicsItem *item);
|
void removeItem(QGraphicsItem *item);
|
||||||
void addItem(QGraphicsItem *item);
|
void addItem(QGraphicsItem *item);
|
||||||
|
bool singleGraph() const;
|
||||||
|
|
||||||
GraphicsScene *_scene;
|
GraphicsScene *_scene;
|
||||||
|
|
||||||
|
550
src/GUI/gui.cpp
@ -1,4 +1,3 @@
|
|||||||
#include "common/config.h"
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QSplitter>
|
#include <QSplitter>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
@ -23,10 +22,8 @@
|
|||||||
#include <QMimeData>
|
#include <QMimeData>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
#include <QPixmapCache>
|
#include <QPixmapCache>
|
||||||
#ifdef ENABLE_HIDPI
|
|
||||||
#include <QWindow>
|
#include <QWindow>
|
||||||
#include <QScreen>
|
#include <QScreen>
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
#include <QStyle>
|
#include <QStyle>
|
||||||
#include "common/programpaths.h"
|
#include "common/programpaths.h"
|
||||||
#include "data/data.h"
|
#include "data/data.h"
|
||||||
@ -47,10 +44,10 @@
|
|||||||
#include "mapview.h"
|
#include "mapview.h"
|
||||||
#include "trackinfo.h"
|
#include "trackinfo.h"
|
||||||
#include "filebrowser.h"
|
#include "filebrowser.h"
|
||||||
#include "cpuarch.h"
|
|
||||||
#include "graphtab.h"
|
#include "graphtab.h"
|
||||||
#include "graphitem.h"
|
#include "graphitem.h"
|
||||||
#include "pathitem.h"
|
#include "pathitem.h"
|
||||||
|
#include "mapitem.h"
|
||||||
#include "mapaction.h"
|
#include "mapaction.h"
|
||||||
#include "gui.h"
|
#include "gui.h"
|
||||||
|
|
||||||
@ -93,8 +90,7 @@ GUI::GUI()
|
|||||||
_routeDistance = 0;
|
_routeDistance = 0;
|
||||||
_time = 0;
|
_time = 0;
|
||||||
_movingTime = 0;
|
_movingTime = 0;
|
||||||
|
_lastGraphTab = 0;
|
||||||
_sliderPos = 0;
|
|
||||||
|
|
||||||
_dataDir = QDir::homePath();
|
_dataDir = QDir::homePath();
|
||||||
_mapDir = QDir::homePath();
|
_mapDir = QDir::homePath();
|
||||||
@ -130,11 +126,17 @@ void GUI::createMapActions()
|
|||||||
if (mapDir.isNull())
|
if (mapDir.isNull())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QString unused;
|
QList<Map*> maps(MapList::loadMaps(mapDir));
|
||||||
QList<Map*> maps(MapList::loadMaps(mapDir, unused));
|
|
||||||
for (int i = 0; i < maps.count(); i++) {
|
for (int i = 0; i < maps.count(); i++) {
|
||||||
MapAction *a = createMapAction(maps.at(i));
|
Map *map = maps.at(i);
|
||||||
connect(a, SIGNAL(loaded()), this, SLOT(mapInitialized()));
|
if (map->isValid()) {
|
||||||
|
MapAction *a = createMapAction(map);
|
||||||
|
connect(a, SIGNAL(loaded()), this, SLOT(mapInitialized()));
|
||||||
|
} else {
|
||||||
|
qWarning("%s: %s", qPrintable(map->path()),
|
||||||
|
qPrintable(map->errorString()));
|
||||||
|
delete map;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,7 +161,7 @@ void GUI::mapInitialized()
|
|||||||
_showMapAction->setEnabled(true);
|
_showMapAction->setEnabled(true);
|
||||||
_clearMapCacheAction->setEnabled(true);
|
_clearMapCacheAction->setEnabled(true);
|
||||||
} else {
|
} else {
|
||||||
qWarning("%s: %s", qPrintable(map->name()), qPrintable(map->errorString()));
|
qWarning("%s: %s", qPrintable(map->path()), qPrintable(map->errorString()));
|
||||||
action->deleteLater();
|
action->deleteLater();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -167,8 +169,13 @@ void GUI::mapInitialized()
|
|||||||
void GUI::createPOIFilesActions()
|
void GUI::createPOIFilesActions()
|
||||||
{
|
{
|
||||||
_poiFilesSignalMapper = new QSignalMapper(this);
|
_poiFilesSignalMapper = new QSignalMapper(this);
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
||||||
connect(_poiFilesSignalMapper, SIGNAL(mapped(int)), this,
|
connect(_poiFilesSignalMapper, SIGNAL(mapped(int)), this,
|
||||||
SLOT(poiFileChecked(int)));
|
SLOT(poiFileChecked(int)));
|
||||||
|
#else // QT 5.15
|
||||||
|
connect(_poiFilesSignalMapper, SIGNAL(mappedInt(int)), this,
|
||||||
|
SLOT(poiFileChecked(int)));
|
||||||
|
#endif // QT 5.15
|
||||||
|
|
||||||
for (int i = 0; i < _poi->files().count(); i++)
|
for (int i = 0; i < _poi->files().count(); i++)
|
||||||
createPOIFileAction(_poi->files().at(i));
|
createPOIFileAction(_poi->files().at(i));
|
||||||
@ -276,7 +283,7 @@ void GUI::createActions()
|
|||||||
_overlapPOIAction->setMenuRole(QAction::NoRole);
|
_overlapPOIAction->setMenuRole(QAction::NoRole);
|
||||||
_overlapPOIAction->setCheckable(true);
|
_overlapPOIAction->setCheckable(true);
|
||||||
connect(_overlapPOIAction, SIGNAL(triggered(bool)), _mapView,
|
connect(_overlapPOIAction, SIGNAL(triggered(bool)), _mapView,
|
||||||
SLOT(setPOIOverlap(bool)));
|
SLOT(showOverlappedPOIs(bool)));
|
||||||
_showPOILabelsAction = new QAction(tr("Show POI labels"), this);
|
_showPOILabelsAction = new QAction(tr("Show POI labels"), this);
|
||||||
_showPOILabelsAction->setMenuRole(QAction::NoRole);
|
_showPOILabelsAction->setMenuRole(QAction::NoRole);
|
||||||
_showPOILabelsAction->setCheckable(true);
|
_showPOILabelsAction->setCheckable(true);
|
||||||
@ -306,10 +313,14 @@ void GUI::createActions()
|
|||||||
this);
|
this);
|
||||||
_loadMapAction->setMenuRole(QAction::NoRole);
|
_loadMapAction->setMenuRole(QAction::NoRole);
|
||||||
connect(_loadMapAction, SIGNAL(triggered()), this, SLOT(loadMap()));
|
connect(_loadMapAction, SIGNAL(triggered()), this, SLOT(loadMap()));
|
||||||
|
_loadMapDirAction = new QAction(QIcon(OPEN_FILE_ICON),
|
||||||
|
tr("Load map directory..."), this);
|
||||||
|
_loadMapDirAction->setMenuRole(QAction::NoRole);
|
||||||
|
connect(_loadMapDirAction, SIGNAL(triggered()), this, SLOT(loadMapDir()));
|
||||||
_clearMapCacheAction = new QAction(tr("Clear tile cache"), this);
|
_clearMapCacheAction = new QAction(tr("Clear tile cache"), this);
|
||||||
_clearMapCacheAction->setEnabled(false);
|
_clearMapCacheAction->setEnabled(false);
|
||||||
_clearMapCacheAction->setMenuRole(QAction::NoRole);
|
_clearMapCacheAction->setMenuRole(QAction::NoRole);
|
||||||
connect(_clearMapCacheAction, SIGNAL(triggered()), _mapView,
|
connect(_clearMapCacheAction, SIGNAL(triggered()), this,
|
||||||
SLOT(clearMapCache()));
|
SLOT(clearMapCache()));
|
||||||
_nextMapAction = new QAction(tr("Next map"), this);
|
_nextMapAction = new QAction(tr("Next map"), this);
|
||||||
_nextMapAction->setMenuRole(QAction::NoRole);
|
_nextMapAction->setMenuRole(QAction::NoRole);
|
||||||
@ -363,6 +374,11 @@ void GUI::createActions()
|
|||||||
_showTicksAction->setCheckable(true);
|
_showTicksAction->setCheckable(true);
|
||||||
connect(_showTicksAction, SIGNAL(triggered(bool)), _mapView,
|
connect(_showTicksAction, SIGNAL(triggered(bool)), _mapView,
|
||||||
SLOT(showTicks(bool)));
|
SLOT(showTicks(bool)));
|
||||||
|
_showMarkersAction = new QAction(tr("Position markers"), this);
|
||||||
|
_showMarkersAction->setMenuRole(QAction::NoRole);
|
||||||
|
_showMarkersAction->setCheckable(true);
|
||||||
|
connect(_showMarkersAction, SIGNAL(triggered(bool)), _mapView,
|
||||||
|
SLOT(showMarkers(bool)));
|
||||||
|
|
||||||
// Graph actions
|
// Graph actions
|
||||||
_showGraphsAction = new QAction(QIcon(SHOW_GRAPHS_ICON), tr("Show graphs"),
|
_showGraphsAction = new QAction(QIcon(SHOW_GRAPHS_ICON), tr("Show graphs"),
|
||||||
@ -399,11 +415,6 @@ void GUI::createActions()
|
|||||||
_showGraphSliderInfoAction->setCheckable(true);
|
_showGraphSliderInfoAction->setCheckable(true);
|
||||||
connect(_showGraphSliderInfoAction, SIGNAL(triggered(bool)), this,
|
connect(_showGraphSliderInfoAction, SIGNAL(triggered(bool)), this,
|
||||||
SLOT(showGraphSliderInfo(bool)));
|
SLOT(showGraphSliderInfo(bool)));
|
||||||
_showMarkersAction = new QAction(tr("Show path markers"), this);
|
|
||||||
_showMarkersAction->setMenuRole(QAction::NoRole);
|
|
||||||
_showMarkersAction->setCheckable(true);
|
|
||||||
connect(_showMarkersAction, SIGNAL(triggered(bool)), _mapView,
|
|
||||||
SLOT(showMarkers(bool)));
|
|
||||||
|
|
||||||
// Settings actions
|
// Settings actions
|
||||||
_showToolbarsAction = new QAction(tr("Show toolbars"), this);
|
_showToolbarsAction = new QAction(tr("Show toolbars"), this);
|
||||||
@ -519,6 +530,7 @@ void GUI::createMenus()
|
|||||||
_mapMenu->addActions(_mapsActionGroup->actions());
|
_mapMenu->addActions(_mapsActionGroup->actions());
|
||||||
_mapsEnd = _mapMenu->addSeparator();
|
_mapsEnd = _mapMenu->addSeparator();
|
||||||
_mapMenu->addAction(_loadMapAction);
|
_mapMenu->addAction(_loadMapAction);
|
||||||
|
_mapMenu->addAction(_loadMapDirAction);
|
||||||
_mapMenu->addAction(_clearMapCacheAction);
|
_mapMenu->addAction(_clearMapCacheAction);
|
||||||
_mapMenu->addSeparator();
|
_mapMenu->addSeparator();
|
||||||
_mapMenu->addAction(_showCoordinatesAction);
|
_mapMenu->addAction(_showCoordinatesAction);
|
||||||
@ -531,7 +543,6 @@ void GUI::createMenus()
|
|||||||
graphMenu->addSeparator();
|
graphMenu->addSeparator();
|
||||||
graphMenu->addAction(_showGraphGridAction);
|
graphMenu->addAction(_showGraphGridAction);
|
||||||
graphMenu->addAction(_showGraphSliderInfoAction);
|
graphMenu->addAction(_showGraphSliderInfoAction);
|
||||||
graphMenu->addAction(_showMarkersAction);
|
|
||||||
graphMenu->addSeparator();
|
graphMenu->addSeparator();
|
||||||
graphMenu->addAction(_showGraphsAction);
|
graphMenu->addAction(_showGraphsAction);
|
||||||
|
|
||||||
@ -552,6 +563,7 @@ void GUI::createMenus()
|
|||||||
displayMenu->addAction(_showWaypointLabelsAction);
|
displayMenu->addAction(_showWaypointLabelsAction);
|
||||||
displayMenu->addAction(_showRouteWaypointsAction);
|
displayMenu->addAction(_showRouteWaypointsAction);
|
||||||
displayMenu->addAction(_showTicksAction);
|
displayMenu->addAction(_showTicksAction);
|
||||||
|
displayMenu->addAction(_showMarkersAction);
|
||||||
dataMenu->addSeparator();
|
dataMenu->addSeparator();
|
||||||
dataMenu->addAction(_showTracksAction);
|
dataMenu->addAction(_showTracksAction);
|
||||||
dataMenu->addAction(_showRoutesAction);
|
dataMenu->addAction(_showRoutesAction);
|
||||||
@ -649,13 +661,8 @@ void GUI::createGraphTabs()
|
|||||||
_tabs.append(new TemperatureGraph(_graphTabWidget));
|
_tabs.append(new TemperatureGraph(_graphTabWidget));
|
||||||
_tabs.append(new GearRatioGraph(_graphTabWidget));
|
_tabs.append(new GearRatioGraph(_graphTabWidget));
|
||||||
|
|
||||||
for (int i = 0; i < _tabs.count(); i++) {
|
connect(_tabs.first(), SIGNAL(sliderPositionChanged(qreal)), _mapView,
|
||||||
#if defined(Q_OS_WIN32) || defined(Q_OS_MAC)
|
SLOT(setMarkerPosition(qreal)));
|
||||||
_tabs.at(i)->setFrameShape(QFrame::NoFrame);
|
|
||||||
#endif // Q_OS_WIN32 || Q_OS_MAC
|
|
||||||
connect(_tabs.at(i), SIGNAL(sliderPositionChanged(qreal)), this,
|
|
||||||
SLOT(sliderPositionChanged(qreal)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI::createStatusBar()
|
void GUI::createStatusBar()
|
||||||
@ -679,8 +686,8 @@ void GUI::about()
|
|||||||
|
|
||||||
msgBox.setWindowTitle(tr("About GPXSee"));
|
msgBox.setWindowTitle(tr("About GPXSee"));
|
||||||
msgBox.setText("<h2>" + QString(APP_NAME) + "</h2><p><p>" + tr("Version %1")
|
msgBox.setText("<h2>" + QString(APP_NAME) + "</h2><p><p>" + tr("Version %1")
|
||||||
.arg(QString(APP_VERSION) + " (" + CPU_ARCH + ", Qt " + QT_VERSION_STR
|
.arg(QString(APP_VERSION) + " (" + QSysInfo::buildCpuArchitecture()
|
||||||
+ ")") + "</p>");
|
+ ", Qt " + QT_VERSION_STR + ")") + "</p>");
|
||||||
msgBox.setInformativeText("<table width=\"300\"><tr><td>"
|
msgBox.setInformativeText("<table width=\"300\"><tr><td>"
|
||||||
+ tr("GPXSee is distributed under the terms of the GNU General Public "
|
+ tr("GPXSee is distributed under the terms of the GNU General Public "
|
||||||
"License version 3. For more info about GPXSee visit the project "
|
"License version 3. For more info about GPXSee visit the project "
|
||||||
@ -759,101 +766,45 @@ void GUI::paths()
|
|||||||
|
|
||||||
void GUI::openFile()
|
void GUI::openFile()
|
||||||
{
|
{
|
||||||
QStringList files = QFileDialog::getOpenFileNames(this, tr("Open file"),
|
QStringList files(QFileDialog::getOpenFileNames(this, tr("Open file"),
|
||||||
_dataDir, Data::formats());
|
_dataDir, Data::formats()));
|
||||||
QStringList list = files;
|
|
||||||
|
|
||||||
for (QStringList::Iterator it = list.begin(); it != list.end(); it++)
|
for (int i = 0; i < files.size(); i++)
|
||||||
openFile(*it);
|
openFile(files.at(i));
|
||||||
if (!list.isEmpty())
|
if (!files.isEmpty())
|
||||||
_dataDir = QFileInfo(list.first()).path();
|
_dataDir = QFileInfo(files.last()).path();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GUI::openFile(const QString &fileName)
|
bool GUI::openFile(const QString &fileName, bool silent)
|
||||||
{
|
{
|
||||||
if (fileName.isEmpty() || _files.contains(fileName))
|
if (_files.contains(fileName))
|
||||||
return false;
|
|
||||||
|
|
||||||
if (loadFile(fileName)) {
|
|
||||||
_files.append(fileName);
|
|
||||||
_browser->setCurrent(fileName);
|
|
||||||
_fileActionGroup->setEnabled(true);
|
|
||||||
_navigationActionGroup->setEnabled(true);
|
|
||||||
|
|
||||||
updateNavigationActions();
|
|
||||||
updateStatusBarInfo();
|
|
||||||
updateWindowTitle();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
|
||||||
if (_files.isEmpty())
|
|
||||||
_fileActionGroup->setEnabled(false);
|
|
||||||
|
|
||||||
|
if (!loadFile(fileName, silent))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
_files.append(fileName);
|
||||||
|
_browser->setCurrent(fileName);
|
||||||
|
_fileActionGroup->setEnabled(true);
|
||||||
|
// Explicitly enable the reload action as it may be disabled by loadMapDir()
|
||||||
|
_reloadFileAction->setEnabled(true);
|
||||||
|
_navigationActionGroup->setEnabled(true);
|
||||||
|
|
||||||
|
updateNavigationActions();
|
||||||
|
updateStatusBarInfo();
|
||||||
|
updateWindowTitle();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GUI::loadFile(const QString &fileName)
|
bool GUI::loadFile(const QString &fileName, bool silent)
|
||||||
{
|
{
|
||||||
Data data(fileName);
|
Data data(fileName, !silent);
|
||||||
QList<QList<GraphItem*> > graphs;
|
|
||||||
QList<PathItem*> paths;
|
|
||||||
|
|
||||||
if (data.isValid()) {
|
if (data.isValid()) {
|
||||||
for (int i = 0; i < data.tracks().count(); i++) {
|
loadData(data);
|
||||||
const Track &track = data.tracks().at(i);
|
|
||||||
_trackDistance += track.distance();
|
|
||||||
_time += track.time();
|
|
||||||
_movingTime += track.movingTime();
|
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
const QDateTime date = track.date().toTimeZone(
|
|
||||||
_options.timeZone.zone());
|
|
||||||
#else // ENABLE_TIMEZONES
|
|
||||||
const QDateTime &date = track.date();
|
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
if (_dateRange.first.isNull() || _dateRange.first > date)
|
|
||||||
_dateRange.first = date;
|
|
||||||
if (_dateRange.second.isNull() || _dateRange.second < date)
|
|
||||||
_dateRange.second = date;
|
|
||||||
}
|
|
||||||
_trackCount += data.tracks().count();
|
|
||||||
|
|
||||||
for (int i = 0; i < data.routes().count(); i++)
|
|
||||||
_routeDistance += data.routes().at(i).distance();
|
|
||||||
_routeCount += data.routes().count();
|
|
||||||
|
|
||||||
_waypointCount += data.waypoints().count();
|
|
||||||
_areaCount += data.areas().count();
|
|
||||||
|
|
||||||
if (_pathName.isNull()) {
|
|
||||||
if (data.tracks().count() == 1 && !data.routes().count())
|
|
||||||
_pathName = data.tracks().first().name();
|
|
||||||
else if (data.routes().count() == 1 && !data.tracks().count())
|
|
||||||
_pathName = data.routes().first().name();
|
|
||||||
} else
|
|
||||||
_pathName = QString();
|
|
||||||
|
|
||||||
for (int i = 0; i < _tabs.count(); i++)
|
|
||||||
graphs.append(_tabs.at(i)->loadData(data));
|
|
||||||
if (updateGraphTabs())
|
|
||||||
_splitter->refresh();
|
|
||||||
paths = _mapView->loadData(data);
|
|
||||||
|
|
||||||
for (int i = 0; i < paths.count(); i++) {
|
|
||||||
const PathItem *pi = paths.at(i);
|
|
||||||
for (int j = 0; j < graphs.count(); j++) {
|
|
||||||
const GraphItem *gi = graphs.at(j).at(i);
|
|
||||||
if (!gi)
|
|
||||||
continue;
|
|
||||||
connect(gi, SIGNAL(sliderPositionChanged(qreal)), pi,
|
|
||||||
SLOT(moveMarker(qreal)));
|
|
||||||
connect(pi, SIGNAL(selected(bool)), gi, SLOT(hover(bool)));
|
|
||||||
connect(gi, SIGNAL(selected(bool)), pi, SLOT(hover(bool)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else if (!silent) {
|
||||||
updateNavigationActions();
|
updateNavigationActions();
|
||||||
updateStatusBarInfo();
|
updateStatusBarInfo();
|
||||||
updateWindowTitle();
|
updateWindowTitle();
|
||||||
@ -865,25 +816,78 @@ bool GUI::loadFile(const QString &fileName)
|
|||||||
error.append("\n" + tr("Line: %1").arg(data.errorLine()));
|
error.append("\n" + tr("Line: %1").arg(data.errorLine()));
|
||||||
QMessageBox::critical(this, APP_NAME, error);
|
QMessageBox::critical(this, APP_NAME, error);
|
||||||
return false;
|
return false;
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::loadData(const Data &data)
|
||||||
|
{
|
||||||
|
QList<QList<GraphItem*> > graphs;
|
||||||
|
QList<PathItem*> paths;
|
||||||
|
|
||||||
|
for (int i = 0; i < data.tracks().count(); i++) {
|
||||||
|
const Track &track = data.tracks().at(i);
|
||||||
|
_trackDistance += track.distance();
|
||||||
|
_time += track.time();
|
||||||
|
_movingTime += track.movingTime();
|
||||||
|
const QDateTime date = track.date().toTimeZone(_options.timeZone.zone());
|
||||||
|
if (_dateRange.first.isNull() || _dateRange.first > date)
|
||||||
|
_dateRange.first = date;
|
||||||
|
if (_dateRange.second.isNull() || _dateRange.second < date)
|
||||||
|
_dateRange.second = date;
|
||||||
|
}
|
||||||
|
_trackCount += data.tracks().count();
|
||||||
|
|
||||||
|
for (int i = 0; i < data.routes().count(); i++)
|
||||||
|
_routeDistance += data.routes().at(i).distance();
|
||||||
|
_routeCount += data.routes().count();
|
||||||
|
|
||||||
|
_waypointCount += data.waypoints().count();
|
||||||
|
_areaCount += data.areas().count();
|
||||||
|
|
||||||
|
if (_pathName.isNull()) {
|
||||||
|
if (data.tracks().count() == 1 && !data.routes().count())
|
||||||
|
_pathName = data.tracks().first().name();
|
||||||
|
else if (data.routes().count() == 1 && !data.tracks().count())
|
||||||
|
_pathName = data.routes().first().name();
|
||||||
|
} else
|
||||||
|
_pathName = QString();
|
||||||
|
|
||||||
|
for (int i = 0; i < _tabs.count(); i++)
|
||||||
|
graphs.append(_tabs.at(i)->loadData(data));
|
||||||
|
if (updateGraphTabs())
|
||||||
|
_splitter->refresh();
|
||||||
|
paths = _mapView->loadData(data);
|
||||||
|
|
||||||
|
GraphTab *gt = static_cast<GraphTab*>(_graphTabWidget->currentWidget());
|
||||||
|
int index = _graphTabWidget->currentIndex();
|
||||||
|
|
||||||
|
for (int i = 0; i < paths.count(); i++) {
|
||||||
|
PathItem *pi = paths.at(i);
|
||||||
|
|
||||||
|
for (int j = 0; j < graphs.count(); j++)
|
||||||
|
pi->addGraph(graphs.at(j).at(i));
|
||||||
|
|
||||||
|
pi->setGraph(index);
|
||||||
|
pi->setMarkerPosition(gt->sliderPosition());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI::openPOIFile()
|
void GUI::openPOIFile()
|
||||||
{
|
{
|
||||||
QStringList files = QFileDialog::getOpenFileNames(this, tr("Open POI file"),
|
QStringList files(QFileDialog::getOpenFileNames(this, tr("Open POI file"),
|
||||||
_poiDir, Data::formats());
|
_poiDir, Data::formats()));
|
||||||
QStringList list = files;
|
|
||||||
|
|
||||||
for (QStringList::Iterator it = list.begin(); it != list.end(); it++)
|
for (int i = 0; i < files.size(); i++)
|
||||||
openPOIFile(*it);
|
openPOIFile(files.at(i));
|
||||||
if (!list.isEmpty())
|
if (!files.isEmpty())
|
||||||
_poiDir = QFileInfo(list.first()).path();
|
_poiDir = QFileInfo(files.last()).path();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GUI::openPOIFile(const QString &fileName)
|
bool GUI::openPOIFile(const QString &fileName)
|
||||||
{
|
{
|
||||||
if (fileName.isEmpty() || _poi->files().contains(fileName))
|
if (_poi->files().contains(fileName))
|
||||||
return false;
|
return true;
|
||||||
|
|
||||||
if (_poi->loadFile(fileName)) {
|
if (_poi->loadFile(fileName)) {
|
||||||
_mapView->showPOI(true);
|
_mapView->showPOI(true);
|
||||||
@ -963,7 +967,8 @@ void GUI::openOptions()
|
|||||||
SET_VIEW_OPTION(pathAntiAliasing, useAntiAliasing);
|
SET_VIEW_OPTION(pathAntiAliasing, useAntiAliasing);
|
||||||
SET_VIEW_OPTION(useOpenGL, useOpenGL);
|
SET_VIEW_OPTION(useOpenGL, useOpenGL);
|
||||||
SET_VIEW_OPTION(sliderColor, setMarkerColor);
|
SET_VIEW_OPTION(sliderColor, setMarkerColor);
|
||||||
SET_VIEW_OPTION(projection, setProjection);
|
SET_VIEW_OPTION(outputProjection, setOutputProjection);
|
||||||
|
SET_VIEW_OPTION(inputProjection, setInputProjection);
|
||||||
|
|
||||||
SET_TAB_OPTION(palette, setPalette);
|
SET_TAB_OPTION(palette, setPalette);
|
||||||
SET_TAB_OPTION(graphWidth, setGraphWidth);
|
SET_TAB_OPTION(graphWidth, setGraphWidth);
|
||||||
@ -1000,23 +1005,18 @@ void GUI::openOptions()
|
|||||||
|
|
||||||
if (options.connectionTimeout != _options.connectionTimeout)
|
if (options.connectionTimeout != _options.connectionTimeout)
|
||||||
Downloader::setTimeout(options.connectionTimeout);
|
Downloader::setTimeout(options.connectionTimeout);
|
||||||
#ifdef ENABLE_HTTP2
|
|
||||||
if (options.enableHTTP2 != _options.enableHTTP2)
|
if (options.enableHTTP2 != _options.enableHTTP2)
|
||||||
Downloader::enableHTTP2(options.enableHTTP2);
|
Downloader::enableHTTP2(options.enableHTTP2);
|
||||||
#endif // ENABLE_HTTP2
|
|
||||||
|
|
||||||
#ifdef ENABLE_HIDPI
|
|
||||||
if (options.hidpiMap != _options.hidpiMap)
|
if (options.hidpiMap != _options.hidpiMap)
|
||||||
_mapView->setDevicePixelRatio(devicePixelRatioF(),
|
_mapView->setDevicePixelRatio(devicePixelRatioF(),
|
||||||
options.hidpiMap ? devicePixelRatioF() : 1.0);
|
options.hidpiMap ? devicePixelRatioF() : 1.0);
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
if (options.timeZone != _options.timeZone) {
|
if (options.timeZone != _options.timeZone) {
|
||||||
_mapView->setTimeZone(options.timeZone.zone());
|
_mapView->setTimeZone(options.timeZone.zone());
|
||||||
_dateRange.first = _dateRange.first.toTimeZone(options.timeZone.zone());
|
_dateRange.first = _dateRange.first.toTimeZone(options.timeZone.zone());
|
||||||
_dateRange.second = _dateRange.second.toTimeZone(options.timeZone.zone());
|
_dateRange.second = _dateRange.second.toTimeZone(options.timeZone.zone());
|
||||||
}
|
}
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
|
|
||||||
if (reload)
|
if (reload)
|
||||||
reloadFiles();
|
reloadFiles();
|
||||||
@ -1044,12 +1044,9 @@ void GUI::exportPDFFile()
|
|||||||
printer.setCreator(QString(APP_NAME) + QString(" ")
|
printer.setCreator(QString(APP_NAME) + QString(" ")
|
||||||
+ QString(APP_VERSION));
|
+ QString(APP_VERSION));
|
||||||
printer.setResolution(_pdfExport.resolution);
|
printer.setResolution(_pdfExport.resolution);
|
||||||
printer.setOrientation(_pdfExport.orientation);
|
printer.setPageLayout(QPageLayout(QPageSize(_pdfExport.paperSize),
|
||||||
|
_pdfExport.orientation, _pdfExport.margins, QPageLayout::Millimeter));
|
||||||
printer.setOutputFileName(_pdfExport.fileName);
|
printer.setOutputFileName(_pdfExport.fileName);
|
||||||
printer.setPaperSize(_pdfExport.paperSize);
|
|
||||||
printer.setPageMargins(_pdfExport.margins.left(), _pdfExport.margins.top(),
|
|
||||||
_pdfExport.margins.right(), _pdfExport.margins.bottom(),
|
|
||||||
QPrinter::Millimeter);
|
|
||||||
|
|
||||||
plot(&printer);
|
plot(&printer);
|
||||||
}
|
}
|
||||||
@ -1227,7 +1224,7 @@ void GUI::plotMainPage(QPainter *painter, const QRectF &rect, qreal ratio,
|
|||||||
sc = 1;
|
sc = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
MapView::PlotFlags flags = MapView::NoFlags;
|
MapView::PlotFlags flags;
|
||||||
if (_options.hiresPrint)
|
if (_options.hiresPrint)
|
||||||
flags |= MapView::HiRes;
|
flags |= MapView::HiRes;
|
||||||
if (expand)
|
if (expand)
|
||||||
@ -1305,8 +1302,6 @@ void GUI::reloadFiles()
|
|||||||
_tabs.at(i)->clear();
|
_tabs.at(i)->clear();
|
||||||
_mapView->clear();
|
_mapView->clear();
|
||||||
|
|
||||||
_sliderPos = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < _files.size(); i++) {
|
for (int i = 0; i < _files.size(); i++) {
|
||||||
if (!loadFile(_files.at(i))) {
|
if (!loadFile(_files.at(i))) {
|
||||||
_files.removeAt(i);
|
_files.removeAt(i);
|
||||||
@ -1335,8 +1330,6 @@ void GUI::closeFiles()
|
|||||||
_dateRange = DateTimeRange(QDateTime(), QDateTime());
|
_dateRange = DateTimeRange(QDateTime(), QDateTime());
|
||||||
_pathName = QString();
|
_pathName = QString();
|
||||||
|
|
||||||
_sliderPos = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < _tabs.count(); i++)
|
for (int i = 0; i < _tabs.count(); i++)
|
||||||
_tabs.at(i)->clear();
|
_tabs.at(i)->clear();
|
||||||
_mapView->clear();
|
_mapView->clear();
|
||||||
@ -1427,45 +1420,73 @@ void GUI::showGraphSliderInfo(bool show)
|
|||||||
|
|
||||||
void GUI::loadMap()
|
void GUI::loadMap()
|
||||||
{
|
{
|
||||||
QStringList files = QFileDialog::getOpenFileNames(this, tr("Open map file"),
|
QStringList files(QFileDialog::getOpenFileNames(this, tr("Open map file"),
|
||||||
_mapDir, MapList::formats());
|
_mapDir, MapList::formats()));
|
||||||
QStringList list = files;
|
MapAction *a, *lastReady = 0;
|
||||||
|
|
||||||
for (QStringList::Iterator it = list.begin(); it != list.end(); it++)
|
for (int i = 0; i < files.size(); i++) {
|
||||||
loadMap(*it);
|
if (loadMap(files.at(i), a) && a)
|
||||||
if (!list.isEmpty())
|
lastReady = a;
|
||||||
_mapDir = QFileInfo(list.first()).path();
|
}
|
||||||
|
if (!files.isEmpty())
|
||||||
|
_mapDir = QFileInfo(files.last()).path();
|
||||||
|
if (lastReady)
|
||||||
|
lastReady->trigger();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GUI::loadMap(const QString &fileName)
|
static MapAction *findMapAction(const QList<QAction*> &mapActions,
|
||||||
|
const Map *map)
|
||||||
{
|
{
|
||||||
// On OS X fileName may be a directory!
|
for (int i = 0; i < mapActions.count(); i++) {
|
||||||
|
const Map *m = mapActions.at(i)->data().value<Map*>();
|
||||||
if (fileName.isEmpty())
|
if (map->path() == m->path())
|
||||||
return false;
|
return static_cast<MapAction*>(mapActions.at(i));
|
||||||
|
|
||||||
QString error;
|
|
||||||
QList<Map*> maps = MapList::loadMaps(fileName, error);
|
|
||||||
if (maps.isEmpty()) {
|
|
||||||
error = tr("Error loading map:") + "\n\n"
|
|
||||||
+ fileName + "\n\n" + error;
|
|
||||||
QMessageBox::critical(this, APP_NAME, error);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GUI::loadMap(const QString &fileName, MapAction *&action, bool silent)
|
||||||
|
{
|
||||||
|
QList<Map*> maps(MapList::loadMaps(fileName));
|
||||||
|
QList<QAction*> existingActions(_mapsActionGroup->actions());
|
||||||
|
MapAction *lastReady = 0;
|
||||||
|
bool valid = false;
|
||||||
|
|
||||||
for (int i = 0; i < maps.size(); i++) {
|
for (int i = 0; i < maps.size(); i++) {
|
||||||
Map *map = maps.at(i);
|
Map *map = maps.at(i);
|
||||||
MapAction *a = createMapAction(map);
|
MapAction *a;
|
||||||
_mapMenu->insertAction(_mapsEnd, a);
|
|
||||||
if (map->isReady()) {
|
if (!(a = findMapAction(existingActions, map))) {
|
||||||
a->trigger();
|
if (!map->isValid()) {
|
||||||
_showMapAction->setEnabled(true);
|
if (!silent)
|
||||||
_clearMapCacheAction->setEnabled(true);
|
QMessageBox::critical(this, APP_NAME,
|
||||||
} else
|
tr("Error loading map:") + "\n\n" + map->path() + "\n\n"
|
||||||
connect(a, SIGNAL(loaded()), this, SLOT(mapLoaded()));
|
+ map->errorString());
|
||||||
|
delete map;
|
||||||
|
} else {
|
||||||
|
valid = true;
|
||||||
|
a = createMapAction(map);
|
||||||
|
_mapMenu->insertAction(_mapsEnd, a);
|
||||||
|
|
||||||
|
if (map->isReady()) {
|
||||||
|
lastReady = a;
|
||||||
|
_showMapAction->setEnabled(true);
|
||||||
|
_clearMapCacheAction->setEnabled(true);
|
||||||
|
} else
|
||||||
|
connect(a, SIGNAL(loaded()), this, SLOT(mapLoaded()));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
valid = true;
|
||||||
|
map = a->data().value<Map*>();
|
||||||
|
if (map->isReady())
|
||||||
|
lastReady = a;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
action = lastReady;
|
||||||
|
|
||||||
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI::mapLoaded()
|
void GUI::mapLoaded()
|
||||||
@ -1478,13 +1499,94 @@ void GUI::mapLoaded()
|
|||||||
_showMapAction->setEnabled(true);
|
_showMapAction->setEnabled(true);
|
||||||
_clearMapCacheAction->setEnabled(true);
|
_clearMapCacheAction->setEnabled(true);
|
||||||
} else {
|
} else {
|
||||||
QString error = tr("Error loading map:") + "\n\n"
|
QString error = tr("Error loading map:") + "\n\n" + map->path() + "\n\n"
|
||||||
+ map->name() + "\n\n" + map->errorString();
|
+ map->errorString();
|
||||||
QMessageBox::critical(this, APP_NAME, error);
|
QMessageBox::critical(this, APP_NAME, error);
|
||||||
action->deleteLater();
|
action->deleteLater();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GUI::mapLoadedDir()
|
||||||
|
{
|
||||||
|
MapAction *action = static_cast<MapAction*>(QObject::sender());
|
||||||
|
Map *map = action->data().value<Map*>();
|
||||||
|
|
||||||
|
if (map->isValid()) {
|
||||||
|
_showMapAction->setEnabled(true);
|
||||||
|
_clearMapCacheAction->setEnabled(true);
|
||||||
|
QList<MapAction*> actions;
|
||||||
|
actions.append(action);
|
||||||
|
_mapView->loadMaps(actions);
|
||||||
|
} else {
|
||||||
|
QString error = tr("Error loading map:") + "\n\n" + map->path() + "\n\n"
|
||||||
|
+ map->errorString();
|
||||||
|
QMessageBox::critical(this, APP_NAME, error);
|
||||||
|
action->deleteLater();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::loadMapDir()
|
||||||
|
{
|
||||||
|
QString dir(QFileDialog::getExistingDirectory(this,
|
||||||
|
tr("Select map directory"), _mapDir, QFileDialog::ShowDirsOnly));
|
||||||
|
if (dir.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
QList<Map*> maps(MapList::loadMaps(dir));
|
||||||
|
QList<MapAction*> actions;
|
||||||
|
QList<QAction*> existingActions(_mapsActionGroup->actions());
|
||||||
|
QFileInfo fi(dir);
|
||||||
|
QMenu *menu = new QMenu(fi.fileName());
|
||||||
|
|
||||||
|
for (int i = 0; i < maps.size(); i++) {
|
||||||
|
Map *map = maps.at(i);
|
||||||
|
MapAction *a;
|
||||||
|
|
||||||
|
if (!(a = findMapAction(existingActions, map))) {
|
||||||
|
if (!map->isValid()) {
|
||||||
|
QMessageBox::critical(this, APP_NAME, tr("Error loading map:")
|
||||||
|
+ "\n\n" + map->path() + "\n\n" + map->errorString());
|
||||||
|
delete map;
|
||||||
|
} else {
|
||||||
|
a = createMapAction(map);
|
||||||
|
menu->addAction(a);
|
||||||
|
|
||||||
|
if (map->isReady()) {
|
||||||
|
_showMapAction->setEnabled(true);
|
||||||
|
_clearMapCacheAction->setEnabled(true);
|
||||||
|
actions.append(a);
|
||||||
|
} else
|
||||||
|
connect(a, SIGNAL(loaded()), this, SLOT(mapLoadedDir()));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
map = a->data().value<Map*>();
|
||||||
|
if (map->isReady())
|
||||||
|
actions.append(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_mapView->loadMaps(actions);
|
||||||
|
|
||||||
|
if (menu->isEmpty())
|
||||||
|
delete menu;
|
||||||
|
else {
|
||||||
|
menu->setStyleSheet("QMenu { menu-scrollable: 1; }");
|
||||||
|
_mapMenu->insertMenu(_mapsEnd, menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
_mapDir = fi.absolutePath();
|
||||||
|
_areaCount += maps.size();
|
||||||
|
_fileActionGroup->setEnabled(true);
|
||||||
|
_reloadFileAction->setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::clearMapCache()
|
||||||
|
{
|
||||||
|
if (QMessageBox::question(this, APP_NAME,
|
||||||
|
tr("Clear the map tile cache?")) == QMessageBox::Yes)
|
||||||
|
_mapView->clearMapCache();
|
||||||
|
}
|
||||||
|
|
||||||
void GUI::updateStatusBarInfo()
|
void GUI::updateStatusBarInfo()
|
||||||
{
|
{
|
||||||
if (_files.count() == 0)
|
if (_files.count() == 0)
|
||||||
@ -1535,7 +1637,7 @@ void GUI::nextMap()
|
|||||||
if (!checked)
|
if (!checked)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QList<QAction*> maps = _mapsActionGroup->actions();
|
QList<QAction*> maps(_mapsActionGroup->actions());
|
||||||
for (int i = 1; i < maps.size(); i++) {
|
for (int i = 1; i < maps.size(); i++) {
|
||||||
int next = (maps.indexOf(checked) + i) % maps.count();
|
int next = (maps.indexOf(checked) + i) % maps.count();
|
||||||
if (maps.at(next)->isEnabled()) {
|
if (maps.at(next)->isEnabled()) {
|
||||||
@ -1551,7 +1653,7 @@ void GUI::prevMap()
|
|||||||
if (!checked)
|
if (!checked)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QList<QAction*> maps = _mapsActionGroup->actions();
|
QList<QAction*> maps(_mapsActionGroup->actions());
|
||||||
for (int i = 1; i < maps.size(); i++) {
|
for (int i = 1; i < maps.size(); i++) {
|
||||||
int prev = (maps.indexOf(checked) + maps.count() - i) % maps.count();
|
int prev = (maps.indexOf(checked) + maps.count() - i) % maps.count();
|
||||||
if (maps.at(prev)->isEnabled()) {
|
if (maps.at(prev)->isEnabled()) {
|
||||||
@ -1567,18 +1669,25 @@ void GUI::poiFileChecked(int index)
|
|||||||
_poiFilesActions.at(index)->isChecked());
|
_poiFilesActions.at(index)->isChecked());
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI::sliderPositionChanged(qreal pos)
|
|
||||||
{
|
|
||||||
_sliderPos = pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
void GUI::graphChanged(int index)
|
void GUI::graphChanged(int index)
|
||||||
{
|
{
|
||||||
if (index < 0)
|
if (index < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
_mapView->setGraph(index);
|
||||||
|
|
||||||
GraphTab *gt = static_cast<GraphTab*>(_graphTabWidget->widget(index));
|
GraphTab *gt = static_cast<GraphTab*>(_graphTabWidget->widget(index));
|
||||||
gt->setSliderPosition(_sliderPos);
|
if (_lastGraphTab)
|
||||||
|
disconnect(_lastGraphTab, SIGNAL(sliderPositionChanged(qreal)),
|
||||||
|
_mapView, SLOT(setMarkerPosition(qreal)));
|
||||||
|
|
||||||
|
connect(gt, SIGNAL(sliderPositionChanged(qreal)), _mapView,
|
||||||
|
SLOT(setMarkerPosition(qreal)));
|
||||||
|
|
||||||
|
if (_lastGraphTab)
|
||||||
|
gt->setSliderPosition(_lastGraphTab->sliderPosition());
|
||||||
|
|
||||||
|
_lastGraphTab = gt;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI::updateNavigationActions()
|
void GUI::updateNavigationActions()
|
||||||
@ -1657,12 +1766,8 @@ void GUI::setCoordinatesFormat(CoordinatesFormat format)
|
|||||||
|
|
||||||
void GUI::setGraphType(GraphType type)
|
void GUI::setGraphType(GraphType type)
|
||||||
{
|
{
|
||||||
_sliderPos = 0;
|
for (int i = 0; i <_tabs.count(); i++)
|
||||||
|
|
||||||
for (int i = 0; i <_tabs.count(); i++) {
|
|
||||||
_tabs.at(i)->setGraphType(type);
|
_tabs.at(i)->setGraphType(type);
|
||||||
_tabs.at(i)->setSliderPosition(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI::next()
|
void GUI::next()
|
||||||
@ -1777,9 +1882,25 @@ void GUI::dragEnterEvent(QDragEnterEvent *event)
|
|||||||
|
|
||||||
void GUI::dropEvent(QDropEvent *event)
|
void GUI::dropEvent(QDropEvent *event)
|
||||||
{
|
{
|
||||||
QList<QUrl> urls = event->mimeData()->urls();
|
MapAction *lastReady = 0;
|
||||||
for (int i = 0; i < urls.size(); i++)
|
QList<QUrl> urls(event->mimeData()->urls());
|
||||||
openFile(urls.at(i).toLocalFile());
|
|
||||||
|
for (int i = 0; i < urls.size(); i++) {
|
||||||
|
QString file(urls.at(i).toLocalFile());
|
||||||
|
|
||||||
|
if (!openFile(file, true)) {
|
||||||
|
MapAction *a;
|
||||||
|
if (!loadMap(file, a, true))
|
||||||
|
openFile(file, false);
|
||||||
|
else {
|
||||||
|
if (a)
|
||||||
|
lastReady = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastReady)
|
||||||
|
lastReady->trigger();
|
||||||
|
|
||||||
event->acceptProposedAction();
|
event->acceptProposedAction();
|
||||||
}
|
}
|
||||||
@ -1840,9 +1961,6 @@ void GUI::writeSettings()
|
|||||||
!= SHOW_GRAPH_SLIDER_INFO_DEFAULT)
|
!= SHOW_GRAPH_SLIDER_INFO_DEFAULT)
|
||||||
settings.setValue(SHOW_GRAPH_SLIDER_INFO_SETTING,
|
settings.setValue(SHOW_GRAPH_SLIDER_INFO_SETTING,
|
||||||
_showGraphSliderInfoAction->isChecked());
|
_showGraphSliderInfoAction->isChecked());
|
||||||
if (_showMarkersAction->isChecked() != SHOW_MARKERS_DEFAULT)
|
|
||||||
settings.setValue(SHOW_MARKERS_SETTING,
|
|
||||||
_showMarkersAction->isChecked());
|
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
settings.beginGroup(POI_SETTINGS_GROUP);
|
settings.beginGroup(POI_SETTINGS_GROUP);
|
||||||
@ -1883,6 +2001,9 @@ void GUI::writeSettings()
|
|||||||
if (_showTicksAction->isChecked() != SHOW_TICKS_DEFAULT)
|
if (_showTicksAction->isChecked() != SHOW_TICKS_DEFAULT)
|
||||||
settings.setValue(SHOW_TICKS_SETTING,
|
settings.setValue(SHOW_TICKS_SETTING,
|
||||||
_showTicksAction->isChecked());
|
_showTicksAction->isChecked());
|
||||||
|
if (_showMarkersAction->isChecked() != SHOW_MARKERS_DEFAULT)
|
||||||
|
settings.setValue(SHOW_MARKERS_SETTING,
|
||||||
|
_showMarkersAction->isChecked());
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
settings.beginGroup(PDF_EXPORT_SETTINGS_GROUP);
|
settings.beginGroup(PDF_EXPORT_SETTINGS_GROUP);
|
||||||
@ -1988,21 +2109,17 @@ void GUI::writeSettings()
|
|||||||
if (_options.showSecondarySpeed != SHOW_SECONDARY_SPEED_DEFAULT)
|
if (_options.showSecondarySpeed != SHOW_SECONDARY_SPEED_DEFAULT)
|
||||||
settings.setValue(SHOW_SECONDARY_SPEED_SETTING,
|
settings.setValue(SHOW_SECONDARY_SPEED_SETTING,
|
||||||
_options.showSecondarySpeed);
|
_options.showSecondarySpeed);
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
if (_options.timeZone != TimeZoneInfo())
|
if (_options.timeZone != TimeZoneInfo())
|
||||||
settings.setValue(TIME_ZONE_SETTING, QVariant::fromValue(
|
settings.setValue(TIME_ZONE_SETTING, QVariant::fromValue(
|
||||||
_options.timeZone));
|
_options.timeZone));
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
if (_options.useSegments != USE_SEGMENTS_DEFAULT)
|
if (_options.useSegments != USE_SEGMENTS_DEFAULT)
|
||||||
settings.setValue(USE_SEGMENTS_SETTING, _options.useSegments);
|
settings.setValue(USE_SEGMENTS_SETTING, _options.useSegments);
|
||||||
if (_options.poiRadius != POI_RADIUS_DEFAULT)
|
if (_options.poiRadius != POI_RADIUS_DEFAULT)
|
||||||
settings.setValue(POI_RADIUS_SETTING, _options.poiRadius);
|
settings.setValue(POI_RADIUS_SETTING, _options.poiRadius);
|
||||||
if (_options.useOpenGL != USE_OPENGL_DEFAULT)
|
if (_options.useOpenGL != USE_OPENGL_DEFAULT)
|
||||||
settings.setValue(USE_OPENGL_SETTING, _options.useOpenGL);
|
settings.setValue(USE_OPENGL_SETTING, _options.useOpenGL);
|
||||||
#ifdef ENABLE_HTTP2
|
|
||||||
if (_options.enableHTTP2 != ENABLE_HTTP2_DEFAULT)
|
if (_options.enableHTTP2 != ENABLE_HTTP2_DEFAULT)
|
||||||
settings.setValue(ENABLE_HTTP2_SETTING, _options.enableHTTP2);
|
settings.setValue(ENABLE_HTTP2_SETTING, _options.enableHTTP2);
|
||||||
#endif // ENABLE_HTTP2
|
|
||||||
if (_options.pixmapCache != PIXMAP_CACHE_DEFAULT)
|
if (_options.pixmapCache != PIXMAP_CACHE_DEFAULT)
|
||||||
settings.setValue(PIXMAP_CACHE_SETTING, _options.pixmapCache);
|
settings.setValue(PIXMAP_CACHE_SETTING, _options.pixmapCache);
|
||||||
if (_options.connectionTimeout != CONNECTION_TIMEOUT_DEFAULT)
|
if (_options.connectionTimeout != CONNECTION_TIMEOUT_DEFAULT)
|
||||||
@ -2026,12 +2143,12 @@ void GUI::writeSettings()
|
|||||||
_options.separateGraphPage);
|
_options.separateGraphPage);
|
||||||
if (_options.sliderColor != SLIDER_COLOR_DEFAULT)
|
if (_options.sliderColor != SLIDER_COLOR_DEFAULT)
|
||||||
settings.setValue(SLIDER_COLOR_SETTING, _options.sliderColor);
|
settings.setValue(SLIDER_COLOR_SETTING, _options.sliderColor);
|
||||||
if (_options.projection != PROJECTION_DEFAULT)
|
if (_options.outputProjection != OUTPUT_PROJECTION_DEFAULT)
|
||||||
settings.setValue(PROJECTION_SETTING, _options.projection);
|
settings.setValue(OUTPUT_PROJECTION_SETTING, _options.outputProjection);
|
||||||
#ifdef ENABLE_HIDPI
|
if (_options.inputProjection != INPUT_PROJECTION_DEFAULT)
|
||||||
|
settings.setValue(INPUT_PROJECTION_SETTING, _options.outputProjection);
|
||||||
if (_options.hidpiMap != HIDPI_MAP_DEFAULT)
|
if (_options.hidpiMap != HIDPI_MAP_DEFAULT)
|
||||||
settings.setValue(HIDPI_MAP_SETTING, _options.hidpiMap);
|
settings.setValue(HIDPI_MAP_SETTING, _options.hidpiMap);
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2114,15 +2231,11 @@ void GUI::readSettings()
|
|||||||
showGraphSliderInfo(false);
|
showGraphSliderInfo(false);
|
||||||
else
|
else
|
||||||
_showGraphSliderInfoAction->setChecked(true);
|
_showGraphSliderInfoAction->setChecked(true);
|
||||||
if (!settings.value(SHOW_MARKERS_SETTING, SHOW_MARKERS_DEFAULT).toBool())
|
|
||||||
_mapView->showMarkers(false);
|
|
||||||
else
|
|
||||||
_showMarkersAction->setChecked(true);
|
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
settings.beginGroup(POI_SETTINGS_GROUP);
|
settings.beginGroup(POI_SETTINGS_GROUP);
|
||||||
if (!settings.value(OVERLAP_POI_SETTING, OVERLAP_POI_DEFAULT).toBool())
|
if (!settings.value(OVERLAP_POI_SETTING, OVERLAP_POI_DEFAULT).toBool())
|
||||||
_mapView->setPOIOverlap(false);
|
_mapView->showOverlappedPOIs(false);
|
||||||
else
|
else
|
||||||
_overlapPOIAction->setChecked(true);
|
_overlapPOIAction->setChecked(true);
|
||||||
if (!settings.value(LABELS_POI_SETTING, LABELS_POI_DEFAULT).toBool())
|
if (!settings.value(LABELS_POI_SETTING, LABELS_POI_DEFAULT).toBool())
|
||||||
@ -2184,14 +2297,18 @@ void GUI::readSettings()
|
|||||||
_mapView->showTicks(true);
|
_mapView->showTicks(true);
|
||||||
_showTicksAction->setChecked(true);
|
_showTicksAction->setChecked(true);
|
||||||
}
|
}
|
||||||
|
if (!settings.value(SHOW_MARKERS_SETTING, SHOW_MARKERS_DEFAULT).toBool())
|
||||||
|
_mapView->showMarkers(false);
|
||||||
|
else
|
||||||
|
_showMarkersAction->setChecked(true);
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
settings.beginGroup(PDF_EXPORT_SETTINGS_GROUP);
|
settings.beginGroup(PDF_EXPORT_SETTINGS_GROUP);
|
||||||
_pdfExport.orientation = (QPrinter::Orientation) settings.value(
|
_pdfExport.orientation = (QPageLayout::Orientation) settings.value(
|
||||||
PAPER_ORIENTATION_SETTING, PAPER_ORIENTATION_DEFAULT).toInt();
|
PAPER_ORIENTATION_SETTING, PAPER_ORIENTATION_DEFAULT).toInt();
|
||||||
_pdfExport.resolution = settings.value(RESOLUTION_SETTING,
|
_pdfExport.resolution = settings.value(RESOLUTION_SETTING,
|
||||||
RESOLUTION_DEFAULT).toInt();
|
RESOLUTION_DEFAULT).toInt();
|
||||||
_pdfExport.paperSize = (QPrinter::PaperSize) settings.value(
|
_pdfExport.paperSize = (QPageSize::PageSizeId) settings.value(
|
||||||
PAPER_SIZE_SETTING, PAPER_SIZE_DEFAULT).toInt();
|
PAPER_SIZE_SETTING, PAPER_SIZE_DEFAULT).toInt();
|
||||||
qreal ml = settings.value(PDF_MARGIN_LEFT_SETTING, PDF_MARGIN_LEFT_DEFAULT)
|
qreal ml = settings.value(PDF_MARGIN_LEFT_SETTING, PDF_MARGIN_LEFT_DEFAULT)
|
||||||
.toReal();
|
.toReal();
|
||||||
@ -2201,7 +2318,7 @@ void GUI::readSettings()
|
|||||||
PDF_MARGIN_RIGHT_DEFAULT).toReal();
|
PDF_MARGIN_RIGHT_DEFAULT).toReal();
|
||||||
qreal mb = settings.value(PDF_MARGIN_BOTTOM_SETTING,
|
qreal mb = settings.value(PDF_MARGIN_BOTTOM_SETTING,
|
||||||
PDF_MARGIN_BOTTOM_DEFAULT).toReal();
|
PDF_MARGIN_BOTTOM_DEFAULT).toReal();
|
||||||
_pdfExport.margins = MarginsF(ml, mt, mr, mb);
|
_pdfExport.margins = QMarginsF(ml, mt, mr, mb);
|
||||||
_pdfExport.fileName = settings.value(PDF_FILENAME_SETTING,
|
_pdfExport.fileName = settings.value(PDF_FILENAME_SETTING,
|
||||||
PDF_FILENAME_DEFAULT).toString();
|
PDF_FILENAME_DEFAULT).toString();
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
@ -2286,9 +2403,7 @@ void GUI::readSettings()
|
|||||||
_options.showSecondarySpeed = settings.value(
|
_options.showSecondarySpeed = settings.value(
|
||||||
SHOW_SECONDARY_SPEED_SETTING,
|
SHOW_SECONDARY_SPEED_SETTING,
|
||||||
SHOW_SECONDARY_SPEED_DEFAULT).toBool();
|
SHOW_SECONDARY_SPEED_DEFAULT).toBool();
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
_options.timeZone = settings.value(TIME_ZONE_SETTING).value<TimeZoneInfo>();
|
_options.timeZone = settings.value(TIME_ZONE_SETTING).value<TimeZoneInfo>();
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
_options.useSegments = settings.value(USE_SEGMENTS_SETTING,
|
_options.useSegments = settings.value(USE_SEGMENTS_SETTING,
|
||||||
USE_SEGMENTS_DEFAULT).toBool();
|
USE_SEGMENTS_DEFAULT).toBool();
|
||||||
_options.automaticPause = settings.value(AUTOMATIC_PAUSE_SETTING,
|
_options.automaticPause = settings.value(AUTOMATIC_PAUSE_SETTING,
|
||||||
@ -2299,10 +2414,8 @@ void GUI::readSettings()
|
|||||||
.toInt();
|
.toInt();
|
||||||
_options.useOpenGL = settings.value(USE_OPENGL_SETTING, USE_OPENGL_DEFAULT)
|
_options.useOpenGL = settings.value(USE_OPENGL_SETTING, USE_OPENGL_DEFAULT)
|
||||||
.toBool();
|
.toBool();
|
||||||
#ifdef ENABLE_HTTP2
|
|
||||||
_options.enableHTTP2 = settings.value(ENABLE_HTTP2_SETTING,
|
_options.enableHTTP2 = settings.value(ENABLE_HTTP2_SETTING,
|
||||||
ENABLE_HTTP2_DEFAULT).toBool();
|
ENABLE_HTTP2_DEFAULT).toBool();
|
||||||
#endif // ENABLE_HTTP2
|
|
||||||
_options.pixmapCache = settings.value(PIXMAP_CACHE_SETTING,
|
_options.pixmapCache = settings.value(PIXMAP_CACHE_SETTING,
|
||||||
PIXMAP_CACHE_DEFAULT).toInt();
|
PIXMAP_CACHE_DEFAULT).toInt();
|
||||||
_options.connectionTimeout = settings.value(CONNECTION_TIMEOUT_SETTING,
|
_options.connectionTimeout = settings.value(CONNECTION_TIMEOUT_SETTING,
|
||||||
@ -2325,12 +2438,12 @@ void GUI::readSettings()
|
|||||||
SEPARATE_GRAPH_PAGE_DEFAULT).toBool();
|
SEPARATE_GRAPH_PAGE_DEFAULT).toBool();
|
||||||
_options.sliderColor = settings.value(SLIDER_COLOR_SETTING,
|
_options.sliderColor = settings.value(SLIDER_COLOR_SETTING,
|
||||||
SLIDER_COLOR_DEFAULT).value<QColor>();
|
SLIDER_COLOR_DEFAULT).value<QColor>();
|
||||||
_options.projection = settings.value(PROJECTION_SETTING, PROJECTION_DEFAULT)
|
_options.outputProjection = settings.value(OUTPUT_PROJECTION_SETTING,
|
||||||
.toInt();
|
OUTPUT_PROJECTION_DEFAULT).toInt();
|
||||||
#ifdef ENABLE_HIDPI
|
_options.inputProjection = settings.value(INPUT_PROJECTION_SETTING,
|
||||||
|
INPUT_PROJECTION_DEFAULT).toInt();
|
||||||
_options.hidpiMap = settings.value(HIDPI_MAP_SETTING, HIDPI_MAP_SETTING)
|
_options.hidpiMap = settings.value(HIDPI_MAP_SETTING, HIDPI_MAP_SETTING)
|
||||||
.toBool();
|
.toBool();
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
|
|
||||||
_mapView->setPalette(_options.palette);
|
_mapView->setPalette(_options.palette);
|
||||||
_mapView->setMapOpacity(_options.mapOpacity);
|
_mapView->setMapOpacity(_options.mapOpacity);
|
||||||
@ -2350,14 +2463,11 @@ void GUI::readSettings()
|
|||||||
_mapView->setMarkerColor(_options.sliderColor);
|
_mapView->setMarkerColor(_options.sliderColor);
|
||||||
if (_options.useOpenGL)
|
if (_options.useOpenGL)
|
||||||
_mapView->useOpenGL(true);
|
_mapView->useOpenGL(true);
|
||||||
#ifdef ENABLE_HIDPI
|
|
||||||
_mapView->setDevicePixelRatio(devicePixelRatioF(),
|
_mapView->setDevicePixelRatio(devicePixelRatioF(),
|
||||||
_options.hidpiMap ? devicePixelRatioF() : 1.0);
|
_options.hidpiMap ? devicePixelRatioF() : 1.0);
|
||||||
#endif // ENABLE_HIDPI
|
_mapView->setOutputProjection(_options.outputProjection);
|
||||||
_mapView->setProjection(_options.projection);
|
_mapView->setInputProjection(_options.inputProjection);
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
_mapView->setTimeZone(_options.timeZone.zone());
|
_mapView->setTimeZone(_options.timeZone.zone());
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
|
|
||||||
for (int i = 0; i < _tabs.count(); i++) {
|
for (int i = 0; i < _tabs.count(); i++) {
|
||||||
_tabs.at(i)->setPalette(_options.palette);
|
_tabs.at(i)->setPalette(_options.palette);
|
||||||
@ -2397,7 +2507,7 @@ void GUI::readSettings()
|
|||||||
|
|
||||||
QAction *GUI::mapAction(const QString &name)
|
QAction *GUI::mapAction(const QString &name)
|
||||||
{
|
{
|
||||||
QList<QAction *> maps = _mapsActionGroup->actions();
|
QList<QAction *> maps(_mapsActionGroup->actions());
|
||||||
|
|
||||||
// Last map
|
// Last map
|
||||||
for (int i = 0; i < maps.count(); i++) {
|
for (int i = 0; i < maps.count(); i++) {
|
||||||
@ -2448,20 +2558,17 @@ void GUI::show()
|
|||||||
{
|
{
|
||||||
QMainWindow::show();
|
QMainWindow::show();
|
||||||
|
|
||||||
#ifdef ENABLE_HIDPI
|
|
||||||
QWindow *w = windowHandle();
|
QWindow *w = windowHandle();
|
||||||
connect(w->screen(), SIGNAL(logicalDotsPerInchChanged(qreal)), this,
|
connect(w->screen(), SIGNAL(logicalDotsPerInchChanged(qreal)), this,
|
||||||
SLOT(logicalDotsPerInchChanged(qreal)));
|
SLOT(logicalDotsPerInchChanged(qreal)));
|
||||||
connect(w, SIGNAL(screenChanged(QScreen*)), this,
|
connect(w, SIGNAL(screenChanged(QScreen*)), this,
|
||||||
SLOT(screenChanged(QScreen*)));
|
SLOT(screenChanged(QScreen*)));
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
|
|
||||||
_mapView->fitContentToSize();
|
_mapView->fitContentToSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI::screenChanged(QScreen *screen)
|
void GUI::screenChanged(QScreen *screen)
|
||||||
{
|
{
|
||||||
#ifdef ENABLE_HIDPI
|
|
||||||
_mapView->setDevicePixelRatio(devicePixelRatioF(),
|
_mapView->setDevicePixelRatio(devicePixelRatioF(),
|
||||||
_options.hidpiMap ? devicePixelRatioF() : 1.0);
|
_options.hidpiMap ? devicePixelRatioF() : 1.0);
|
||||||
|
|
||||||
@ -2469,17 +2576,12 @@ void GUI::screenChanged(QScreen *screen)
|
|||||||
SLOT(logicalDotsPerInchChanged(qreal)));
|
SLOT(logicalDotsPerInchChanged(qreal)));
|
||||||
connect(screen, SIGNAL(logicalDotsPerInchChanged(qreal)), this,
|
connect(screen, SIGNAL(logicalDotsPerInchChanged(qreal)), this,
|
||||||
SLOT(logicalDotsPerInchChanged(qreal)));
|
SLOT(logicalDotsPerInchChanged(qreal)));
|
||||||
#else // ENABLE_HIDPI
|
|
||||||
Q_UNUSED(screen);
|
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI::logicalDotsPerInchChanged(qreal dpi)
|
void GUI::logicalDotsPerInchChanged(qreal dpi)
|
||||||
{
|
{
|
||||||
Q_UNUSED(dpi)
|
Q_UNUSED(dpi)
|
||||||
|
|
||||||
#ifdef ENABLE_HIDPI
|
|
||||||
_mapView->setDevicePixelRatio(devicePixelRatioF(),
|
_mapView->setDevicePixelRatio(devicePixelRatioF(),
|
||||||
_options.hidpiMap ? devicePixelRatioF() : 1.0);
|
_options.hidpiMap ? devicePixelRatioF() : 1.0);
|
||||||
#endif // ENBLE_HIDPI
|
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ class Map;
|
|||||||
class POI;
|
class POI;
|
||||||
class QScreen;
|
class QScreen;
|
||||||
class MapAction;
|
class MapAction;
|
||||||
|
class Data;
|
||||||
|
|
||||||
class GUI : public QMainWindow
|
class GUI : public QMainWindow
|
||||||
{
|
{
|
||||||
@ -38,7 +39,9 @@ class GUI : public QMainWindow
|
|||||||
public:
|
public:
|
||||||
GUI();
|
GUI();
|
||||||
|
|
||||||
bool openFile(const QString &fileName);
|
bool openFile(const QString &fileName, bool silent = false);
|
||||||
|
bool loadMap(const QString &fileName, MapAction *&action,
|
||||||
|
bool silent = false);
|
||||||
void show();
|
void show();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
@ -62,9 +65,11 @@ private slots:
|
|||||||
void showTracks(bool show);
|
void showTracks(bool show);
|
||||||
void showRoutes(bool show);
|
void showRoutes(bool show);
|
||||||
void loadMap();
|
void loadMap();
|
||||||
|
void loadMapDir();
|
||||||
void nextMap();
|
void nextMap();
|
||||||
void prevMap();
|
void prevMap();
|
||||||
void openOptions();
|
void openOptions();
|
||||||
|
void clearMapCache();
|
||||||
|
|
||||||
void mapChanged();
|
void mapChanged();
|
||||||
void graphChanged(int);
|
void graphChanged(int);
|
||||||
@ -86,11 +91,11 @@ private slots:
|
|||||||
void setDegreesMinutes() {setCoordinatesFormat(DegreesMinutes);}
|
void setDegreesMinutes() {setCoordinatesFormat(DegreesMinutes);}
|
||||||
void setDMS() {setCoordinatesFormat(DMS);}
|
void setDMS() {setCoordinatesFormat(DMS);}
|
||||||
|
|
||||||
void sliderPositionChanged(qreal pos);
|
|
||||||
void screenChanged(QScreen *screen);
|
void screenChanged(QScreen *screen);
|
||||||
void logicalDotsPerInchChanged(qreal dpi);
|
void logicalDotsPerInchChanged(qreal dpi);
|
||||||
|
|
||||||
void mapLoaded();
|
void mapLoaded();
|
||||||
|
void mapLoadedDir();
|
||||||
void mapInitialized();
|
void mapInitialized();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -117,8 +122,8 @@ private:
|
|||||||
void createBrowser();
|
void createBrowser();
|
||||||
|
|
||||||
bool openPOIFile(const QString &fileName);
|
bool openPOIFile(const QString &fileName);
|
||||||
bool loadFile(const QString &fileName);
|
bool loadFile(const QString &fileName, bool silent = false);
|
||||||
bool loadMap(const QString &fileName);
|
void loadData(const Data &data);
|
||||||
void updateStatusBarInfo();
|
void updateStatusBarInfo();
|
||||||
void updateWindowTitle();
|
void updateWindowTitle();
|
||||||
void updateNavigationActions();
|
void updateNavigationActions();
|
||||||
@ -172,6 +177,7 @@ private:
|
|||||||
QAction *_showMapAction;
|
QAction *_showMapAction;
|
||||||
QAction *_fullscreenAction;
|
QAction *_fullscreenAction;
|
||||||
QAction *_loadMapAction;
|
QAction *_loadMapAction;
|
||||||
|
QAction *_loadMapDirAction;
|
||||||
QAction *_clearMapCacheAction;
|
QAction *_clearMapCacheAction;
|
||||||
QAction *_showGraphsAction;
|
QAction *_showGraphsAction;
|
||||||
QAction *_showGraphGridAction;
|
QAction *_showGraphGridAction;
|
||||||
@ -229,7 +235,7 @@ private:
|
|||||||
DateTimeRange _dateRange;
|
DateTimeRange _dateRange;
|
||||||
QString _pathName;
|
QString _pathName;
|
||||||
|
|
||||||
qreal _sliderPos;
|
GraphTab *_lastGraphTab;
|
||||||
|
|
||||||
QList<QByteArray> _windowStates;
|
QList<QByteArray> _windowStates;
|
||||||
int _frameStyle;
|
int _frameStyle;
|
||||||
|
@ -18,9 +18,9 @@ void InfoItem::updateBoundingRect()
|
|||||||
|
|
||||||
for (QList<KV<QString, QString> >::const_iterator i = _list.constBegin();
|
for (QList<KV<QString, QString> >::const_iterator i = _list.constBegin();
|
||||||
i != _list.constEnd(); i++) {
|
i != _list.constEnd(); i++) {
|
||||||
width += fm.width(i->key() + ": ");
|
width += fm.horizontalAdvance(i->key() + ": " + i->value());
|
||||||
width += fm.width(i->value()) + ((i == _list.constEnd() - 1)
|
if (i != _list.constEnd() - 1)
|
||||||
? 0 : PADDING);
|
width += PADDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
_boundingRect = QRectF(0, 0, width, _list.isEmpty() ? 0 : fm.height());
|
_boundingRect = QRectF(0, 0, width, _list.isEmpty() ? 0 : fm.height());
|
||||||
@ -39,12 +39,11 @@ void InfoItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
|||||||
|
|
||||||
for (QList<KV<QString, QString> >::const_iterator i = _list.constBegin();
|
for (QList<KV<QString, QString> >::const_iterator i = _list.constBegin();
|
||||||
i != _list.constEnd(); i++) {
|
i != _list.constEnd(); i++) {
|
||||||
painter->drawText(width, fm.height() - fm.descent(), i->key() + ": ");
|
QString text(i->key() + ": " + i->value());
|
||||||
width += fm.width(i->key() + ": ");
|
painter->drawText(width, fm.height() - fm.descent(), text);
|
||||||
painter->drawText(width, fm.height() - fm.descent(), i->value());
|
width += fm.horizontalAdvance(text);
|
||||||
width += fm.width(i->value()) + ((i == _list.constEnd() - 1)
|
|
||||||
? 0 : PADDING);
|
|
||||||
if (i != _list.constEnd() - 1) {
|
if (i != _list.constEnd() - 1) {
|
||||||
|
width += PADDING;
|
||||||
painter->save();
|
painter->save();
|
||||||
painter->setPen(Qt::gray);
|
painter->setPen(Qt::gray);
|
||||||
painter->drawLine(width - PADDING/2, fm.descent(),
|
painter->drawLine(width - PADDING/2, fm.descent(),
|
||||||
|
230
src/GUI/mapitem.cpp
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
#include <cmath>
|
||||||
|
#include <QCursor>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QGraphicsSceneMouseEvent>
|
||||||
|
#include "map/map.h"
|
||||||
|
#include "mapaction.h"
|
||||||
|
#include "popup.h"
|
||||||
|
#include "tooltip.h"
|
||||||
|
#include "mapitem.h"
|
||||||
|
|
||||||
|
|
||||||
|
static void growLeft(Map *map, const Coordinates &c, QRectF &rect)
|
||||||
|
{
|
||||||
|
QPointF p(map->ll2xy(c));
|
||||||
|
|
||||||
|
if (p.x() < rect.left())
|
||||||
|
rect.setLeft(p.x());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void growRight(Map *map, const Coordinates &c, QRectF &rect)
|
||||||
|
{
|
||||||
|
|
||||||
|
QPointF p(map->ll2xy(c));
|
||||||
|
|
||||||
|
if (p.x() > rect.right())
|
||||||
|
rect.setRight(p.x());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void growTop(Map *map, const Coordinates &c, QRectF &rect)
|
||||||
|
{
|
||||||
|
QPointF p(map->ll2xy(c));
|
||||||
|
|
||||||
|
if (p.y() > rect.top())
|
||||||
|
rect.setTop(p.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void growBottom(Map *map, const Coordinates &c, QRectF &rect)
|
||||||
|
{
|
||||||
|
QPointF p(map->ll2xy(c));
|
||||||
|
|
||||||
|
if (p.y() < rect.bottom())
|
||||||
|
rect.setBottom(p.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
static QRectF bbox(const RectC &rect, Map *map, int samples = 100)
|
||||||
|
{
|
||||||
|
if (!rect.isValid())
|
||||||
|
return QRectF();
|
||||||
|
|
||||||
|
double dx = rect.width() / samples;
|
||||||
|
double dy = rect.height() / samples;
|
||||||
|
|
||||||
|
QPointF tl(map->ll2xy(rect.topLeft()));
|
||||||
|
QPointF br(map->ll2xy(rect.bottomRight()));
|
||||||
|
QRectF prect(tl, br);
|
||||||
|
|
||||||
|
for (int i = 0; i <= samples; i++) {
|
||||||
|
double x = remainder(rect.left() + i * dx, 360.0);
|
||||||
|
growTop(map, Coordinates(x, rect.bottom()), prect);
|
||||||
|
growBottom(map, Coordinates(x, rect.top()), prect);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i <= samples; i++) {
|
||||||
|
double y = rect.bottom() + i * dy;
|
||||||
|
growLeft(map, Coordinates(rect.left(), y), prect);
|
||||||
|
growRight(map, Coordinates(rect.right(), y), prect);
|
||||||
|
}
|
||||||
|
|
||||||
|
return prect;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString MapItem::info() const
|
||||||
|
{
|
||||||
|
ToolTip tt;
|
||||||
|
|
||||||
|
if (!_name.isEmpty())
|
||||||
|
tt.insert(tr("Name"), _name);
|
||||||
|
if (!_fileName.isEmpty())
|
||||||
|
tt.insert(tr("File"), _fileName);
|
||||||
|
|
||||||
|
return tt.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
MapItem::MapItem(MapAction *action, Map *map, GraphicsItem *parent)
|
||||||
|
: PlaneItem(parent)
|
||||||
|
{
|
||||||
|
Map *src = action->data().value<Map*>();
|
||||||
|
Q_ASSERT(map->isReady());
|
||||||
|
|
||||||
|
_name = src->name();
|
||||||
|
_fileName = src->path();
|
||||||
|
_bounds = src->llBounds();
|
||||||
|
|
||||||
|
connect(this, SIGNAL(triggered()), action, SLOT(trigger()));
|
||||||
|
|
||||||
|
_map = map;
|
||||||
|
_digitalZoom = 0;
|
||||||
|
|
||||||
|
_width = 2;
|
||||||
|
_opacity = 0.5;
|
||||||
|
QBrush brush(Qt::SolidPattern);
|
||||||
|
_pen = QPen(brush, _width);
|
||||||
|
|
||||||
|
updatePainterPath();
|
||||||
|
|
||||||
|
setCursor(Qt::ArrowCursor);
|
||||||
|
setAcceptHoverEvents(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapItem::updatePainterPath()
|
||||||
|
{
|
||||||
|
_painterPath = QPainterPath();
|
||||||
|
|
||||||
|
QRectF r(bbox(_bounds, _map));
|
||||||
|
|
||||||
|
if (r.left() > r.right()) {
|
||||||
|
QRectF r1(bbox(RectC(_bounds.topLeft(),
|
||||||
|
Coordinates(180, _bounds.bottomRight().lat())), _map));
|
||||||
|
QRectF r2(bbox(RectC(Coordinates(-180, _bounds.topLeft().lat()),
|
||||||
|
_bounds.bottomRight()), _map));
|
||||||
|
|
||||||
|
_painterPath.addRect(r1);
|
||||||
|
_painterPath.addRect(r2);
|
||||||
|
} else
|
||||||
|
_painterPath.addRect(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
||||||
|
QWidget *widget)
|
||||||
|
{
|
||||||
|
Q_UNUSED(option);
|
||||||
|
Q_UNUSED(widget);
|
||||||
|
|
||||||
|
painter->setPen(_width ? _pen : QPen(Qt::NoPen));
|
||||||
|
painter->drawPath(_painterPath);
|
||||||
|
painter->fillPath(_painterPath, _brush);
|
||||||
|
|
||||||
|
//QPen p = QPen(QBrush(Qt::red), 0);
|
||||||
|
//painter->setPen(p);
|
||||||
|
//painter->drawRect(boundingRect());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapItem::setMap(Map *map)
|
||||||
|
{
|
||||||
|
prepareGeometryChange();
|
||||||
|
|
||||||
|
_map = map;
|
||||||
|
|
||||||
|
updatePainterPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapItem::setColor(const QColor &color)
|
||||||
|
{
|
||||||
|
if (_pen.color() == color)
|
||||||
|
return;
|
||||||
|
|
||||||
|
QColor bc(color);
|
||||||
|
bc.setAlphaF(_opacity * color.alphaF());
|
||||||
|
|
||||||
|
_pen.setColor(color);
|
||||||
|
_brush = QBrush(bc);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapItem::setOpacity(qreal opacity)
|
||||||
|
{
|
||||||
|
if (_opacity == opacity)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_opacity = opacity;
|
||||||
|
QColor bc(_pen.color());
|
||||||
|
bc.setAlphaF(_opacity * _pen.color().alphaF());
|
||||||
|
_brush = QBrush(bc);
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapItem::setWidth(qreal width)
|
||||||
|
{
|
||||||
|
if (_width == width)
|
||||||
|
return;
|
||||||
|
|
||||||
|
prepareGeometryChange();
|
||||||
|
|
||||||
|
_width = width;
|
||||||
|
_pen.setWidthF(_width * pow(2, -_digitalZoom));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapItem::setStyle(Qt::PenStyle style)
|
||||||
|
{
|
||||||
|
if (_pen.style() == style)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_pen.setStyle(style);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapItem::setDigitalZoom(int zoom)
|
||||||
|
{
|
||||||
|
if (_digitalZoom == zoom)
|
||||||
|
return;
|
||||||
|
|
||||||
|
prepareGeometryChange();
|
||||||
|
|
||||||
|
_digitalZoom = zoom;
|
||||||
|
_pen.setWidthF(_width * pow(2, -_digitalZoom));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event);
|
||||||
|
|
||||||
|
_pen.setWidthF((_width + 1) * pow(2, -_digitalZoom));
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event);
|
||||||
|
|
||||||
|
_pen.setWidthF(_width * pow(2, -_digitalZoom));
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event);
|
||||||
|
|
||||||
|
emit triggered();
|
||||||
|
}
|
57
src/GUI/mapitem.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
#ifndef MAPITEM_H
|
||||||
|
#define MAPITEM_H
|
||||||
|
|
||||||
|
#include "planeitem.h"
|
||||||
|
|
||||||
|
class MapAction;
|
||||||
|
|
||||||
|
class MapItem : public QObject, public PlaneItem
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
MapItem(MapAction *action, Map *map, GraphicsItem *parent = 0);
|
||||||
|
|
||||||
|
QPainterPath shape() const {return _painterPath;}
|
||||||
|
QRectF boundingRect() const {return _painterPath.boundingRect();}
|
||||||
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
||||||
|
QWidget *widget);
|
||||||
|
|
||||||
|
RectC bounds() const {return _bounds;}
|
||||||
|
void setMap(Map *map);
|
||||||
|
|
||||||
|
void setColor(const QColor &color);
|
||||||
|
void setOpacity(qreal opacity);
|
||||||
|
void setWidth(qreal width);
|
||||||
|
void setStyle(Qt::PenStyle style);
|
||||||
|
void setDigitalZoom(int zoom);
|
||||||
|
|
||||||
|
QString info() const;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void triggered();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
|
||||||
|
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
|
||||||
|
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void updatePainterPath();
|
||||||
|
|
||||||
|
RectC _bounds;
|
||||||
|
QString _name;
|
||||||
|
QString _fileName;
|
||||||
|
|
||||||
|
Map *_map;
|
||||||
|
int _digitalZoom;
|
||||||
|
|
||||||
|
qreal _width;
|
||||||
|
QPen _pen;
|
||||||
|
QBrush _brush;
|
||||||
|
qreal _opacity;
|
||||||
|
|
||||||
|
QPainterPath _painterPath;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MAPITEM_H
|
@ -4,19 +4,21 @@
|
|||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QScrollBar>
|
#include <QScrollBar>
|
||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
|
#include <QOpenGLWidget>
|
||||||
#include "data/poi.h"
|
#include "data/poi.h"
|
||||||
#include "data/data.h"
|
#include "data/data.h"
|
||||||
#include "map/map.h"
|
#include "map/map.h"
|
||||||
#include "map/pcs.h"
|
#include "map/pcs.h"
|
||||||
#include "opengl.h"
|
|
||||||
#include "trackitem.h"
|
#include "trackitem.h"
|
||||||
#include "routeitem.h"
|
#include "routeitem.h"
|
||||||
#include "waypointitem.h"
|
#include "waypointitem.h"
|
||||||
#include "areaitem.h"
|
#include "areaitem.h"
|
||||||
#include "scaleitem.h"
|
#include "scaleitem.h"
|
||||||
#include "coordinatesitem.h"
|
#include "coordinatesitem.h"
|
||||||
|
#include "mapitem.h"
|
||||||
#include "keys.h"
|
#include "keys.h"
|
||||||
#include "graphicsscene.h"
|
#include "graphicsscene.h"
|
||||||
|
#include "mapaction.h"
|
||||||
#include "mapview.h"
|
#include "mapview.h"
|
||||||
|
|
||||||
|
|
||||||
@ -27,6 +29,20 @@
|
|||||||
#define COORDINATES_OFFSET SCALE_OFFSET
|
#define COORDINATES_OFFSET SCALE_OFFSET
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
static void updateZValues(T &items)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < items.size(); i++) {
|
||||||
|
const QGraphicsItem *ai = items.at(i);
|
||||||
|
for (int j = 0; j < items.size(); j++) {
|
||||||
|
QGraphicsItem *aj = items[j];
|
||||||
|
if (aj->boundingRect().contains(ai->boundingRect()))
|
||||||
|
aj->setZValue(qMin(ai->zValue() - 1, aj->zValue()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MapView::MapView(Map *map, POI *poi, QWidget *parent)
|
MapView::MapView(Map *map, POI *poi, QWidget *parent)
|
||||||
: QGraphicsView(parent)
|
: QGraphicsView(parent)
|
||||||
{
|
{
|
||||||
@ -39,7 +55,7 @@ MapView::MapView(Map *map, POI *poi, QWidget *parent)
|
|||||||
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
|
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
|
||||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||||
setRenderHint(QPainter::Antialiasing, true);
|
setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
|
||||||
setResizeAnchor(QGraphicsView::AnchorViewCenter);
|
setResizeAnchor(QGraphicsView::AnchorViewCenter);
|
||||||
setAcceptDrops(false);
|
setAcceptDrops(false);
|
||||||
|
|
||||||
@ -51,10 +67,12 @@ MapView::MapView(Map *map, POI *poi, QWidget *parent)
|
|||||||
_coordinates->setVisible(false);
|
_coordinates->setVisible(false);
|
||||||
_scene->addItem(_coordinates);
|
_scene->addItem(_coordinates);
|
||||||
|
|
||||||
_projection = PCS::pcs(3857);
|
_outputProjection = PCS::pcs(3857);
|
||||||
|
_inputProjection = GCS::gcs(4326);
|
||||||
_map = map;
|
_map = map;
|
||||||
_map->load();
|
_map->load();
|
||||||
_map->setProjection(_projection);
|
_map->setOutputProjection(_outputProjection);
|
||||||
|
_map->setInputProjection(_inputProjection);
|
||||||
connect(_map, SIGNAL(tilesLoaded()), this, SLOT(reloadMap()));
|
connect(_map, SIGNAL(tilesLoaded()), this, SLOT(reloadMap()));
|
||||||
|
|
||||||
_poi = poi;
|
_poi = poi;
|
||||||
@ -85,10 +103,8 @@ MapView::MapView(Map *map, POI *poi, QWidget *parent)
|
|||||||
_poiSize = 8;
|
_poiSize = 8;
|
||||||
_poiColor = Qt::black;
|
_poiColor = Qt::black;
|
||||||
|
|
||||||
#ifdef ENABLE_HIDPI
|
|
||||||
_deviceRatio = 1.0;
|
_deviceRatio = 1.0;
|
||||||
_mapRatio = 1.0;
|
_mapRatio = 1.0;
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
_opengl = false;
|
_opengl = false;
|
||||||
_plot = false;
|
_plot = false;
|
||||||
_digitalZoom = 0;
|
_digitalZoom = 0;
|
||||||
@ -170,18 +186,19 @@ void MapView::addArea(const Area &area)
|
|||||||
}
|
}
|
||||||
|
|
||||||
AreaItem *ai = new AreaItem(area, _map);
|
AreaItem *ai = new AreaItem(area, _map);
|
||||||
_areas.append(ai);
|
|
||||||
_ar |= ai->area().boundingRect();
|
|
||||||
ai->setColor(_palette.nextColor());
|
ai->setColor(_palette.nextColor());
|
||||||
ai->setWidth(_areaWidth);
|
ai->setWidth(_areaWidth);
|
||||||
ai->setStyle(_areaStyle);
|
ai->setStyle(_areaStyle);
|
||||||
ai->setOpacity(_areaOpacity);
|
ai->setOpacity(_areaOpacity);
|
||||||
ai->setDigitalZoom(_digitalZoom);
|
ai->setDigitalZoom(_digitalZoom);
|
||||||
ai->setVisible(_showAreas);
|
ai->setVisible(_showAreas);
|
||||||
|
|
||||||
_scene->addItem(ai);
|
_scene->addItem(ai);
|
||||||
|
_ar |= ai->bounds();
|
||||||
|
_areas.append(ai);
|
||||||
|
|
||||||
if (_showAreas)
|
if (_showAreas)
|
||||||
addPOI(_poi->points(ai->area()));
|
addPOI(_poi->points(ai->bounds()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapView::addWaypoints(const QVector<Waypoint> &waypoints)
|
void MapView::addWaypoints(const QVector<Waypoint> &waypoints)
|
||||||
@ -205,6 +222,26 @@ void MapView::addWaypoints(const QVector<Waypoint> &waypoints)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MapItem *MapView::addMap(MapAction *map)
|
||||||
|
{
|
||||||
|
MapItem *mi = new MapItem(map, _map);
|
||||||
|
mi->setColor(_palette.nextColor());
|
||||||
|
mi->setWidth(_areaWidth);
|
||||||
|
mi->setStyle(_areaStyle);
|
||||||
|
mi->setOpacity(_areaOpacity);
|
||||||
|
mi->setDigitalZoom(_digitalZoom);
|
||||||
|
mi->setVisible(_showAreas);
|
||||||
|
|
||||||
|
_scene->addItem(mi);
|
||||||
|
_ar |= mi->bounds();
|
||||||
|
_areas.append(mi);
|
||||||
|
|
||||||
|
if (_showAreas)
|
||||||
|
addPOI(_poi->points(mi->bounds()));
|
||||||
|
|
||||||
|
return mi;
|
||||||
|
}
|
||||||
|
|
||||||
QList<PathItem *> MapView::loadData(const Data &data)
|
QList<PathItem *> MapView::loadData(const Data &data)
|
||||||
{
|
{
|
||||||
QList<PathItem *> paths;
|
QList<PathItem *> paths;
|
||||||
@ -227,18 +264,37 @@ QList<PathItem *> MapView::loadData(const Data &data)
|
|||||||
else
|
else
|
||||||
updatePOIVisibility();
|
updatePOIVisibility();
|
||||||
|
|
||||||
|
if (!data.areas().isEmpty())
|
||||||
|
updateZValues(_areas);
|
||||||
|
|
||||||
centerOn(contentCenter());
|
centerOn(contentCenter());
|
||||||
|
|
||||||
return paths;
|
return paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MapView::loadMaps(const QList<MapAction *> &maps)
|
||||||
|
{
|
||||||
|
int zoom = _map->zoom();
|
||||||
|
|
||||||
|
for (int i = 0; i < maps.size(); i++)
|
||||||
|
addMap(maps.at(i));
|
||||||
|
|
||||||
|
if (fitMapZoom() != zoom)
|
||||||
|
rescale();
|
||||||
|
else
|
||||||
|
updatePOIVisibility();
|
||||||
|
|
||||||
|
updateZValues(_areas);
|
||||||
|
|
||||||
|
centerOn(contentCenter());
|
||||||
|
}
|
||||||
|
|
||||||
int MapView::fitMapZoom() const
|
int MapView::fitMapZoom() const
|
||||||
{
|
{
|
||||||
RectC br = _tr | _rr | _wr | _ar;
|
RectC br = _tr | _rr | _wr | _ar;
|
||||||
|
|
||||||
return _map->zoomFit(viewport()->size() - QSize(2*MARGIN, 2*MARGIN),
|
return _map->zoomFit(viewport()->size() - QSize(2*MARGIN, 2*MARGIN),
|
||||||
br.isNull() ? RectC(_map->xy2ll(_map->bounds().topLeft()),
|
br.isNull() ? _map->llBounds() : br);
|
||||||
_map->xy2ll(_map->bounds().bottomRight())) : br);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QPointF MapView::contentCenter() const
|
QPointF MapView::contentCenter() const
|
||||||
@ -315,10 +371,9 @@ void MapView::setMap(Map *map)
|
|||||||
|
|
||||||
_map = map;
|
_map = map;
|
||||||
_map->load();
|
_map->load();
|
||||||
_map->setProjection(_projection);
|
_map->setOutputProjection(_outputProjection);
|
||||||
#ifdef ENABLE_HIDPI
|
_map->setInputProjection(_inputProjection);
|
||||||
_map->setDevicePixelRatio(_deviceRatio, _mapRatio);
|
_map->setDevicePixelRatio(_deviceRatio, _mapRatio);
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
connect(_map, SIGNAL(tilesLoaded()), this, SLOT(reloadMap()));
|
connect(_map, SIGNAL(tilesLoaded()), this, SLOT(reloadMap()));
|
||||||
|
|
||||||
digitalZoom(0);
|
digitalZoom(0);
|
||||||
@ -357,6 +412,14 @@ void MapView::setPOI(POI *poi)
|
|||||||
updatePOI();
|
updatePOI();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MapView::setGraph(int index)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < _tracks.size(); i++)
|
||||||
|
_tracks.at(i)->setGraph(index);
|
||||||
|
for (int i = 0; i < _routes.size(); i++)
|
||||||
|
_routes.at(i)->setGraph(index);
|
||||||
|
}
|
||||||
|
|
||||||
void MapView::updatePOI()
|
void MapView::updatePOI()
|
||||||
{
|
{
|
||||||
for (POIHash::const_iterator it = _pois.constBegin();
|
for (POIHash::const_iterator it = _pois.constBegin();
|
||||||
@ -373,7 +436,7 @@ void MapView::updatePOI()
|
|||||||
addPOI(_poi->points(_routes.at(i)->path()));
|
addPOI(_poi->points(_routes.at(i)->path()));
|
||||||
if (_showAreas)
|
if (_showAreas)
|
||||||
for (int i = 0; i < _areas.size(); i++)
|
for (int i = 0; i < _areas.size(); i++)
|
||||||
addPOI(_poi->points(_areas.at(i)->area()));
|
addPOI(_poi->points(_areas.at(i)->bounds()));
|
||||||
if (_showWaypoints)
|
if (_showWaypoints)
|
||||||
for (int i = 0; i< _waypoints.size(); i++)
|
for (int i = 0; i< _waypoints.size(); i++)
|
||||||
addPOI(_poi->points(_waypoints.at(i)->waypoint()));
|
addPOI(_poi->points(_waypoints.at(i)->waypoint()));
|
||||||
@ -424,12 +487,8 @@ void MapView::setCoordinatesFormat(CoordinatesFormat format)
|
|||||||
|
|
||||||
void MapView::setTimeZone(const QTimeZone &zone)
|
void MapView::setTimeZone(const QTimeZone &zone)
|
||||||
{
|
{
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
WaypointItem::setTimeZone(zone);
|
WaypointItem::setTimeZone(zone);
|
||||||
PathItem::setTimeZone(zone);
|
PathItem::setTimeZone(zone);
|
||||||
#else // ENABLE_TIMEZONES
|
|
||||||
Q_UNUSED(zone);
|
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapView::clearMapCache()
|
void MapView::clearMapCache()
|
||||||
@ -464,10 +523,8 @@ void MapView::digitalZoom(int zoom)
|
|||||||
_coordinates->setDigitalZoom(_digitalZoom);
|
_coordinates->setDigitalZoom(_digitalZoom);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapView::zoom(int zoom, const QPoint &pos)
|
void MapView::zoom(int zoom, const QPoint &pos, bool shift)
|
||||||
{
|
{
|
||||||
bool shift = QApplication::keyboardModifiers() & Qt::ShiftModifier;
|
|
||||||
|
|
||||||
if (_digitalZoom) {
|
if (_digitalZoom) {
|
||||||
if (((_digitalZoom > 0 && zoom > 0) && (!shift || _digitalZoom
|
if (((_digitalZoom > 0 && zoom > 0) && (!shift || _digitalZoom
|
||||||
>= MAX_DIGITAL_ZOOM)) || ((_digitalZoom < 0 && zoom < 0) && (!shift
|
>= MAX_DIGITAL_ZOOM)) || ((_digitalZoom < 0 && zoom < 0) && (!shift
|
||||||
@ -493,27 +550,42 @@ void MapView::zoom(int zoom, const QPoint &pos)
|
|||||||
void MapView::wheelEvent(QWheelEvent *event)
|
void MapView::wheelEvent(QWheelEvent *event)
|
||||||
{
|
{
|
||||||
static int deg = 0;
|
static int deg = 0;
|
||||||
|
bool shift = (event->modifiers() & MODIFIER) ? true : false;
|
||||||
|
// Shift inverts the wheel axis on OS X, so use scrolling in both axes for
|
||||||
|
// the zoom.
|
||||||
|
int delta = event->angleDelta().y()
|
||||||
|
? event->angleDelta().y() : event->angleDelta().x();
|
||||||
|
|
||||||
deg += event->delta() / 8;
|
deg += delta / 8;
|
||||||
if (qAbs(deg) < 15)
|
if (qAbs(deg) < 15)
|
||||||
return;
|
return;
|
||||||
deg = 0;
|
deg = 0;
|
||||||
|
|
||||||
zoom((event->delta() > 0) ? 1 : -1, event->pos());
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
||||||
|
zoom((delta > 0) ? 1 : -1, event->pos(), shift);
|
||||||
|
#else // QT 5.15
|
||||||
|
zoom((delta > 0) ? 1 : -1, event->position().toPoint(), shift);
|
||||||
|
#endif // QT 5.15
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapView::mouseDoubleClickEvent(QMouseEvent *event)
|
void MapView::mouseDoubleClickEvent(QMouseEvent *event)
|
||||||
{
|
{
|
||||||
|
bool shift = (event->modifiers() & MODIFIER) ? true : false;
|
||||||
|
|
||||||
|
QGraphicsView::mouseDoubleClickEvent(event);
|
||||||
|
if (event->isAccepted())
|
||||||
|
return;
|
||||||
|
|
||||||
if (event->button() != Qt::LeftButton && event->button() != Qt::RightButton)
|
if (event->button() != Qt::LeftButton && event->button() != Qt::RightButton)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
zoom((event->button() == Qt::LeftButton) ? 1 : -1, event->pos());
|
zoom((event->button() == Qt::LeftButton) ? 1 : -1, event->pos(), shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapView::keyPressEvent(QKeyEvent *event)
|
void MapView::keyPressEvent(QKeyEvent *event)
|
||||||
{
|
{
|
||||||
int z;
|
int z;
|
||||||
|
bool shift = (event->modifiers() & MODIFIER) ? true : false;
|
||||||
QPoint pos = viewport()->rect().center();
|
QPoint pos = viewport()->rect().center();
|
||||||
|
|
||||||
if (event->key() == ZOOM_IN)
|
if (event->key() == ZOOM_IN)
|
||||||
@ -533,7 +605,7 @@ void MapView::keyPressEvent(QKeyEvent *event)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
zoom(z, pos);
|
zoom(z, pos, shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapView::keyReleaseEvent(QKeyEvent *event)
|
void MapView::keyReleaseEvent(QKeyEvent *event)
|
||||||
@ -566,9 +638,7 @@ void MapView::plot(QPainter *painter, const QRectF &target, qreal scale,
|
|||||||
// Enter plot mode
|
// Enter plot mode
|
||||||
setUpdatesEnabled(false);
|
setUpdatesEnabled(false);
|
||||||
_plot = true;
|
_plot = true;
|
||||||
#ifdef ENABLE_HIDPI
|
|
||||||
_map->setDevicePixelRatio(_deviceRatio, 1.0);
|
_map->setDevicePixelRatio(_deviceRatio, 1.0);
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
|
|
||||||
// Compute sizes & ratios
|
// Compute sizes & ratios
|
||||||
orig = viewport()->rect();
|
orig = viewport()->rect();
|
||||||
@ -635,9 +705,7 @@ void MapView::plot(QPainter *painter, const QRectF &target, qreal scale,
|
|||||||
_mapScale->setPos(origPos);
|
_mapScale->setPos(origPos);
|
||||||
|
|
||||||
// Exit plot mode
|
// Exit plot mode
|
||||||
#ifdef ENABLE_HIDPI
|
|
||||||
_map->setDevicePixelRatio(_deviceRatio, _mapRatio);
|
_map->setDevicePixelRatio(_deviceRatio, _mapRatio);
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
_plot = false;
|
_plot = false;
|
||||||
setUpdatesEnabled(true);
|
setUpdatesEnabled(true);
|
||||||
}
|
}
|
||||||
@ -780,9 +848,9 @@ void MapView::showCoordinates(bool show)
|
|||||||
setMouseTracking(show);
|
setMouseTracking(show);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapView::setPOIOverlap(bool overlap)
|
void MapView::showOverlappedPOIs(bool show)
|
||||||
{
|
{
|
||||||
_overlapPOIs = overlap;
|
_overlapPOIs = show;
|
||||||
|
|
||||||
updatePOIVisibility();
|
updatePOIVisibility();
|
||||||
}
|
}
|
||||||
@ -959,7 +1027,7 @@ void MapView::useOpenGL(bool use)
|
|||||||
_opengl = use;
|
_opengl = use;
|
||||||
|
|
||||||
if (use)
|
if (use)
|
||||||
setViewport(new OPENGL_WIDGET);
|
setViewport(new QOpenGLWidget);
|
||||||
else
|
else
|
||||||
setViewport(new QWidget);
|
setViewport(new QWidget);
|
||||||
}
|
}
|
||||||
@ -979,6 +1047,14 @@ void MapView::setMarkerColor(const QColor &color)
|
|||||||
_routes.at(i)->setMarkerColor(color);
|
_routes.at(i)->setMarkerColor(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MapView::setMarkerPosition(qreal pos)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < _tracks.size(); i++)
|
||||||
|
_tracks.at(i)->setMarkerPosition(pos);
|
||||||
|
for (int i = 0; i < _routes.size(); i++)
|
||||||
|
_routes.at(i)->setMarkerPosition(pos);
|
||||||
|
}
|
||||||
|
|
||||||
void MapView::reloadMap()
|
void MapView::reloadMap()
|
||||||
{
|
{
|
||||||
_scene->invalidate();
|
_scene->invalidate();
|
||||||
@ -986,7 +1062,6 @@ void MapView::reloadMap()
|
|||||||
|
|
||||||
void MapView::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
|
void MapView::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
|
||||||
{
|
{
|
||||||
#ifdef ENABLE_HIDPI
|
|
||||||
if (_deviceRatio == deviceRatio && _mapRatio == mapRatio)
|
if (_deviceRatio == deviceRatio && _mapRatio == mapRatio)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -1019,26 +1094,40 @@ void MapView::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
|
|||||||
centerOn(nc);
|
centerOn(nc);
|
||||||
|
|
||||||
reloadMap();
|
reloadMap();
|
||||||
#else // ENABLE_HIDPI
|
|
||||||
Q_UNUSED(deviceRatio);
|
|
||||||
Q_UNUSED(mapRatio);
|
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapView::setProjection(int id)
|
void MapView::setOutputProjection(int id)
|
||||||
{
|
{
|
||||||
const PCS *pcs;
|
const PCS *pcs;
|
||||||
const GCS *gcs;
|
const GCS *gcs;
|
||||||
Coordinates center = _map->xy2ll(mapToScene(viewport()->rect().center()));
|
Coordinates center = _map->xy2ll(mapToScene(viewport()->rect().center()));
|
||||||
|
|
||||||
if ((pcs = PCS::pcs(id)))
|
if ((pcs = PCS::pcs(id)))
|
||||||
_projection = Projection(pcs);
|
_outputProjection = Projection(pcs);
|
||||||
else if ((gcs = GCS::gcs(id)))
|
else if ((gcs = GCS::gcs(id)))
|
||||||
_projection = Projection(gcs);
|
_outputProjection = Projection(gcs);
|
||||||
else
|
else
|
||||||
qWarning("%d: Unknown PCS/GCS id", id);
|
qWarning("%d: Unknown PCS/GCS id", id);
|
||||||
|
|
||||||
_map->setProjection(_projection);
|
_map->setOutputProjection(_outputProjection);
|
||||||
|
rescale();
|
||||||
|
centerOn(_map->ll2xy(center));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapView::setInputProjection(int id)
|
||||||
|
{
|
||||||
|
const PCS *pcs;
|
||||||
|
const GCS *gcs;
|
||||||
|
Coordinates center = _map->xy2ll(mapToScene(viewport()->rect().center()));
|
||||||
|
|
||||||
|
if ((pcs = PCS::pcs(id)))
|
||||||
|
_inputProjection = Projection(pcs);
|
||||||
|
else if ((gcs = GCS::gcs(id)))
|
||||||
|
_inputProjection = Projection(gcs);
|
||||||
|
else
|
||||||
|
qWarning("%d: Unknown PCS/GCS id", id);
|
||||||
|
|
||||||
|
_map->setInputProjection(_inputProjection);
|
||||||
rescale();
|
rescale();
|
||||||
centerOn(_map->ll2xy(center));
|
centerOn(_map->ll2xy(center));
|
||||||
}
|
}
|
||||||
|
@ -29,10 +29,12 @@ class ScaleItem;
|
|||||||
class CoordinatesItem;
|
class CoordinatesItem;
|
||||||
class PathItem;
|
class PathItem;
|
||||||
class GraphItem;
|
class GraphItem;
|
||||||
class AreaItem;
|
class PlaneItem;
|
||||||
|
class MapItem;
|
||||||
class Area;
|
class Area;
|
||||||
class GraphicsScene;
|
class GraphicsScene;
|
||||||
class QTimeZone;
|
class QTimeZone;
|
||||||
|
class MapAction;
|
||||||
|
|
||||||
class MapView : public QGraphicsView
|
class MapView : public QGraphicsView
|
||||||
{
|
{
|
||||||
@ -49,10 +51,12 @@ public:
|
|||||||
MapView(Map *map, POI *poi, QWidget *parent = 0);
|
MapView(Map *map, POI *poi, QWidget *parent = 0);
|
||||||
|
|
||||||
QList<PathItem *> loadData(const Data &data);
|
QList<PathItem *> loadData(const Data &data);
|
||||||
|
void loadMaps(const QList<MapAction*> &maps);
|
||||||
|
|
||||||
void setPalette(const Palette &palette);
|
void setPalette(const Palette &palette);
|
||||||
void setPOI(POI *poi);
|
void setPOI(POI *poi);
|
||||||
void setMap(Map *map);
|
void setMap(Map *map);
|
||||||
|
void setGraph(int index);
|
||||||
|
|
||||||
void plot(QPainter *painter, const QRectF &target, qreal scale,
|
void plot(QPainter *painter, const QRectF &target, qreal scale,
|
||||||
PlotFlags flags);
|
PlotFlags flags);
|
||||||
@ -76,28 +80,29 @@ public:
|
|||||||
void setBackgroundColor(const QColor &color);
|
void setBackgroundColor(const QColor &color);
|
||||||
void useOpenGL(bool use);
|
void useOpenGL(bool use);
|
||||||
void useAntiAliasing(bool use);
|
void useAntiAliasing(bool use);
|
||||||
|
void setCoordinatesFormat(CoordinatesFormat format);
|
||||||
|
void setTimeZone(const QTimeZone &zone);
|
||||||
|
void setDevicePixelRatio(qreal deviceRatio, qreal mapRatio);
|
||||||
|
void setOutputProjection(int id);
|
||||||
|
void setInputProjection(int id);
|
||||||
|
void clearMapCache();
|
||||||
|
void fitContentToSize();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void showMap(bool show);
|
void showMap(bool show);
|
||||||
void showPOI(bool show);
|
void showPOI(bool show);
|
||||||
void setPOIOverlap(bool overlap);
|
|
||||||
void showWaypointLabels(bool show);
|
|
||||||
void showPOILabels(bool show);
|
void showPOILabels(bool show);
|
||||||
|
void showCoordinates(bool show);
|
||||||
|
void showTicks(bool show);
|
||||||
|
void showMarkers(bool show);
|
||||||
|
void showOverlappedPOIs(bool show);
|
||||||
|
void showWaypointLabels(bool show);
|
||||||
void showTracks(bool show);
|
void showTracks(bool show);
|
||||||
void showRoutes(bool show);
|
void showRoutes(bool show);
|
||||||
void showAreas(bool show);
|
void showAreas(bool show);
|
||||||
void showWaypoints(bool show);
|
void showWaypoints(bool show);
|
||||||
void showRouteWaypoints(bool show);
|
void showRouteWaypoints(bool show);
|
||||||
void showMarkers(bool show);
|
void setMarkerPosition(qreal pos);
|
||||||
void showCoordinates(bool show);
|
|
||||||
void showTicks(bool show);
|
|
||||||
void clearMapCache();
|
|
||||||
void setCoordinatesFormat(CoordinatesFormat format);
|
|
||||||
void setTimeZone(const QTimeZone &zone);
|
|
||||||
void setDevicePixelRatio(qreal deviceRatio, qreal mapRatio);
|
|
||||||
void setProjection(int id);
|
|
||||||
|
|
||||||
void fitContentToSize();
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void updatePOI();
|
void updatePOI();
|
||||||
@ -108,6 +113,7 @@ private:
|
|||||||
|
|
||||||
PathItem *addTrack(const Track &track);
|
PathItem *addTrack(const Track &track);
|
||||||
PathItem *addRoute(const Route &route);
|
PathItem *addRoute(const Route &route);
|
||||||
|
MapItem *addMap(MapAction *map);
|
||||||
void addArea(const Area &area);
|
void addArea(const Area &area);
|
||||||
void addWaypoints(const QVector<Waypoint> &waypoints);
|
void addWaypoints(const QVector<Waypoint> &waypoints);
|
||||||
void addPOI(const QList<Waypoint> &waypoints);
|
void addPOI(const QList<Waypoint> &waypoints);
|
||||||
@ -118,7 +124,7 @@ private:
|
|||||||
QPointF contentCenter() const;
|
QPointF contentCenter() const;
|
||||||
void rescale();
|
void rescale();
|
||||||
void centerOn(const QPointF &pos);
|
void centerOn(const QPointF &pos);
|
||||||
void zoom(int zoom, const QPoint &pos);
|
void zoom(int zoom, const QPoint &pos, bool shift);
|
||||||
void digitalZoom(int zoom);
|
void digitalZoom(int zoom);
|
||||||
void updatePOIVisibility();
|
void updatePOIVisibility();
|
||||||
void skipColor() {_palette.nextColor();}
|
void skipColor() {_palette.nextColor();}
|
||||||
@ -140,7 +146,7 @@ private:
|
|||||||
QList<TrackItem*> _tracks;
|
QList<TrackItem*> _tracks;
|
||||||
QList<RouteItem*> _routes;
|
QList<RouteItem*> _routes;
|
||||||
QList<WaypointItem*> _waypoints;
|
QList<WaypointItem*> _waypoints;
|
||||||
QList<AreaItem*> _areas;
|
QList<PlaneItem*> _areas;
|
||||||
POIHash _pois;
|
POIHash _pois;
|
||||||
|
|
||||||
RectC _tr, _rr, _wr, _ar;
|
RectC _tr, _rr, _wr, _ar;
|
||||||
@ -151,7 +157,7 @@ private:
|
|||||||
|
|
||||||
Palette _palette;
|
Palette _palette;
|
||||||
qreal _mapOpacity;
|
qreal _mapOpacity;
|
||||||
Projection _projection;
|
Projection _outputProjection, _inputProjection;
|
||||||
|
|
||||||
bool _showMap, _showTracks, _showRoutes, _showAreas, _showWaypoints,
|
bool _showMap, _showTracks, _showRoutes, _showAreas, _showWaypoints,
|
||||||
_showWaypointLabels, _showPOI, _showPOILabels, _showRouteWaypoints,
|
_showWaypointLabels, _showPOI, _showPOILabels, _showRouteWaypoints,
|
||||||
@ -167,10 +173,8 @@ private:
|
|||||||
bool _plot;
|
bool _plot;
|
||||||
QCursor _cursor;
|
QCursor _cursor;
|
||||||
|
|
||||||
#ifdef ENABLE_HIDPI
|
|
||||||
qreal _deviceRatio;
|
qreal _deviceRatio;
|
||||||
qreal _mapRatio;
|
qreal _mapRatio;
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
bool _opengl;
|
bool _opengl;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,44 +0,0 @@
|
|||||||
#ifndef MARGINS_H
|
|
||||||
#define MARGINS_H
|
|
||||||
|
|
||||||
#include <QtGlobal>
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
class MarginsF
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
MarginsF() {_left = 0; _top = 0; _right = 0; _bottom = 0;}
|
|
||||||
MarginsF(qreal left, qreal top, qreal right, qreal bottom)
|
|
||||||
{_left = left, _top = top; _right = right; _bottom = bottom;}
|
|
||||||
|
|
||||||
qreal left() const {return _left;}
|
|
||||||
qreal top() const {return _top;}
|
|
||||||
qreal right() const {return _right;}
|
|
||||||
qreal bottom() const {return _bottom;}
|
|
||||||
|
|
||||||
private:
|
|
||||||
qreal _left, _top, _right, _bottom;
|
|
||||||
};
|
|
||||||
|
|
||||||
inline MarginsF operator*(const MarginsF &margins, qreal factor)
|
|
||||||
{
|
|
||||||
return MarginsF(margins.left() * factor, margins.top() * factor,
|
|
||||||
margins.right() * factor, margins.bottom() * factor);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline MarginsF operator/(const MarginsF &margins, qreal factor)
|
|
||||||
{
|
|
||||||
return MarginsF(margins.left() / factor, margins.top() / factor,
|
|
||||||
margins.right() / factor, margins.bottom() / factor);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef QT_NO_DEBUG
|
|
||||||
inline QDebug operator<<(QDebug dbg, const MarginsF &margins)
|
|
||||||
{
|
|
||||||
dbg.nospace() << "MarginsF(" << margins.left() << ", " << margins.top()
|
|
||||||
<< ", " << margins.right() << margins.bottom() << ")";
|
|
||||||
return dbg.space();
|
|
||||||
}
|
|
||||||
#endif // QT_NO_DEBUG
|
|
||||||
|
|
||||||
#endif // MARGINS_H
|
|
@ -75,7 +75,7 @@ MarginsFWidget::MarginsFWidget(QWidget *parent) : QWidget(parent)
|
|||||||
setLayout(layout);
|
setLayout(layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MarginsFWidget::setValue(const MarginsF &value)
|
void MarginsFWidget::setValue(const QMarginsF &value)
|
||||||
{
|
{
|
||||||
_top->setValue(value.top());
|
_top->setValue(value.top());
|
||||||
_bottom->setValue(value.bottom());
|
_bottom->setValue(value.bottom());
|
||||||
@ -104,8 +104,8 @@ void MarginsFWidget::setSingleStep(qreal step)
|
|||||||
_right->setSingleStep(step);
|
_right->setSingleStep(step);
|
||||||
}
|
}
|
||||||
|
|
||||||
MarginsF MarginsFWidget::value() const
|
QMarginsF MarginsFWidget::value() const
|
||||||
{
|
{
|
||||||
return MarginsF(_left->value(), _top->value(), _right->value(),
|
return QMarginsF(_left->value(), _top->value(), _right->value(),
|
||||||
_bottom->value());
|
_bottom->value());
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QMargins>
|
#include <QMargins>
|
||||||
#include "margins.h"
|
|
||||||
|
|
||||||
class QSpinBox;
|
class QSpinBox;
|
||||||
class QDoubleSpinBox;
|
class QDoubleSpinBox;
|
||||||
@ -33,8 +32,8 @@ class MarginsFWidget : public QWidget
|
|||||||
public:
|
public:
|
||||||
MarginsFWidget(QWidget *parent = 0);
|
MarginsFWidget(QWidget *parent = 0);
|
||||||
|
|
||||||
MarginsF value() const;
|
QMarginsF value() const;
|
||||||
void setValue(const MarginsF &value);
|
void setValue(const QMarginsF &value);
|
||||||
void setUnits(const QString &units);
|
void setUnits(const QString &units);
|
||||||
void setSingleStep(qreal step);
|
void setSingleStep(qreal step);
|
||||||
|
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
#include <QtGlobal>
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 0)
|
|
||||||
#include <QGLWidget>
|
|
||||||
#include <QGLFormat>
|
|
||||||
#else
|
|
||||||
#include <QOpenGLWidget>
|
|
||||||
#include <QSurfaceFormat>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 0)
|
|
||||||
#define OPENGL_WIDGET QGLWidget
|
|
||||||
#else
|
|
||||||
#define OPENGL_WIDGET QOpenGLWidget
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 0)
|
|
||||||
#define OPENGL_SET_FORMAT(samples, stencilBuffer) \
|
|
||||||
{QGLFormat fmt; \
|
|
||||||
fmt.setStencilBufferSize(stencilBuffer); \
|
|
||||||
fmt.setSamples(samples); \
|
|
||||||
QGLFormat::setDefaultFormat(fmt);}
|
|
||||||
#else
|
|
||||||
#define OPENGL_SET_FORMAT(samples, stencilBuffer) \
|
|
||||||
{QSurfaceFormat fmt; \
|
|
||||||
fmt.setStencilBufferSize(stencilBuffer); \
|
|
||||||
fmt.setSamples(samples); \
|
|
||||||
QSurfaceFormat::setDefaultFormat(fmt);}
|
|
||||||
#endif
|
|
@ -46,19 +46,53 @@ void OptionsDialog::automaticPauseDetectionSet(bool set)
|
|||||||
|
|
||||||
QWidget *OptionsDialog::createMapPage()
|
QWidget *OptionsDialog::createMapPage()
|
||||||
{
|
{
|
||||||
_projection = new LimitedComboBox(200);
|
int last = -1;
|
||||||
|
|
||||||
|
_outputProjection = new LimitedComboBox(200);
|
||||||
QList<KV<int, QString> > projections(GCS::list() + PCS::list());
|
QList<KV<int, QString> > projections(GCS::list() + PCS::list());
|
||||||
qSort(projections);
|
std::sort(projections.begin(), projections.end());
|
||||||
|
|
||||||
for (int i = 0; i < projections.size(); i++) {
|
for (int i = 0; i < projections.size(); i++) {
|
||||||
QString text = QString::number(projections.at(i).key()) + " - "
|
const KV<int, QString> &proj = projections.at(i);
|
||||||
+ projections.at(i).value();
|
// There may be same EPSG codes with different names
|
||||||
_projection->addItem(text, QVariant(projections.at(i).key()));
|
if (proj.key() == last)
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
last = proj.key();
|
||||||
|
QString text = QString::number(proj.key()) + " - " + proj.value();
|
||||||
|
_outputProjection->addItem(text, QVariant(proj.key()));
|
||||||
}
|
}
|
||||||
_projection->setCurrentIndex(_projection->findData(_options.projection));
|
_outputProjection->setCurrentIndex(_outputProjection->findData(
|
||||||
|
_options.outputProjection));
|
||||||
|
|
||||||
|
_inputProjection = new LimitedComboBox(200);
|
||||||
|
last = -1;
|
||||||
|
for (int i = 0; i < projections.size(); i++) {
|
||||||
|
const KV<int, QString> &proj = projections.at(i);
|
||||||
|
// There may be same EPSG codes with different names
|
||||||
|
if (proj.key() == last)
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
last = proj.key();
|
||||||
|
if (proj.key() == 4326 || proj.key() == 3857) {
|
||||||
|
QString text = QString::number(proj.key()) + " - " + proj.value();
|
||||||
|
_inputProjection->addItem(text, QVariant(proj.key()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_inputProjection->setCurrentIndex(_inputProjection->findData(
|
||||||
|
_options.inputProjection));
|
||||||
|
|
||||||
|
QLabel *inInfo = new QLabel(tr("Select the proper projection of"
|
||||||
|
" JNX and KMZ maps. Both EPSG:3857 and EPSG:4326 projected maps"
|
||||||
|
" exist and there is no projection info in the map file."));
|
||||||
|
QLabel *outInfo = new QLabel(tr("Select the desired projection of IMG"
|
||||||
|
" maps. The projection must be valid for the whole map area."));
|
||||||
|
QFont f = inInfo->font();
|
||||||
|
f.setPointSize(f.pointSize() - 1);
|
||||||
|
inInfo->setWordWrap(true);
|
||||||
|
outInfo->setWordWrap(true);
|
||||||
|
inInfo->setFont(f);
|
||||||
|
outInfo->setFont(f);
|
||||||
|
|
||||||
#ifdef ENABLE_HIDPI
|
|
||||||
_hidpi = new QRadioButton(tr("High-resolution"));
|
_hidpi = new QRadioButton(tr("High-resolution"));
|
||||||
_lodpi = new QRadioButton(tr("Standard"));
|
_lodpi = new QRadioButton(tr("Standard"));
|
||||||
if (_options.hidpiMap)
|
if (_options.hidpiMap)
|
||||||
@ -69,24 +103,39 @@ QWidget *OptionsDialog::createMapPage()
|
|||||||
"The map is sharp but map objects are small/hard to read."));
|
"The map is sharp but map objects are small/hard to read."));
|
||||||
QLabel *llo = new QLabel(tr("Non-HiDPI maps are loaded such as they are. "
|
QLabel *llo = new QLabel(tr("Non-HiDPI maps are loaded such as they are. "
|
||||||
"Map objects have the expected size but the map is blurry."));
|
"Map objects have the expected size but the map is blurry."));
|
||||||
QFont f = lhi->font();
|
|
||||||
f.setPointSize(f.pointSize() - 1);
|
|
||||||
lhi->setWordWrap(true);
|
lhi->setWordWrap(true);
|
||||||
llo->setWordWrap(true);
|
llo->setWordWrap(true);
|
||||||
lhi->setFont(f);
|
lhi->setFont(f);
|
||||||
llo->setFont(f);
|
llo->setFont(f);
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
|
|
||||||
QFormLayout *vectorLayout = new QFormLayout();
|
QVBoxLayout *inLayout = new QVBoxLayout();
|
||||||
vectorLayout->addRow(tr("Projection:"), _projection);
|
inLayout->addWidget(_inputProjection);
|
||||||
|
inLayout->addWidget(inInfo);
|
||||||
|
QVBoxLayout *outLayout = new QVBoxLayout();
|
||||||
|
outLayout->addWidget(_outputProjection);
|
||||||
|
outLayout->addWidget(outInfo);
|
||||||
|
#ifndef Q_OS_MAC
|
||||||
|
QGroupBox *inBox = new QGroupBox(tr("Input"));
|
||||||
|
inBox->setLayout(inLayout);
|
||||||
|
QGroupBox *outBox = new QGroupBox(tr("Output"));
|
||||||
|
outBox->setLayout(outLayout);
|
||||||
|
#endif // Q_OS_MAC
|
||||||
|
|
||||||
QWidget *vectorMapsTab = new QWidget();
|
QWidget *projectionTab = new QWidget();
|
||||||
QVBoxLayout *vectorMapsTabLayout = new QVBoxLayout();
|
QVBoxLayout *projectionTabLayout = new QVBoxLayout();
|
||||||
vectorMapsTabLayout->addLayout(vectorLayout);
|
#ifdef Q_OS_MAC
|
||||||
vectorMapsTabLayout->addStretch();
|
projectionTabLayout->addWidget(new QLabel(tr("Input:")));
|
||||||
vectorMapsTab->setLayout(vectorMapsTabLayout);
|
projectionTabLayout->addLayout(inLayout);
|
||||||
|
projectionTabLayout->addWidget(line());
|
||||||
|
projectionTabLayout->addWidget(new QLabel(tr("Output:")));
|
||||||
|
projectionTabLayout->addLayout(outLayout);
|
||||||
|
#else // Q_OS_MAC
|
||||||
|
projectionTabLayout->addWidget(inBox);
|
||||||
|
projectionTabLayout->addWidget(outBox);
|
||||||
|
#endif // Q_OS_MAC
|
||||||
|
projectionTabLayout->addStretch();
|
||||||
|
projectionTab->setLayout(projectionTabLayout);
|
||||||
|
|
||||||
#ifdef ENABLE_HIDPI
|
|
||||||
QVBoxLayout *hidpiTabLayout = new QVBoxLayout();
|
QVBoxLayout *hidpiTabLayout = new QVBoxLayout();
|
||||||
hidpiTabLayout->addWidget(_lodpi);
|
hidpiTabLayout->addWidget(_lodpi);
|
||||||
hidpiTabLayout->addWidget(llo);
|
hidpiTabLayout->addWidget(llo);
|
||||||
@ -97,13 +146,10 @@ QWidget *OptionsDialog::createMapPage()
|
|||||||
|
|
||||||
QWidget *hidpiTab = new QWidget();
|
QWidget *hidpiTab = new QWidget();
|
||||||
hidpiTab->setLayout(hidpiTabLayout);
|
hidpiTab->setLayout(hidpiTabLayout);
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
|
|
||||||
QTabWidget *mapPage = new QTabWidget();
|
QTabWidget *mapPage = new QTabWidget();
|
||||||
mapPage->addTab(vectorMapsTab, tr("Vector maps"));
|
mapPage->addTab(projectionTab, tr("Projection"));
|
||||||
#ifdef ENABLE_HIDPI
|
|
||||||
mapPage->addTab(hidpiTab, tr("HiDPI display mode"));
|
mapPage->addTab(hidpiTab, tr("HiDPI display mode"));
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
|
|
||||||
return mapPage;
|
return mapPage;
|
||||||
}
|
}
|
||||||
@ -416,7 +462,6 @@ QWidget *OptionsDialog::createDataPage()
|
|||||||
_showSecondaryElevation = new QCheckBox(tr("Show secondary elevation"));
|
_showSecondaryElevation = new QCheckBox(tr("Show secondary elevation"));
|
||||||
_showSecondaryElevation->setChecked(_options.showSecondaryElevation);
|
_showSecondaryElevation->setChecked(_options.showSecondaryElevation);
|
||||||
|
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
_utcZone = new QRadioButton(tr("UTC"));
|
_utcZone = new QRadioButton(tr("UTC"));
|
||||||
_systemZone = new QRadioButton(tr("System"));
|
_systemZone = new QRadioButton(tr("System"));
|
||||||
_customZone = new QRadioButton(tr("Custom"));
|
_customZone = new QRadioButton(tr("Custom"));
|
||||||
@ -437,7 +482,6 @@ QWidget *OptionsDialog::createDataPage()
|
|||||||
QHBoxLayout *customZoneLayout = new QHBoxLayout();
|
QHBoxLayout *customZoneLayout = new QHBoxLayout();
|
||||||
customZoneLayout->addSpacing(20);
|
customZoneLayout->addSpacing(20);
|
||||||
customZoneLayout->addWidget(_timeZone);
|
customZoneLayout->addWidget(_timeZone);
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
|
|
||||||
_useSegments = new QCheckBox(tr("Use segments"));
|
_useSegments = new QCheckBox(tr("Use segments"));
|
||||||
_useSegments->setChecked(_options.useSegments);
|
_useSegments->setChecked(_options.useSegments);
|
||||||
@ -462,7 +506,6 @@ QWidget *OptionsDialog::createDataPage()
|
|||||||
elevationOptions->addWidget(_dataDEMElevation);
|
elevationOptions->addWidget(_dataDEMElevation);
|
||||||
elevationOptions->addWidget(_showSecondaryElevation);
|
elevationOptions->addWidget(_showSecondaryElevation);
|
||||||
|
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
QButtonGroup *timeZoneGroup = new QButtonGroup(this);
|
QButtonGroup *timeZoneGroup = new QButtonGroup(this);
|
||||||
timeZoneGroup->addButton(_utcZone);
|
timeZoneGroup->addButton(_utcZone);
|
||||||
timeZoneGroup->addButton(_systemZone);
|
timeZoneGroup->addButton(_systemZone);
|
||||||
@ -472,15 +515,12 @@ QWidget *OptionsDialog::createDataPage()
|
|||||||
zoneOptions->addWidget(_systemZone);
|
zoneOptions->addWidget(_systemZone);
|
||||||
zoneOptions->addWidget(_customZone);
|
zoneOptions->addWidget(_customZone);
|
||||||
zoneOptions->addItem(customZoneLayout);
|
zoneOptions->addItem(customZoneLayout);
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
|
|
||||||
QFormLayout *formLayout = new QFormLayout();
|
QFormLayout *formLayout = new QFormLayout();
|
||||||
formLayout->addRow(tr("Speed:"), speedOptions);
|
formLayout->addRow(tr("Speed:"), speedOptions);
|
||||||
formLayout->addRow(tr("Elevation:"), elevationOptions);
|
formLayout->addRow(tr("Elevation:"), elevationOptions);
|
||||||
|
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
formLayout->addRow(tr("Time zone:"), zoneOptions);
|
formLayout->addRow(tr("Time zone:"), zoneOptions);
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
|
|
||||||
QFormLayout *segmentsLayout = new QFormLayout();
|
QFormLayout *segmentsLayout = new QFormLayout();
|
||||||
segmentsLayout->addWidget(_useSegments);
|
segmentsLayout->addWidget(_useSegments);
|
||||||
@ -492,9 +532,7 @@ QWidget *OptionsDialog::createDataPage()
|
|||||||
#else // Q_OS_MAC
|
#else // Q_OS_MAC
|
||||||
QFormLayout *speedLayout = new QFormLayout();
|
QFormLayout *speedLayout = new QFormLayout();
|
||||||
QFormLayout *elevationLayout = new QFormLayout();
|
QFormLayout *elevationLayout = new QFormLayout();
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
QFormLayout *timeZoneLayout = new QFormLayout();
|
QFormLayout *timeZoneLayout = new QFormLayout();
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
QFormLayout *segmentsLayout = new QFormLayout();
|
QFormLayout *segmentsLayout = new QFormLayout();
|
||||||
|
|
||||||
speedLayout->addWidget(_computedSpeed);
|
speedLayout->addWidget(_computedSpeed);
|
||||||
@ -511,7 +549,6 @@ QWidget *OptionsDialog::createDataPage()
|
|||||||
QGroupBox *elevationBox = new QGroupBox(tr("Elevation"));
|
QGroupBox *elevationBox = new QGroupBox(tr("Elevation"));
|
||||||
elevationBox->setLayout(elevationLayout);
|
elevationBox->setLayout(elevationLayout);
|
||||||
|
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
timeZoneLayout->addWidget(_utcZone);
|
timeZoneLayout->addWidget(_utcZone);
|
||||||
timeZoneLayout->addWidget(_systemZone);
|
timeZoneLayout->addWidget(_systemZone);
|
||||||
timeZoneLayout->addWidget(_customZone);
|
timeZoneLayout->addWidget(_customZone);
|
||||||
@ -519,15 +556,12 @@ QWidget *OptionsDialog::createDataPage()
|
|||||||
|
|
||||||
QGroupBox *timeZoneBox = new QGroupBox(tr("Time zone"));
|
QGroupBox *timeZoneBox = new QGroupBox(tr("Time zone"));
|
||||||
timeZoneBox->setLayout(timeZoneLayout);
|
timeZoneBox->setLayout(timeZoneLayout);
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
|
|
||||||
segmentsLayout->addWidget(_useSegments);
|
segmentsLayout->addWidget(_useSegments);
|
||||||
|
|
||||||
sourceTabLayout->addWidget(speedBox);
|
sourceTabLayout->addWidget(speedBox);
|
||||||
sourceTabLayout->addWidget(elevationBox);
|
sourceTabLayout->addWidget(elevationBox);
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
sourceTabLayout->addWidget(timeZoneBox);
|
sourceTabLayout->addWidget(timeZoneBox);
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
sourceTabLayout->addLayout(segmentsLayout);
|
sourceTabLayout->addLayout(segmentsLayout);
|
||||||
#endif // Q_OS_MAC
|
#endif // Q_OS_MAC
|
||||||
sourceTabLayout->addStretch();
|
sourceTabLayout->addStretch();
|
||||||
@ -648,10 +682,8 @@ QWidget *OptionsDialog::createSystemPage()
|
|||||||
{
|
{
|
||||||
_useOpenGL = new QCheckBox(tr("Use OpenGL"));
|
_useOpenGL = new QCheckBox(tr("Use OpenGL"));
|
||||||
_useOpenGL->setChecked(_options.useOpenGL);
|
_useOpenGL->setChecked(_options.useOpenGL);
|
||||||
#ifdef ENABLE_HTTP2
|
|
||||||
_enableHTTP2 = new QCheckBox(tr("Enable HTTP/2"));
|
_enableHTTP2 = new QCheckBox(tr("Enable HTTP/2"));
|
||||||
_enableHTTP2->setChecked(_options.enableHTTP2);
|
_enableHTTP2->setChecked(_options.enableHTTP2);
|
||||||
#endif // ENABLE_HTTP2
|
|
||||||
|
|
||||||
_pixmapCache = new QSpinBox();
|
_pixmapCache = new QSpinBox();
|
||||||
_pixmapCache->setMinimum(16);
|
_pixmapCache->setMinimum(16);
|
||||||
@ -670,9 +702,7 @@ QWidget *OptionsDialog::createSystemPage()
|
|||||||
formLayout->addRow(tr("Connection timeout:"), _connectionTimeout);
|
formLayout->addRow(tr("Connection timeout:"), _connectionTimeout);
|
||||||
|
|
||||||
QFormLayout *checkboxLayout = new QFormLayout();
|
QFormLayout *checkboxLayout = new QFormLayout();
|
||||||
#ifdef ENABLE_HTTP2
|
|
||||||
checkboxLayout->addWidget(_enableHTTP2);
|
checkboxLayout->addWidget(_enableHTTP2);
|
||||||
#endif // ENABLE_HTTP2
|
|
||||||
checkboxLayout->addWidget(_useOpenGL);
|
checkboxLayout->addWidget(_useOpenGL);
|
||||||
|
|
||||||
QWidget *systemTab = new QWidget();
|
QWidget *systemTab = new QWidget();
|
||||||
@ -764,11 +794,11 @@ void OptionsDialog::accept()
|
|||||||
_options.sliderColor = _sliderColor->color();
|
_options.sliderColor = _sliderColor->color();
|
||||||
_options.graphAntiAliasing = _graphAA->isChecked();
|
_options.graphAntiAliasing = _graphAA->isChecked();
|
||||||
|
|
||||||
_options.projection = _projection->itemData(_projection->currentIndex())
|
_options.outputProjection = _outputProjection->itemData(
|
||||||
.toInt();
|
_outputProjection->currentIndex()).toInt();
|
||||||
#ifdef ENABLE_HIDPI
|
_options.inputProjection = _inputProjection->itemData(
|
||||||
|
_inputProjection->currentIndex()).toInt();
|
||||||
_options.hidpiMap = _hidpi->isChecked();
|
_options.hidpiMap = _hidpi->isChecked();
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
|
|
||||||
_options.elevationFilter = _elevationFilter->value();
|
_options.elevationFilter = _elevationFilter->value();
|
||||||
_options.speedFilter = _speedFilter->value();
|
_options.speedFilter = _speedFilter->value();
|
||||||
@ -787,13 +817,11 @@ void OptionsDialog::accept()
|
|||||||
_options.dataUseDEM = _dataDEMElevation->isChecked();
|
_options.dataUseDEM = _dataDEMElevation->isChecked();
|
||||||
_options.showSecondaryElevation = _showSecondaryElevation->isChecked();
|
_options.showSecondaryElevation = _showSecondaryElevation->isChecked();
|
||||||
_options.showSecondarySpeed = _showSecondarySpeed->isChecked();
|
_options.showSecondarySpeed = _showSecondarySpeed->isChecked();
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
_options.timeZone.setType(_utcZone->isChecked()
|
_options.timeZone.setType(_utcZone->isChecked()
|
||||||
? TimeZoneInfo::UTC : _systemZone->isChecked()
|
? TimeZoneInfo::UTC : _systemZone->isChecked()
|
||||||
? TimeZoneInfo::System : TimeZoneInfo::Custom);
|
? TimeZoneInfo::System : TimeZoneInfo::Custom);
|
||||||
_options.timeZone.setCustomZone(QTimeZone(_timeZone->currentText()
|
_options.timeZone.setCustomZone(QTimeZone(_timeZone->currentText()
|
||||||
.toLatin1()));
|
.toLatin1()));
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
_options.useSegments = _useSegments->isChecked();
|
_options.useSegments = _useSegments->isChecked();
|
||||||
|
|
||||||
qreal poiRadius = (_units == Imperial)
|
qreal poiRadius = (_units == Imperial)
|
||||||
@ -803,9 +831,7 @@ void OptionsDialog::accept()
|
|||||||
_options.poiRadius = poiRadius;
|
_options.poiRadius = poiRadius;
|
||||||
|
|
||||||
_options.useOpenGL = _useOpenGL->isChecked();
|
_options.useOpenGL = _useOpenGL->isChecked();
|
||||||
#ifdef ENABLE_HTTP2
|
|
||||||
_options.enableHTTP2 = _enableHTTP2->isChecked();
|
_options.enableHTTP2 = _enableHTTP2->isChecked();
|
||||||
#endif // ENABLE_HTTP2
|
|
||||||
_options.pixmapCache = _pixmapCache->value();
|
_options.pixmapCache = _pixmapCache->value();
|
||||||
_options.connectionTimeout = _connectionTimeout->value();
|
_options.connectionTimeout = _connectionTimeout->value();
|
||||||
|
|
||||||
|
@ -2,12 +2,9 @@
|
|||||||
#define OPTIONSDIALOG_H
|
#define OPTIONSDIALOG_H
|
||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include "common/config.h"
|
|
||||||
#include "palette.h"
|
#include "palette.h"
|
||||||
#include "units.h"
|
#include "units.h"
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
#include "timezoneinfo.h"
|
#include "timezoneinfo.h"
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
|
|
||||||
class ColorBox;
|
class ColorBox;
|
||||||
class StyleComboBox;
|
class StyleComboBox;
|
||||||
@ -42,10 +39,9 @@ struct Options {
|
|||||||
int mapOpacity;
|
int mapOpacity;
|
||||||
QColor backgroundColor;
|
QColor backgroundColor;
|
||||||
// Map
|
// Map
|
||||||
int projection;
|
int outputProjection;
|
||||||
#ifdef ENABLE_HIDPI
|
int inputProjection;
|
||||||
bool hidpiMap;
|
bool hidpiMap;
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
// Data
|
// Data
|
||||||
int elevationFilter;
|
int elevationFilter;
|
||||||
int speedFilter;
|
int speedFilter;
|
||||||
@ -60,17 +56,13 @@ struct Options {
|
|||||||
bool dataUseDEM;
|
bool dataUseDEM;
|
||||||
bool showSecondaryElevation;
|
bool showSecondaryElevation;
|
||||||
bool showSecondarySpeed;
|
bool showSecondarySpeed;
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
TimeZoneInfo timeZone;
|
TimeZoneInfo timeZone;
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
bool useSegments;
|
bool useSegments;
|
||||||
// POI
|
// POI
|
||||||
int poiRadius;
|
int poiRadius;
|
||||||
// System
|
// System
|
||||||
bool useOpenGL;
|
bool useOpenGL;
|
||||||
#ifdef ENABLE_HTTP2
|
|
||||||
bool enableHTTP2;
|
bool enableHTTP2;
|
||||||
#endif // ENABLE_HTTP2
|
|
||||||
int pixmapCache;
|
int pixmapCache;
|
||||||
int connectionTimeout;
|
int connectionTimeout;
|
||||||
// Print/Export
|
// Print/Export
|
||||||
@ -129,11 +121,10 @@ private:
|
|||||||
ColorBox *_sliderColor;
|
ColorBox *_sliderColor;
|
||||||
QCheckBox *_graphAA;
|
QCheckBox *_graphAA;
|
||||||
// Map
|
// Map
|
||||||
LimitedComboBox *_projection;
|
LimitedComboBox *_outputProjection;
|
||||||
#ifdef ENABLE_HIDPI
|
LimitedComboBox *_inputProjection;
|
||||||
QRadioButton *_hidpi;
|
QRadioButton *_hidpi;
|
||||||
QRadioButton *_lodpi;
|
QRadioButton *_lodpi;
|
||||||
#endif // ENABLE_HIDPI
|
|
||||||
// Data
|
// Data
|
||||||
OddSpinBox *_elevationFilter;
|
OddSpinBox *_elevationFilter;
|
||||||
OddSpinBox *_speedFilter;
|
OddSpinBox *_speedFilter;
|
||||||
@ -151,12 +142,10 @@ private:
|
|||||||
QRadioButton *_dataDEMElevation;
|
QRadioButton *_dataDEMElevation;
|
||||||
QCheckBox *_showSecondaryElevation;
|
QCheckBox *_showSecondaryElevation;
|
||||||
QCheckBox *_showSecondarySpeed;
|
QCheckBox *_showSecondarySpeed;
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
QRadioButton *_utcZone;
|
QRadioButton *_utcZone;
|
||||||
QRadioButton *_systemZone;
|
QRadioButton *_systemZone;
|
||||||
QRadioButton *_customZone;
|
QRadioButton *_customZone;
|
||||||
QComboBox *_timeZone;
|
QComboBox *_timeZone;
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
QCheckBox *_useSegments;
|
QCheckBox *_useSegments;
|
||||||
// POI
|
// POI
|
||||||
QDoubleSpinBox *_poiRadius;
|
QDoubleSpinBox *_poiRadius;
|
||||||
@ -164,9 +153,7 @@ private:
|
|||||||
QSpinBox *_pixmapCache;
|
QSpinBox *_pixmapCache;
|
||||||
QSpinBox *_connectionTimeout;
|
QSpinBox *_connectionTimeout;
|
||||||
QCheckBox *_useOpenGL;
|
QCheckBox *_useOpenGL;
|
||||||
#ifdef ENABLE_HTTP2
|
|
||||||
QCheckBox *_enableHTTP2;
|
QCheckBox *_enableHTTP2;
|
||||||
#endif // ENABLE_HTTP2
|
|
||||||
// Print/Export
|
// Print/Export
|
||||||
QRadioButton *_wysiwyg;
|
QRadioButton *_wysiwyg;
|
||||||
QRadioButton *_hires;
|
QRadioButton *_hires;
|
||||||
|
@ -24,8 +24,13 @@ public:
|
|||||||
{return !(*this == other);}
|
{return !(*this == other);}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||||
qreal _h, _s, _v, _a, _shift;
|
qreal _h, _s, _v, _a, _shift;
|
||||||
qreal _state;
|
qreal _state;
|
||||||
|
#else // QT6
|
||||||
|
float _h, _s, _v, _a, _shift;
|
||||||
|
float _state;
|
||||||
|
#endif // QT6
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef QT_NO_DEBUG
|
#ifndef QT_NO_DEBUG
|
||||||
|
@ -6,9 +6,17 @@
|
|||||||
#include "map/map.h"
|
#include "map/map.h"
|
||||||
#include "pathtickitem.h"
|
#include "pathtickitem.h"
|
||||||
#include "popup.h"
|
#include "popup.h"
|
||||||
|
#include "graphitem.h"
|
||||||
|
#include "markeritem.h"
|
||||||
#include "pathitem.h"
|
#include "pathitem.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
||||||
|
#define INTERSECTS intersect
|
||||||
|
#else // QT 5.15
|
||||||
|
#define INTERSECTS intersects
|
||||||
|
#endif // QT 5.15
|
||||||
|
|
||||||
#define GEOGRAPHICAL_MILE 1855.3248
|
#define GEOGRAPHICAL_MILE 1855.3248
|
||||||
|
|
||||||
static inline bool isValid(const QPointF &p)
|
static inline bool isValid(const QPointF &p)
|
||||||
@ -22,12 +30,10 @@ static inline unsigned segments(qreal distance)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Units PathItem::_units = Metric;
|
Units PathItem::_units = Metric;
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
QTimeZone PathItem::_timeZone = QTimeZone::utc();
|
QTimeZone PathItem::_timeZone = QTimeZone::utc();
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
|
|
||||||
PathItem::PathItem(const Path &path, Map *map, QGraphicsItem *parent)
|
PathItem::PathItem(const Path &path, Map *map, QGraphicsItem *parent)
|
||||||
: GraphicsItem(parent), _path(path), _map(map)
|
: GraphicsItem(parent), _path(path), _map(map), _graph(0)
|
||||||
{
|
{
|
||||||
Q_ASSERT(_path.isValid());
|
Q_ASSERT(_path.isValid());
|
||||||
|
|
||||||
@ -68,14 +74,14 @@ void PathItem::addSegment(const Coordinates &c1, const Coordinates &c2)
|
|||||||
QLineF l(QPointF(c1.lon(), c1.lat()), QPointF(c2.lon() + 360,
|
QLineF l(QPointF(c1.lon(), c1.lat()), QPointF(c2.lon() + 360,
|
||||||
c2.lat()));
|
c2.lat()));
|
||||||
QLineF dl(QPointF(180, -90), QPointF(180, 90));
|
QLineF dl(QPointF(180, -90), QPointF(180, 90));
|
||||||
l.intersect(dl, &p);
|
l.INTERSECTS(dl, &p);
|
||||||
_painterPath.lineTo(_map->ll2xy(Coordinates(180, p.y())));
|
_painterPath.lineTo(_map->ll2xy(Coordinates(180, p.y())));
|
||||||
_painterPath.moveTo(_map->ll2xy(Coordinates(-180, p.y())));
|
_painterPath.moveTo(_map->ll2xy(Coordinates(-180, p.y())));
|
||||||
} else {
|
} else {
|
||||||
QLineF l(QPointF(c1.lon(), c1.lat()), QPointF(c2.lon() - 360,
|
QLineF l(QPointF(c1.lon(), c1.lat()), QPointF(c2.lon() - 360,
|
||||||
c2.lat()));
|
c2.lat()));
|
||||||
QLineF dl(QPointF(-180, -90), QPointF(-180, 90));
|
QLineF dl(QPointF(-180, -90), QPointF(-180, 90));
|
||||||
l.intersect(dl, &p);
|
l.INTERSECTS(dl, &p);
|
||||||
_painterPath.lineTo(_map->ll2xy(Coordinates(-180, p.y())));
|
_painterPath.lineTo(_map->ll2xy(Coordinates(-180, p.y())));
|
||||||
_painterPath.moveTo(_map->ll2xy(Coordinates(180, p.y())));
|
_painterPath.moveTo(_map->ll2xy(Coordinates(180, p.y())));
|
||||||
}
|
}
|
||||||
@ -260,14 +266,18 @@ QPointF PathItem::position(qreal x) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PathItem::moveMarker(qreal distance)
|
void PathItem::setMarkerPosition(qreal pos)
|
||||||
{
|
{
|
||||||
_markerDistance = distance;
|
qreal distance = _graph
|
||||||
QPointF pos(position(distance));
|
? (_graph->graphType() == Time) ? _graph->distanceAtTime(pos) : pos
|
||||||
|
: NAN;
|
||||||
|
|
||||||
if (isValid(pos)) {
|
_markerDistance = distance;
|
||||||
|
QPointF pp(position(distance));
|
||||||
|
|
||||||
|
if (isValid(pp)) {
|
||||||
_marker->setVisible(_showMarker);
|
_marker->setVisible(_showMarker);
|
||||||
_marker->setPos(pos);
|
_marker->setPos(pp);
|
||||||
} else
|
} else
|
||||||
_marker->setVisible(false);
|
_marker->setVisible(false);
|
||||||
}
|
}
|
||||||
@ -356,6 +366,21 @@ void PathItem::showTicks(bool show)
|
|||||||
updateTicks();
|
updateTicks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PathItem::addGraph(GraphItem *graph)
|
||||||
|
{
|
||||||
|
_graphs.append(graph);
|
||||||
|
|
||||||
|
if (graph) {
|
||||||
|
connect(this, SIGNAL(selected(bool)), graph, SLOT(hover(bool)));
|
||||||
|
connect(graph, SIGNAL(selected(bool)), this, SLOT(hover(bool)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PathItem::setGraph(int index)
|
||||||
|
{
|
||||||
|
_graph = _graphs.at(index);
|
||||||
|
}
|
||||||
|
|
||||||
void PathItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
|
void PathItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
|
||||||
{
|
{
|
||||||
Q_UNUSED(event);
|
Q_UNUSED(event);
|
||||||
|
@ -1,19 +1,17 @@
|
|||||||
#ifndef PATHITEM_H
|
#ifndef PATHITEM_H
|
||||||
#define PATHITEM_H
|
#define PATHITEM_H
|
||||||
|
|
||||||
#include "common/config.h"
|
|
||||||
#include <QGraphicsObject>
|
#include <QGraphicsObject>
|
||||||
#include <QPen>
|
#include <QPen>
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
#include <QTimeZone>
|
#include <QTimeZone>
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
#include "data/path.h"
|
#include "data/path.h"
|
||||||
#include "markeritem.h"
|
|
||||||
#include "units.h"
|
|
||||||
#include "graphicsscene.h"
|
#include "graphicsscene.h"
|
||||||
|
#include "units.h"
|
||||||
|
|
||||||
class Map;
|
class Map;
|
||||||
class PathTickItem;
|
class PathTickItem;
|
||||||
|
class GraphItem;
|
||||||
|
class MarkerItem;
|
||||||
|
|
||||||
class PathItem : public QObject, public GraphicsItem
|
class PathItem : public QObject, public GraphicsItem
|
||||||
{
|
{
|
||||||
@ -30,7 +28,10 @@ public:
|
|||||||
|
|
||||||
const Path &path() const {return _path;}
|
const Path &path() const {return _path;}
|
||||||
|
|
||||||
|
void addGraph(GraphItem *graph);
|
||||||
|
|
||||||
void setMap(Map *map);
|
void setMap(Map *map);
|
||||||
|
void setGraph(int index);
|
||||||
|
|
||||||
void setColor(const QColor &color);
|
void setColor(const QColor &color);
|
||||||
void setWidth(qreal width);
|
void setWidth(qreal width);
|
||||||
@ -40,15 +41,14 @@ public:
|
|||||||
void showMarker(bool show);
|
void showMarker(bool show);
|
||||||
void showTicks(bool show);
|
void showTicks(bool show);
|
||||||
|
|
||||||
|
void setMarkerPosition(qreal pos);
|
||||||
|
|
||||||
void updateTicks();
|
void updateTicks();
|
||||||
|
|
||||||
static void setUnits(Units units) {_units = units;}
|
static void setUnits(Units units) {_units = units;}
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
static void setTimeZone(const QTimeZone &zone) {_timeZone = zone;}
|
static void setTimeZone(const QTimeZone &zone) {_timeZone = zone;}
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void moveMarker(qreal distance);
|
|
||||||
void hover(bool hover);
|
void hover(bool hover);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
@ -60,9 +60,7 @@ protected:
|
|||||||
void mousePressEvent(QGraphicsSceneMouseEvent *event);
|
void mousePressEvent(QGraphicsSceneMouseEvent *event);
|
||||||
|
|
||||||
static Units _units;
|
static Units _units;
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
static QTimeZone _timeZone;
|
static QTimeZone _timeZone;
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const PathSegment *segment(qreal x) const;
|
const PathSegment *segment(qreal x) const;
|
||||||
@ -76,6 +74,8 @@ private:
|
|||||||
|
|
||||||
Path _path;
|
Path _path;
|
||||||
Map *_map;
|
Map *_map;
|
||||||
|
QList<GraphItem *> _graphs;
|
||||||
|
GraphItem *_graph;
|
||||||
qreal _markerDistance;
|
qreal _markerDistance;
|
||||||
int _digitalZoom;
|
int _digitalZoom;
|
||||||
|
|
||||||
|
@ -24,18 +24,18 @@ PDFExportDialog::PDFExportDialog(PDFExport &exp, Units units, QWidget *parent)
|
|||||||
_fileSelect->setFile(_export.fileName);
|
_fileSelect->setFile(_export.fileName);
|
||||||
|
|
||||||
_paperSize = new QComboBox();
|
_paperSize = new QComboBox();
|
||||||
_paperSize->addItem("A2", QPrinter::A2);
|
_paperSize->addItem("A2", QPageSize::PageSizeId::A2);
|
||||||
_paperSize->addItem("A3", QPrinter::A3);
|
_paperSize->addItem("A3", QPageSize::PageSizeId::A3);
|
||||||
_paperSize->addItem("A4", QPrinter::A4);
|
_paperSize->addItem("A4", QPageSize::PageSizeId::A4);
|
||||||
_paperSize->addItem("A5", QPrinter::A5);
|
_paperSize->addItem("A5", QPageSize::PageSizeId::A5);
|
||||||
_paperSize->addItem("A6", QPrinter::A6);
|
_paperSize->addItem("A6", QPageSize::PageSizeId::A6);
|
||||||
_paperSize->addItem("B3", QPrinter::B3);
|
_paperSize->addItem("B3", QPageSize::PageSizeId::B3);
|
||||||
_paperSize->addItem("B4", QPrinter::B4);
|
_paperSize->addItem("B4", QPageSize::PageSizeId::B4);
|
||||||
_paperSize->addItem("B5", QPrinter::B5);
|
_paperSize->addItem("B5", QPageSize::PageSizeId::B5);
|
||||||
_paperSize->addItem("B6", QPrinter::B6);
|
_paperSize->addItem("B6", QPageSize::PageSizeId::B6);
|
||||||
_paperSize->addItem("Tabloid", QPrinter::Tabloid);
|
_paperSize->addItem("Tabloid", QPageSize::PageSizeId::Tabloid);
|
||||||
_paperSize->addItem("Legal", QPrinter::Legal);
|
_paperSize->addItem("Legal", QPageSize::PageSizeId::Legal);
|
||||||
_paperSize->addItem("Letter", QPrinter::Letter);
|
_paperSize->addItem("Letter", QPageSize::PageSizeId::Letter);
|
||||||
if ((index = _paperSize->findData(_export.paperSize)) >= 0)
|
if ((index = _paperSize->findData(_export.paperSize)) >= 0)
|
||||||
_paperSize->setCurrentIndex(index);
|
_paperSize->setCurrentIndex(index);
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ PDFExportDialog::PDFExportDialog(PDFExport &exp, Units units, QWidget *parent)
|
|||||||
QHBoxLayout *orientationLayout = new QHBoxLayout();
|
QHBoxLayout *orientationLayout = new QHBoxLayout();
|
||||||
orientationLayout->addWidget(_portrait);
|
orientationLayout->addWidget(_portrait);
|
||||||
orientationLayout->addWidget(_landscape);
|
orientationLayout->addWidget(_landscape);
|
||||||
if (_export.orientation == QPrinter::Portrait)
|
if (_export.orientation == QPageLayout::Orientation::Portrait)
|
||||||
_portrait->setChecked(true);
|
_portrait->setChecked(true);
|
||||||
else
|
else
|
||||||
_landscape->setChecked(true);
|
_landscape->setChecked(true);
|
||||||
@ -116,9 +116,9 @@ void PDFExportDialog::accept()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QPrinter::Orientation orientation = _portrait->isChecked()
|
QPageLayout::Orientation orientation = _portrait->isChecked()
|
||||||
? QPrinter::Portrait : QPrinter::Landscape;
|
? QPageLayout::Orientation::Portrait : QPageLayout::Orientation::Landscape;
|
||||||
QPrinter::PaperSize paperSize = static_cast<QPrinter::PaperSize>
|
QPageSize::PageSizeId paperSize = static_cast<QPageSize::PageSizeId>
|
||||||
(_paperSize->itemData(_paperSize->currentIndex()).toInt());
|
(_paperSize->itemData(_paperSize->currentIndex()).toInt());
|
||||||
int resolution = _resolution->itemData(_resolution->currentIndex()).toInt();
|
int resolution = _resolution->itemData(_resolution->currentIndex()).toInt();
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QPrinter>
|
#include <QPrinter>
|
||||||
#include "margins.h"
|
|
||||||
#include "units.h"
|
#include "units.h"
|
||||||
|
|
||||||
class QComboBox;
|
class QComboBox;
|
||||||
@ -14,9 +13,9 @@ class MarginsFWidget;
|
|||||||
struct PDFExport
|
struct PDFExport
|
||||||
{
|
{
|
||||||
QString fileName;
|
QString fileName;
|
||||||
QPrinter::PaperSize paperSize;
|
QPageSize::PageSizeId paperSize;
|
||||||
QPrinter::Orientation orientation;
|
QPageLayout::Orientation orientation;
|
||||||
MarginsF margins;
|
QMarginsF margins;
|
||||||
int resolution;
|
int resolution;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
24
src/GUI/planeitem.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef PLANEITEM_H
|
||||||
|
#define PLANEITEM_H
|
||||||
|
|
||||||
|
#include "common/rectc.h"
|
||||||
|
#include "graphicsscene.h"
|
||||||
|
|
||||||
|
class Map;
|
||||||
|
|
||||||
|
class PlaneItem : public GraphicsItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PlaneItem(GraphicsItem *parent = 0) : GraphicsItem(parent) {}
|
||||||
|
|
||||||
|
virtual RectC bounds() const = 0;
|
||||||
|
virtual void setMap(Map *map) = 0;
|
||||||
|
|
||||||
|
virtual void setColor(const QColor &color) = 0;
|
||||||
|
virtual void setOpacity(qreal opacity) = 0;
|
||||||
|
virtual void setWidth(qreal width) = 0;
|
||||||
|
virtual void setStyle(Qt::PenStyle style) = 0;
|
||||||
|
virtual void setDigitalZoom(int zoom) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // PLANEITEM_H
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QMargins>
|
#include <QMargins>
|
||||||
#include "margins.h"
|
|
||||||
|
|
||||||
class FileSelectWidget;
|
class FileSelectWidget;
|
||||||
class MarginsWidget;
|
class MarginsWidget;
|
||||||
|
@ -4,9 +4,12 @@
|
|||||||
#include <QStyleOptionFrame>
|
#include <QStyleOptionFrame>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QMouseEvent>
|
#include <QMouseEvent>
|
||||||
#include <QApplication>
|
|
||||||
#include <QDesktopWidget>
|
|
||||||
#include <QBasicTimer>
|
#include <QBasicTimer>
|
||||||
|
#include <QScreen>
|
||||||
|
#include <QApplication>
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
||||||
|
#include <QDesktopWidget>
|
||||||
|
#endif // QT 5.15
|
||||||
#include "popup.h"
|
#include "popup.h"
|
||||||
|
|
||||||
|
|
||||||
@ -36,10 +39,7 @@ PopupLabel *PopupLabel::_instance = 0;
|
|||||||
|
|
||||||
PopupLabel::PopupLabel(const QString &text, QWidget *parent)
|
PopupLabel::PopupLabel(const QString &text, QWidget *parent)
|
||||||
: QLabel(text, parent, Qt::ToolTip | Qt::BypassGraphicsProxyWidget
|
: QLabel(text, parent, Qt::ToolTip | Qt::BypassGraphicsProxyWidget
|
||||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
|
| Qt::WindowDoesNotAcceptFocus)
|
||||||
| Qt::WindowDoesNotAcceptFocus
|
|
||||||
#endif // QT5
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
delete _instance;
|
delete _instance;
|
||||||
_instance = this;
|
_instance = this;
|
||||||
@ -74,7 +74,7 @@ void PopupLabel::paintEvent(QPaintEvent *event)
|
|||||||
{
|
{
|
||||||
QStylePainter p(this);
|
QStylePainter p(this);
|
||||||
QStyleOptionFrame opt;
|
QStyleOptionFrame opt;
|
||||||
opt.init(this);
|
opt.initFrom(this);
|
||||||
p.drawPrimitive(QStyle::PE_PanelTipLabel, opt);
|
p.drawPrimitive(QStyle::PE_PanelTipLabel, opt);
|
||||||
p.end();
|
p.end();
|
||||||
QLabel::paintEvent(event);
|
QLabel::paintEvent(event);
|
||||||
@ -125,7 +125,11 @@ bool PopupLabel::eventFilter(QObject *o, QEvent *ev)
|
|||||||
|
|
||||||
void PopupLabel::place(const QPoint &pos, QWidget *w)
|
void PopupLabel::place(const QPoint &pos, QWidget *w)
|
||||||
{
|
{
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
||||||
QRect screen = QApplication::desktop()->screenGeometry(w);
|
QRect screen = QApplication::desktop()->screenGeometry(w);
|
||||||
|
#else // QT 5.15
|
||||||
|
QRect screen = w->screen()->geometry();
|
||||||
|
#endif // QT 5.15
|
||||||
QPoint p(pos.x() + 2, pos.y() + 16);
|
QPoint p(pos.x() + 2, pos.y() + 16);
|
||||||
|
|
||||||
if (p.x() + width() > screen.x() + screen.width())
|
if (p.x() + width() > screen.x() + screen.width())
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include "data/waypoint.h"
|
#include "data/waypoint.h"
|
||||||
|
#include "data/route.h"
|
||||||
#include "map/map.h"
|
#include "map/map.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
#include "waypointitem.h"
|
#include "waypointitem.h"
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
#ifndef ROUTEITEM_H
|
#ifndef ROUTEITEM_H
|
||||||
#define ROUTEITEM_H
|
#define ROUTEITEM_H
|
||||||
|
|
||||||
#include "data/route.h"
|
#include "data/link.h"
|
||||||
#include "pathitem.h"
|
#include "pathitem.h"
|
||||||
#include "units.h"
|
|
||||||
#include "format.h"
|
|
||||||
#include "graphicsscene.h"
|
|
||||||
|
|
||||||
class Map;
|
class Map;
|
||||||
|
class Route;
|
||||||
class WaypointItem;
|
class WaypointItem;
|
||||||
|
|
||||||
class RouteItem : public PathItem
|
class RouteItem : public PathItem
|
||||||
|
@ -61,9 +61,9 @@ void ScaleItem::computeScale()
|
|||||||
qreal res = _res * pow(2, -_digitalZoom);
|
qreal res = _res * pow(2, -_digitalZoom);
|
||||||
|
|
||||||
if (_units == Imperial) {
|
if (_units == Imperial) {
|
||||||
_length = niceNum((res * M2FT * SCALE_WIDTH) / SEGMENTS, true);
|
_length = Util::niceNum((res * M2FT * SCALE_WIDTH) / SEGMENTS, true);
|
||||||
if (_length >= MIINFT) {
|
if (_length >= MIINFT) {
|
||||||
_length = niceNum((res * M2MI * SCALE_WIDTH) / SEGMENTS, true);
|
_length = Util::niceNum((res * M2MI * SCALE_WIDTH) / SEGMENTS, true);
|
||||||
_width = (_length / (res * M2MI));
|
_width = (_length / (res * M2MI));
|
||||||
_scale = true;
|
_scale = true;
|
||||||
} else {
|
} else {
|
||||||
@ -71,9 +71,9 @@ void ScaleItem::computeScale()
|
|||||||
_scale = false;
|
_scale = false;
|
||||||
}
|
}
|
||||||
} else if (_units == Nautical) {
|
} else if (_units == Nautical) {
|
||||||
_length = niceNum((res * M2FT * SCALE_WIDTH) / SEGMENTS, true);
|
_length = Util::niceNum((res * M2FT * SCALE_WIDTH) / SEGMENTS, true);
|
||||||
if (_length >= NMIINFT) {
|
if (_length >= NMIINFT) {
|
||||||
_length = niceNum((res * M2NMI * SCALE_WIDTH) / SEGMENTS, true);
|
_length = Util::niceNum((res * M2NMI * SCALE_WIDTH) / SEGMENTS, true);
|
||||||
_width = (_length / (res * M2NMI));
|
_width = (_length / (res * M2NMI));
|
||||||
_scale = true;
|
_scale = true;
|
||||||
} else {
|
} else {
|
||||||
@ -81,7 +81,7 @@ void ScaleItem::computeScale()
|
|||||||
_scale = false;
|
_scale = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_length = niceNum((res * SCALE_WIDTH) / SEGMENTS, true);
|
_length = Util::niceNum((res * SCALE_WIDTH) / SEGMENTS, true);
|
||||||
if (_length >= KMINM) {
|
if (_length >= KMINM) {
|
||||||
_length *= M2KM;
|
_length *= M2KM;
|
||||||
_width = (_length / (res * M2KM));
|
_width = (_length / (res * M2KM));
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef SEARCHPOINTER_H
|
#ifndef SEARCHPOINTER_H
|
||||||
#define SEARCHPOINTER_H
|
#define SEARCHPOINTER_H
|
||||||
|
|
||||||
|
#include "common/config.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
class SearchPointer
|
class SearchPointer
|
||||||
{
|
{
|
||||||
@ -16,7 +18,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
inline uint qHash(const SearchPointer<T> &t)
|
inline HASH_T qHash(const SearchPointer<T> &t)
|
||||||
{
|
{
|
||||||
return ::qHash(*(t.data()));
|
return ::qHash(*(t.data()));
|
||||||
}
|
}
|
||||||
|
@ -30,8 +30,6 @@
|
|||||||
#define SHOW_GRAPH_GRIDS_DEFAULT true
|
#define SHOW_GRAPH_GRIDS_DEFAULT true
|
||||||
#define SHOW_GRAPH_SLIDER_INFO_SETTING "sliderInfo"
|
#define SHOW_GRAPH_SLIDER_INFO_SETTING "sliderInfo"
|
||||||
#define SHOW_GRAPH_SLIDER_INFO_DEFAULT true
|
#define SHOW_GRAPH_SLIDER_INFO_DEFAULT true
|
||||||
#define SHOW_MARKERS_SETTING "pathMarkers"
|
|
||||||
#define SHOW_MARKERS_DEFAULT true
|
|
||||||
#define SHOW_TICKS_SETTING "pathTicks"
|
#define SHOW_TICKS_SETTING "pathTicks"
|
||||||
#define SHOW_TICKS_DEFAULT false
|
#define SHOW_TICKS_DEFAULT false
|
||||||
|
|
||||||
@ -65,13 +63,16 @@
|
|||||||
#define SHOW_ROUTE_WAYPOINTS_DEFAULT true
|
#define SHOW_ROUTE_WAYPOINTS_DEFAULT true
|
||||||
#define SHOW_WAYPOINT_LABELS_SETTING "waypointLabels"
|
#define SHOW_WAYPOINT_LABELS_SETTING "waypointLabels"
|
||||||
#define SHOW_WAYPOINT_LABELS_DEFAULT true
|
#define SHOW_WAYPOINT_LABELS_DEFAULT true
|
||||||
|
#define SHOW_MARKERS_SETTING "positionMarkers"
|
||||||
|
#define SHOW_MARKERS_DEFAULT true
|
||||||
|
|
||||||
#define PDF_EXPORT_SETTINGS_GROUP "Export"
|
#define PDF_EXPORT_SETTINGS_GROUP "Export"
|
||||||
#define PAPER_ORIENTATION_SETTING "orientation"
|
#define PAPER_ORIENTATION_SETTING "orientation"
|
||||||
#define PAPER_ORIENTATION_DEFAULT QPrinter::Portrait
|
#define PAPER_ORIENTATION_DEFAULT QPageLayout::Orientation::Portrait
|
||||||
#define PAPER_SIZE_SETTING "size"
|
#define PAPER_SIZE_SETTING "size"
|
||||||
#define PAPER_SIZE_DEFAULT (IMPERIAL_UNITS() ? QPrinter::Letter \
|
#define PAPER_SIZE_DEFAULT (IMPERIAL_UNITS() \
|
||||||
: QPrinter::A4)
|
? QPageSize::PageSizeId::Letter \
|
||||||
|
: QPageSize::PageSizeId::A4)
|
||||||
#define PDF_MARGIN_LEFT_SETTING "marginLeft"
|
#define PDF_MARGIN_LEFT_SETTING "marginLeft"
|
||||||
#define PDF_MARGIN_LEFT_DEFAULT 5 /* mm */
|
#define PDF_MARGIN_LEFT_DEFAULT 5 /* mm */
|
||||||
#define PDF_MARGIN_TOP_SETTING "marginTop"
|
#define PDF_MARGIN_TOP_SETTING "marginTop"
|
||||||
@ -199,8 +200,10 @@
|
|||||||
#define SEPARATE_GRAPH_PAGE_DEFAULT false
|
#define SEPARATE_GRAPH_PAGE_DEFAULT false
|
||||||
#define SLIDER_COLOR_SETTING "sliderColor"
|
#define SLIDER_COLOR_SETTING "sliderColor"
|
||||||
#define SLIDER_COLOR_DEFAULT QColor(Qt::red)
|
#define SLIDER_COLOR_DEFAULT QColor(Qt::red)
|
||||||
#define PROJECTION_SETTING "projection"
|
#define OUTPUT_PROJECTION_SETTING "outputProjection"
|
||||||
#define PROJECTION_DEFAULT 3857
|
#define OUTPUT_PROJECTION_DEFAULT 3857
|
||||||
|
#define INPUT_PROJECTION_SETTING "inputProjection"
|
||||||
|
#define INPUT_PROJECTION_DEFAULT 4326
|
||||||
#define HIDPI_MAP_SETTING "HiDPIMap"
|
#define HIDPI_MAP_SETTING "HiDPIMap"
|
||||||
#define HIDPI_MAP_DEFAULT true
|
#define HIDPI_MAP_DEFAULT true
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ void SliderInfoItem::updateBoundingRect()
|
|||||||
{
|
{
|
||||||
QFontMetrics fm(_font);
|
QFontMetrics fm(_font);
|
||||||
|
|
||||||
qreal width = qMax(fm.width(_x), fm.width(_y));
|
qreal width = qMax(fm.boundingRect(_x).width(), fm.boundingRect(_y).width());
|
||||||
qreal height = 2 * fm.height() - 2*fm.descent();
|
qreal height = 2 * fm.height() - 2*fm.descent();
|
||||||
|
|
||||||
_boundingRect = (_side == Right)
|
_boundingRect = (_side == Right)
|
||||||
@ -35,16 +35,16 @@ void SliderInfoItem::paint(QPainter *painter, const QStyleOptionGraphicsItem
|
|||||||
QRectF rx, ry;
|
QRectF rx, ry;
|
||||||
|
|
||||||
|
|
||||||
qreal width = qMax(fm.width(_x), fm.width(_y));
|
qreal width = qMax(fm.boundingRect(_x).width(), fm.boundingRect(_y).width());
|
||||||
if (_side == Right) {
|
if (_side == Right) {
|
||||||
ry = QRectF(SIZE, -fm.height() + fm.descent(), fm.width(_y),
|
ry = QRectF(SIZE, -fm.height() + fm.descent(), fm.boundingRect(_y).width(),
|
||||||
fm.height() - fm.descent());
|
fm.height() - fm.descent());
|
||||||
rx = QRectF(SIZE, 0, fm.width(_x), fm.height()
|
rx = QRectF(SIZE, 0, fm.boundingRect(_x).width(), fm.height()
|
||||||
- fm.descent());
|
- fm.descent());
|
||||||
} else {
|
} else {
|
||||||
ry = QRectF(-(width + SIZE), -fm.height() + fm.descent(), fm.width(_y),
|
ry = QRectF(-(width + SIZE), -fm.height() + fm.descent(),
|
||||||
fm.height() - fm.descent());
|
fm.boundingRect(_y).width(), fm.height() - fm.descent());
|
||||||
rx = QRectF(-(width + SIZE), 0, fm.width(_x), fm.height()
|
rx = QRectF(-(width + SIZE), 0, fm.boundingRect(_x).width(), fm.height()
|
||||||
- fm.descent());
|
- fm.descent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <QTimeZone>
|
#include <QTimeZone>
|
||||||
#include <QDataStream>
|
#include <QDataStream>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
class TimeZoneInfo
|
class TimeZoneInfo
|
||||||
{
|
{
|
||||||
@ -42,6 +43,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
friend QDataStream& operator<<(QDataStream &out, const TimeZoneInfo &info);
|
friend QDataStream& operator<<(QDataStream &out, const TimeZoneInfo &info);
|
||||||
friend QDataStream& operator>>(QDataStream &in, TimeZoneInfo &info);
|
friend QDataStream& operator>>(QDataStream &in, TimeZoneInfo &info);
|
||||||
|
friend QDebug operator<<(QDebug dbg, const TimeZoneInfo &info);
|
||||||
|
|
||||||
Type _type;
|
Type _type;
|
||||||
QTimeZone _customZone;
|
QTimeZone _customZone;
|
||||||
@ -66,4 +68,12 @@ inline QDataStream &operator>>(QDataStream &in, TimeZoneInfo &info)
|
|||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Required in Qt6 even in release builds
|
||||||
|
inline QDebug operator<<(QDebug dbg, const TimeZoneInfo &info)
|
||||||
|
{
|
||||||
|
dbg.nospace() << "TimeZoneInfo(" << static_cast<int>(info._type)
|
||||||
|
<< ", " << info._customZone << ")";
|
||||||
|
return dbg.space();
|
||||||
|
}
|
||||||
|
|
||||||
#endif // TIMEZONEINFO_H
|
#endif // TIMEZONEINFO_H
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include "map/map.h"
|
#include "map/map.h"
|
||||||
|
#include "data/track.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
#include "tooltip.h"
|
#include "tooltip.h"
|
||||||
#include "trackitem.h"
|
#include "trackitem.h"
|
||||||
@ -8,6 +9,7 @@
|
|||||||
QString TrackItem::info() const
|
QString TrackItem::info() const
|
||||||
{
|
{
|
||||||
ToolTip tt;
|
ToolTip tt;
|
||||||
|
QLocale l;
|
||||||
|
|
||||||
if (!_name.isEmpty())
|
if (!_name.isEmpty())
|
||||||
tt.insert(tr("Name"), _name);
|
tt.insert(tr("Name"), _name);
|
||||||
@ -22,13 +24,7 @@ QString TrackItem::info() const
|
|||||||
if (_movingTime > 0)
|
if (_movingTime > 0)
|
||||||
tt.insert(tr("Moving time"), Format::timeSpan(_movingTime));
|
tt.insert(tr("Moving time"), Format::timeSpan(_movingTime));
|
||||||
if (!_date.isNull())
|
if (!_date.isNull())
|
||||||
tt.insert(tr("Date"),
|
tt.insert(tr("Date"), l.toString(_date.toTimeZone(_timeZone)));
|
||||||
#ifdef ENABLE_TIMEZONES
|
|
||||||
_date.toTimeZone(_timeZone)
|
|
||||||
#else // ENABLE_TIMEZONES
|
|
||||||
_date
|
|
||||||
#endif // ENABLE_TIMEZONES
|
|
||||||
.toString(Qt::SystemLocaleShortDate));
|
|
||||||
if (!_links.isEmpty()) {
|
if (!_links.isEmpty()) {
|
||||||
QString links;
|
QString links;
|
||||||
for (int i = 0; i < _links.size(); i++) {
|
for (int i = 0; i < _links.size(); i++) {
|
||||||
|
@ -2,13 +2,11 @@
|
|||||||
#define TRACKITEM_H
|
#define TRACKITEM_H
|
||||||
|
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QPen>
|
#include "data/link.h"
|
||||||
#include "data/track.h"
|
|
||||||
#include "pathitem.h"
|
#include "pathitem.h"
|
||||||
#include "units.h"
|
|
||||||
#include "graphicsscene.h"
|
|
||||||
|
|
||||||
class Map;
|
class Map;
|
||||||
|
class Track;
|
||||||
|
|
||||||
class TrackItem : public PathItem
|
class TrackItem : public PathItem
|
||||||
{
|
{
|
||||||
|