mirror of
https://github.com/tumic0/GPXSee.git
synced 2025-07-06 15:42:51 +02:00
Compare commits
468 Commits
Author | SHA1 | Date | |
---|---|---|---|
bb6d6a4044 | |||
521369a6ec | |||
45a6cdeda0 | |||
12827edcb2 | |||
ee24bd54f1 | |||
cc22df3bf2 | |||
d7f0cda4b2 | |||
a898ff2807 | |||
9dd4e117f6 | |||
92deaaaf2b | |||
015a9187a0 | |||
1de9c6ef5d | |||
54b6225c6c | |||
48c7299ba6 | |||
c284b9fa7c | |||
2c503a2406 | |||
27edc4d6b5 | |||
f333a76ef7 | |||
2c114f43c5 | |||
29e29591f8 | |||
e4ac9fda0e | |||
26229e5871 | |||
64bee2f2f4 | |||
e4288ee95c | |||
c9b3c2eedd | |||
42e4b0769f | |||
ce043ef8fa | |||
8c7050e273 | |||
d670107a11 | |||
7b03c4d852 | |||
2002b828dd | |||
71f0e1d0ac | |||
eb9767f2dd | |||
8d06ab6208 | |||
187cb77858 | |||
8167a995f6 | |||
b5aed7314e | |||
464d4c5327 | |||
11f4dc4b41 | |||
2d3ad41d69 | |||
a7dcc57dd1 | |||
2d5e11f001 | |||
e86f89308b | |||
378fa8dc0e | |||
dde8903013 | |||
37c4fe1eba | |||
f9db0acb03 | |||
1aa07a6a34 | |||
c302a67299 | |||
8b6d7acec5 | |||
ba70fd159d | |||
1773a1ae0d | |||
136f08aa76 | |||
f70d92805b | |||
69e66f1856 | |||
911c63df0c | |||
d16899530a | |||
e2339c67cd | |||
c809d2f17e | |||
fac0bae006 | |||
9bd03c1225 | |||
d63c666997 | |||
0cd20a1e57 | |||
2f70d46be8 | |||
325e83569c | |||
56b374ed30 | |||
df1be4aeb9 | |||
d79bdaef78 | |||
fa0c09b30c | |||
95c82c501a | |||
3b16f37e66 | |||
661e26fbdb | |||
25939cfa62 | |||
c59ea4e5cd | |||
5de1bc7e7d | |||
7c3399575b | |||
7bedd17071 | |||
06a84dcea2 | |||
ca204626a1 | |||
d16ef7b081 | |||
ef013dc036 | |||
633d52daca | |||
adbb5e5684 | |||
bd9b09df3d | |||
ede2b6004f | |||
a516055dc2 | |||
1ba3ada96e | |||
1667e0ca70 | |||
cb03c8a903 | |||
b50d5227a5 | |||
eef6360643 | |||
f38db3227f | |||
ac73c04445 | |||
c3aeb95660 | |||
3299b41ec7 | |||
6bdd97611d | |||
58fd5022ca | |||
15e09539c7 | |||
ebe1851abb | |||
a225c6d308 | |||
b3ddbd7b63 | |||
a94056ac7e | |||
e5042b11d7 | |||
aea7bbdf09 | |||
2e0eadd0e7 | |||
1c9b31d7c9 | |||
42e917efab | |||
7a9b26756a | |||
07761ea335 | |||
eaae965719 | |||
f17e5c2ea1 | |||
ca6e8638d8 | |||
21bcaf9562 | |||
66a22fbfee | |||
a160cb4eb3 | |||
2d3ca7c5f8 | |||
f5ec18a13a | |||
8c71d11fa6 | |||
f6b15e1acc | |||
857c5050f4 | |||
652471ac90 | |||
44d1d27c93 | |||
2da1f8bc70 | |||
68e20cff5b | |||
2d4d2721bf | |||
1c67f1cac9 | |||
d74816883a | |||
a09d13594d | |||
81b5631de4 | |||
6916d0e6b4 | |||
757ec98108 | |||
2ddb5dc28b | |||
2e84901e43 | |||
f61fb5657c | |||
24e216cdfc | |||
09d6de00a6 | |||
f7990ee2e6 | |||
cb01c0b590 | |||
21cf5ddaec | |||
48d4686dd4 | |||
d035a307d8 | |||
89e04f3678 | |||
e664fc188c | |||
3597a07ed7 | |||
0472cc03f3 | |||
d169a9f710 | |||
2ff2195116 | |||
cdbf2db5fe | |||
2bb635a120 | |||
465b146001 | |||
ce6d6298bb | |||
ae2ff99be8 | |||
5b6cd24839 | |||
cd22e6207a | |||
b826e497f3 | |||
7cc39f25e1 | |||
f61d9fcd55 | |||
67a1f7e108 | |||
040de56a54 | |||
a486abb159 | |||
37215959b8 | |||
1ccce095a9 | |||
057180e431 | |||
60e62da6a2 | |||
a3eafea60a | |||
962f8de160 | |||
6525d34e08 | |||
3c661ddf65 | |||
42b4216d9c | |||
4e7418111d | |||
a89ef11d73 | |||
d8b54ac342 | |||
293046590e | |||
ea2f67fc09 | |||
60b33064a7 | |||
2efc6fb6d3 | |||
eb744df9cc | |||
8c9180190a | |||
6c6d297a3c | |||
6839119794 | |||
669715aa32 | |||
fdc172ab38 | |||
05f23de1ed | |||
9a0344adac | |||
b9d5fa8772 | |||
d4de0edca6 | |||
fdeb24a196 | |||
7f650f9d6a | |||
a986293f20 | |||
ec0b0adba0 | |||
52c6bb569e | |||
0f670f9ddd | |||
dba46b09a8 | |||
ce59f13de7 | |||
b8cf3872ce | |||
b59112f74e | |||
17b3602fda | |||
c0928097cc | |||
e709fad764 | |||
fb566ae163 | |||
3d8a4cc6b7 | |||
4eb44a53f7 | |||
b61c39ea46 | |||
4767be1972 | |||
ee9e17e31c | |||
3721084d21 | |||
6076c9d82e | |||
2ef499001d | |||
e4d8ab1feb | |||
2fc82aceab | |||
475eb6185a | |||
cdf3a48516 | |||
dcc3c0086a | |||
0d6aeecebb | |||
704c68443a | |||
183b02a5e7 | |||
e91815150d | |||
73c33450ee | |||
e06d07c176 | |||
c73f30e21f | |||
bbf2044729 | |||
4a86ab9d1e | |||
16c3fea8a8 | |||
f4ec9b6ac4 | |||
44155f9ef0 | |||
a5e809a0f3 | |||
3e70f9262b | |||
3573a2edbe | |||
82d9623c6d | |||
258a9b0201 | |||
36d84f6c98 | |||
15c79a7a13 | |||
34e0294815 | |||
ad6a04b975 | |||
e0f682fcd8 | |||
a801359eed | |||
bb238f4c7e | |||
c1ebc8e74b | |||
110c8c6bed | |||
e8fffe65bf | |||
1731aa1890 | |||
c389889662 | |||
e38e12f89b | |||
26f71f5d00 | |||
65e04ce08b | |||
d84d8e03e0 | |||
475ad358ae | |||
db7e60bdfb | |||
444791fb4c | |||
be3a882baa | |||
6d6dc9f316 | |||
d86e825c60 | |||
6bb2af3da8 | |||
d195526afb | |||
9ec3956672 | |||
3098d2ab95 | |||
dccf9f7e1a | |||
e55c29c33c | |||
bd5728ffa0 | |||
af525d4e3d | |||
96e0b584a0 | |||
0d6e3bac17 | |||
d292b5f533 | |||
ec2cb21a8a | |||
3632ed8816 | |||
58acea1a2d | |||
9e63e3f47e | |||
7581c8a32a | |||
8715e0e37b | |||
36b9813e1b | |||
1a59e1cb24 | |||
7f7d25a6fa | |||
87755952b6 | |||
3821eb4d84 | |||
15af82ee49 | |||
1f8a66108b | |||
9309dd945b | |||
858741c9a5 | |||
26c922d9a2 | |||
2ba78545ef | |||
d2a47d1a51 | |||
b2ca97b836 | |||
979981ffb8 | |||
9a57ca69a0 | |||
7b9bdf1f08 | |||
034647b461 | |||
f1d8497851 | |||
2f2f155707 | |||
6d87587544 | |||
dad2d79361 | |||
9f2d7eb4bb | |||
b57809b3b3 | |||
6cb6c1b4fd | |||
14a01b7126 | |||
315c095af9 | |||
10d2fe4431 | |||
29147e1b8b | |||
0a1a1ac6be | |||
6c102c6d98 | |||
df89952483 | |||
01d8d917cb | |||
d1522210e5 | |||
d3ac528d57 | |||
82eed4759c | |||
2a94e1ac59 | |||
8feeeaa918 | |||
2946fa799e | |||
41ebe8aec7 | |||
e35a8246f9 | |||
725bb8a381 | |||
fc5eea33cf | |||
a1de3c956c | |||
d2d9b94e78 | |||
e6b205e823 | |||
0b680928fd | |||
c0c01eef8b | |||
7cdee93e9e | |||
33071ac8df | |||
c7ff6f3aa1 | |||
c61d4c8201 | |||
05a871c8a0 | |||
ae9dd309e9 | |||
cea0a51d0e | |||
5dcc63600c | |||
c29ed0a2ca | |||
9905de67bd | |||
25b42fd2f8 | |||
0a6d575b21 | |||
21de5e22e4 | |||
4670630e22 | |||
5f79326601 | |||
0c1a123cd9 | |||
9c96e7124a | |||
694847a424 | |||
e7f5da5af7 | |||
d59a37466b | |||
f2bfd584d0 | |||
a9ce6f54c7 | |||
de9bae9d66 | |||
716662322d | |||
2a893fe4ef | |||
a24d55025f | |||
04ddcecb70 | |||
dc9a600a6e | |||
c365de130b | |||
d3558198ca | |||
acc69f5c3d | |||
7a900f2252 | |||
dad76a4e89 | |||
e28e69b248 | |||
7fffd6a161 | |||
c4fd82e5a0 | |||
fa08c0dbea | |||
070eff2115 | |||
20a4870904 | |||
1bb9908936 | |||
36555b3140 | |||
6564fb36ab | |||
1a3356b8fe | |||
7ad64922c9 | |||
64a8ec1b84 | |||
0a75298b2b | |||
99be5699af | |||
cdb641b204 | |||
f57bd48840 | |||
c2abf2c146 | |||
a5a2070ccc | |||
ed7cb1beb1 | |||
37d832bc7f | |||
c322bf9f68 | |||
2705ffbbfe | |||
e8962dd50f | |||
b37e32d622 | |||
2b1d0d2189 | |||
33e3471ca3 | |||
bf55f1e07d | |||
37a0eec48f | |||
fcaacb4b6a | |||
f9c593e6d1 | |||
37e07accd4 | |||
a7117361be | |||
548c03d543 | |||
1addb1118d | |||
ae64ef9d83 | |||
3d16cf2500 | |||
609ac0c57a | |||
a70c6f0f24 | |||
3ad0c89511 | |||
1497d42bd5 | |||
a4906e7d01 | |||
f56dfd95e3 | |||
2bda7ba714 | |||
940bd0511e | |||
30518cebc0 | |||
696bc50ba1 | |||
b91358a6bd | |||
94eab9fba0 | |||
44b98754d7 | |||
8451178808 | |||
7eedcc083e | |||
cd32b21aca | |||
e1bda86b35 | |||
967e307be9 | |||
7cf1e3e1a5 | |||
0f44feebb1 | |||
ecb82952f6 | |||
ab6ea84255 | |||
0b2d610a34 | |||
f67eaa8dec | |||
2a619aa0ef | |||
dd292bc995 | |||
680104fec3 | |||
b72a9e67fe | |||
24b7b9d996 | |||
7965f2ff34 | |||
5f5b391cd9 | |||
faed6fc203 | |||
38b62c0121 | |||
f26f8a95ac | |||
1297db26f6 | |||
2ee955172d | |||
a11b926a98 | |||
70b5371a6e | |||
d07b6c6a9d | |||
c9a62e8b61 | |||
aa3579c0be | |||
297177ad41 | |||
0e9720f68b | |||
c1f36e5fbb | |||
a20fd3e474 | |||
aba78f3baa | |||
2f24bb5462 | |||
c1fdb21fad | |||
6bea3b7ebf | |||
a7efa80e8f | |||
4e9faf3a23 | |||
d4e153d10f | |||
86cc30433c | |||
a41e89053d | |||
63335aa004 | |||
3243179b32 | |||
b04388f776 | |||
53e960fabe | |||
c56e6c14d1 | |||
b4cc88446a | |||
2860530d3c | |||
863aa3f542 | |||
fa0a380839 | |||
03d5745da9 | |||
52cf7c4278 | |||
5c86fc4103 | |||
3ad8c58911 | |||
ce5a3be7ca | |||
83e6772de2 | |||
db0df92933 | |||
a3bc48c5d3 | |||
537b1c3716 | |||
561fadb4f2 | |||
a39f2bc2a9 | |||
ebb690673c | |||
7ee9ea0fa4 | |||
e10808fc7c | |||
255f4ca63c | |||
d2a65b4cb1 | |||
3a046af6b6 | |||
d8be4f8951 | |||
ee09b2e667 | |||
2811d7b2a3 |
@ -1,22 +1,33 @@
|
|||||||
version: 7.9.{build}
|
version: 7.24.{build}
|
||||||
configuration: Release
|
|
||||||
platform: Any CPU
|
configuration:
|
||||||
|
- Release
|
||||||
|
|
||||||
|
image:
|
||||||
|
- Visual Studio 2017
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
NSISDIR: C:\Program Files (x86)\NSIS
|
NSISDIR: C:\Program Files (x86)\NSIS
|
||||||
matrix:
|
matrix:
|
||||||
- QTDIR: C:\Qt\5.11\msvc2015
|
- QTDIR: C:\Qt\5.13\msvc2017
|
||||||
PLATFORM: x86
|
|
||||||
NSI: gpxsee.nsi
|
NSI: gpxsee.nsi
|
||||||
OPENSSLDIR: C:\OpenSSL-Win32\bin
|
VCVARS: vcvars32.bat
|
||||||
- QTDIR: C:\Qt\5.11\msvc2015_64
|
OPENSSLDIR: C:\OpenSSL-v111-Win32\bin
|
||||||
PLATFORM: x86_amd64
|
LIBCRYPTO: libssl-1_1.dll
|
||||||
|
LIBSSL: libcrypto-1_1.dll
|
||||||
|
- QTDIR: C:\Qt\5.13\msvc2017_64
|
||||||
NSI: gpxsee64.nsi
|
NSI: gpxsee64.nsi
|
||||||
OPENSSLDIR: C:\OpenSSL-Win64\bin
|
VCVARS: vcvars64.bat
|
||||||
|
OPENSSLDIR: C:\OpenSSL-v111-Win64\bin
|
||||||
|
LIBCRYPTO: libssl-1_1-x64.dll
|
||||||
|
LIBSSL: libcrypto-1_1-x64.dll
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- cmd: >-
|
- cmd: >-
|
||||||
set PATH=%QTDIR%\bin;%NSISDIR%;%PATH%
|
set PATH=%QTDIR%\bin;%NSISDIR%;%PATH%
|
||||||
|
|
||||||
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %PLATFORM%
|
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\"%VCVARS%
|
||||||
|
|
||||||
build_script:
|
build_script:
|
||||||
- cmd: >-
|
- cmd: >-
|
||||||
lrelease gpxsee.pro
|
lrelease gpxsee.pro
|
||||||
@ -44,9 +55,9 @@ build_script:
|
|||||||
|
|
||||||
copy licence.txt installer
|
copy licence.txt installer
|
||||||
|
|
||||||
copy %OPENSSLDIR%\libeay32.dll installer
|
copy %OPENSSLDIR%\%LIBCRYPTO% installer
|
||||||
|
|
||||||
copy %OPENSSLDIR%\ssleay32.dll installer
|
copy %OPENSSLDIR%\%LIBSSL% installer
|
||||||
|
|
||||||
|
|
||||||
makensis.exe installer\%NSI%
|
makensis.exe installer\%NSI%
|
||||||
|
@ -6,10 +6,11 @@ os:
|
|||||||
|
|
||||||
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
|
||||||
|
|
||||||
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; fi
|
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install libqt4-dev libqt4-opengl-dev; 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
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
GPXSee is a Qt-based GPS log file viewer and analyzer that supports all common GPS log file formats.
|
GPXSee is a Qt-based GPS log file viewer and analyzer that supports all common GPS log file formats.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
* Opens GPX, TCX, FIT, KML, IGC, NMEA, SLF, LOC, GeoJSON, OziExplorer (PLT, RTE, WPT), Garmin 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 & JNX maps, TwoNav RMaps, GeoTIFF images).
|
* Offline maps (MBTiles, OziExplorer maps, TrekBuddy maps/atlases, Garmin IMG/GMAP & JNX maps, TwoNav RMaps, GeoTIFF images).
|
||||||
* 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.
|
||||||
|
56
gpxsee.pro
56
gpxsee.pro
@ -3,7 +3,7 @@ unix:!macx {
|
|||||||
} else {
|
} else {
|
||||||
TARGET = GPXSee
|
TARGET = GPXSee
|
||||||
}
|
}
|
||||||
VERSION = 7.9
|
VERSION = 7.24
|
||||||
|
|
||||||
QT += core \
|
QT += core \
|
||||||
gui \
|
gui \
|
||||||
@ -19,6 +19,9 @@ 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/graphicsscene.h \
|
||||||
|
src/GUI/popup.h \
|
||||||
|
src/common/garmin.h \
|
||||||
src/common/staticassert.h \
|
src/common/staticassert.h \
|
||||||
src/common/coordinates.h \
|
src/common/coordinates.h \
|
||||||
src/common/range.h \
|
src/common/range.h \
|
||||||
@ -84,7 +87,14 @@ HEADERS += src/common/config.h \
|
|||||||
src/GUI/mapview.h \
|
src/GUI/mapview.h \
|
||||||
src/GUI/font.h \
|
src/GUI/font.h \
|
||||||
src/GUI/areaitem.h \
|
src/GUI/areaitem.h \
|
||||||
|
src/data/link.h \
|
||||||
src/map/IMG/bitmapline.h \
|
src/map/IMG/bitmapline.h \
|
||||||
|
src/map/IMG/bitstream.h \
|
||||||
|
src/map/IMG/deltastream.h \
|
||||||
|
src/map/IMG/gmap.h \
|
||||||
|
src/map/IMG/huffmanstream.h \
|
||||||
|
src/map/IMG/huffmantable.h \
|
||||||
|
src/map/IMG/mapdata.h \
|
||||||
src/map/IMG/textpathitem.h \
|
src/map/IMG/textpathitem.h \
|
||||||
src/map/IMG/textpointitem.h \
|
src/map/IMG/textpointitem.h \
|
||||||
src/map/projection.h \
|
src/map/projection.h \
|
||||||
@ -175,13 +185,19 @@ HEADERS += src/common/config.h \
|
|||||||
src/map/IMG/lblfile.h \
|
src/map/IMG/lblfile.h \
|
||||||
src/map/IMG/vectortile.h \
|
src/map/IMG/vectortile.h \
|
||||||
src/map/IMG/subdiv.h \
|
src/map/IMG/subdiv.h \
|
||||||
src/map/IMG/units.h \
|
|
||||||
src/map/IMG/style.h \
|
src/map/IMG/style.h \
|
||||||
src/map/IMG/netfile.h \
|
src/map/IMG/netfile.h \
|
||||||
src/GUI/limitedcombobox.h \
|
src/GUI/limitedcombobox.h \
|
||||||
src/GUI/pathtickitem.h \
|
src/GUI/pathtickitem.h \
|
||||||
src/map/IMG/textitem.h
|
src/map/IMG/textitem.h \
|
||||||
|
src/map/IMG/label.h \
|
||||||
|
src/data/csv.h \
|
||||||
|
src/data/cupparser.h \
|
||||||
|
src/data/gpiparser.h \
|
||||||
|
src/data/address.h \
|
||||||
|
src/data/smlparser.h
|
||||||
SOURCES += src/main.cpp \
|
SOURCES += src/main.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 \
|
||||||
@ -233,6 +249,12 @@ SOURCES += src/main.cpp \
|
|||||||
src/GUI/mapview.cpp \
|
src/GUI/mapview.cpp \
|
||||||
src/GUI/areaitem.cpp \
|
src/GUI/areaitem.cpp \
|
||||||
src/map/IMG/bitmapline.cpp \
|
src/map/IMG/bitmapline.cpp \
|
||||||
|
src/map/IMG/bitstream.cpp \
|
||||||
|
src/map/IMG/deltastream.cpp \
|
||||||
|
src/map/IMG/gmap.cpp \
|
||||||
|
src/map/IMG/huffmanstream.cpp \
|
||||||
|
src/map/IMG/huffmantable.cpp \
|
||||||
|
src/map/IMG/mapdata.cpp \
|
||||||
src/map/IMG/textpathitem.cpp \
|
src/map/IMG/textpathitem.cpp \
|
||||||
src/map/IMG/textpointitem.cpp \
|
src/map/IMG/textpointitem.cpp \
|
||||||
src/map/maplist.cpp \
|
src/map/maplist.cpp \
|
||||||
@ -311,14 +333,20 @@ SOURCES += src/main.cpp \
|
|||||||
src/map/IMG/style.cpp \
|
src/map/IMG/style.cpp \
|
||||||
src/map/IMG/netfile.cpp \
|
src/map/IMG/netfile.cpp \
|
||||||
src/GUI/pathtickitem.cpp \
|
src/GUI/pathtickitem.cpp \
|
||||||
src/map/IMG/textitem.cpp
|
src/map/IMG/textitem.cpp \
|
||||||
|
src/data/csv.cpp \
|
||||||
|
src/data/cupparser.cpp \
|
||||||
|
src/GUI/graphicsscene.cpp \
|
||||||
|
src/data/gpiparser.cpp \
|
||||||
|
src/data/smlparser.cpp
|
||||||
|
|
||||||
greaterThan(QT_MAJOR_VERSION, 4) {
|
greaterThan(QT_MAJOR_VERSION, 4) {
|
||||||
HEADERS += src/data/geojsonparser.h
|
HEADERS += src/data/geojsonparser.h
|
||||||
SOURCES += src/data/geojsonparser.cpp
|
SOURCES += src/data/geojsonparser.cpp
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINES += APP_VERSION=\\\"$$VERSION\\\"
|
DEFINES += APP_VERSION=\\\"$$VERSION\\\" \
|
||||||
|
QT_NO_DEPRECATED_WARNINGS
|
||||||
DEFINES *= QT_USE_QSTRINGBUILDER
|
DEFINES *= QT_USE_QSTRINGBUILDER
|
||||||
|
|
||||||
RESOURCES += gpxsee.qrc
|
RESOURCES += gpxsee.qrc
|
||||||
@ -334,7 +362,9 @@ TRANSLATIONS = lang/gpxsee_en.ts \
|
|||||||
lang/gpxsee_da.ts \
|
lang/gpxsee_da.ts \
|
||||||
lang/gpxsee_tr.ts \
|
lang/gpxsee_tr.ts \
|
||||||
lang/gpxsee_es.ts \
|
lang/gpxsee_es.ts \
|
||||||
lang/gpxsee_pt_BR.ts
|
lang/gpxsee_pt_BR.ts \
|
||||||
|
lang/gpxsee_uk.ts \
|
||||||
|
lang/gpxsee_hu.ts
|
||||||
|
|
||||||
macx {
|
macx {
|
||||||
ICON = icons/gpxsee.icns
|
ICON = icons/gpxsee.icns
|
||||||
@ -352,7 +382,9 @@ macx {
|
|||||||
lang/gpxsee_da.qm \
|
lang/gpxsee_da.qm \
|
||||||
lang/gpxsee_tr.qm \
|
lang/gpxsee_tr.qm \
|
||||||
lang/gpxsee_es.qm \
|
lang/gpxsee_es.qm \
|
||||||
lang/gpxsee_pt_BR.qm
|
lang/gpxsee_pt_BR.qm \
|
||||||
|
lang/gpxsee_uk.qm \
|
||||||
|
lang/gpxsee_hu.qm
|
||||||
csv.path = Contents/Resources
|
csv.path = Contents/Resources
|
||||||
csv.files = pkg/csv
|
csv.files = pkg/csv
|
||||||
maps.path = Contents/Resources
|
maps.path = Contents/Resources
|
||||||
@ -369,7 +401,10 @@ macx {
|
|||||||
icons/formats/wpt.icns \
|
icons/formats/wpt.icns \
|
||||||
icons/formats/loc.icns \
|
icons/formats/loc.icns \
|
||||||
icons/formats/slf.icns \
|
icons/formats/slf.icns \
|
||||||
icons/formats/json.icns
|
icons/formats/json.icns \
|
||||||
|
icons/formats/cup.icns \
|
||||||
|
icons/formats/gpi.icns \
|
||||||
|
icons/formats/sml.icns
|
||||||
QMAKE_BUNDLE_DATA += locale maps icons csv
|
QMAKE_BUNDLE_DATA += locale maps icons csv
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -386,7 +421,10 @@ win32 {
|
|||||||
icons/formats/wpt.ico \
|
icons/formats/wpt.ico \
|
||||||
icons/formats/loc.ico \
|
icons/formats/loc.ico \
|
||||||
icons/formats/slf.ico \
|
icons/formats/slf.ico \
|
||||||
icons/formats/json.ico
|
icons/formats/json.ico \
|
||||||
|
icons/formats/cup.ico \
|
||||||
|
icons/formats/gpi.ico \
|
||||||
|
icons/formats/sml.ico
|
||||||
DEFINES += _USE_MATH_DEFINES \
|
DEFINES += _USE_MATH_DEFINES \
|
||||||
NOGDI
|
NOGDI
|
||||||
}
|
}
|
||||||
|
BIN
icons/formats/cup.icns
Normal file
BIN
icons/formats/cup.icns
Normal file
Binary file not shown.
BIN
icons/formats/cup.ico
Normal file
BIN
icons/formats/cup.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 304 KiB |
BIN
icons/formats/gpi.icns
Normal file
BIN
icons/formats/gpi.icns
Normal file
Binary file not shown.
BIN
icons/formats/gpi.ico
Normal file
BIN
icons/formats/gpi.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 303 KiB |
BIN
icons/formats/sml.icns
Normal file
BIN
icons/formats/sml.icns
Normal file
Binary file not shown.
BIN
icons/formats/sml.ico
Normal file
BIN
icons/formats/sml.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 304 KiB |
@ -10,3 +10,6 @@ tcx:#ffcc00
|
|||||||
wpt:#66ff00
|
wpt:#66ff00
|
||||||
loc:#556677
|
loc:#556677
|
||||||
slf:#881199
|
slf:#881199
|
||||||
|
cup:#20a810
|
||||||
|
gpi:#fca314
|
||||||
|
sml:#6434eb
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1900
lang/gpxsee_hu.ts
Normal file
1900
lang/gpxsee_hu.ts
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1901
lang/gpxsee_uk.ts
Normal file
1901
lang/gpxsee_uk.ts
Normal file
File diff suppressed because it is too large
Load Diff
111
pkg/Info.plist
111
pkg/Info.plist
@ -211,6 +211,54 @@
|
|||||||
<key>CFBundleTypeRole</key>
|
<key>CFBundleTypeRole</key>
|
||||||
<string>Viewer</string>
|
<string>Viewer</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>cup</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>application/vnd.naviter.seeyou.cup</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>icons/cup.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>SeeYou CUP File</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>gpi</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>application/vnd.garmin.gpi</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>icons/gpi.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>Garmin POI File</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>sml</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>application/sml+xml</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>icons/sml.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>Suunto Markup Language</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
|
|
||||||
<key>UTImportedTypeDeclarations</key>
|
<key>UTImportedTypeDeclarations</key>
|
||||||
@ -467,6 +515,69 @@
|
|||||||
<string>application/geo+json</string>
|
<string>application/geo+json</string>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>com.naviter.seeyou.cup</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>http://www.naviter.com</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>SeeYou CUP File</string>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.data</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict>
|
||||||
|
<key>public.filename-extension</key>
|
||||||
|
<array>
|
||||||
|
<string>cup</string>
|
||||||
|
</array>
|
||||||
|
<key>public.mime-type</key>
|
||||||
|
<string>application/vnd.naviter.seeyou.cup</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>com.garmin.gpi</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>http://www.garmin.com</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>Garmin POI File</string>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.data</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict>
|
||||||
|
<key>public.filename-extension</key>
|
||||||
|
<array>
|
||||||
|
<string>gpi</string>
|
||||||
|
</array>
|
||||||
|
<key>public.mime-type</key>
|
||||||
|
<string>application/vnd.garmin.gpi</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>UTTypeIdentifier</key>
|
||||||
|
<string>com.suunto.sml</string>
|
||||||
|
<key>UTTypeReferenceURL</key>
|
||||||
|
<string>https://www.suunto.com</string>
|
||||||
|
<key>UTTypeDescription</key>
|
||||||
|
<string>Suunto Markup Language</string>
|
||||||
|
<key>UTTypeConformsTo</key>
|
||||||
|
<array>
|
||||||
|
<string>public.xml</string>
|
||||||
|
</array>
|
||||||
|
<key>UTTypeTagSpecification</key>
|
||||||
|
<dict>
|
||||||
|
<key>public.filename-extension</key>
|
||||||
|
<array>
|
||||||
|
<string>sml</string>
|
||||||
|
</array>
|
||||||
|
<key>public.mime-type</key>
|
||||||
|
<string>application/sml+xml</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
@ -12,16 +12,18 @@
|
|||||||
|
|
||||||
<p>Features:</p>
|
<p>Features:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Opens GPX, TCX, FIT, KML, IGC, NMEA, SLF, LOC, OziExplorer (PLT,
|
<li>Opens GPX, TCX, FIT, KML, IGC, NMEA, SIGMA SLF, Suunto SML, LOC,
|
||||||
WPT, RTE), GeoJSON, Garmin CSV and geotagged JPEG files.</li>
|
OziExplorer (PLT, WPT, RTE), GeoJSON, SeeYou CUP,
|
||||||
|
Garmin GPI & CSV and geotagged JPEG files.</li>
|
||||||
<li>User-definable online maps (OpenStreetMap/Google tiles, WMTS,
|
<li>User-definable online maps (OpenStreetMap/Google tiles, WMTS,
|
||||||
WMS, TMS).</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, GeoTIFF images).</li>
|
||||||
<li>Elevation, speed, heart rate, cadence, power and temperature
|
<li>Elevation, speed, heart rate, cadence, power, temperature and
|
||||||
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>Print/export to PDF.</li>
|
<li>Print/export to PDF.</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>
|
||||||
@ -67,5 +69,8 @@
|
|||||||
<mimetype>application/loc+xml</mimetype>
|
<mimetype>application/loc+xml</mimetype>
|
||||||
<mimetype>application/slf+xml</mimetype>
|
<mimetype>application/slf+xml</mimetype>
|
||||||
<mimetype>application/geo+json</mimetype>
|
<mimetype>application/geo+json</mimetype>
|
||||||
|
<mimetype>application/vnd.naviter.seeyou.cup</mimetype>
|
||||||
|
<mimetype>application/vnd.garmin.gpi</mimetype>
|
||||||
|
<mimetype>application/sml+xml</mimetype>
|
||||||
</mimetypes>
|
</mimetypes>
|
||||||
</component>
|
</component>
|
||||||
|
@ -3,12 +3,16 @@ Name=GPXSee
|
|||||||
Comment=GPS log file viewer and analyzer
|
Comment=GPS log file viewer and analyzer
|
||||||
Comment[cz]=Prohlížeč a analyzátor GPS logů
|
Comment[cz]=Prohlížeč a analyzátor GPS logů
|
||||||
Comment[fi]=Ohjelma GPS-lokien katseluun ja analysointiin
|
Comment[fi]=Ohjelma GPS-lokien katseluun ja analysointiin
|
||||||
|
Comment[fr]=Visualisation et analyse de fichier GPS
|
||||||
|
Comment[nb]=GPS-loggfilleser og analysator
|
||||||
Comment[pl]=Przeglądarka i analizator plików dziennika GPS
|
Comment[pl]=Przeglądarka i analizator plików dziennika GPS
|
||||||
Comment[ru]=Программа для просмотра и анализа GPS логов
|
Comment[ru]=Программа для просмотра и анализа GPS логов
|
||||||
Comment[sv]=GPS-loggfilsläsare och analysator
|
Comment[sv]=GPS-loggfilsläsare och analysator
|
||||||
|
Comment[tr]=GPS günlük dosyası görüntüleyici ve analizcisi
|
||||||
|
Comment[uk]=Переглядач та аналізатор GPS логів
|
||||||
Exec=gpxsee %F
|
Exec=gpxsee %F
|
||||||
Icon=gpxsee
|
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;
|
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;
|
||||||
|
@ -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.9"
|
!define VERSION "7.24"
|
||||||
|
|
||||||
; The file to write
|
; The file to write
|
||||||
OutFile "GPXSee-${VERSION}.exe"
|
OutFile "GPXSee-${VERSION}.exe"
|
||||||
@ -106,18 +106,21 @@ 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" 5
|
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 8
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 6
|
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 9
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 7
|
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 10
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 8
|
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 11
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 9
|
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 12
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 data" 10
|
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 Data" 13
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 11
|
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 14
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 12
|
!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
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "geojson" "GeoJSON" 4
|
!insertmacro FILE_ASSOCIATION_ADD "geojson" "GeoJSON" 4
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "cup" "SeeYou CUP File" 5
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "gpi" "Garmin POI File" 6
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "sml" "Suunto Markup Language" 7
|
||||||
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
|
||||||
@ -145,30 +148,17 @@ Section "MSVC runtime" SEC_MSVC
|
|||||||
|
|
||||||
SectionIn RO
|
SectionIn RO
|
||||||
|
|
||||||
DetailPrint "Checking whether Visual C++ 2015 Redistributable is already installed..."
|
|
||||||
${If} ${RunningX64}
|
|
||||||
ReadRegDword $R0 HKLM "SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x86" "Installed"
|
|
||||||
${Else}
|
|
||||||
ReadRegDword $R0 HKLM "SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x86" "Installed"
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
StrCmp $R0 "1" 0 +3
|
|
||||||
DetailPrint "Visual C++ 2015 Redistributable is already installed, skipping install."
|
|
||||||
Goto done
|
|
||||||
|
|
||||||
DetailPrint "Installing Visual C++ 2015 Redistributable..."
|
|
||||||
SetOutPath $TEMP
|
SetOutPath $TEMP
|
||||||
File "vcredist_x86.exe"
|
File "vc_redist.x86.exe"
|
||||||
ExecWait '"$TEMP\vcredist_x86.exe" /install /quiet /norestart'
|
ExecWait '"$TEMP\vc_redist.x86.exe" /install /quiet /norestart'
|
||||||
SetOutPath $INSTDIR
|
SetOutPath $INSTDIR
|
||||||
|
|
||||||
done:
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
Section "OpenSSL" SEC_OPENSSL
|
Section "OpenSSL" SEC_OPENSSL
|
||||||
|
|
||||||
File "libeay32.dll"
|
File "libcrypto-1_1.dll"
|
||||||
File "ssleay32.dll"
|
File "libssl-1_1.dll"
|
||||||
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
@ -186,6 +176,7 @@ SectionGroup "Localization" SEC_LOCALIZATION
|
|||||||
!insertmacro LOCALIZATION "Finnish" "fi"
|
!insertmacro LOCALIZATION "Finnish" "fi"
|
||||||
!insertmacro LOCALIZATION "French" "fr"
|
!insertmacro LOCALIZATION "French" "fr"
|
||||||
!insertmacro LOCALIZATION "German" "de"
|
!insertmacro LOCALIZATION "German" "de"
|
||||||
|
!insertmacro LOCALIZATION "Hungarian" "hu"
|
||||||
!insertmacro LOCALIZATION "Norwegian" "nb"
|
!insertmacro LOCALIZATION "Norwegian" "nb"
|
||||||
!insertmacro LOCALIZATION "Polish" "pl"
|
!insertmacro LOCALIZATION "Polish" "pl"
|
||||||
!insertmacro LOCALIZATION "Portuguese (Brazil)" "pt_BR"
|
!insertmacro LOCALIZATION "Portuguese (Brazil)" "pt_BR"
|
||||||
@ -193,6 +184,7 @@ SectionGroup "Localization" SEC_LOCALIZATION
|
|||||||
!insertmacro LOCALIZATION "Spanish" "es"
|
!insertmacro LOCALIZATION "Spanish" "es"
|
||||||
!insertmacro LOCALIZATION "Swedish" "sv"
|
!insertmacro LOCALIZATION "Swedish" "sv"
|
||||||
!insertmacro LOCALIZATION "Turkish" "tr"
|
!insertmacro LOCALIZATION "Turkish" "tr"
|
||||||
|
!insertmacro LOCALIZATION "Ukrainian" "uk"
|
||||||
SectionGroupEnd
|
SectionGroupEnd
|
||||||
|
|
||||||
;--------------------------------
|
;--------------------------------
|
||||||
@ -227,6 +219,9 @@ Section "Uninstall"
|
|||||||
!insertmacro FILE_ASSOCIATION_REMOVE "loc"
|
!insertmacro FILE_ASSOCIATION_REMOVE "loc"
|
||||||
!insertmacro FILE_ASSOCIATION_REMOVE "slf"
|
!insertmacro FILE_ASSOCIATION_REMOVE "slf"
|
||||||
!insertmacro FILE_ASSOCIATION_REMOVE "geojson"
|
!insertmacro FILE_ASSOCIATION_REMOVE "geojson"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "cup"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "gpi"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "sml"
|
||||||
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
|
||||||
@ -239,7 +234,7 @@ SectionEnd
|
|||||||
LangString DESC_QT ${LANG_ENGLISH} \
|
LangString DESC_QT ${LANG_ENGLISH} \
|
||||||
"QT cross-platform application framework."
|
"QT cross-platform application framework."
|
||||||
LangString DESC_MSVC ${LANG_ENGLISH} \
|
LangString DESC_MSVC ${LANG_ENGLISH} \
|
||||||
"Visual C++ 2015 runtime components. If already installed, will be skipped."
|
"Microsoft Visual C++ 2017 runtime. If already installed, will be skipped."
|
||||||
LangString DESC_OPENSSL ${LANG_ENGLISH} \
|
LangString DESC_OPENSSL ${LANG_ENGLISH} \
|
||||||
"OpenSSL library. Required for HTTPS to work."
|
"OpenSSL library. Required for HTTPS to work."
|
||||||
LangString DESC_ANGLE ${LANG_ENGLISH} \
|
LangString DESC_ANGLE ${LANG_ENGLISH} \
|
||||||
|
@ -84,4 +84,25 @@
|
|||||||
<generic-icon name="text-plain"/>
|
<generic-icon name="text-plain"/>
|
||||||
<glob pattern="*.geojson"/>
|
<glob pattern="*.geojson"/>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
|
|
||||||
|
<mime-type type="application/vnd.naviter.seeyou.cup">
|
||||||
|
<comment>SeeYou CUP File</comment>
|
||||||
|
<sub-class-of type="text/plain"/>
|
||||||
|
<generic-icon name="text-plain"/>
|
||||||
|
<glob pattern="*.cup"/>
|
||||||
|
</mime-type>
|
||||||
|
|
||||||
|
<mime-type type="application/vnd.garmin.gpi">
|
||||||
|
<comment>Garmin POI File</comment>
|
||||||
|
<sub-class-of type="application/octet-stream"/>
|
||||||
|
<generic-icon name="application/octet-stream"/>
|
||||||
|
<glob pattern="*.gpi"/>
|
||||||
|
</mime-type>
|
||||||
|
|
||||||
|
<mime-type type="application/sml+xml">
|
||||||
|
<comment>Suunto Markup Language</comment>
|
||||||
|
<sub-class-of type="application/xml"/>
|
||||||
|
<generic-icon name="application-xml"/>
|
||||||
|
<glob pattern="*.sml"/>
|
||||||
|
</mime-type>
|
||||||
</mime-info>
|
</mime-info>
|
||||||
|
@ -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.9"
|
!define VERSION "7.24"
|
||||||
|
|
||||||
; The file to write
|
; The file to write
|
||||||
OutFile "GPXSee-${VERSION}_x64.exe"
|
OutFile "GPXSee-${VERSION}_x64.exe"
|
||||||
@ -113,18 +113,21 @@ 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" 5
|
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 8
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 6
|
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 9
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 7
|
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 10
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 8
|
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 11
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 9
|
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 12
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 data" 10
|
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 Data" 13
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 11
|
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 14
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 12
|
!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
|
||||||
!insertmacro FILE_ASSOCIATION_ADD "geojson" "GeoJSON" 4
|
!insertmacro FILE_ASSOCIATION_ADD "geojson" "GeoJSON" 4
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "cup" "SeeYou CUP File" 5
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "gpi" "Garmin POI File" 6
|
||||||
|
!insertmacro FILE_ASSOCIATION_ADD "sml" "Suunto Markup Language" 7
|
||||||
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
|
||||||
@ -152,25 +155,17 @@ Section "MSVC runtime" SEC_MSVC
|
|||||||
|
|
||||||
SectionIn RO
|
SectionIn RO
|
||||||
|
|
||||||
DetailPrint "Checking whether Visual C++ 2015 Redistributable is already installed..."
|
|
||||||
ReadRegDword $R0 HKLM "SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64" "Installed"
|
|
||||||
StrCmp $R0 "1" 0 +3
|
|
||||||
DetailPrint "Visual C++ 2015 Redistributable is already installed, skipping install."
|
|
||||||
Goto done
|
|
||||||
|
|
||||||
DetailPrint "Installing Visual C++ 2015 Redistributable..."
|
|
||||||
SetOutPath $TEMP
|
SetOutPath $TEMP
|
||||||
File "vcredist_x64.exe"
|
File "vc_redist.x64.exe"
|
||||||
ExecWait '"$TEMP\vcredist_x64.exe" /install /quiet /norestart'
|
ExecWait '"$TEMP\vc_redist.x64.exe" /install /quiet /norestart'
|
||||||
SetOutPath $INSTDIR
|
SetOutPath $INSTDIR
|
||||||
|
|
||||||
done:
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
Section "OpenSSL" SEC_OPENSSL
|
Section "OpenSSL" SEC_OPENSSL
|
||||||
|
|
||||||
File "libeay32.dll"
|
File "libcrypto-1_1-x64.dll"
|
||||||
File "ssleay32.dll"
|
File "libssl-1_1-x64.dll"
|
||||||
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
@ -188,6 +183,7 @@ SectionGroup "Localization" SEC_LOCALIZATION
|
|||||||
!insertmacro LOCALIZATION "Finnish" "fi"
|
!insertmacro LOCALIZATION "Finnish" "fi"
|
||||||
!insertmacro LOCALIZATION "French" "fr"
|
!insertmacro LOCALIZATION "French" "fr"
|
||||||
!insertmacro LOCALIZATION "German" "de"
|
!insertmacro LOCALIZATION "German" "de"
|
||||||
|
!insertmacro LOCALIZATION "Hungarian" "hu"
|
||||||
!insertmacro LOCALIZATION "Norwegian" "nb"
|
!insertmacro LOCALIZATION "Norwegian" "nb"
|
||||||
!insertmacro LOCALIZATION "Polish" "pl"
|
!insertmacro LOCALIZATION "Polish" "pl"
|
||||||
!insertmacro LOCALIZATION "Portuguese (Brazil)" "pt_BR"
|
!insertmacro LOCALIZATION "Portuguese (Brazil)" "pt_BR"
|
||||||
@ -195,6 +191,7 @@ SectionGroup "Localization" SEC_LOCALIZATION
|
|||||||
!insertmacro LOCALIZATION "Spanish" "es"
|
!insertmacro LOCALIZATION "Spanish" "es"
|
||||||
!insertmacro LOCALIZATION "Swedish" "sv"
|
!insertmacro LOCALIZATION "Swedish" "sv"
|
||||||
!insertmacro LOCALIZATION "Turkish" "tr"
|
!insertmacro LOCALIZATION "Turkish" "tr"
|
||||||
|
!insertmacro LOCALIZATION "Ukrainian" "uk"
|
||||||
SectionGroupEnd
|
SectionGroupEnd
|
||||||
|
|
||||||
;--------------------------------
|
;--------------------------------
|
||||||
@ -230,6 +227,9 @@ Section "Uninstall"
|
|||||||
!insertmacro FILE_ASSOCIATION_REMOVE "loc"
|
!insertmacro FILE_ASSOCIATION_REMOVE "loc"
|
||||||
!insertmacro FILE_ASSOCIATION_REMOVE "slf"
|
!insertmacro FILE_ASSOCIATION_REMOVE "slf"
|
||||||
!insertmacro FILE_ASSOCIATION_REMOVE "geojson"
|
!insertmacro FILE_ASSOCIATION_REMOVE "geojson"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "cup"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "gpi"
|
||||||
|
!insertmacro FILE_ASSOCIATION_REMOVE "sml"
|
||||||
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
|
||||||
@ -242,7 +242,7 @@ SectionEnd
|
|||||||
LangString DESC_QT ${LANG_ENGLISH} \
|
LangString DESC_QT ${LANG_ENGLISH} \
|
||||||
"QT cross-platform application framework."
|
"QT cross-platform application framework."
|
||||||
LangString DESC_MSVC ${LANG_ENGLISH} \
|
LangString DESC_MSVC ${LANG_ENGLISH} \
|
||||||
"Visual C++ 2015 runtime components. If already installed, will be skipped."
|
"Microsoft Visual C++ 2017 runtime. If already installed, will be skipped."
|
||||||
LangString DESC_OPENSSL ${LANG_ENGLISH} \
|
LangString DESC_OPENSSL ${LANG_ENGLISH} \
|
||||||
"OpenSSL library. Required for HTTPS to work."
|
"OpenSSL library. Required for HTTPS to work."
|
||||||
LangString DESC_ANGLE ${LANG_ENGLISH} \
|
LangString DESC_ANGLE ${LANG_ENGLISH} \
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<map xmlns="http://www.gpxsee.org/map/1.3">
|
<map xmlns="http://www.gpxsee.org/map/1.4">
|
||||||
<name>4UMaps</name>
|
<name>4UMaps</name>
|
||||||
<url>https://4umaps.com/$z/$x/$y.png</url>
|
<url>https://tileserver.4umaps.com/$z/$x/$y.png</url>
|
||||||
<zoom min="2" max="15"/>
|
<zoom min="2" max="15"/>
|
||||||
<bounds bottom="-65"/>
|
<bounds bottom="-65"/>
|
||||||
<copyright>Map data: © OpenStreetMap contributors (ODbL) | Rendering: © 4UMaps.eu</copyright>
|
<copyright>Map data: © OpenStreetMap contributors (ODbL) | Rendering: © 4UMaps.eu</copyright>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<map xmlns="http://www.gpxsee.org/map/1.3" type="WMTS">
|
<map xmlns="http://www.gpxsee.org/map/1.4" type="WMTS">
|
||||||
<name>Antarctica</name>
|
<name>Antarctica</name>
|
||||||
<url type="REST">https://gis.ngdc.noaa.gov/arcgis/rest/services/antarctic/antarctic_basemap/MapServer/WMTS/1.0.0/WMTSCapabilities.xml</url>
|
<url type="REST">https://gis.ngdc.noaa.gov/arcgis/rest/services/antarctic/antarctic_basemap/MapServer/WMTS/1.0.0/WMTSCapabilities.xml</url>
|
||||||
<copyright>NOAA National Centers for Environmental Information (NCEI); International Bathymetric Chart of the Southern Ocean (IBCSO); General Bathymetric Chart of the Oceans (GEBCO); Natural Earth</copyright>
|
<copyright>NOAA National Centers for Environmental Information (NCEI); International Bathymetric Chart of the Southern Ocean (IBCSO); General Bathymetric Chart of the Oceans (GEBCO); Natural Earth</copyright>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<map xmlns="http://www.gpxsee.org/map/1.3">
|
<map xmlns="http://www.gpxsee.org/map/1.4">
|
||||||
<name>Open Street Map</name>
|
<name>Open Street Map</name>
|
||||||
<url>http://tile.openstreetmap.org/$z/$x/$y.png</url>
|
<url>https://tile.openstreetmap.org/$z/$x/$y.png</url>
|
||||||
<copyright>Map data: © OpenStreetMap contributors (ODbL) | Rendering: © OpenStreetMap (CC-BY-SA)</copyright>
|
<copyright>Map data: © OpenStreetMap contributors (ODbL) | Rendering: © OpenStreetMap (CC-BY-SA)</copyright>
|
||||||
</map>
|
</map>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<map xmlns="http://www.gpxsee.org/map/1.3">
|
<map xmlns="http://www.gpxsee.org/map/1.4">
|
||||||
<name>Open Topo Map</name>
|
<name>Open Topo Map</name>
|
||||||
<url>https://a.tile.opentopomap.org/$z/$x/$y.png</url>
|
<url>https://a.tile.opentopomap.org/$z/$x/$y.png</url>
|
||||||
<zoom max="17"/>
|
<zoom max="17"/>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<map xmlns="http://www.gpxsee.org/map/1.3">
|
<map xmlns="http://www.gpxsee.org/map/1.4">
|
||||||
<name>USGS Imagery</name>
|
<name>USGS Imagery</name>
|
||||||
<url>https://basemap.nationalmap.gov/ArcGIS/rest/services/USGSImageryOnly/MapServer/tile/$z/$y/$x</url>
|
<url>https://basemap.nationalmap.gov/ArcGIS/rest/services/USGSImageryOnly/MapServer/tile/$z/$y/$x</url>
|
||||||
<zoom min="2" max="15"/>
|
<zoom min="2" max="15"/>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<map xmlns="http://www.gpxsee.org/map/1.3">
|
<map xmlns="http://www.gpxsee.org/map/1.4">
|
||||||
<name>USGS Topo</name>
|
<name>USGS Topo</name>
|
||||||
<url>https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/tile/$z/$y/$x</url>
|
<url>https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/tile/$z/$y/$x</url>
|
||||||
<zoom min="2" max="15"/>
|
<zoom min="2" max="15"/>
|
||||||
|
@ -2,12 +2,13 @@
|
|||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QCursor>
|
#include <QCursor>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
#include <QGraphicsSceneMouseEvent>
|
||||||
#include "map/map.h"
|
#include "map/map.h"
|
||||||
#include "tooltip.h"
|
#include "popup.h"
|
||||||
#include "areaitem.h"
|
#include "areaitem.h"
|
||||||
|
|
||||||
|
|
||||||
QString AreaItem::toolTip() const
|
QString AreaItem::info() const
|
||||||
{
|
{
|
||||||
ToolTip tt;
|
ToolTip tt;
|
||||||
|
|
||||||
@ -20,8 +21,8 @@ QString AreaItem::toolTip() const
|
|||||||
return tt.toString();
|
return tt.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
AreaItem::AreaItem(const Area &area, Map *map, QGraphicsItem *parent)
|
AreaItem::AreaItem(const Area &area, Map *map, GraphicsItem *parent)
|
||||||
: QGraphicsItem(parent), _area(area)
|
: GraphicsItem(parent), _area(area)
|
||||||
{
|
{
|
||||||
_map = map;
|
_map = map;
|
||||||
_digitalZoom = 0;
|
_digitalZoom = 0;
|
||||||
@ -35,8 +36,6 @@ AreaItem::AreaItem(const Area &area, Map *map, QGraphicsItem *parent)
|
|||||||
|
|
||||||
setCursor(Qt::ArrowCursor);
|
setCursor(Qt::ArrowCursor);
|
||||||
setAcceptHoverEvents(true);
|
setAcceptHoverEvents(true);
|
||||||
|
|
||||||
setToolTip(toolTip());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -153,3 +152,27 @@ void AreaItem::setDigitalZoom(int zoom)
|
|||||||
_digitalZoom = zoom;
|
_digitalZoom = zoom;
|
||||||
_pen.setWidthF(_width * pow(2, -_digitalZoom));
|
_pen.setWidthF(_width * pow(2, -_digitalZoom));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AreaItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event);
|
||||||
|
|
||||||
|
_pen.setWidthF((_width + 1) * pow(2, -_digitalZoom));
|
||||||
|
setZValue(zValue() + 1.0);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AreaItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event);
|
||||||
|
|
||||||
|
_pen.setWidthF(_width * pow(2, -_digitalZoom));
|
||||||
|
setZValue(zValue() - 1.0);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AreaItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
|
||||||
|
{
|
||||||
|
Popup::show(event->screenPos(), info(), event->widget());
|
||||||
|
QGraphicsItem::mousePressEvent(event);
|
||||||
|
}
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
#ifndef AREAITEM_H
|
#ifndef AREAITEM_H
|
||||||
#define AREAITEM_H
|
#define AREAITEM_H
|
||||||
|
|
||||||
#include <QGraphicsItem>
|
|
||||||
#include "data/area.h"
|
#include "data/area.h"
|
||||||
|
#include "graphicsscene.h"
|
||||||
|
#include "tooltip.h"
|
||||||
|
|
||||||
class Map;
|
class Map;
|
||||||
|
|
||||||
class AreaItem : public QGraphicsItem
|
class AreaItem : public GraphicsItem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AreaItem(const Area &area, Map *map, QGraphicsItem *parent = 0);
|
AreaItem(const Area &area, Map *map, GraphicsItem *parent = 0);
|
||||||
|
|
||||||
QPainterPath shape() const {return _painterPath;}
|
QPainterPath shape() const {return _painterPath;}
|
||||||
QRectF boundingRect() const {return _painterPath.boundingRect();}
|
QRectF boundingRect() const {return _painterPath.boundingRect();}
|
||||||
@ -26,10 +27,17 @@ public:
|
|||||||
void setStyle(Qt::PenStyle style);
|
void setStyle(Qt::PenStyle style);
|
||||||
void setDigitalZoom(int zoom);
|
void setDigitalZoom(int zoom);
|
||||||
|
|
||||||
|
virtual QString info() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void hoverEnterEvent(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();
|
||||||
QString toolTip() const;
|
ToolTip toolTip() const;
|
||||||
|
|
||||||
Area _area;
|
Area _area;
|
||||||
Map *_map;
|
Map *_map;
|
||||||
|
@ -30,7 +30,7 @@ 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 = niceNum(maxValue - minValue, false);
|
||||||
_d = niceNum(range / maxCount, true);
|
_d = niceNum(range / maxCount, false);
|
||||||
_min = ceil(minValue / _d) * _d;
|
_min = ceil(minValue / _d) * _d;
|
||||||
_max = floor(maxValue / _d) * _d;
|
_max = floor(maxValue / _d) * _d;
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,11 @@ CadenceGraph::CadenceGraph(QWidget *parent) : GraphTab(parent)
|
|||||||
setSliderPrecision(1);
|
setSliderPrecision(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CadenceGraph::~CadenceGraph()
|
||||||
|
{
|
||||||
|
qDeleteAll(_tracks);
|
||||||
|
}
|
||||||
|
|
||||||
void CadenceGraph::setInfo()
|
void CadenceGraph::setInfo()
|
||||||
{
|
{
|
||||||
if (_showTracks) {
|
if (_showTracks) {
|
||||||
@ -36,23 +41,28 @@ QList<GraphItem*> CadenceGraph::loadData(const Data &data)
|
|||||||
const Graph &graph = track.cadence();
|
const Graph &graph = track.cadence();
|
||||||
|
|
||||||
if (!graph.isValid()) {
|
if (!graph.isValid()) {
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
graphs.append(0);
|
graphs.append(0);
|
||||||
} else {
|
} else {
|
||||||
CadenceGraphItem *gi = new CadenceGraphItem(graph, _graphType);
|
CadenceGraphItem *gi = new CadenceGraphItem(graph, _graphType,
|
||||||
GraphView::addGraph(gi);
|
_width, _palette.nextColor());
|
||||||
|
|
||||||
|
_tracks.append(gi);
|
||||||
|
if (_showTracks)
|
||||||
|
addGraph(gi);
|
||||||
|
|
||||||
_avg.append(QPointF(track.distance(), gi->avg()));
|
_avg.append(QPointF(track.distance(), gi->avg()));
|
||||||
graphs.append(gi);
|
graphs.append(gi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < data.routes().count(); i++) {
|
for (int i = 0; i < data.routes().count(); i++) {
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
graphs.append(0);
|
graphs.append(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < data.areas().count(); i++)
|
for (int i = 0; i < data.areas().count(); i++)
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
|
|
||||||
setInfo();
|
setInfo();
|
||||||
redraw();
|
redraw();
|
||||||
@ -75,6 +85,9 @@ qreal CadenceGraph::avg() const
|
|||||||
|
|
||||||
void CadenceGraph::clear()
|
void CadenceGraph::clear()
|
||||||
{
|
{
|
||||||
|
qDeleteAll(_tracks);
|
||||||
|
_tracks.clear();
|
||||||
|
|
||||||
_avg.clear();
|
_avg.clear();
|
||||||
|
|
||||||
GraphTab::clear();
|
GraphTab::clear();
|
||||||
@ -84,7 +97,13 @@ void CadenceGraph::showTracks(bool show)
|
|||||||
{
|
{
|
||||||
_showTracks = show;
|
_showTracks = show;
|
||||||
|
|
||||||
showGraph(show);
|
for (int i = 0; i < _tracks.size(); i++) {
|
||||||
|
if (show)
|
||||||
|
addGraph(_tracks.at(i));
|
||||||
|
else
|
||||||
|
removeGraph(_tracks.at(i));
|
||||||
|
}
|
||||||
|
|
||||||
setInfo();
|
setInfo();
|
||||||
|
|
||||||
redraw();
|
redraw();
|
||||||
|
@ -3,18 +3,20 @@
|
|||||||
|
|
||||||
#include "graphtab.h"
|
#include "graphtab.h"
|
||||||
|
|
||||||
|
class CadenceGraphItem;
|
||||||
|
|
||||||
class CadenceGraph : public GraphTab
|
class CadenceGraph : public GraphTab
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CadenceGraph(QWidget *parent = 0);
|
CadenceGraph(QWidget *parent = 0);
|
||||||
|
~CadenceGraph();
|
||||||
|
|
||||||
QString label() const {return tr("Cadence");}
|
QString label() const {return tr("Cadence");}
|
||||||
QList<GraphItem*> loadData(const Data &data);
|
QList<GraphItem*> loadData(const Data &data);
|
||||||
void clear();
|
void clear();
|
||||||
void showTracks(bool show);
|
void showTracks(bool show);
|
||||||
void showRoutes(bool show) {Q_UNUSED(show);}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
qreal avg() const;
|
qreal avg() const;
|
||||||
@ -24,6 +26,7 @@ private:
|
|||||||
QVector<QPointF> _avg;
|
QVector<QPointF> _avg;
|
||||||
|
|
||||||
bool _showTracks;
|
bool _showTracks;
|
||||||
|
QList<CadenceGraphItem *> _tracks;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CADENCEGRAPH_H
|
#endif // CADENCEGRAPH_H
|
||||||
|
@ -4,12 +4,12 @@
|
|||||||
|
|
||||||
|
|
||||||
CadenceGraphItem::CadenceGraphItem(const Graph &graph, GraphType type,
|
CadenceGraphItem::CadenceGraphItem(const Graph &graph, GraphType type,
|
||||||
QGraphicsItem *parent) : GraphItem(graph, type, parent)
|
int width, const QColor &color, QGraphicsItem *parent)
|
||||||
|
: GraphItem(graph, type, width, color, parent)
|
||||||
{
|
{
|
||||||
setToolTip(toolTip());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString CadenceGraphItem::toolTip() const
|
QString CadenceGraphItem::info() const
|
||||||
{
|
{
|
||||||
ToolTip tt;
|
ToolTip tt;
|
||||||
QLocale l(QLocale::system());
|
QLocale l(QLocale::system());
|
||||||
|
@ -8,11 +8,10 @@ class CadenceGraphItem : public GraphItem
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CadenceGraphItem(const Graph &graph, GraphType type,
|
CadenceGraphItem(const Graph &graph, GraphType type, int width,
|
||||||
QGraphicsItem *parent = 0);
|
const QColor &color, QGraphicsItem *parent = 0);
|
||||||
|
|
||||||
private:
|
QString info() const;
|
||||||
QString toolTip() const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CADENCEGRAPHITEM_H
|
#endif // CADENCEGRAPHITEM_H
|
||||||
|
@ -8,26 +8,18 @@
|
|||||||
|
|
||||||
static qreal nMin(qreal a, qreal b)
|
static qreal nMin(qreal a, qreal b)
|
||||||
{
|
{
|
||||||
if (!std::isnan(a) && !std::isnan(b))
|
if (std::isnan(a))
|
||||||
return qMin(a, b);
|
return std::isnan(b) ? NAN : b;
|
||||||
else if (!std::isnan(a))
|
|
||||||
return a;
|
|
||||||
else if (!std::isnan(b))
|
|
||||||
return b;
|
|
||||||
else
|
else
|
||||||
return NAN;
|
return std::isnan(b) ? a : qMin(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
static qreal nMax(qreal a, qreal b)
|
static qreal nMax(qreal a, qreal b)
|
||||||
{
|
{
|
||||||
if (!std::isnan(a) && !std::isnan(b))
|
if (std::isnan(a))
|
||||||
return qMax(a, b);
|
return std::isnan(b) ? NAN : b;
|
||||||
else if (!std::isnan(a))
|
|
||||||
return a;
|
|
||||||
else if (!std::isnan(b))
|
|
||||||
return b;
|
|
||||||
else
|
else
|
||||||
return NAN;
|
return std::isnan(b) ? a : qMax(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
ElevationGraph::ElevationGraph(QWidget *parent) : GraphTab(parent)
|
ElevationGraph::ElevationGraph(QWidget *parent) : GraphTab(parent)
|
||||||
@ -49,6 +41,12 @@ ElevationGraph::ElevationGraph(QWidget *parent) : GraphTab(parent)
|
|||||||
setMinYRange(50.0);
|
setMinYRange(50.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ElevationGraph::~ElevationGraph()
|
||||||
|
{
|
||||||
|
qDeleteAll(_tracks);
|
||||||
|
qDeleteAll(_routes);
|
||||||
|
}
|
||||||
|
|
||||||
void ElevationGraph::setInfo()
|
void ElevationGraph::setInfo()
|
||||||
{
|
{
|
||||||
if (std::isnan(max()) || std::isnan(min()))
|
if (std::isnan(max()) || std::isnan(min()))
|
||||||
@ -70,19 +68,28 @@ void ElevationGraph::setInfo()
|
|||||||
GraphItem *ElevationGraph::loadGraph(const Graph &graph, Type type)
|
GraphItem *ElevationGraph::loadGraph(const Graph &graph, Type type)
|
||||||
{
|
{
|
||||||
if (!graph.isValid()) {
|
if (!graph.isValid()) {
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ElevationGraphItem *gi = new ElevationGraphItem(graph, _graphType);
|
ElevationGraphItem *gi = new ElevationGraphItem(graph, _graphType, _width,
|
||||||
GraphView::addGraph(gi, type);
|
_palette.nextColor());
|
||||||
|
gi->setUnits(_units);
|
||||||
|
|
||||||
if (type == Track) {
|
if (type == Track) {
|
||||||
|
_tracks.append(gi);
|
||||||
|
if (_showTracks)
|
||||||
|
addGraph(gi);
|
||||||
|
|
||||||
_trackAscent += gi->ascent();
|
_trackAscent += gi->ascent();
|
||||||
_trackDescent += gi->descent();
|
_trackDescent += gi->descent();
|
||||||
_trackMax = nMax(_trackMax, gi->max());
|
_trackMax = nMax(_trackMax, gi->max());
|
||||||
_trackMin = nMin(_trackMin, gi->min());
|
_trackMin = nMin(_trackMin, gi->min());
|
||||||
} else {
|
} else {
|
||||||
|
_routes.append(gi);
|
||||||
|
if (_showRoutes)
|
||||||
|
addGraph(gi);
|
||||||
|
|
||||||
_routeAscent += gi->ascent();
|
_routeAscent += gi->ascent();
|
||||||
_routeDescent += gi->descent();
|
_routeDescent += gi->descent();
|
||||||
_routeMax = nMax(_routeMax, gi->max());
|
_routeMax = nMax(_routeMax, gi->max());
|
||||||
@ -101,7 +108,7 @@ QList<GraphItem*> ElevationGraph::loadData(const Data &data)
|
|||||||
for (int i = 0; i < data.routes().count(); i++)
|
for (int i = 0; i < data.routes().count(); i++)
|
||||||
graphs.append(loadGraph(data.routes().at(i).elevation(), Route));
|
graphs.append(loadGraph(data.routes().at(i).elevation(), Route));
|
||||||
for (int i = 0; i < data.areas().count(); i++)
|
for (int i = 0; i < data.areas().count(); i++)
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
|
|
||||||
setInfo();
|
setInfo();
|
||||||
redraw();
|
redraw();
|
||||||
@ -111,6 +118,11 @@ QList<GraphItem*> ElevationGraph::loadData(const Data &data)
|
|||||||
|
|
||||||
void ElevationGraph::clear()
|
void ElevationGraph::clear()
|
||||||
{
|
{
|
||||||
|
qDeleteAll(_tracks);
|
||||||
|
_tracks.clear();
|
||||||
|
qDeleteAll(_routes);
|
||||||
|
_routes.clear();
|
||||||
|
|
||||||
_trackAscent = 0;
|
_trackAscent = 0;
|
||||||
_routeAscent = 0;
|
_routeAscent = 0;
|
||||||
_trackDescent = 0;
|
_trackDescent = 0;
|
||||||
@ -142,12 +154,23 @@ void ElevationGraph::setUnits(Units units)
|
|||||||
GraphView::setUnits(units);
|
GraphView::setUnits(units);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ElevationGraph::showItems(const QList<ElevationGraphItem *> &list,
|
||||||
|
bool show)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
if (show)
|
||||||
|
addGraph(list.at(i));
|
||||||
|
else
|
||||||
|
removeGraph(list.at(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ElevationGraph::showTracks(bool show)
|
void ElevationGraph::showTracks(bool show)
|
||||||
{
|
{
|
||||||
_showTracks = show;
|
_showTracks = show;
|
||||||
|
|
||||||
|
showItems(_tracks, show);
|
||||||
setInfo();
|
setInfo();
|
||||||
showGraph(show, Track);
|
|
||||||
|
|
||||||
redraw();
|
redraw();
|
||||||
}
|
}
|
||||||
@ -156,7 +179,7 @@ void ElevationGraph::showRoutes(bool show)
|
|||||||
{
|
{
|
||||||
_showRoutes = show;
|
_showRoutes = show;
|
||||||
|
|
||||||
showGraph(show, Route);
|
showItems(_routes, show);
|
||||||
setInfo();
|
setInfo();
|
||||||
|
|
||||||
redraw();
|
redraw();
|
||||||
|
@ -3,12 +3,15 @@
|
|||||||
|
|
||||||
#include "graphtab.h"
|
#include "graphtab.h"
|
||||||
|
|
||||||
|
class ElevationGraphItem;
|
||||||
|
|
||||||
class ElevationGraph : public GraphTab
|
class ElevationGraph : public GraphTab
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ElevationGraph(QWidget *parent = 0);
|
ElevationGraph(QWidget *parent = 0);
|
||||||
|
~ElevationGraph();
|
||||||
|
|
||||||
QString label() const {return tr("Elevation");}
|
QString label() const {return tr("Elevation");}
|
||||||
QList<GraphItem*> loadData(const Data &data);
|
QList<GraphItem*> loadData(const Data &data);
|
||||||
@ -29,6 +32,7 @@ private:
|
|||||||
void setInfo();
|
void setInfo();
|
||||||
|
|
||||||
GraphItem *loadGraph(const Graph &graph, Type type);
|
GraphItem *loadGraph(const Graph &graph, Type type);
|
||||||
|
void showItems(const QList<ElevationGraphItem *> &list, bool show);
|
||||||
|
|
||||||
qreal _trackAscent, _trackDescent;
|
qreal _trackAscent, _trackDescent;
|
||||||
qreal _routeAscent, _routeDescent;
|
qreal _routeAscent, _routeDescent;
|
||||||
@ -36,6 +40,7 @@ private:
|
|||||||
qreal _trackMin, _routeMin;
|
qreal _trackMin, _routeMin;
|
||||||
|
|
||||||
bool _showTracks, _showRoutes;
|
bool _showTracks, _showRoutes;
|
||||||
|
QList<ElevationGraphItem *> _tracks, _routes;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ELEVATIONGRAPH_H
|
#endif // ELEVATIONGRAPH_H
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
|
|
||||||
|
|
||||||
ElevationGraphItem::ElevationGraphItem(const Graph &graph, GraphType type,
|
ElevationGraphItem::ElevationGraphItem(const Graph &graph, GraphType type,
|
||||||
QGraphicsItem *parent) : GraphItem(graph, type, parent)
|
int width, const QColor &color, QGraphicsItem *parent)
|
||||||
|
: GraphItem(graph, type, width, color, parent)
|
||||||
{
|
{
|
||||||
_min = GraphItem::min();
|
_min = GraphItem::min();
|
||||||
_max = GraphItem::max();
|
_max = GraphItem::max();
|
||||||
@ -23,15 +24,13 @@ ElevationGraphItem::ElevationGraphItem(const Graph &graph, GraphType type,
|
|||||||
_descent += prev - cur;
|
_descent += prev - cur;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setToolTip(toolTip(Metric));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString ElevationGraphItem::toolTip(Units units) const
|
QString ElevationGraphItem::info() const
|
||||||
{
|
{
|
||||||
ToolTip tt;
|
ToolTip tt;
|
||||||
qreal scale = (units == Metric) ? 1.0 : M2FT;
|
qreal scale = (_units == Metric) ? 1.0 : M2FT;
|
||||||
QString su = (units == Metric) ? tr("m") : tr("ft");
|
QString su = (_units == Metric) ? tr("m") : tr("ft");
|
||||||
QLocale l(QLocale::system());
|
QLocale l(QLocale::system());
|
||||||
|
|
||||||
tt.insert(tr("Ascent"), l.toString(ascent() * scale, 'f', 0)
|
tt.insert(tr("Ascent"), l.toString(ascent() * scale, 'f', 0)
|
||||||
@ -45,8 +44,3 @@ QString ElevationGraphItem::toolTip(Units units) const
|
|||||||
|
|
||||||
return tt.toString();
|
return tt.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ElevationGraphItem::setUnits(Units units)
|
|
||||||
{
|
|
||||||
setToolTip(toolTip(units));
|
|
||||||
}
|
|
||||||
|
@ -8,19 +8,17 @@ class ElevationGraphItem : public GraphItem
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ElevationGraphItem(const Graph &graph, GraphType type,
|
ElevationGraphItem(const Graph &graph, GraphType type, int width,
|
||||||
QGraphicsItem *parent = 0);
|
const QColor &color, QGraphicsItem *parent = 0);
|
||||||
|
|
||||||
qreal ascent() const {return _ascent;}
|
qreal ascent() const {return _ascent;}
|
||||||
qreal descent() const {return _descent;}
|
qreal descent() const {return _descent;}
|
||||||
qreal max() const {return _max;}
|
qreal max() const {return _max;}
|
||||||
qreal min() const {return _min;}
|
qreal min() const {return _min;}
|
||||||
|
|
||||||
void setUnits(Units units);
|
QString info() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString toolTip(Units units) const;
|
|
||||||
|
|
||||||
qreal _ascent, _descent, _min, _max;
|
qreal _ascent, _descent, _min, _max;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -14,6 +14,11 @@ GearRatioGraph::GearRatioGraph(QWidget *parent) : GraphTab(parent)
|
|||||||
setSliderPrecision(2);
|
setSliderPrecision(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GearRatioGraph::~GearRatioGraph()
|
||||||
|
{
|
||||||
|
qDeleteAll(_tracks);
|
||||||
|
}
|
||||||
|
|
||||||
void GearRatioGraph::setInfo()
|
void GearRatioGraph::setInfo()
|
||||||
{
|
{
|
||||||
if (_showTracks) {
|
if (_showTracks) {
|
||||||
@ -37,11 +42,15 @@ QList<GraphItem*> GearRatioGraph::loadData(const Data &data)
|
|||||||
const Graph &graph = data.tracks().at(i).ratio();
|
const Graph &graph = data.tracks().at(i).ratio();
|
||||||
|
|
||||||
if (!graph.isValid()) {
|
if (!graph.isValid()) {
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
graphs.append(0);
|
graphs.append(0);
|
||||||
} else {
|
} else {
|
||||||
GearRatioGraphItem *gi = new GearRatioGraphItem(graph, _graphType);
|
GearRatioGraphItem *gi = new GearRatioGraphItem(graph, _graphType,
|
||||||
GraphView::addGraph(gi);
|
_width, _palette.nextColor());
|
||||||
|
|
||||||
|
_tracks.append(gi);
|
||||||
|
if (_showTracks)
|
||||||
|
addGraph(gi);
|
||||||
|
|
||||||
for (QMap<qreal, qreal>::const_iterator it = gi->map().constBegin();
|
for (QMap<qreal, qreal>::const_iterator it = gi->map().constBegin();
|
||||||
it != gi->map().constEnd(); ++it)
|
it != gi->map().constEnd(); ++it)
|
||||||
@ -51,12 +60,12 @@ QList<GraphItem*> GearRatioGraph::loadData(const Data &data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < data.routes().count(); i++) {
|
for (int i = 0; i < data.routes().count(); i++) {
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
graphs.append(0);
|
graphs.append(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < data.areas().count(); i++)
|
for (int i = 0; i < data.areas().count(); i++)
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
|
|
||||||
setInfo();
|
setInfo();
|
||||||
redraw();
|
redraw();
|
||||||
@ -70,10 +79,7 @@ qreal GearRatioGraph::top() const
|
|||||||
|
|
||||||
for (QMap<qreal, qreal>::const_iterator it = _map.constBegin();
|
for (QMap<qreal, qreal>::const_iterator it = _map.constBegin();
|
||||||
it != _map.constEnd(); ++it) {
|
it != _map.constEnd(); ++it) {
|
||||||
if (it == _map.constBegin()) {
|
if (std::isnan(val) || it.value() > val) {
|
||||||
val = it.value();
|
|
||||||
key = it.key();
|
|
||||||
} else if (it.value() > val) {
|
|
||||||
val = it.value();
|
val = it.value();
|
||||||
key = it.key();
|
key = it.key();
|
||||||
}
|
}
|
||||||
@ -84,6 +90,9 @@ qreal GearRatioGraph::top() const
|
|||||||
|
|
||||||
void GearRatioGraph::clear()
|
void GearRatioGraph::clear()
|
||||||
{
|
{
|
||||||
|
qDeleteAll(_tracks);
|
||||||
|
_tracks.clear();
|
||||||
|
|
||||||
_map.clear();
|
_map.clear();
|
||||||
|
|
||||||
GraphTab::clear();
|
GraphTab::clear();
|
||||||
@ -93,7 +102,13 @@ void GearRatioGraph::showTracks(bool show)
|
|||||||
{
|
{
|
||||||
_showTracks = show;
|
_showTracks = show;
|
||||||
|
|
||||||
showGraph(show);
|
for (int i = 0; i < _tracks.size(); i++) {
|
||||||
|
if (show)
|
||||||
|
addGraph(_tracks.at(i));
|
||||||
|
else
|
||||||
|
removeGraph(_tracks.at(i));
|
||||||
|
}
|
||||||
|
|
||||||
setInfo();
|
setInfo();
|
||||||
|
|
||||||
redraw();
|
redraw();
|
||||||
|
@ -4,12 +4,15 @@
|
|||||||
#include <QMap>
|
#include <QMap>
|
||||||
#include "graphtab.h"
|
#include "graphtab.h"
|
||||||
|
|
||||||
|
class GearRatioGraphItem;
|
||||||
|
|
||||||
class GearRatioGraph : public GraphTab
|
class GearRatioGraph : public GraphTab
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GearRatioGraph(QWidget *parent = 0);
|
GearRatioGraph(QWidget *parent = 0);
|
||||||
|
~GearRatioGraph();
|
||||||
|
|
||||||
QString label() const {return tr("Gear ratio");}
|
QString label() const {return tr("Gear ratio");}
|
||||||
QList<GraphItem*> loadData(const Data &data);
|
QList<GraphItem*> loadData(const Data &data);
|
||||||
@ -25,6 +28,7 @@ private:
|
|||||||
QMap<qreal, qreal> _map;
|
QMap<qreal, qreal> _map;
|
||||||
|
|
||||||
bool _showTracks;
|
bool _showTracks;
|
||||||
|
QList<GearRatioGraphItem*> _tracks;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GEARRATIOGRAPH_H
|
#endif // GEARRATIOGRAPH_H
|
||||||
|
@ -5,25 +5,29 @@
|
|||||||
|
|
||||||
|
|
||||||
GearRatioGraphItem::GearRatioGraphItem(const Graph &graph, GraphType type,
|
GearRatioGraphItem::GearRatioGraphItem(const Graph &graph, GraphType type,
|
||||||
QGraphicsItem *parent) : GraphItem(graph, type, parent), _top(NAN)
|
int width, const QColor &color, QGraphicsItem *parent)
|
||||||
|
: GraphItem(graph, type, width, color, parent)
|
||||||
{
|
{
|
||||||
qreal val = NAN;
|
for (int i = 0; i < graph.size(); i++) {
|
||||||
|
const GraphSegment &segment = graph.at(i);
|
||||||
|
for (int j = 1; j < segment.size(); j++) {
|
||||||
|
qreal dx = segment.at(j).s() - segment.at(j-1).s();
|
||||||
|
_map.insert(segment.at(j).y(), _map.value(segment.at(j).y()) + dx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal key = NAN, val = NAN;
|
||||||
for (QMap<qreal, qreal>::const_iterator it = _map.constBegin();
|
for (QMap<qreal, qreal>::const_iterator it = _map.constBegin();
|
||||||
it != _map.constEnd(); ++it) {
|
it != _map.constEnd(); ++it) {
|
||||||
if (it == _map.constBegin()) {
|
if (std::isnan(val) || it.value() > val) {
|
||||||
val = it.value();
|
val = it.value();
|
||||||
_top = it.key();
|
key = it.key();
|
||||||
} else if (it.value() > val) {
|
|
||||||
val = it.value();
|
|
||||||
_top = it.key();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_top = key;
|
||||||
setToolTip(toolTip());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString GearRatioGraphItem::toolTip() const
|
QString GearRatioGraphItem::info() const
|
||||||
{
|
{
|
||||||
ToolTip tt;
|
ToolTip tt;
|
||||||
QLocale l(QLocale::system());
|
QLocale l(QLocale::system());
|
||||||
|
@ -9,16 +9,15 @@ class GearRatioGraphItem : public GraphItem
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GearRatioGraphItem(const Graph &graph, GraphType type,
|
GearRatioGraphItem(const Graph &graph, GraphType type, int width,
|
||||||
QGraphicsItem *parent = 0);
|
const QColor &color, QGraphicsItem *parent = 0);
|
||||||
|
|
||||||
qreal top() const {return _top;}
|
qreal top() const {return _top;}
|
||||||
|
|
||||||
const QMap<qreal, qreal> &map() const {return _map;}
|
const QMap<qreal, qreal> &map() const {return _map;}
|
||||||
|
|
||||||
private:
|
QString info() const;
|
||||||
QString toolTip() const;
|
|
||||||
|
|
||||||
|
private:
|
||||||
QMap<qreal, qreal> _map;
|
QMap<qreal, qreal> _map;
|
||||||
qreal _top;
|
qreal _top;
|
||||||
};
|
};
|
||||||
|
54
src/GUI/graphicsscene.cpp
Normal file
54
src/GUI/graphicsscene.cpp
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#include <QGraphicsSceneHelpEvent>
|
||||||
|
#include <QGraphicsView>
|
||||||
|
#include "popup.h"
|
||||||
|
#include "graphicsscene.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Standard GraphicsScene::items() is not pixel accurate, so we use the
|
||||||
|
following function which has the same logic as used in the original
|
||||||
|
QGraphicsScene::helpEvent() function. */
|
||||||
|
QList<QGraphicsItem *> GraphicsScene::itemsAtPosition(const QPoint &screenPos,
|
||||||
|
const QPointF &scenePos, QWidget *widget) const
|
||||||
|
{
|
||||||
|
QGraphicsView *view = widget
|
||||||
|
? qobject_cast<QGraphicsView *>(widget->parentWidget()) : 0;
|
||||||
|
|
||||||
|
if (!view)
|
||||||
|
return items(scenePos, Qt::IntersectsItemShape, Qt::DescendingOrder,
|
||||||
|
QTransform());
|
||||||
|
|
||||||
|
const QRectF pointRect(QPointF(widget->mapFromGlobal(screenPos)),
|
||||||
|
QSizeF(1, 1));
|
||||||
|
if (!view->isTransformed())
|
||||||
|
return items(pointRect, Qt::IntersectsItemShape, Qt::DescendingOrder);
|
||||||
|
|
||||||
|
const QTransform viewTransform = view->viewportTransform();
|
||||||
|
if (viewTransform.type() <= QTransform::TxScale)
|
||||||
|
return items(viewTransform.inverted().mapRect(pointRect),
|
||||||
|
Qt::IntersectsItemShape, Qt::DescendingOrder, viewTransform);
|
||||||
|
|
||||||
|
return items(viewTransform.inverted().map(pointRect),
|
||||||
|
Qt::IntersectsItemShape, Qt::DescendingOrder, viewTransform);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GraphicsScene::helpEvent(QGraphicsSceneHelpEvent *event)
|
||||||
|
{
|
||||||
|
QList<QGraphicsItem *> list = itemsAtPosition(event->screenPos(),
|
||||||
|
event->scenePos(), event->widget());
|
||||||
|
|
||||||
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
if (list.at(i)->type() == QGraphicsItem::UserType + 1) {
|
||||||
|
GraphicsItem *mi = static_cast<GraphicsItem*>(list.at(i));
|
||||||
|
Popup::show(event->screenPos(), mi->info(), event->widget());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* No need to process QGraphicsScene::helpEvent() */
|
||||||
|
}
|
||||||
|
|
||||||
|
void GraphicsScene::clear()
|
||||||
|
{
|
||||||
|
Popup::clear();
|
||||||
|
QGraphicsScene::clear();
|
||||||
|
}
|
32
src/GUI/graphicsscene.h
Normal file
32
src/GUI/graphicsscene.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#ifndef GRAPHICSSCENE_H
|
||||||
|
#define GRAPHICSSCENE_H
|
||||||
|
|
||||||
|
#include <QGraphicsScene>
|
||||||
|
#include <QGraphicsItem>
|
||||||
|
|
||||||
|
class GraphicsItem : public QGraphicsItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GraphicsItem(QGraphicsItem *parent = 0) : QGraphicsItem(parent) {}
|
||||||
|
|
||||||
|
virtual QString info() const = 0;
|
||||||
|
int type() const {return QGraphicsItem::UserType + 1;}
|
||||||
|
};
|
||||||
|
|
||||||
|
class GraphicsScene : public QGraphicsScene
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GraphicsScene(QObject *parent = 0) : QGraphicsScene(parent) {}
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void helpEvent(QGraphicsSceneHelpEvent *event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QList<QGraphicsItem *> itemsAtPosition(const QPoint &screenPos,
|
||||||
|
const QPointF &scenePos, QWidget *widget) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // GRAPHICSSCENE_H
|
@ -1,31 +1,29 @@
|
|||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
#include <QGraphicsSceneMouseEvent>
|
||||||
|
#include "popup.h"
|
||||||
#include "graphitem.h"
|
#include "graphitem.h"
|
||||||
|
|
||||||
|
|
||||||
GraphItem::GraphItem(const Graph &graph, GraphType type, QGraphicsItem *parent)
|
GraphItem::GraphItem(const Graph &graph, GraphType type, int width,
|
||||||
: QGraphicsObject(parent), _graph(graph), _type(type)
|
const QColor &color, QGraphicsItem *parent)
|
||||||
|
: GraphicsItem(parent), _graph(graph), _type(type)
|
||||||
{
|
{
|
||||||
Q_ASSERT(_graph.isValid());
|
Q_ASSERT(_graph.isValid());
|
||||||
|
|
||||||
_id = 0;
|
_units = Metric;
|
||||||
_width = 1;
|
_pen = QPen(color, width);
|
||||||
_pen = QPen(Qt::black, _width);
|
_sx = 0; _sy = 0;
|
||||||
_sx = 1.0; _sy = 1.0;
|
|
||||||
_time = _graph.hasTime();
|
_time = _graph.hasTime();
|
||||||
|
|
||||||
setZValue(2.0);
|
setZValue(2.0);
|
||||||
|
|
||||||
updatePath();
|
|
||||||
updateShape();
|
|
||||||
updateBounds();
|
|
||||||
|
|
||||||
setAcceptHoverEvents(true);
|
setAcceptHoverEvents(true);
|
||||||
|
|
||||||
|
updateBounds();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphItem::updateShape()
|
void GraphItem::updateShape()
|
||||||
{
|
{
|
||||||
QPainterPathStroker s;
|
QPainterPathStroker s;
|
||||||
s.setWidth(_width + 1);
|
s.setWidth(_pen.width() + 1);
|
||||||
_shape = s.createStroke(_path);
|
_shape = s.createStroke(_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,7 +52,6 @@ void GraphItem::setGraphType(GraphType type)
|
|||||||
|
|
||||||
_type = type;
|
_type = type;
|
||||||
updatePath();
|
updatePath();
|
||||||
updateShape();
|
|
||||||
updateBounds();
|
updateBounds();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,12 +66,11 @@ void GraphItem::setColor(const QColor &color)
|
|||||||
|
|
||||||
void GraphItem::setWidth(int width)
|
void GraphItem::setWidth(int width)
|
||||||
{
|
{
|
||||||
if (width == _width)
|
if (width == _pen.width())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
prepareGeometryChange();
|
prepareGeometryChange();
|
||||||
|
|
||||||
_width = width;
|
|
||||||
_pen.setWidth(width);
|
_pen.setWidth(width);
|
||||||
|
|
||||||
updateShape();
|
updateShape();
|
||||||
@ -170,10 +166,10 @@ void GraphItem::emitSliderPositionChanged(qreal pos)
|
|||||||
void GraphItem::hover(bool hover)
|
void GraphItem::hover(bool hover)
|
||||||
{
|
{
|
||||||
if (hover) {
|
if (hover) {
|
||||||
_pen.setWidth(_width + 1);
|
_pen.setWidth(_pen.width() + 1);
|
||||||
setZValue(zValue() + 1.0);
|
setZValue(zValue() + 1.0);
|
||||||
} else {
|
} else {
|
||||||
_pen.setWidth(_width);
|
_pen.setWidth(_pen.width() - 1);
|
||||||
setZValue(zValue() - 1.0);
|
setZValue(zValue() - 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,23 +185,30 @@ void GraphItem::setScale(qreal sx, qreal sy)
|
|||||||
|
|
||||||
_sx = sx; _sy = sy;
|
_sx = sx; _sy = sy;
|
||||||
updatePath();
|
updatePath();
|
||||||
updateShape();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphItem::updatePath()
|
void GraphItem::updatePath()
|
||||||
{
|
{
|
||||||
_path = QPainterPath();
|
if (_sx == 0 && _sy == 0)
|
||||||
|
|
||||||
if (_type == Time && !_time)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
prepareGeometryChange();
|
||||||
|
|
||||||
|
_path = QPainterPath();
|
||||||
|
|
||||||
|
if (!(_type == Time && !_time)) {
|
||||||
for (int i = 0; i < _graph.size(); i++) {
|
for (int i = 0; i < _graph.size(); i++) {
|
||||||
const GraphSegment &segment = _graph.at(i);
|
const GraphSegment &segment = _graph.at(i);
|
||||||
|
|
||||||
_path.moveTo(segment.first().x(_type) * _sx, -segment.first().y() * _sy);
|
_path.moveTo(segment.first().x(_type) * _sx, -segment.first().y()
|
||||||
|
* _sy);
|
||||||
for (int i = 1; i < segment.size(); i++)
|
for (int i = 1; i < segment.size(); i++)
|
||||||
_path.lineTo(segment.at(i).x(_type) * _sx, -segment.at(i).y() * _sy);
|
_path.lineTo(segment.at(i).x(_type) * _sx, -segment.at(i).y()
|
||||||
|
* _sy);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
updateShape();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphItem::updateBounds()
|
void GraphItem::updateBounds()
|
||||||
@ -231,6 +234,9 @@ void GraphItem::updateBounds()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (left == right)
|
||||||
|
_bounds = QRectF();
|
||||||
|
else
|
||||||
_bounds = QRectF(QPointF(left, top), QPointF(right, bottom));
|
_bounds = QRectF(QPointF(left, top), QPointF(right, bottom));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -286,7 +292,7 @@ void GraphItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
|
|||||||
{
|
{
|
||||||
Q_UNUSED(event);
|
Q_UNUSED(event);
|
||||||
|
|
||||||
_pen.setWidthF(_width + 1);
|
_pen.setWidth(_pen.width() + 1);
|
||||||
setZValue(zValue() + 1.0);
|
setZValue(zValue() + 1.0);
|
||||||
update();
|
update();
|
||||||
|
|
||||||
@ -297,9 +303,15 @@ void GraphItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
|
|||||||
{
|
{
|
||||||
Q_UNUSED(event);
|
Q_UNUSED(event);
|
||||||
|
|
||||||
_pen.setWidthF(_width);
|
_pen.setWidth(_pen.width() - 1);
|
||||||
setZValue(zValue() - 1.0);
|
setZValue(zValue() - 1.0);
|
||||||
update();
|
update();
|
||||||
|
|
||||||
emit selected(false);
|
emit selected(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GraphItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
|
||||||
|
{
|
||||||
|
Popup::show(event->screenPos(), info(), event->widget());
|
||||||
|
GraphicsItem::mousePressEvent(event);
|
||||||
|
}
|
||||||
|
@ -5,15 +5,19 @@
|
|||||||
#include <QPen>
|
#include <QPen>
|
||||||
#include "data/graph.h"
|
#include "data/graph.h"
|
||||||
#include "units.h"
|
#include "units.h"
|
||||||
|
#include "graphicsscene.h"
|
||||||
|
|
||||||
class GraphItem : public QGraphicsObject
|
class GraphItem : public QObject, public GraphicsItem
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GraphItem(const Graph &graph, GraphType type, QGraphicsItem *parent = 0);
|
GraphItem(const Graph &graph, GraphType type, int width, const QColor &color,
|
||||||
|
QGraphicsItem *parent = 0);
|
||||||
virtual ~GraphItem() {}
|
virtual ~GraphItem() {}
|
||||||
|
|
||||||
|
virtual QString info() const = 0;
|
||||||
|
|
||||||
QPainterPath shape() const {return _shape;}
|
QPainterPath shape() const {return _shape;}
|
||||||
QRectF boundingRect() const {return _shape.boundingRect();}
|
QRectF boundingRect() const {return _shape.boundingRect();}
|
||||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
||||||
@ -27,11 +31,9 @@ public:
|
|||||||
|
|
||||||
void setScale(qreal sx, qreal sy);
|
void setScale(qreal sx, qreal sy);
|
||||||
void setGraphType(GraphType type);
|
void setGraphType(GraphType type);
|
||||||
int id() const {return _id;}
|
|
||||||
void setId(int id) {_id = id;}
|
|
||||||
void setColor(const QColor &color);
|
void setColor(const QColor &color);
|
||||||
void setWidth(int width);
|
void setWidth(int width);
|
||||||
virtual void setUnits(Units units) {Q_UNUSED(units);}
|
void setUnits(Units units) {_units = units;}
|
||||||
|
|
||||||
qreal yAtX(qreal x);
|
qreal yAtX(qreal x);
|
||||||
qreal distanceAtTime(qreal time);
|
qreal distanceAtTime(qreal time);
|
||||||
@ -46,27 +48,26 @@ public slots:
|
|||||||
void emitSliderPositionChanged(qreal);
|
void emitSliderPositionChanged(qreal);
|
||||||
void hover(bool hover);
|
void hover(bool hover);
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
|
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
|
||||||
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
|
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
|
||||||
|
void mousePressEvent(QGraphicsSceneMouseEvent *event);
|
||||||
|
|
||||||
|
Units _units;
|
||||||
|
|
||||||
|
private:
|
||||||
const GraphSegment *segment(qreal x, GraphType type) const;
|
const GraphSegment *segment(qreal x, GraphType type) const;
|
||||||
void updatePath();
|
void updatePath();
|
||||||
void updateShape();
|
void updateShape();
|
||||||
void updateBounds();
|
void updateBounds();
|
||||||
|
|
||||||
int _id;
|
|
||||||
QPen _pen;
|
|
||||||
int _width;
|
|
||||||
|
|
||||||
Graph _graph;
|
Graph _graph;
|
||||||
GraphType _type;
|
GraphType _type;
|
||||||
|
|
||||||
QPainterPath _path;
|
QPainterPath _path;
|
||||||
QPainterPath _shape;
|
QPainterPath _shape;
|
||||||
QRectF _bounds;
|
QRectF _bounds;
|
||||||
qreal _sx, _sy;
|
qreal _sx, _sy;
|
||||||
|
QPen _pen;
|
||||||
bool _time;
|
bool _time;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
#include <QGraphicsScene>
|
#include <QGraphicsScene>
|
||||||
#include <QEvent>
|
#include <QEvent>
|
||||||
#include <QMouseEvent>
|
#include <QMouseEvent>
|
||||||
#include <QPaintEngine>
|
#include <QScrollBar>
|
||||||
#include <QPaintDevice>
|
|
||||||
#include <QGraphicsSimpleTextItem>
|
#include <QGraphicsSimpleTextItem>
|
||||||
#include <QPalette>
|
#include <QPalette>
|
||||||
#include <QLocale>
|
#include <QLocale>
|
||||||
@ -16,6 +15,7 @@
|
|||||||
#include "graphitem.h"
|
#include "graphitem.h"
|
||||||
#include "pathitem.h"
|
#include "pathitem.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
|
#include "graphicsscene.h"
|
||||||
#include "graphview.h"
|
#include "graphview.h"
|
||||||
|
|
||||||
|
|
||||||
@ -24,7 +24,7 @@
|
|||||||
GraphView::GraphView(QWidget *parent)
|
GraphView::GraphView(QWidget *parent)
|
||||||
: QGraphicsView(parent)
|
: QGraphicsView(parent)
|
||||||
{
|
{
|
||||||
_scene = new QGraphicsScene(this);
|
_scene = new GraphicsScene(this);
|
||||||
setScene(_scene);
|
setScene(_scene);
|
||||||
|
|
||||||
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
|
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
|
||||||
@ -38,9 +38,9 @@ GraphView::GraphView(QWidget *parent)
|
|||||||
_yAxis = new AxisItem(AxisItem::Y);
|
_yAxis = new AxisItem(AxisItem::Y);
|
||||||
_yAxis->setZValue(1.0);
|
_yAxis->setZValue(1.0);
|
||||||
_slider = new SliderItem();
|
_slider = new SliderItem();
|
||||||
_slider->setZValue(3.0);
|
_slider->setZValue(4.0);
|
||||||
_sliderInfo = new SliderInfoItem(_slider);
|
_sliderInfo = new SliderInfoItem(_slider);
|
||||||
_sliderInfo->setZValue(3.0);
|
_sliderInfo->setZValue(4.0);
|
||||||
_info = new InfoItem();
|
_info = new InfoItem();
|
||||||
_grid = new GridItem();
|
_grid = new GridItem();
|
||||||
_message = new QGraphicsSimpleTextItem(tr("Data not available"));
|
_message = new QGraphicsSimpleTextItem(tr("Data not available"));
|
||||||
@ -64,6 +64,8 @@ GraphView::GraphView(QWidget *parent)
|
|||||||
_units = Metric;
|
_units = Metric;
|
||||||
_graphType = Distance;
|
_graphType = Distance;
|
||||||
_xLabel = tr("Distance");
|
_xLabel = tr("Distance");
|
||||||
|
|
||||||
|
_zoom = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
GraphView::~GraphView()
|
GraphView::~GraphView()
|
||||||
@ -74,9 +76,6 @@ GraphView::~GraphView()
|
|||||||
delete _info;
|
delete _info;
|
||||||
delete _grid;
|
delete _grid;
|
||||||
delete _message;
|
delete _message;
|
||||||
|
|
||||||
for (int i = 0; i < _graphs.count(); i++)
|
|
||||||
delete _graphs[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphView::createXLabel()
|
void GraphView::createXLabel()
|
||||||
@ -167,13 +166,10 @@ void GraphView::setGraphType(GraphType type)
|
|||||||
for (int i = 0; i < _graphs.count(); i++) {
|
for (int i = 0; i < _graphs.count(); i++) {
|
||||||
GraphItem *gi = _graphs.at(i);
|
GraphItem *gi = _graphs.at(i);
|
||||||
gi->setGraphType(type);
|
gi->setGraphType(type);
|
||||||
if (!_hide.contains(gi->id())) {
|
if (gi->bounds().isNull())
|
||||||
if (gi->bounds().width() > 0)
|
|
||||||
addItem(gi);
|
|
||||||
else
|
|
||||||
removeItem(gi);
|
removeItem(gi);
|
||||||
}
|
else
|
||||||
if (gi->scene() == _scene)
|
addItem(gi);
|
||||||
_bounds |= gi->bounds();
|
_bounds |= gi->bounds();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,29 +192,32 @@ void GraphView::showSliderInfo(bool show)
|
|||||||
_sliderInfo->setVisible(show);
|
_sliderInfo->setVisible(show);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphView::addGraph(GraphItem *graph, int id)
|
void GraphView::addGraph(GraphItem *graph)
|
||||||
{
|
{
|
||||||
QColor color(_palette.nextColor());
|
|
||||||
color.setAlpha(255);
|
|
||||||
|
|
||||||
graph->setUnits(_units);
|
|
||||||
graph->setId(id);
|
|
||||||
graph->setColor(color);
|
|
||||||
graph->setWidth(_width);
|
|
||||||
|
|
||||||
connect(this, SIGNAL(sliderPositionChanged(qreal)), graph,
|
connect(this, SIGNAL(sliderPositionChanged(qreal)), graph,
|
||||||
SLOT(emitSliderPositionChanged(qreal)));
|
SLOT(emitSliderPositionChanged(qreal)));
|
||||||
|
|
||||||
_graphs.append(graph);
|
_graphs.append(graph);
|
||||||
|
if (!graph->bounds().isNull())
|
||||||
if (!_hide.contains(id)) {
|
|
||||||
_visible.append(graph);
|
|
||||||
if (graph->bounds().width() > 0) {
|
|
||||||
_scene->addItem(graph);
|
_scene->addItem(graph);
|
||||||
_bounds |= graph->bounds();
|
_bounds |= graph->bounds();
|
||||||
}
|
|
||||||
|
setXUnits();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GraphView::removeGraph(GraphItem *graph)
|
||||||
|
{
|
||||||
|
disconnect(this, SIGNAL(sliderPositionChanged(qreal)), graph,
|
||||||
|
SLOT(emitSliderPositionChanged(qreal)));
|
||||||
|
|
||||||
|
_graphs.removeOne(graph);
|
||||||
|
_scene->removeItem(graph);
|
||||||
|
|
||||||
|
_bounds = QRectF();
|
||||||
|
for (int i = 0; i < _graphs.count(); i++)
|
||||||
|
_bounds |= _graphs.at(i)->bounds();
|
||||||
|
|
||||||
setXUnits();
|
setXUnits();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphView::removeItem(QGraphicsItem *item)
|
void GraphView::removeItem(QGraphicsItem *item)
|
||||||
@ -233,29 +232,6 @@ void GraphView::addItem(QGraphicsItem *item)
|
|||||||
_scene->addItem(item);
|
_scene->addItem(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphView::showGraph(bool show, int id)
|
|
||||||
{
|
|
||||||
if (show)
|
|
||||||
_hide.remove(id);
|
|
||||||
else
|
|
||||||
_hide.insert(id);
|
|
||||||
|
|
||||||
_visible.clear();
|
|
||||||
_bounds = QRectF();
|
|
||||||
for (int i = 0; i < _graphs.count(); i++) {
|
|
||||||
GraphItem *gi = _graphs.at(i);
|
|
||||||
if (_hide.contains(gi->id()))
|
|
||||||
removeItem(gi);
|
|
||||||
else {
|
|
||||||
_visible.append(gi);
|
|
||||||
if (gi->bounds().width() > 0) {
|
|
||||||
addItem(gi);
|
|
||||||
_bounds |= gi->bounds();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QRectF GraphView::bounds() const
|
QRectF GraphView::bounds() const
|
||||||
{
|
{
|
||||||
QRectF br(_bounds);
|
QRectF br(_bounds);
|
||||||
@ -314,9 +290,10 @@ void GraphView::redraw(const QSizeF &size)
|
|||||||
sx = (size.width() - (my.width() + mx.width())) / r.width();
|
sx = (size.width() - (my.width() + mx.width())) / r.width();
|
||||||
sy = (size.height() - (mx.height() + my.height())
|
sy = (size.height() - (mx.height() + my.height())
|
||||||
- _info->boundingRect().height()) / r.height();
|
- _info->boundingRect().height()) / r.height();
|
||||||
|
sx *= _zoom;
|
||||||
|
|
||||||
for (int i = 0; i < _visible.size(); i++)
|
for (int i = 0; i < _graphs.size(); i++)
|
||||||
_visible.at(i)->setScale(sx, sy);
|
_graphs.at(i)->setScale(sx, sy);
|
||||||
|
|
||||||
QPointF p(r.left() * sx, r.top() * sy);
|
QPointF p(r.left() * sx, r.top() * sy);
|
||||||
QSizeF s(r.width() * sx, r.height() * sy);
|
QSizeF s(r.width() * sx, r.height() * sy);
|
||||||
@ -361,6 +338,40 @@ void GraphView::mousePressEvent(QMouseEvent *e)
|
|||||||
QGraphicsView::mousePressEvent(e);
|
QGraphicsView::mousePressEvent(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GraphView::wheelEvent(QWheelEvent *e)
|
||||||
|
{
|
||||||
|
static int deg = 0;
|
||||||
|
|
||||||
|
deg += e->delta() / 8;
|
||||||
|
if (qAbs(deg) < 15)
|
||||||
|
return;
|
||||||
|
deg = 0;
|
||||||
|
|
||||||
|
QPointF pos = mapToScene(e->pos());
|
||||||
|
QRectF gr(_grid->boundingRect());
|
||||||
|
QPointF r(pos.x() / gr.width(), pos.y() / gr.height());
|
||||||
|
|
||||||
|
_zoom = (e->delta() > 0) ? _zoom * 1.25 : qMax(_zoom / 1.25, 1.0);
|
||||||
|
redraw();
|
||||||
|
|
||||||
|
QRectF ngr(_grid->boundingRect());
|
||||||
|
QPointF npos(mapFromScene(QPointF(r.x() * ngr.width(),
|
||||||
|
r.y() * ngr.height())));
|
||||||
|
QScrollBar *sb = horizontalScrollBar();
|
||||||
|
sb->setSliderPosition(sb->sliderPosition() + npos.x() - e->pos().x());
|
||||||
|
|
||||||
|
QGraphicsView::wheelEvent(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GraphView::paintEvent(QPaintEvent *e)
|
||||||
|
{
|
||||||
|
QRectF viewRect(mapToScene(rect()).boundingRect());
|
||||||
|
_info->setPos(QPointF(viewRect.left() + (viewRect.width()
|
||||||
|
- _info->boundingRect().width())/2.0, _info->pos().y()));
|
||||||
|
|
||||||
|
QGraphicsView::paintEvent(e);
|
||||||
|
}
|
||||||
|
|
||||||
void GraphView::plot(QPainter *painter, const QRectF &target, qreal scale)
|
void GraphView::plot(QPainter *painter, const QRectF &target, qreal scale)
|
||||||
{
|
{
|
||||||
QSizeF canvas = QSizeF(target.width() / scale, target.height() / scale);
|
QSizeF canvas = QSizeF(target.width() / scale, target.height() / scale);
|
||||||
@ -377,56 +388,45 @@ void GraphView::plot(QPainter *painter, const QRectF &target, qreal scale)
|
|||||||
|
|
||||||
void GraphView::clear()
|
void GraphView::clear()
|
||||||
{
|
{
|
||||||
|
_graphs.clear();
|
||||||
|
|
||||||
_slider->clear();
|
_slider->clear();
|
||||||
_info->clear();
|
_info->clear();
|
||||||
|
|
||||||
for (int i = 0; i < _graphs.count(); i++)
|
|
||||||
delete _graphs[i];
|
|
||||||
|
|
||||||
_graphs.clear();
|
|
||||||
_visible.clear();
|
|
||||||
_palette.reset();
|
_palette.reset();
|
||||||
|
|
||||||
_bounds = QRectF();
|
_bounds = QRectF();
|
||||||
_sliderPos = 0;
|
_sliderPos = 0;
|
||||||
|
_zoom = 1.0;
|
||||||
|
|
||||||
_scene->setSceneRect(0, 0, 0, 0);
|
_scene->setSceneRect(0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphView::updateSliderPosition()
|
void GraphView::updateSliderPosition()
|
||||||
{
|
{
|
||||||
if (bounds().width() <= 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (_sliderPos <= bounds().right() && _sliderPos >= bounds().left()) {
|
if (_sliderPos <= bounds().right() && _sliderPos >= bounds().left()) {
|
||||||
_slider->setPos((_sliderPos / bounds().width())
|
_slider->setPos((_sliderPos / bounds().width())
|
||||||
* _slider->area().width(), _slider->area().bottom());
|
* _slider->area().width(), _slider->area().bottom());
|
||||||
_slider->setVisible(!_visible.isEmpty());
|
_slider->setVisible(true);
|
||||||
|
updateSliderInfo();
|
||||||
} else {
|
} else {
|
||||||
_slider->setPos(_slider->area().left(), _slider->area().bottom());
|
_slider->setPos(_slider->area().left(), _slider->area().bottom());
|
||||||
_slider->setVisible(false);
|
_slider->setVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_slider->isVisible())
|
|
||||||
updateSliderInfo();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphView::updateSliderInfo()
|
void GraphView::updateSliderInfo()
|
||||||
{
|
{
|
||||||
QLocale l(QLocale::system());
|
QLocale l(QLocale::system());
|
||||||
qreal r, y;
|
qreal r = 0, y = 0;
|
||||||
|
|
||||||
|
if (_graphs.count() == 1) {
|
||||||
if (_visible.count() > 1) {
|
QRectF br(_graphs.first()->bounds());
|
||||||
r = 0;
|
|
||||||
y = 0;
|
|
||||||
} else {
|
|
||||||
QRectF br(_visible.first()->bounds());
|
|
||||||
if (br.height() < _minYRange)
|
if (br.height() < _minYRange)
|
||||||
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 = _visible.first()->yAtX(_sliderPos);
|
y = _graphs.first()->yAtX(_sliderPos);
|
||||||
r = (y - br.bottom()) / br.height();
|
r = (y - br.bottom()) / br.height();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -438,7 +438,7 @@ void GraphView::updateSliderInfo()
|
|||||||
_sliderInfo->setPos(QPointF(0, _slider->boundingRect().height() * r));
|
_sliderInfo->setPos(QPointF(0, _slider->boundingRect().height() * r));
|
||||||
_sliderInfo->setText(_graphType == Time ? Format::timeSpan(_sliderPos,
|
_sliderInfo->setText(_graphType == Time ? Format::timeSpan(_sliderPos,
|
||||||
bounds().width() > 3600) : l.toString(_sliderPos * _xScale, 'f', 1)
|
bounds().width() > 3600) : l.toString(_sliderPos * _xScale, 'f', 1)
|
||||||
+ UNIT_SPACE + _xUnits, (_visible.count() > 1) ? QString()
|
+ UNIT_SPACE + _xUnits, (_graphs.count() > 1) ? QString()
|
||||||
: l.toString(-y * _yScale + _yOffset, 'f', _precision) + UNIT_SPACE
|
: l.toString(-y * _yScale + _yOffset, 'f', _precision) + UNIT_SPACE
|
||||||
+ _yUnits);
|
+ _yUnits);
|
||||||
}
|
}
|
||||||
@ -458,7 +458,7 @@ void GraphView::emitSliderPositionChanged(const QPointF &pos)
|
|||||||
|
|
||||||
void GraphView::setSliderPosition(qreal pos)
|
void GraphView::setSliderPosition(qreal pos)
|
||||||
{
|
{
|
||||||
if (_visible.isEmpty())
|
if (_graphs.isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_sliderPos = pos;
|
_sliderPos = pos;
|
||||||
@ -486,11 +486,8 @@ void GraphView::setPalette(const Palette &palette)
|
|||||||
_palette = palette;
|
_palette = palette;
|
||||||
_palette.reset();
|
_palette.reset();
|
||||||
|
|
||||||
for (int i = 0; i < _graphs.count(); i++) {
|
for (int i = 0; i < _graphs.count(); i++)
|
||||||
QColor color(_palette.nextColor());
|
_graphs.at(i)->setColor(_palette.nextColor());
|
||||||
color.setAlpha(255);
|
|
||||||
_graphs.at(i)->setColor(color);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphView::setGraphWidth(int width)
|
void GraphView::setGraphWidth(int width)
|
||||||
|
@ -17,6 +17,7 @@ class GraphItem;
|
|||||||
class PathItem;
|
class PathItem;
|
||||||
class GridItem;
|
class GridItem;
|
||||||
class QGraphicsSimpleTextItem;
|
class QGraphicsSimpleTextItem;
|
||||||
|
class GraphicsScene;
|
||||||
|
|
||||||
class GraphView : public QGraphicsView
|
class GraphView : public QGraphicsView
|
||||||
{
|
{
|
||||||
@ -27,7 +28,7 @@ public:
|
|||||||
~GraphView();
|
~GraphView();
|
||||||
|
|
||||||
bool isEmpty() const {return _graphs.isEmpty();}
|
bool isEmpty() const {return _graphs.isEmpty();}
|
||||||
const QList<KV> &info() const {return _info->info();}
|
const QList<KV<QString, QString> > &info() const {return _info->info();}
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
void plot(QPainter *painter, const QRectF &target, qreal scale);
|
void plot(QPainter *painter, const QRectF &target, qreal scale);
|
||||||
@ -46,12 +47,17 @@ signals:
|
|||||||
void sliderPositionChanged(qreal);
|
void sliderPositionChanged(qreal);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void addGraph(GraphItem *graph, int id = 0);
|
void addGraph(GraphItem *graph);
|
||||||
|
void removeGraph(GraphItem *graph);
|
||||||
void showGraph(bool show, int id = 0);
|
|
||||||
void setGraphType(GraphType type);
|
void setGraphType(GraphType type);
|
||||||
void setUnits(Units units);
|
void setUnits(Units units);
|
||||||
|
|
||||||
|
void resizeEvent(QResizeEvent *e);
|
||||||
|
void mousePressEvent(QMouseEvent *e);
|
||||||
|
void wheelEvent(QWheelEvent *e);
|
||||||
|
void changeEvent(QEvent *e);
|
||||||
|
void paintEvent(QPaintEvent *e);
|
||||||
|
|
||||||
const QString &yLabel() const {return _yLabel;}
|
const QString &yLabel() const {return _yLabel;}
|
||||||
const QString &yUnits() const {return _yUnits;}
|
const QString &yUnits() const {return _yUnits;}
|
||||||
qreal yScale() const {return _yScale;}
|
qreal yScale() const {return _yScale;}
|
||||||
@ -68,12 +74,11 @@ protected:
|
|||||||
void redraw();
|
void redraw();
|
||||||
void addInfo(const QString &key, const QString &value);
|
void addInfo(const QString &key, const QString &value);
|
||||||
void clearInfo();
|
void clearInfo();
|
||||||
void skipColor() {_palette.nextColor();}
|
|
||||||
|
|
||||||
void changeEvent(QEvent *e);
|
|
||||||
|
|
||||||
QList<GraphItem*> _graphs;
|
|
||||||
GraphType _graphType;
|
GraphType _graphType;
|
||||||
|
Units _units;
|
||||||
|
Palette _palette;
|
||||||
|
int _width;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void emitSliderPositionChanged(const QPointF &pos);
|
void emitSliderPositionChanged(const QPointF &pos);
|
||||||
@ -89,19 +94,7 @@ private:
|
|||||||
void removeItem(QGraphicsItem *item);
|
void removeItem(QGraphicsItem *item);
|
||||||
void addItem(QGraphicsItem *item);
|
void addItem(QGraphicsItem *item);
|
||||||
|
|
||||||
void resizeEvent(QResizeEvent *e);
|
GraphicsScene *_scene;
|
||||||
void mousePressEvent(QMouseEvent *e);
|
|
||||||
|
|
||||||
Units _units;
|
|
||||||
qreal _xScale, _yScale;
|
|
||||||
qreal _yOffset;
|
|
||||||
QString _xUnits, _yUnits;
|
|
||||||
QString _xLabel, _yLabel;
|
|
||||||
int _precision;
|
|
||||||
qreal _minYRange;
|
|
||||||
qreal _sliderPos;
|
|
||||||
|
|
||||||
QGraphicsScene *_scene;
|
|
||||||
|
|
||||||
AxisItem *_xAxis, *_yAxis;
|
AxisItem *_xAxis, *_yAxis;
|
||||||
SliderItem *_slider;
|
SliderItem *_slider;
|
||||||
@ -109,12 +102,19 @@ private:
|
|||||||
InfoItem *_info;
|
InfoItem *_info;
|
||||||
GridItem *_grid;
|
GridItem *_grid;
|
||||||
QGraphicsSimpleTextItem *_message;
|
QGraphicsSimpleTextItem *_message;
|
||||||
|
QList<GraphItem*> _graphs;
|
||||||
|
|
||||||
QList<GraphItem*> _visible;
|
|
||||||
QSet<int> _hide;
|
|
||||||
QRectF _bounds;
|
QRectF _bounds;
|
||||||
Palette _palette;
|
qreal _sliderPos;
|
||||||
int _width;
|
|
||||||
|
qreal _xScale, _yScale;
|
||||||
|
qreal _yOffset;
|
||||||
|
QString _xUnits, _yUnits;
|
||||||
|
QString _xLabel, _yLabel;
|
||||||
|
int _precision;
|
||||||
|
qreal _minYRange;
|
||||||
|
|
||||||
|
qreal _zoom;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GRAPHVIEW_H
|
#endif // GRAPHVIEW_H
|
||||||
|
@ -112,7 +112,7 @@ void GUI::loadMaps()
|
|||||||
QString mapDir(ProgramPaths::mapDir());
|
QString mapDir(ProgramPaths::mapDir());
|
||||||
|
|
||||||
if (!mapDir.isNull() && !_ml->loadDir(mapDir))
|
if (!mapDir.isNull() && !_ml->loadDir(mapDir))
|
||||||
qWarning("%s", qPrintable(_ml->errorString()));
|
qWarning("%s", qPrintable(_ml->errorPath() + ": " + _ml->errorString()));
|
||||||
|
|
||||||
_map = new EmptyMap(this);
|
_map = new EmptyMap(this);
|
||||||
}
|
}
|
||||||
@ -451,11 +451,11 @@ void GUI::createActions()
|
|||||||
_degreesMinutesAction->setActionGroup(ag);
|
_degreesMinutesAction->setActionGroup(ag);
|
||||||
connect(_degreesMinutesAction, SIGNAL(triggered()), this,
|
connect(_degreesMinutesAction, SIGNAL(triggered()), this,
|
||||||
SLOT(setDegreesMinutes()));
|
SLOT(setDegreesMinutes()));
|
||||||
_DMSAction = new QAction(tr("Degrees, minutes, seconds (DMS)"), this);
|
_dmsAction = new QAction(tr("Degrees, minutes, seconds (DMS)"), this);
|
||||||
_DMSAction->setMenuRole(QAction::NoRole);
|
_dmsAction->setMenuRole(QAction::NoRole);
|
||||||
_DMSAction->setCheckable(true);
|
_dmsAction->setCheckable(true);
|
||||||
_DMSAction->setActionGroup(ag);
|
_dmsAction->setActionGroup(ag);
|
||||||
connect(_DMSAction, SIGNAL(triggered()), this, SLOT(setDMS()));
|
connect(_dmsAction, SIGNAL(triggered()), this, SLOT(setDMS()));
|
||||||
_fullscreenAction = new QAction(QIcon(FULLSCREEN_ICON),
|
_fullscreenAction = new QAction(QIcon(FULLSCREEN_ICON),
|
||||||
tr("Fullscreen mode"), this);
|
tr("Fullscreen mode"), this);
|
||||||
_fullscreenAction->setMenuRole(QAction::NoRole);
|
_fullscreenAction->setMenuRole(QAction::NoRole);
|
||||||
@ -559,7 +559,7 @@ void GUI::createMenus()
|
|||||||
QMenu *coordinatesMenu = settingsMenu->addMenu(tr("Coordinates format"));
|
QMenu *coordinatesMenu = settingsMenu->addMenu(tr("Coordinates format"));
|
||||||
coordinatesMenu->addAction(_decimalDegreesAction);
|
coordinatesMenu->addAction(_decimalDegreesAction);
|
||||||
coordinatesMenu->addAction(_degreesMinutesAction);
|
coordinatesMenu->addAction(_degreesMinutesAction);
|
||||||
coordinatesMenu->addAction(_DMSAction);
|
coordinatesMenu->addAction(_dmsAction);
|
||||||
settingsMenu->addSeparator();
|
settingsMenu->addSeparator();
|
||||||
settingsMenu->addAction(_showToolbarsAction);
|
settingsMenu->addAction(_showToolbarsAction);
|
||||||
settingsMenu->addAction(_fullscreenAction);
|
settingsMenu->addAction(_fullscreenAction);
|
||||||
@ -885,8 +885,7 @@ void GUI::closePOIFiles()
|
|||||||
{
|
{
|
||||||
_poiFilesMenu->clear();
|
_poiFilesMenu->clear();
|
||||||
|
|
||||||
for (int i = 0; i < _poiFilesActions.count(); i++)
|
qDeleteAll(_poiFilesActions);
|
||||||
delete _poiFilesActions[i];
|
|
||||||
_poiFilesActions.clear();
|
_poiFilesActions.clear();
|
||||||
|
|
||||||
_poi->clear();
|
_poi->clear();
|
||||||
@ -950,6 +949,7 @@ void GUI::openOptions()
|
|||||||
SET_TRACK_OPTION(cadenceFilter, setCadenceFilter);
|
SET_TRACK_OPTION(cadenceFilter, setCadenceFilter);
|
||||||
SET_TRACK_OPTION(powerFilter, setPowerFilter);
|
SET_TRACK_OPTION(powerFilter, setPowerFilter);
|
||||||
SET_TRACK_OPTION(outlierEliminate, setOutlierElimination);
|
SET_TRACK_OPTION(outlierEliminate, setOutlierElimination);
|
||||||
|
SET_TRACK_OPTION(automaticPause, setAutomaticPause);
|
||||||
SET_TRACK_OPTION(pauseSpeed, setPauseSpeed);
|
SET_TRACK_OPTION(pauseSpeed, setPauseSpeed);
|
||||||
SET_TRACK_OPTION(pauseInterval, setPauseInterval);
|
SET_TRACK_OPTION(pauseInterval, setPauseInterval);
|
||||||
SET_TRACK_OPTION(useReportedSpeed, useReportedSpeed);
|
SET_TRACK_OPTION(useReportedSpeed, useReportedSpeed);
|
||||||
@ -1067,7 +1067,7 @@ void GUI::statistics()
|
|||||||
|
|
||||||
text.append("<tr><th colspan=\"2\">" + tab->label() + "</th></tr>");
|
text.append("<tr><th colspan=\"2\">" + tab->label() + "</th></tr>");
|
||||||
for (int j = 0; j < tab->info().size(); j++) {
|
for (int j = 0; j < tab->info().size(); j++) {
|
||||||
const KV &kv = tab->info().at(j);
|
const KV<QString, QString> &kv = tab->info().at(j);
|
||||||
text.append("<tr><td>" + kv.key() + ":</td><td>" + kv.value()
|
text.append("<tr><td>" + kv.key() + ":</td><td>" + kv.value()
|
||||||
+ "</td></tr>");
|
+ "</td></tr>");
|
||||||
}
|
}
|
||||||
@ -1325,7 +1325,10 @@ bool GUI::loadMap(const QString &fileName)
|
|||||||
if (fileName.isEmpty())
|
if (fileName.isEmpty())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (_ml->loadFile(fileName)) {
|
QFileInfo fi(fileName);
|
||||||
|
bool res = fi.isDir() ? _ml->loadDir(fileName) : _ml->loadFile(fileName);
|
||||||
|
|
||||||
|
if (res) {
|
||||||
QAction *a = createMapAction(_ml->maps().last());
|
QAction *a = createMapAction(_ml->maps().last());
|
||||||
_mapMenu->insertAction(_mapsEnd, a);
|
_mapMenu->insertAction(_mapsEnd, a);
|
||||||
_showMapAction->setEnabled(true);
|
_showMapAction->setEnabled(true);
|
||||||
@ -1581,7 +1584,6 @@ void GUI::keyPressEvent(QKeyEvent *event)
|
|||||||
else
|
else
|
||||||
_movingTimeAction->trigger();
|
_movingTimeAction->trigger();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Qt::Key_Escape:
|
case Qt::Key_Escape:
|
||||||
if (_fullscreenAction->isChecked()) {
|
if (_fullscreenAction->isChecked()) {
|
||||||
_fullscreenAction->setChecked(false);
|
_fullscreenAction->setChecked(false);
|
||||||
@ -1656,7 +1658,7 @@ void GUI::writeSettings()
|
|||||||
: _nauticalUnitsAction->isChecked() ? Nautical : Metric;
|
: _nauticalUnitsAction->isChecked() ? Nautical : Metric;
|
||||||
if (units != UNITS_DEFAULT)
|
if (units != UNITS_DEFAULT)
|
||||||
settings.setValue(UNITS_SETTING, units);
|
settings.setValue(UNITS_SETTING, units);
|
||||||
CoordinatesFormat format = _DMSAction->isChecked() ? DMS
|
CoordinatesFormat format = _dmsAction->isChecked() ? DMS
|
||||||
: _degreesMinutesAction->isChecked() ? DegreesMinutes : DecimalDegrees;
|
: _degreesMinutesAction->isChecked() ? DegreesMinutes : DecimalDegrees;
|
||||||
if (format != COORDINATES_DEFAULT)
|
if (format != COORDINATES_DEFAULT)
|
||||||
settings.setValue(COORDINATES_SETTING, format);
|
settings.setValue(COORDINATES_SETTING, format);
|
||||||
@ -1800,6 +1802,8 @@ void GUI::writeSettings()
|
|||||||
settings.setValue(POWER_FILTER_SETTING, _options.powerFilter);
|
settings.setValue(POWER_FILTER_SETTING, _options.powerFilter);
|
||||||
if (_options.outlierEliminate != OUTLIER_ELIMINATE_DEFAULT)
|
if (_options.outlierEliminate != OUTLIER_ELIMINATE_DEFAULT)
|
||||||
settings.setValue(OUTLIER_ELIMINATE_SETTING, _options.outlierEliminate);
|
settings.setValue(OUTLIER_ELIMINATE_SETTING, _options.outlierEliminate);
|
||||||
|
if (_options.automaticPause != AUTOMATIC_PAUSE_DEFAULT)
|
||||||
|
settings.setValue(AUTOMATIC_PAUSE_SETTING, _options.automaticPause);
|
||||||
if (_options.pauseSpeed != PAUSE_SPEED_DEFAULT)
|
if (_options.pauseSpeed != PAUSE_SPEED_DEFAULT)
|
||||||
settings.setValue(PAUSE_SPEED_SETTING, _options.pauseSpeed);
|
settings.setValue(PAUSE_SPEED_SETTING, _options.pauseSpeed);
|
||||||
if (_options.pauseInterval != PAUSE_INTERVAL_DEFAULT)
|
if (_options.pauseInterval != PAUSE_INTERVAL_DEFAULT)
|
||||||
@ -1878,7 +1882,7 @@ void GUI::readSettings()
|
|||||||
|
|
||||||
value = settings.value(COORDINATES_SETTING, COORDINATES_DEFAULT).toInt();
|
value = settings.value(COORDINATES_SETTING, COORDINATES_DEFAULT).toInt();
|
||||||
if (value == DMS)
|
if (value == DMS)
|
||||||
_DMSAction->trigger();
|
_dmsAction->trigger();
|
||||||
else if (value == DegreesMinutes)
|
else if (value == DegreesMinutes)
|
||||||
_degreesMinutesAction->trigger();
|
_degreesMinutesAction->trigger();
|
||||||
else
|
else
|
||||||
@ -2074,6 +2078,8 @@ void GUI::readSettings()
|
|||||||
USE_REPORTED_SPEED_DEFAULT).toBool();
|
USE_REPORTED_SPEED_DEFAULT).toBool();
|
||||||
_options.dataUseDEM = settings.value(DATA_USE_DEM_SETTING,
|
_options.dataUseDEM = settings.value(DATA_USE_DEM_SETTING,
|
||||||
DATA_USE_DEM_DEFAULT).toBool();
|
DATA_USE_DEM_DEFAULT).toBool();
|
||||||
|
_options.automaticPause = settings.value(AUTOMATIC_PAUSE_SETTING,
|
||||||
|
AUTOMATIC_PAUSE_DEFAULT).toBool();
|
||||||
_options.pauseInterval = settings.value(PAUSE_INTERVAL_SETTING,
|
_options.pauseInterval = settings.value(PAUSE_INTERVAL_SETTING,
|
||||||
PAUSE_INTERVAL_DEFAULT).toInt();
|
PAUSE_INTERVAL_DEFAULT).toInt();
|
||||||
_options.poiRadius = settings.value(POI_RADIUS_SETTING, POI_RADIUS_DEFAULT)
|
_options.poiRadius = settings.value(POI_RADIUS_SETTING, POI_RADIUS_DEFAULT)
|
||||||
@ -2155,6 +2161,7 @@ void GUI::readSettings()
|
|||||||
Track::setCadenceFilter(_options.cadenceFilter);
|
Track::setCadenceFilter(_options.cadenceFilter);
|
||||||
Track::setPowerFilter(_options.powerFilter);
|
Track::setPowerFilter(_options.powerFilter);
|
||||||
Track::setOutlierElimination(_options.outlierEliminate);
|
Track::setOutlierElimination(_options.outlierEliminate);
|
||||||
|
Track::setAutomaticPause(_options.automaticPause);
|
||||||
Track::setPauseSpeed(_options.pauseSpeed);
|
Track::setPauseSpeed(_options.pauseSpeed);
|
||||||
Track::setPauseInterval(_options.pauseInterval);
|
Track::setPauseInterval(_options.pauseInterval);
|
||||||
Track::useReportedSpeed(_options.useReportedSpeed);
|
Track::useReportedSpeed(_options.useReportedSpeed);
|
||||||
|
@ -180,7 +180,7 @@ private:
|
|||||||
QAction *_nauticalUnitsAction;
|
QAction *_nauticalUnitsAction;
|
||||||
QAction *_decimalDegreesAction;
|
QAction *_decimalDegreesAction;
|
||||||
QAction *_degreesMinutesAction;
|
QAction *_degreesMinutesAction;
|
||||||
QAction *_DMSAction;
|
QAction *_dmsAction;
|
||||||
QAction *_totalTimeAction;
|
QAction *_totalTimeAction;
|
||||||
QAction *_movingTimeAction;
|
QAction *_movingTimeAction;
|
||||||
QAction *_nextMapAction;
|
QAction *_nextMapAction;
|
||||||
|
@ -14,6 +14,11 @@ HeartRateGraph::HeartRateGraph(QWidget *parent) : GraphTab(parent)
|
|||||||
setSliderPrecision(0);
|
setSliderPrecision(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HeartRateGraph::~HeartRateGraph()
|
||||||
|
{
|
||||||
|
qDeleteAll(_tracks);
|
||||||
|
}
|
||||||
|
|
||||||
void HeartRateGraph::setInfo()
|
void HeartRateGraph::setInfo()
|
||||||
{
|
{
|
||||||
if (_showTracks) {
|
if (_showTracks) {
|
||||||
@ -36,23 +41,28 @@ QList<GraphItem*> HeartRateGraph::loadData(const Data &data)
|
|||||||
const Graph &graph = track.heartRate();
|
const Graph &graph = track.heartRate();
|
||||||
|
|
||||||
if (!graph.isValid()) {
|
if (!graph.isValid()) {
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
graphs.append(0);
|
graphs.append(0);
|
||||||
} else {
|
} else {
|
||||||
HeartRateGraphItem *gi = new HeartRateGraphItem(graph, _graphType);
|
HeartRateGraphItem *gi = new HeartRateGraphItem(graph, _graphType,
|
||||||
GraphView::addGraph(gi);
|
_width, _palette.nextColor());
|
||||||
|
|
||||||
|
_tracks.append(gi);
|
||||||
|
if (_showTracks)
|
||||||
|
addGraph(gi);
|
||||||
|
|
||||||
_avg.append(QPointF(track.distance(), gi->avg()));
|
_avg.append(QPointF(track.distance(), gi->avg()));
|
||||||
graphs.append(gi);
|
graphs.append(gi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < data.routes().count(); i++) {
|
for (int i = 0; i < data.routes().count(); i++) {
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
graphs.append(0);
|
graphs.append(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < data.areas().count(); i++)
|
for (int i = 0; i < data.areas().count(); i++)
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
|
|
||||||
setInfo();
|
setInfo();
|
||||||
redraw();
|
redraw();
|
||||||
@ -75,6 +85,9 @@ qreal HeartRateGraph::avg() const
|
|||||||
|
|
||||||
void HeartRateGraph::clear()
|
void HeartRateGraph::clear()
|
||||||
{
|
{
|
||||||
|
qDeleteAll(_tracks);
|
||||||
|
_tracks.clear();
|
||||||
|
|
||||||
_avg.clear();
|
_avg.clear();
|
||||||
|
|
||||||
GraphTab::clear();
|
GraphTab::clear();
|
||||||
@ -84,7 +97,13 @@ void HeartRateGraph::showTracks(bool show)
|
|||||||
{
|
{
|
||||||
_showTracks = show;
|
_showTracks = show;
|
||||||
|
|
||||||
showGraph(show);
|
for (int i = 0; i < _tracks.size(); i++) {
|
||||||
|
if (show)
|
||||||
|
addGraph(_tracks.at(i));
|
||||||
|
else
|
||||||
|
removeGraph(_tracks.at(i));
|
||||||
|
}
|
||||||
|
|
||||||
setInfo();
|
setInfo();
|
||||||
|
|
||||||
redraw();
|
redraw();
|
||||||
|
@ -3,12 +3,15 @@
|
|||||||
|
|
||||||
#include "graphtab.h"
|
#include "graphtab.h"
|
||||||
|
|
||||||
|
class HeartRateGraphItem;
|
||||||
|
|
||||||
class HeartRateGraph : public GraphTab
|
class HeartRateGraph : public GraphTab
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
HeartRateGraph(QWidget *parent = 0);
|
HeartRateGraph(QWidget *parent = 0);
|
||||||
|
~HeartRateGraph();
|
||||||
|
|
||||||
QString label() const {return tr("Heart rate");}
|
QString label() const {return tr("Heart rate");}
|
||||||
QList<GraphItem*> loadData(const Data &data);
|
QList<GraphItem*> loadData(const Data &data);
|
||||||
@ -23,6 +26,7 @@ private:
|
|||||||
QVector<QPointF> _avg;
|
QVector<QPointF> _avg;
|
||||||
|
|
||||||
bool _showTracks;
|
bool _showTracks;
|
||||||
|
QList<HeartRateGraphItem*> _tracks;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // HEARTRATEGRAPH_H
|
#endif // HEARTRATEGRAPH_H
|
||||||
|
@ -4,12 +4,12 @@
|
|||||||
|
|
||||||
|
|
||||||
HeartRateGraphItem::HeartRateGraphItem(const Graph &graph, GraphType type,
|
HeartRateGraphItem::HeartRateGraphItem(const Graph &graph, GraphType type,
|
||||||
QGraphicsItem *parent) : GraphItem(graph, type, parent)
|
int width, const QColor &color, QGraphicsItem *parent)
|
||||||
|
: GraphItem(graph, type, width, color, parent)
|
||||||
{
|
{
|
||||||
setToolTip(toolTip());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString HeartRateGraphItem::toolTip() const
|
QString HeartRateGraphItem::info() const
|
||||||
{
|
{
|
||||||
ToolTip tt;
|
ToolTip tt;
|
||||||
QLocale l(QLocale::system());
|
QLocale l(QLocale::system());
|
||||||
|
@ -8,11 +8,10 @@ class HeartRateGraphItem : public GraphItem
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
HeartRateGraphItem(const Graph &graph, GraphType type,
|
HeartRateGraphItem(const Graph &graph, GraphType type, int width,
|
||||||
QGraphicsItem *parent = 0);
|
const QColor &color, QGraphicsItem *parent = 0);
|
||||||
|
|
||||||
private:
|
QString info() const;
|
||||||
QString toolTip() const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // HEARTRATEGRAPHITEM_H
|
#endif // HEARTRATEGRAPHITEM_H
|
||||||
|
@ -16,7 +16,7 @@ void InfoItem::updateBoundingRect()
|
|||||||
QFontMetrics fm(_font);
|
QFontMetrics fm(_font);
|
||||||
qreal width = 0;
|
qreal width = 0;
|
||||||
|
|
||||||
for (QList<KV>::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.width(i->key() + ": ");
|
||||||
width += fm.width(i->value()) + ((i == _list.constEnd() - 1)
|
width += fm.width(i->value()) + ((i == _list.constEnd() - 1)
|
||||||
@ -37,7 +37,7 @@ void InfoItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
|||||||
painter->setFont(_font);
|
painter->setFont(_font);
|
||||||
painter->setRenderHint(QPainter::Antialiasing, false);
|
painter->setRenderHint(QPainter::Antialiasing, false);
|
||||||
|
|
||||||
for (QList<KV>::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() + ": ");
|
painter->drawText(width, fm.height() - fm.descent(), i->key() + ": ");
|
||||||
width += fm.width(i->key() + ": ");
|
width += fm.width(i->key() + ": ");
|
||||||
@ -61,7 +61,7 @@ void InfoItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
|||||||
|
|
||||||
void InfoItem::insert(const QString &key, const QString &value)
|
void InfoItem::insert(const QString &key, const QString &value)
|
||||||
{
|
{
|
||||||
KV kv(key, value);
|
KV<QString, QString> kv(key, value);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
prepareGeometryChange();
|
prepareGeometryChange();
|
||||||
|
@ -14,7 +14,7 @@ public:
|
|||||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
||||||
QWidget *widget);
|
QWidget *widget);
|
||||||
|
|
||||||
const QList<KV> &info() const {return _list;}
|
const QList<KV<QString, QString> > &info() const {return _list;}
|
||||||
|
|
||||||
void insert(const QString &key, const QString &value);
|
void insert(const QString &key, const QString &value);
|
||||||
void clear();
|
void clear();
|
||||||
@ -23,7 +23,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
void updateBoundingRect();
|
void updateBoundingRect();
|
||||||
|
|
||||||
QList<KV> _list;
|
QList<KV<QString, QString> > _list;
|
||||||
QRectF _boundingRect;
|
QRectF _boundingRect;
|
||||||
QFont _font;
|
QFont _font;
|
||||||
};
|
};
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
#include <QGraphicsScene>
|
#include <QGraphicsScene>
|
||||||
#include <QWheelEvent>
|
#include <QWheelEvent>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QPixmapCache>
|
|
||||||
#include <QScrollBar>
|
#include <QScrollBar>
|
||||||
#include "data/poi.h"
|
#include "data/poi.h"
|
||||||
#include "data/data.h"
|
#include "data/data.h"
|
||||||
@ -16,6 +15,7 @@
|
|||||||
#include "scaleitem.h"
|
#include "scaleitem.h"
|
||||||
#include "coordinatesitem.h"
|
#include "coordinatesitem.h"
|
||||||
#include "keys.h"
|
#include "keys.h"
|
||||||
|
#include "graphicsscene.h"
|
||||||
#include "mapview.h"
|
#include "mapview.h"
|
||||||
|
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ MapView::MapView(Map *map, POI *poi, QWidget *parent)
|
|||||||
Q_ASSERT(map != 0);
|
Q_ASSERT(map != 0);
|
||||||
Q_ASSERT(poi != 0);
|
Q_ASSERT(poi != 0);
|
||||||
|
|
||||||
_scene = new QGraphicsScene(this);
|
_scene = new GraphicsScene(this);
|
||||||
setScene(_scene);
|
setScene(_scene);
|
||||||
setDragMode(QGraphicsView::ScrollHandDrag);
|
setDragMode(QGraphicsView::ScrollHandDrag);
|
||||||
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
|
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
|
||||||
@ -215,12 +215,12 @@ QList<PathItem *> MapView::loadData(const Data &data)
|
|||||||
QList<PathItem *> paths;
|
QList<PathItem *> paths;
|
||||||
int zoom = _map->zoom();
|
int zoom = _map->zoom();
|
||||||
|
|
||||||
|
for (int i = 0; i < data.areas().count(); i++)
|
||||||
|
addArea(data.areas().at(i));
|
||||||
for (int i = 0; i < data.tracks().count(); i++)
|
for (int i = 0; i < data.tracks().count(); i++)
|
||||||
paths.append(addTrack(data.tracks().at(i)));
|
paths.append(addTrack(data.tracks().at(i)));
|
||||||
for (int i = 0; i < data.routes().count(); i++)
|
for (int i = 0; i < data.routes().count(); i++)
|
||||||
paths.append(addRoute(data.routes().at(i)));
|
paths.append(addRoute(data.routes().at(i)));
|
||||||
for (int i = 0; i < data.areas().count(); i++)
|
|
||||||
addArea(data.areas().at(i));
|
|
||||||
addWaypoints(data.waypoints());
|
addWaypoints(data.waypoints());
|
||||||
|
|
||||||
if (_tracks.empty() && _routes.empty() && _waypoints.empty()
|
if (_tracks.empty() && _routes.empty() && _waypoints.empty()
|
||||||
@ -255,17 +255,18 @@ QPointF MapView::contentCenter() const
|
|||||||
|
|
||||||
void MapView::updatePOIVisibility()
|
void MapView::updatePOIVisibility()
|
||||||
{
|
{
|
||||||
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it, jt;
|
|
||||||
|
|
||||||
if (!_showPOI)
|
if (!_showPOI)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
|
for (POIHash::const_iterator it = _pois.constBegin();
|
||||||
|
it != _pois.constEnd(); it++)
|
||||||
it.value()->show();
|
it.value()->show();
|
||||||
|
|
||||||
if (!_overlapPOIs) {
|
if (!_overlapPOIs) {
|
||||||
for (it = _pois.constBegin(); it != _pois.constEnd(); it++) {
|
for (POIHash::const_iterator it = _pois.constBegin();
|
||||||
for (jt = _pois.constBegin(); jt != _pois.constEnd(); jt++) {
|
it != _pois.constEnd(); it++) {
|
||||||
|
for (POIHash::const_iterator jt = _pois.constBegin();
|
||||||
|
jt != _pois.constEnd(); jt++) {
|
||||||
if (it.value()->isVisible() && jt.value()->isVisible()
|
if (it.value()->isVisible() && jt.value()->isVisible()
|
||||||
&& it != jt && it.value()->collidesWithItem(jt.value()))
|
&& it != jt && it.value()->collidesWithItem(jt.value()))
|
||||||
jt.value()->hide();
|
jt.value()->hide();
|
||||||
@ -288,8 +289,8 @@ void MapView::rescale()
|
|||||||
for (int i = 0; i < _waypoints.size(); i++)
|
for (int i = 0; i < _waypoints.size(); i++)
|
||||||
_waypoints.at(i)->setMap(_map);
|
_waypoints.at(i)->setMap(_map);
|
||||||
|
|
||||||
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
|
for (POIHash::const_iterator it = _pois.constBegin();
|
||||||
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
|
it != _pois.constEnd(); it++)
|
||||||
it.value()->setMap(_map);
|
it.value()->setMap(_map);
|
||||||
|
|
||||||
updatePOIVisibility();
|
updatePOIVisibility();
|
||||||
@ -339,8 +340,8 @@ void MapView::setMap(Map *map)
|
|||||||
for (int i = 0; i < _waypoints.size(); i++)
|
for (int i = 0; i < _waypoints.size(); i++)
|
||||||
_waypoints.at(i)->setMap(map);
|
_waypoints.at(i)->setMap(map);
|
||||||
|
|
||||||
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
|
for (POIHash::const_iterator it = _pois.constBegin();
|
||||||
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
|
it != _pois.constEnd(); it++)
|
||||||
it.value()->setMap(_map);
|
it.value()->setMap(_map);
|
||||||
updatePOIVisibility();
|
updatePOIVisibility();
|
||||||
|
|
||||||
@ -349,7 +350,6 @@ void MapView::setMap(Map *map)
|
|||||||
centerOn(nc);
|
centerOn(nc);
|
||||||
|
|
||||||
reloadMap();
|
reloadMap();
|
||||||
QPixmapCache::clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapView::setPOI(POI *poi)
|
void MapView::setPOI(POI *poi)
|
||||||
@ -364,12 +364,10 @@ void MapView::setPOI(POI *poi)
|
|||||||
|
|
||||||
void MapView::updatePOI()
|
void MapView::updatePOI()
|
||||||
{
|
{
|
||||||
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
|
for (POIHash::const_iterator it = _pois.constBegin();
|
||||||
|
it != _pois.constEnd(); it++)
|
||||||
for (it = _pois.constBegin(); it != _pois.constEnd(); it++) {
|
|
||||||
_scene->removeItem(it.value());
|
_scene->removeItem(it.value());
|
||||||
delete it.value();
|
qDeleteAll(_pois);
|
||||||
}
|
|
||||||
_pois.clear();
|
_pois.clear();
|
||||||
|
|
||||||
if (_showTracks)
|
if (_showTracks)
|
||||||
@ -426,8 +424,8 @@ void MapView::setUnits(Units units)
|
|||||||
for (int i = 0; i < _waypoints.size(); i++)
|
for (int i = 0; i < _waypoints.size(); i++)
|
||||||
_waypoints.at(i)->setToolTipFormat(_units, _coordinatesFormat);
|
_waypoints.at(i)->setToolTipFormat(_units, _coordinatesFormat);
|
||||||
|
|
||||||
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
|
for (POIHash::const_iterator it = _pois.constBegin();
|
||||||
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
|
it != _pois.constEnd(); it++)
|
||||||
it.value()->setToolTipFormat(_units, _coordinatesFormat);
|
it.value()->setToolTipFormat(_units, _coordinatesFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -445,8 +443,8 @@ void MapView::setCoordinatesFormat(CoordinatesFormat format)
|
|||||||
for (int i = 0; i < _routes.count(); i++)
|
for (int i = 0; i < _routes.count(); i++)
|
||||||
_routes[i]->setCoordinatesFormat(_coordinatesFormat);
|
_routes[i]->setCoordinatesFormat(_coordinatesFormat);
|
||||||
|
|
||||||
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
|
for (POIHash::const_iterator it = _pois.constBegin();
|
||||||
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
|
it != _pois.constEnd(); it++)
|
||||||
it.value()->setToolTipFormat(_units, _coordinatesFormat);
|
it.value()->setToolTipFormat(_units, _coordinatesFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -461,8 +459,6 @@ void MapView::clearMapCache()
|
|||||||
|
|
||||||
void MapView::digitalZoom(int zoom)
|
void MapView::digitalZoom(int zoom)
|
||||||
{
|
{
|
||||||
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
|
|
||||||
|
|
||||||
if (zoom) {
|
if (zoom) {
|
||||||
_digitalZoom += zoom;
|
_digitalZoom += zoom;
|
||||||
scale(pow(2, zoom), pow(2, zoom));
|
scale(pow(2, zoom), pow(2, zoom));
|
||||||
@ -479,7 +475,8 @@ void MapView::digitalZoom(int zoom)
|
|||||||
_areas.at(i)->setDigitalZoom(_digitalZoom);
|
_areas.at(i)->setDigitalZoom(_digitalZoom);
|
||||||
for (int i = 0; i < _waypoints.size(); i++)
|
for (int i = 0; i < _waypoints.size(); i++)
|
||||||
_waypoints.at(i)->setDigitalZoom(_digitalZoom);
|
_waypoints.at(i)->setDigitalZoom(_digitalZoom);
|
||||||
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
|
for (POIHash::const_iterator it = _pois.constBegin();
|
||||||
|
it != _pois.constEnd(); it++)
|
||||||
it.value()->setDigitalZoom(_digitalZoom);
|
it.value()->setDigitalZoom(_digitalZoom);
|
||||||
|
|
||||||
_mapScale->setDigitalZoom(_digitalZoom);
|
_mapScale->setDigitalZoom(_digitalZoom);
|
||||||
@ -747,8 +744,8 @@ void MapView::showPOI(bool show)
|
|||||||
{
|
{
|
||||||
_showPOI = show;
|
_showPOI = show;
|
||||||
|
|
||||||
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
|
for (POIHash::const_iterator it = _pois.constBegin();
|
||||||
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
|
it != _pois.constEnd(); it++)
|
||||||
it.value()->setVisible(show);
|
it.value()->setVisible(show);
|
||||||
|
|
||||||
updatePOIVisibility();
|
updatePOIVisibility();
|
||||||
@ -758,8 +755,8 @@ void MapView::showPOILabels(bool show)
|
|||||||
{
|
{
|
||||||
_showPOILabels = show;
|
_showPOILabels = show;
|
||||||
|
|
||||||
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
|
for (POIHash::const_iterator it = _pois.constBegin();
|
||||||
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
|
it != _pois.constEnd(); it++)
|
||||||
it.value()->showLabel(show);
|
it.value()->showLabel(show);
|
||||||
|
|
||||||
updatePOIVisibility();
|
updatePOIVisibility();
|
||||||
@ -852,21 +849,19 @@ void MapView::setWaypointColor(const QColor &color)
|
|||||||
|
|
||||||
void MapView::setPOISize(int size)
|
void MapView::setPOISize(int size)
|
||||||
{
|
{
|
||||||
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
|
|
||||||
|
|
||||||
_poiSize = size;
|
_poiSize = size;
|
||||||
|
|
||||||
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
|
for (POIHash::const_iterator it = _pois.constBegin();
|
||||||
|
it != _pois.constEnd(); it++)
|
||||||
it.value()->setSize(size);
|
it.value()->setSize(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapView::setPOIColor(const QColor &color)
|
void MapView::setPOIColor(const QColor &color)
|
||||||
{
|
{
|
||||||
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
|
|
||||||
|
|
||||||
_poiColor = color;
|
_poiColor = color;
|
||||||
|
|
||||||
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
|
for (POIHash::const_iterator it = _pois.constBegin();
|
||||||
|
it != _pois.constEnd(); it++)
|
||||||
it.value()->setColor(color);
|
it.value()->setColor(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -985,7 +980,6 @@ void MapView::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
|
|||||||
|
|
||||||
_deviceRatio = deviceRatio;
|
_deviceRatio = deviceRatio;
|
||||||
_mapRatio = mapRatio;
|
_mapRatio = mapRatio;
|
||||||
QPixmapCache::clear();
|
|
||||||
|
|
||||||
QRectF vr(mapToScene(viewport()->rect()).boundingRect()
|
QRectF vr(mapToScene(viewport()->rect()).boundingRect()
|
||||||
.intersected(_map->bounds()));
|
.intersected(_map->bounds()));
|
||||||
@ -1003,8 +997,8 @@ void MapView::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
|
|||||||
for (int i = 0; i < _waypoints.size(); i++)
|
for (int i = 0; i < _waypoints.size(); i++)
|
||||||
_waypoints.at(i)->setMap(_map);
|
_waypoints.at(i)->setMap(_map);
|
||||||
|
|
||||||
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
|
for (POIHash::const_iterator it = _pois.constBegin();
|
||||||
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
|
it != _pois.constEnd(); it++)
|
||||||
it.value()->setMap(_map);
|
it.value()->setMap(_map);
|
||||||
updatePOIVisibility();
|
updatePOIVisibility();
|
||||||
|
|
||||||
@ -1021,13 +1015,17 @@ void MapView::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
|
|||||||
|
|
||||||
void MapView::setProjection(int id)
|
void MapView::setProjection(int id)
|
||||||
{
|
{
|
||||||
Projection projection(PCS::pcs(id));
|
const PCS *pcs;
|
||||||
if (!projection.isValid())
|
const GCS *gcs;
|
||||||
return;
|
|
||||||
|
|
||||||
_projection = projection;
|
|
||||||
|
|
||||||
Coordinates center = _map->xy2ll(mapToScene(viewport()->rect().center()));
|
Coordinates center = _map->xy2ll(mapToScene(viewport()->rect().center()));
|
||||||
|
|
||||||
|
if ((pcs = PCS::pcs(id)))
|
||||||
|
_projection = Projection(pcs);
|
||||||
|
else if ((gcs = GCS::gcs(id)))
|
||||||
|
_projection = Projection(gcs);
|
||||||
|
else
|
||||||
|
qWarning("%d: Unknown PCS/GCS id", id);
|
||||||
|
|
||||||
_map->setProjection(_projection);
|
_map->setProjection(_projection);
|
||||||
rescale();
|
rescale();
|
||||||
centerOn(_map->ll2xy(center));
|
centerOn(_map->ll2xy(center));
|
||||||
|
@ -30,6 +30,7 @@ class PathItem;
|
|||||||
class GraphItem;
|
class GraphItem;
|
||||||
class AreaItem;
|
class AreaItem;
|
||||||
class Area;
|
class Area;
|
||||||
|
class GraphicsScene;
|
||||||
|
|
||||||
class MapView : public QGraphicsView
|
class MapView : public QGraphicsView
|
||||||
{
|
{
|
||||||
@ -92,6 +93,8 @@ private slots:
|
|||||||
void reloadMap();
|
void reloadMap();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
typedef QHash<SearchPointer<Waypoint>, WaypointItem*> POIHash;
|
||||||
|
|
||||||
PathItem *addTrack(const Track &track);
|
PathItem *addTrack(const Track &track);
|
||||||
PathItem *addRoute(const Route &route);
|
PathItem *addRoute(const Route &route);
|
||||||
void addArea(const Area &area);
|
void addArea(const Area &area);
|
||||||
@ -118,14 +121,14 @@ private:
|
|||||||
void mouseMoveEvent(QMouseEvent *event);
|
void mouseMoveEvent(QMouseEvent *event);
|
||||||
void leaveEvent(QEvent *event);
|
void leaveEvent(QEvent *event);
|
||||||
|
|
||||||
QGraphicsScene *_scene;
|
GraphicsScene *_scene;
|
||||||
ScaleItem *_mapScale;
|
ScaleItem *_mapScale;
|
||||||
CoordinatesItem *_coordinates;
|
CoordinatesItem *_coordinates;
|
||||||
QList<TrackItem*> _tracks;
|
QList<TrackItem*> _tracks;
|
||||||
QList<RouteItem*> _routes;
|
QList<RouteItem*> _routes;
|
||||||
QList<WaypointItem*> _waypoints;
|
QList<WaypointItem*> _waypoints;
|
||||||
QList<AreaItem*> _areas;
|
QList<AreaItem*> _areas;
|
||||||
QHash<SearchPointer<Waypoint>, WaypointItem*> _pois;
|
POIHash _pois;
|
||||||
|
|
||||||
RectC _tr, _rr, _wr, _ar;
|
RectC _tr, _rr, _wr, _ar;
|
||||||
qreal _res;
|
qreal _res;
|
||||||
|
@ -36,15 +36,24 @@ static QFrame *line()
|
|||||||
}
|
}
|
||||||
#endif // Q_OS_MAC
|
#endif // Q_OS_MAC
|
||||||
|
|
||||||
|
|
||||||
|
void OptionsDialog::automaticPauseDetectionSet(bool set)
|
||||||
|
{
|
||||||
|
_pauseInterval->setEnabled(!set);
|
||||||
|
_pauseSpeed->setEnabled(!set);
|
||||||
|
}
|
||||||
|
|
||||||
QWidget *OptionsDialog::createMapPage()
|
QWidget *OptionsDialog::createMapPage()
|
||||||
{
|
{
|
||||||
_projection = new LimitedComboBox(200);
|
_projection = new LimitedComboBox(200);
|
||||||
QList<PCS::Info> projections(PCS::pcsList());
|
|
||||||
|
QList<KV<int, QString> > projections(GCS::list() + PCS::list());
|
||||||
qSort(projections);
|
qSort(projections);
|
||||||
|
|
||||||
for (int i = 0; i < projections.size(); i++) {
|
for (int i = 0; i < projections.size(); i++) {
|
||||||
QString text = QString::number(projections.at(i).id()) + " - "
|
QString text = QString::number(projections.at(i).key()) + " - "
|
||||||
+ projections.at(i).name();
|
+ projections.at(i).value();
|
||||||
_projection->addItem(text, QVariant(projections.at(i).id()));
|
_projection->addItem(text, QVariant(projections.at(i).key()));
|
||||||
}
|
}
|
||||||
_projection->setCurrentIndex(_projection->findData(_options->projection));
|
_projection->setCurrentIndex(_projection->findData(_options->projection));
|
||||||
|
|
||||||
@ -340,10 +349,18 @@ QWidget *OptionsDialog::createDataPage()
|
|||||||
filterTab->setLayout(filterTabLayout);
|
filterTab->setLayout(filterTabLayout);
|
||||||
|
|
||||||
|
|
||||||
|
_automaticPause = new QRadioButton(tr("Automatic"));
|
||||||
|
_manualPause = new QRadioButton(tr("Custom"));
|
||||||
|
if (_options->automaticPause)
|
||||||
|
_automaticPause->setChecked(true);
|
||||||
|
else
|
||||||
|
_manualPause->setChecked(true);
|
||||||
|
|
||||||
_pauseSpeed = new QDoubleSpinBox();
|
_pauseSpeed = new QDoubleSpinBox();
|
||||||
_pauseSpeed->setDecimals(1);
|
_pauseSpeed->setDecimals(1);
|
||||||
_pauseSpeed->setSingleStep(0.1);
|
_pauseSpeed->setSingleStep(0.1);
|
||||||
_pauseSpeed->setMinimum(0.1);
|
_pauseSpeed->setMinimum(0.1);
|
||||||
|
_pauseSpeed->setEnabled(_manualPause->isChecked());
|
||||||
if (_options->units == Imperial) {
|
if (_options->units == Imperial) {
|
||||||
_pauseSpeed->setValue(_options->pauseSpeed * MS2MIH);
|
_pauseSpeed->setValue(_options->pauseSpeed * MS2MIH);
|
||||||
_pauseSpeed->setSuffix(UNIT_SPACE + tr("mi/h"));
|
_pauseSpeed->setSuffix(UNIT_SPACE + tr("mi/h"));
|
||||||
@ -358,10 +375,26 @@ QWidget *OptionsDialog::createDataPage()
|
|||||||
_pauseInterval->setMinimum(1);
|
_pauseInterval->setMinimum(1);
|
||||||
_pauseInterval->setSuffix(UNIT_SPACE + tr("s"));
|
_pauseInterval->setSuffix(UNIT_SPACE + tr("s"));
|
||||||
_pauseInterval->setValue(_options->pauseInterval);
|
_pauseInterval->setValue(_options->pauseInterval);
|
||||||
|
_pauseInterval->setEnabled(_manualPause->isChecked());
|
||||||
|
|
||||||
QFormLayout *pauseLayout = new QFormLayout();
|
connect(_automaticPause, SIGNAL(toggled(bool)), this,
|
||||||
pauseLayout->addRow(tr("Minimal speed:"), _pauseSpeed);
|
SLOT(automaticPauseDetectionSet(bool)));
|
||||||
pauseLayout->addRow(tr("Minimal duration:"), _pauseInterval);
|
|
||||||
|
QHBoxLayout *pauseTypeLayout = new QHBoxLayout();
|
||||||
|
#ifdef Q_OS_MAC
|
||||||
|
pauseTypeLayout->addStretch();
|
||||||
|
#endif
|
||||||
|
pauseTypeLayout->addWidget(_automaticPause);
|
||||||
|
pauseTypeLayout->addWidget(_manualPause);
|
||||||
|
pauseTypeLayout->addStretch();
|
||||||
|
|
||||||
|
QFormLayout *pauseValuesLayout = new QFormLayout();
|
||||||
|
pauseValuesLayout->addRow(tr("Minimal speed:"), _pauseSpeed);
|
||||||
|
pauseValuesLayout->addRow(tr("Minimal duration:"), _pauseInterval);
|
||||||
|
|
||||||
|
QVBoxLayout *pauseLayout = new QVBoxLayout();
|
||||||
|
pauseLayout->addLayout(pauseTypeLayout);
|
||||||
|
pauseLayout->addLayout(pauseValuesLayout);
|
||||||
|
|
||||||
QWidget *pauseTab = new QWidget();
|
QWidget *pauseTab = new QWidget();
|
||||||
pauseTab->setLayout(pauseLayout);
|
pauseTab->setLayout(pauseLayout);
|
||||||
@ -676,6 +709,7 @@ void OptionsDialog::accept()
|
|||||||
_options->cadenceFilter = _cadenceFilter->value();
|
_options->cadenceFilter = _cadenceFilter->value();
|
||||||
_options->powerFilter = _powerFilter->value();
|
_options->powerFilter = _powerFilter->value();
|
||||||
_options->outlierEliminate = _outlierEliminate->isChecked();
|
_options->outlierEliminate = _outlierEliminate->isChecked();
|
||||||
|
_options->automaticPause = _automaticPause->isChecked();
|
||||||
qreal pauseSpeed = (_options->units == Imperial)
|
qreal pauseSpeed = (_options->units == Imperial)
|
||||||
? _pauseSpeed->value() / MS2MIH : (_options->units == Nautical)
|
? _pauseSpeed->value() / MS2MIH : (_options->units == Nautical)
|
||||||
? _pauseSpeed->value() / MS2KN : _pauseSpeed->value() / MS2KMH;
|
? _pauseSpeed->value() / MS2KN : _pauseSpeed->value() / MS2KMH;
|
||||||
|
@ -49,6 +49,7 @@ struct Options {
|
|||||||
int cadenceFilter;
|
int cadenceFilter;
|
||||||
int powerFilter;
|
int powerFilter;
|
||||||
bool outlierEliminate;
|
bool outlierEliminate;
|
||||||
|
bool automaticPause;
|
||||||
qreal pauseSpeed;
|
qreal pauseSpeed;
|
||||||
int pauseInterval;
|
int pauseInterval;
|
||||||
bool useReportedSpeed;
|
bool useReportedSpeed;
|
||||||
@ -86,6 +87,9 @@ public slots:
|
|||||||
public:
|
public:
|
||||||
OptionsDialog(Options *options, QWidget *parent = 0);
|
OptionsDialog(Options *options, QWidget *parent = 0);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void automaticPauseDetectionSet(bool set);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QWidget *createMapPage();
|
QWidget *createMapPage();
|
||||||
QWidget *createAppearancePage();
|
QWidget *createAppearancePage();
|
||||||
@ -129,6 +133,9 @@ private:
|
|||||||
OddSpinBox *_cadenceFilter;
|
OddSpinBox *_cadenceFilter;
|
||||||
OddSpinBox *_powerFilter;
|
OddSpinBox *_powerFilter;
|
||||||
QCheckBox *_outlierEliminate;
|
QCheckBox *_outlierEliminate;
|
||||||
|
|
||||||
|
QRadioButton *_automaticPause;
|
||||||
|
QRadioButton *_manualPause;
|
||||||
QDoubleSpinBox *_pauseSpeed;
|
QDoubleSpinBox *_pauseSpeed;
|
||||||
QSpinBox *_pauseInterval;
|
QSpinBox *_pauseInterval;
|
||||||
QRadioButton *_computedSpeed;
|
QRadioButton *_computedSpeed;
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <QCursor>
|
#include <QCursor>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
#include <QGraphicsSceneMouseEvent>
|
||||||
#include "common/greatcircle.h"
|
#include "common/greatcircle.h"
|
||||||
#include "map/map.h"
|
#include "map/map.h"
|
||||||
#include "pathtickitem.h"
|
#include "pathtickitem.h"
|
||||||
|
#include "popup.h"
|
||||||
#include "pathitem.h"
|
#include "pathitem.h"
|
||||||
|
|
||||||
|
|
||||||
@ -20,7 +22,7 @@ static inline unsigned segments(qreal distance)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PathItem::PathItem(const Path &path, Map *map, QGraphicsItem *parent)
|
PathItem::PathItem(const Path &path, Map *map, QGraphicsItem *parent)
|
||||||
: QGraphicsObject(parent), _path(path), _map(map)
|
: GraphicsItem(parent), _path(path), _map(map)
|
||||||
{
|
{
|
||||||
Q_ASSERT(_path.isValid());
|
Q_ASSERT(_path.isValid());
|
||||||
|
|
||||||
@ -38,6 +40,7 @@ PathItem::PathItem(const Path &path, Map *map, QGraphicsItem *parent)
|
|||||||
|
|
||||||
_markerDistance = _path.first().first().distance();
|
_markerDistance = _path.first().first().distance();
|
||||||
_marker = new MarkerItem(this);
|
_marker = new MarkerItem(this);
|
||||||
|
_marker->setZValue(1);
|
||||||
_marker->setPos(position(_markerDistance));
|
_marker->setPos(position(_markerDistance));
|
||||||
|
|
||||||
setCursor(Qt::ArrowCursor);
|
setCursor(Qt::ArrowCursor);
|
||||||
@ -141,6 +144,10 @@ void PathItem::setColor(const QColor &color)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
_pen.setColor(color);
|
_pen.setColor(color);
|
||||||
|
|
||||||
|
for (int i = 0; i < _ticks.size(); i++)
|
||||||
|
_ticks[i]->setColor(color);
|
||||||
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,8 +324,7 @@ unsigned PathItem::tickSize() const
|
|||||||
|
|
||||||
void PathItem::updateTicks()
|
void PathItem::updateTicks()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < _ticks.size(); i++)
|
qDeleteAll(_ticks);
|
||||||
delete _ticks[i];
|
|
||||||
_ticks.clear();
|
_ticks.clear();
|
||||||
|
|
||||||
if (!_showTicks)
|
if (!_showTicks)
|
||||||
@ -333,7 +339,6 @@ void PathItem::updateTicks()
|
|||||||
_ticks[i] = new PathTickItem(tr, (i + 1) * ts, this);
|
_ticks[i] = new PathTickItem(tr, (i + 1) * ts, this);
|
||||||
_ticks[i]->setPos(position((i + 1) * ts * xInM()));
|
_ticks[i]->setPos(position((i + 1) * ts * xInM()));
|
||||||
_ticks[i]->setColor(_pen.color());
|
_ticks[i]->setColor(_pen.color());
|
||||||
_ticks[i]->setToolTip(toolTip());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -378,3 +383,9 @@ void PathItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
|
|||||||
|
|
||||||
emit selected(false);
|
emit selected(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PathItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
|
||||||
|
{
|
||||||
|
Popup::show(event->screenPos(), info(), event->widget());
|
||||||
|
GraphicsItem::mousePressEvent(event);
|
||||||
|
}
|
||||||
|
@ -6,16 +6,18 @@
|
|||||||
#include "data/path.h"
|
#include "data/path.h"
|
||||||
#include "markeritem.h"
|
#include "markeritem.h"
|
||||||
#include "units.h"
|
#include "units.h"
|
||||||
|
#include "graphicsscene.h"
|
||||||
|
|
||||||
class Map;
|
class Map;
|
||||||
class PathTickItem;
|
class PathTickItem;
|
||||||
|
|
||||||
class PathItem : public QGraphicsObject
|
class PathItem : public QObject, public GraphicsItem
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PathItem(const Path &path, Map *map, QGraphicsItem *parent = 0);
|
PathItem(const Path &path, Map *map, QGraphicsItem *parent = 0);
|
||||||
|
virtual ~PathItem() {}
|
||||||
|
|
||||||
QPainterPath shape() const {return _shape;}
|
QPainterPath shape() const {return _shape;}
|
||||||
QRectF boundingRect() const {return _shape.boundingRect();}
|
QRectF boundingRect() const {return _shape.boundingRect();}
|
||||||
@ -35,8 +37,6 @@ public:
|
|||||||
void showMarker(bool show);
|
void showMarker(bool show);
|
||||||
void showTicks(bool show);
|
void showTicks(bool show);
|
||||||
|
|
||||||
Units units() const {return _units;}
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void moveMarker(qreal distance);
|
void moveMarker(qreal distance);
|
||||||
void hover(bool hover);
|
void hover(bool hover);
|
||||||
@ -44,6 +44,13 @@ public slots:
|
|||||||
signals:
|
signals:
|
||||||
void selected(bool);
|
void selected(bool);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
|
||||||
|
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
|
||||||
|
void mousePressEvent(QGraphicsSceneMouseEvent *event);
|
||||||
|
|
||||||
|
Units _units;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const PathSegment *segment(qreal x) const;
|
const PathSegment *segment(qreal x) const;
|
||||||
QPointF position(qreal distance) const;
|
QPointF position(qreal distance) const;
|
||||||
@ -55,15 +62,11 @@ private:
|
|||||||
unsigned tickSize() const;
|
unsigned tickSize() const;
|
||||||
void updateTicks();
|
void updateTicks();
|
||||||
|
|
||||||
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
|
|
||||||
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
|
|
||||||
|
|
||||||
Path _path;
|
Path _path;
|
||||||
Map *_map;
|
Map *_map;
|
||||||
qreal _markerDistance;
|
qreal _markerDistance;
|
||||||
int _digitalZoom;
|
int _digitalZoom;
|
||||||
|
|
||||||
Units _units;
|
|
||||||
qreal _width;
|
qreal _width;
|
||||||
QPen _pen;
|
QPen _pen;
|
||||||
QPainterPath _shape;
|
QPainterPath _shape;
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QCursor>
|
#include <QCursor>
|
||||||
|
#include <QGraphicsSceneMouseEvent>
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
#include "popup.h"
|
||||||
|
#include "pathitem.h"
|
||||||
#include "pathtickitem.h"
|
#include "pathtickitem.h"
|
||||||
|
|
||||||
|
|
||||||
@ -17,7 +20,7 @@ static QFont defaultFont()
|
|||||||
QFont PathTickItem::_font = defaultFont();
|
QFont PathTickItem::_font = defaultFont();
|
||||||
|
|
||||||
PathTickItem::PathTickItem(const QRectF &tickRect, int value,
|
PathTickItem::PathTickItem(const QRectF &tickRect, int value,
|
||||||
QGraphicsItem *parent) : QGraphicsItem(parent), _tickRect(tickRect),
|
QGraphicsItem *parent) : GraphicsItem(parent), _tickRect(tickRect),
|
||||||
_text(QString::number(value))
|
_text(QString::number(value))
|
||||||
{
|
{
|
||||||
_tickRect.moveCenter(QPointF(0, -_tickRect.height()/2.0 - 3));
|
_tickRect.moveCenter(QPointF(0, -_tickRect.height()/2.0 - 3));
|
||||||
@ -69,3 +72,10 @@ QRect PathTickItem::tickRect(int value)
|
|||||||
return fm.boundingRect(QRect(), Qt::AlignCenter,
|
return fm.boundingRect(QRect(), Qt::AlignCenter,
|
||||||
QString::number(qMax(value, 10))).adjusted(-2, 0, 2, 0);
|
QString::number(qMax(value, 10))).adjusted(-2, 0, 2, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PathTickItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
|
||||||
|
{
|
||||||
|
const PathItem *pi = static_cast<PathItem*>(parentItem());
|
||||||
|
Popup::show(event->screenPos(), pi->info(), event->widget());
|
||||||
|
QGraphicsItem::mousePressEvent(event);
|
||||||
|
}
|
||||||
|
@ -3,8 +3,9 @@
|
|||||||
|
|
||||||
#include <QFont>
|
#include <QFont>
|
||||||
#include <QGraphicsItem>
|
#include <QGraphicsItem>
|
||||||
|
#include "graphicsscene.h"
|
||||||
|
|
||||||
class PathTickItem : public QGraphicsItem
|
class PathTickItem : public GraphicsItem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PathTickItem(const QRectF &tickRect, int value, QGraphicsItem *parent = 0);
|
PathTickItem(const QRectF &tickRect, int value, QGraphicsItem *parent = 0);
|
||||||
@ -16,8 +17,14 @@ public:
|
|||||||
void setPos(const QPointF &pos);
|
void setPos(const QPointF &pos);
|
||||||
void setColor(const QColor &color) {_brush = QBrush(color);}
|
void setColor(const QColor &color) {_brush = QBrush(color);}
|
||||||
|
|
||||||
|
int type() const {return parentItem()->type();}
|
||||||
|
QString info() const {return static_cast<GraphicsItem*>(parentItem())->info();}
|
||||||
|
|
||||||
static QRect tickRect(int value);
|
static QRect tickRect(int value);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void mousePressEvent(QGraphicsSceneMouseEvent *event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QRectF _tickRect;
|
QRectF _tickRect;
|
||||||
QString _text;
|
QString _text;
|
||||||
|
@ -24,7 +24,7 @@ PercentSlider::PercentSlider(QWidget *parent) : QWidget(parent)
|
|||||||
_label->setAlignment(Qt::AlignRight);
|
_label->setAlignment(Qt::AlignRight);
|
||||||
_label->setText(format(_slider->value()));
|
_label->setText(format(_slider->value()));
|
||||||
|
|
||||||
connect(_slider, SIGNAL(sliderMoved(int)), this, SLOT(updateLabel(int)));
|
connect(_slider, SIGNAL(valueChanged(int)), this, SLOT(updateLabel(int)));
|
||||||
|
|
||||||
QHBoxLayout *layout = new QHBoxLayout();
|
QHBoxLayout *layout = new QHBoxLayout();
|
||||||
layout->addWidget(_slider);
|
layout->addWidget(_slider);
|
||||||
|
171
src/GUI/popup.cpp
Normal file
171
src/GUI/popup.cpp
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
#include <QToolTip>
|
||||||
|
#include <QStyle>
|
||||||
|
#include <QStylePainter>
|
||||||
|
#include <QStyleOptionFrame>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QMouseEvent>
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QDesktopWidget>
|
||||||
|
#include <QBasicTimer>
|
||||||
|
#include "popup.h"
|
||||||
|
|
||||||
|
|
||||||
|
class PopupLabel : public QLabel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PopupLabel(const QString &text, QWidget *parent = 0);
|
||||||
|
~PopupLabel();
|
||||||
|
|
||||||
|
bool eventFilter(QObject *o, QEvent *ev);
|
||||||
|
void place(const QPoint &pos, QWidget *w);
|
||||||
|
void deleteAfterTimer();
|
||||||
|
void stopTimer() {_timer.stop();}
|
||||||
|
|
||||||
|
static PopupLabel *_instance;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void paintEvent(QPaintEvent *event);
|
||||||
|
void timerEvent(QTimerEvent *event);
|
||||||
|
void contextMenuEvent(QContextMenuEvent *) {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
QBasicTimer _timer;
|
||||||
|
};
|
||||||
|
|
||||||
|
PopupLabel *PopupLabel::_instance = 0;
|
||||||
|
|
||||||
|
PopupLabel::PopupLabel(const QString &text, QWidget *parent)
|
||||||
|
: QLabel(text, parent, Qt::ToolTip | Qt::BypassGraphicsProxyWidget
|
||||||
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
|
||||||
|
| Qt::WindowDoesNotAcceptFocus
|
||||||
|
#endif // QT5
|
||||||
|
)
|
||||||
|
{
|
||||||
|
delete _instance;
|
||||||
|
_instance = this;
|
||||||
|
|
||||||
|
setForegroundRole(QPalette::ToolTipText);
|
||||||
|
setBackgroundRole(QPalette::ToolTipBase);
|
||||||
|
setPalette(QToolTip::palette());
|
||||||
|
ensurePolished();
|
||||||
|
setMargin(1 + style()->pixelMetric(QStyle::PM_ToolTipLabelFrameWidth, 0,
|
||||||
|
this));
|
||||||
|
setFrameStyle(QFrame::NoFrame);
|
||||||
|
setAlignment(Qt::AlignLeft);
|
||||||
|
setIndent(1);
|
||||||
|
setWindowOpacity(style()->styleHint(QStyle::SH_ToolTipLabel_Opacity, 0,
|
||||||
|
this) / 255.0);
|
||||||
|
|
||||||
|
setTextInteractionFlags(Qt::TextBrowserInteraction);
|
||||||
|
setOpenExternalLinks(true);
|
||||||
|
setWordWrap(true);
|
||||||
|
|
||||||
|
setMouseTracking(true);
|
||||||
|
|
||||||
|
qApp->installEventFilter(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
PopupLabel::~PopupLabel()
|
||||||
|
{
|
||||||
|
_instance = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PopupLabel::paintEvent(QPaintEvent *event)
|
||||||
|
{
|
||||||
|
QStylePainter p(this);
|
||||||
|
QStyleOptionFrame opt;
|
||||||
|
opt.init(this);
|
||||||
|
p.drawPrimitive(QStyle::PE_PanelTipLabel, opt);
|
||||||
|
p.end();
|
||||||
|
QLabel::paintEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PopupLabel::timerEvent(QTimerEvent *event)
|
||||||
|
{
|
||||||
|
if (event->timerId() == _timer.timerId()) {
|
||||||
|
_timer.stop();
|
||||||
|
deleteLater();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PopupLabel::eventFilter(QObject *o, QEvent *ev)
|
||||||
|
{
|
||||||
|
Q_UNUSED(o);
|
||||||
|
|
||||||
|
switch (ev->type()) {
|
||||||
|
case QEvent::KeyPress:
|
||||||
|
case QEvent::KeyRelease: {
|
||||||
|
const int key = static_cast<QKeyEvent *>(ev)->key();
|
||||||
|
if (key == Qt::Key_Escape) {
|
||||||
|
deleteLater();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case QEvent::FocusIn:
|
||||||
|
case QEvent::FocusOut:
|
||||||
|
case QEvent::WindowActivate:
|
||||||
|
case QEvent::WindowDeactivate:
|
||||||
|
case QEvent::Close:
|
||||||
|
deleteLater();
|
||||||
|
break;
|
||||||
|
case QEvent::MouseMove: {
|
||||||
|
QRectF r(geometry().adjusted(-5, -20, 5, 20));
|
||||||
|
QPointF p(static_cast<QMouseEvent*>(ev)->globalPos());
|
||||||
|
if (!r.contains(p))
|
||||||
|
deleteAfterTimer();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PopupLabel::place(const QPoint &pos, QWidget *w)
|
||||||
|
{
|
||||||
|
QRect screen = QApplication::desktop()->screenGeometry(w);
|
||||||
|
QPoint p(pos.x() + 2, pos.y() + 16);
|
||||||
|
|
||||||
|
if (p.x() + width() > screen.x() + screen.width())
|
||||||
|
p.rx() -= 4 + width();
|
||||||
|
if (p.y() + height() > screen.y() + screen.height())
|
||||||
|
p.ry() -= 24 + height();
|
||||||
|
if (p.y() < screen.y())
|
||||||
|
p.setY(screen.y());
|
||||||
|
if (p.x() + width() > screen.x() + screen.width())
|
||||||
|
p.setX(screen.x() + screen.width() - width());
|
||||||
|
if (p.x() < screen.x())
|
||||||
|
p.setX(screen.x());
|
||||||
|
if (p.y() + height() > screen.y() + screen.height())
|
||||||
|
p.setY(screen.y() + screen.height() - height());
|
||||||
|
|
||||||
|
this->move(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PopupLabel::deleteAfterTimer()
|
||||||
|
{
|
||||||
|
if (!_timer.isActive())
|
||||||
|
_timer.start(300, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Popup::show(const QPoint &pos, const QString &text, QWidget *w)
|
||||||
|
{
|
||||||
|
if (PopupLabel::_instance) {
|
||||||
|
PopupLabel::_instance->stopTimer();
|
||||||
|
PopupLabel::_instance->setText(text);
|
||||||
|
} else
|
||||||
|
PopupLabel::_instance = new PopupLabel(text);
|
||||||
|
|
||||||
|
PopupLabel::_instance->resize(PopupLabel::_instance->sizeHint());
|
||||||
|
PopupLabel::_instance->place(pos, w);
|
||||||
|
PopupLabel::_instance->showNormal();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Popup::clear()
|
||||||
|
{
|
||||||
|
if (PopupLabel::_instance)
|
||||||
|
delete PopupLabel::_instance;
|
||||||
|
}
|
15
src/GUI/popup.h
Normal file
15
src/GUI/popup.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef POPUP_H
|
||||||
|
#define POPUP_H
|
||||||
|
|
||||||
|
class QPoint;
|
||||||
|
class QString;
|
||||||
|
class QWidget;
|
||||||
|
|
||||||
|
class Popup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void show(const QPoint &pos, const QString &text, QWidget *w);
|
||||||
|
static void clear();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // POPUP_H
|
@ -14,6 +14,11 @@ PowerGraph::PowerGraph(QWidget *parent) : GraphTab(parent)
|
|||||||
setSliderPrecision(1);
|
setSliderPrecision(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PowerGraph::~PowerGraph()
|
||||||
|
{
|
||||||
|
qDeleteAll(_tracks);
|
||||||
|
}
|
||||||
|
|
||||||
void PowerGraph::setInfo()
|
void PowerGraph::setInfo()
|
||||||
{
|
{
|
||||||
if (_showTracks) {
|
if (_showTracks) {
|
||||||
@ -36,23 +41,27 @@ QList<GraphItem*> PowerGraph::loadData(const Data &data)
|
|||||||
const Graph &graph = track.power();
|
const Graph &graph = track.power();
|
||||||
|
|
||||||
if (!graph.isValid()) {
|
if (!graph.isValid()) {
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
graphs.append(0);
|
graphs.append(0);
|
||||||
} else {
|
} else {
|
||||||
PowerGraphItem *gi = new PowerGraphItem(graph, _graphType);
|
PowerGraphItem *gi = new PowerGraphItem(graph, _graphType, _width,
|
||||||
GraphView::addGraph(gi);
|
_palette.nextColor());
|
||||||
|
|
||||||
|
_tracks.append(gi);
|
||||||
|
if (_showTracks)
|
||||||
|
addGraph(gi);
|
||||||
_avg.append(QPointF(track.distance(), gi->avg()));
|
_avg.append(QPointF(track.distance(), gi->avg()));
|
||||||
graphs.append(gi);
|
graphs.append(gi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < data.routes().count(); i++) {
|
for (int i = 0; i < data.routes().count(); i++) {
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
graphs.append(0);
|
graphs.append(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < data.areas().count(); i++)
|
for (int i = 0; i < data.areas().count(); i++)
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
|
|
||||||
setInfo();
|
setInfo();
|
||||||
redraw();
|
redraw();
|
||||||
@ -75,6 +84,9 @@ qreal PowerGraph::avg() const
|
|||||||
|
|
||||||
void PowerGraph::clear()
|
void PowerGraph::clear()
|
||||||
{
|
{
|
||||||
|
qDeleteAll(_tracks);
|
||||||
|
_tracks.clear();
|
||||||
|
|
||||||
_avg.clear();
|
_avg.clear();
|
||||||
|
|
||||||
GraphTab::clear();
|
GraphTab::clear();
|
||||||
@ -84,7 +96,13 @@ void PowerGraph::showTracks(bool show)
|
|||||||
{
|
{
|
||||||
_showTracks = show;
|
_showTracks = show;
|
||||||
|
|
||||||
showGraph(show);
|
for (int i = 0; i < _tracks.size(); i++) {
|
||||||
|
if (show)
|
||||||
|
addGraph(_tracks.at(i));
|
||||||
|
else
|
||||||
|
removeGraph(_tracks.at(i));
|
||||||
|
}
|
||||||
|
|
||||||
setInfo();
|
setInfo();
|
||||||
|
|
||||||
redraw();
|
redraw();
|
||||||
|
@ -3,12 +3,15 @@
|
|||||||
|
|
||||||
#include "graphtab.h"
|
#include "graphtab.h"
|
||||||
|
|
||||||
|
class PowerGraphItem;
|
||||||
|
|
||||||
class PowerGraph : public GraphTab
|
class PowerGraph : public GraphTab
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PowerGraph(QWidget *parent = 0);
|
PowerGraph(QWidget *parent = 0);
|
||||||
|
~PowerGraph();
|
||||||
|
|
||||||
QString label() const {return tr("Power");}
|
QString label() const {return tr("Power");}
|
||||||
QList<GraphItem*> loadData(const Data &data);
|
QList<GraphItem*> loadData(const Data &data);
|
||||||
@ -23,6 +26,7 @@ private:
|
|||||||
QVector<QPointF> _avg;
|
QVector<QPointF> _avg;
|
||||||
|
|
||||||
bool _showTracks;
|
bool _showTracks;
|
||||||
|
QList<PowerGraphItem*> _tracks;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // POWERGRAPH_H
|
#endif // POWERGRAPH_H
|
||||||
|
@ -3,13 +3,13 @@
|
|||||||
#include "powergraphitem.h"
|
#include "powergraphitem.h"
|
||||||
|
|
||||||
|
|
||||||
PowerGraphItem::PowerGraphItem(const Graph &graph, GraphType type,
|
PowerGraphItem::PowerGraphItem(const Graph &graph, GraphType type, int width,
|
||||||
QGraphicsItem *parent) : GraphItem(graph, type, parent)
|
const QColor &color, QGraphicsItem *parent)
|
||||||
|
: GraphItem(graph, type, width, color, parent)
|
||||||
{
|
{
|
||||||
setToolTip(toolTip());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString PowerGraphItem::toolTip() const
|
QString PowerGraphItem::info() const
|
||||||
{
|
{
|
||||||
ToolTip tt;
|
ToolTip tt;
|
||||||
QLocale l(QLocale::system());
|
QLocale l(QLocale::system());
|
||||||
|
@ -8,11 +8,10 @@ class PowerGraphItem : public GraphItem
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PowerGraphItem(const Graph &graph, GraphType type,
|
PowerGraphItem(const Graph &graph, GraphType type, int width,
|
||||||
QGraphicsItem *parent = 0);
|
const QColor &color, QGraphicsItem *parent = 0);
|
||||||
|
|
||||||
private:
|
QString info() const;
|
||||||
QString toolTip() const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // POWERGRAPHITEM_H
|
#endif // POWERGRAPHITEM_H
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "routeitem.h"
|
#include "routeitem.h"
|
||||||
|
|
||||||
|
|
||||||
QString RouteItem::toolTip(Units units) const
|
QString RouteItem::info() const
|
||||||
{
|
{
|
||||||
ToolTip tt;
|
ToolTip tt;
|
||||||
|
|
||||||
@ -16,7 +16,18 @@ QString RouteItem::toolTip(Units units) const
|
|||||||
if (!_desc.isEmpty())
|
if (!_desc.isEmpty())
|
||||||
tt.insert(tr("Description"), _desc);
|
tt.insert(tr("Description"), _desc);
|
||||||
tt.insert(tr("Distance"), Format::distance(path().last().last().distance(),
|
tt.insert(tr("Distance"), Format::distance(path().last().last().distance(),
|
||||||
units));
|
_units));
|
||||||
|
if (!_links.isEmpty()) {
|
||||||
|
QString links;
|
||||||
|
for (int i = 0; i < _links.size(); i++) {
|
||||||
|
const Link &link = _links.at(i);
|
||||||
|
links.append(QString("<a href=\"%0\">%1</a>").arg(link.URL(),
|
||||||
|
link.text().isEmpty() ? link.URL() : link.text()));
|
||||||
|
if (i != _links.size() - 1)
|
||||||
|
links.append("<br/>");
|
||||||
|
}
|
||||||
|
tt.insert(tr("Links"), links);
|
||||||
|
}
|
||||||
|
|
||||||
return tt.toString();
|
return tt.toString();
|
||||||
}
|
}
|
||||||
@ -24,7 +35,7 @@ QString RouteItem::toolTip(Units units) const
|
|||||||
RouteItem::RouteItem(const Route &route, Map *map, QGraphicsItem *parent)
|
RouteItem::RouteItem(const Route &route, Map *map, QGraphicsItem *parent)
|
||||||
: PathItem(route.path(), map, parent)
|
: PathItem(route.path(), map, parent)
|
||||||
{
|
{
|
||||||
const QVector<Waypoint> &waypoints = route.waypoints();
|
const RouteData &waypoints = route.data();
|
||||||
|
|
||||||
_waypoints.resize(waypoints.size());
|
_waypoints.resize(waypoints.size());
|
||||||
for (int i = 0; i < waypoints.size(); i++)
|
for (int i = 0; i < waypoints.size(); i++)
|
||||||
@ -32,9 +43,8 @@ RouteItem::RouteItem(const Route &route, Map *map, QGraphicsItem *parent)
|
|||||||
|
|
||||||
_name = route.name();
|
_name = route.name();
|
||||||
_desc = route.description();
|
_desc = route.description();
|
||||||
|
_links = route.links();
|
||||||
_coordinatesFormat = DecimalDegrees;
|
_coordinatesFormat = DecimalDegrees;
|
||||||
|
|
||||||
setToolTip(toolTip(Metric));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RouteItem::setMap(Map *map)
|
void RouteItem::setMap(Map *map)
|
||||||
@ -47,15 +57,13 @@ void RouteItem::setMap(Map *map)
|
|||||||
|
|
||||||
void RouteItem::setUnits(Units u)
|
void RouteItem::setUnits(Units u)
|
||||||
{
|
{
|
||||||
if (units() == u)
|
if (_units == u)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PathItem::setUnits(u);
|
|
||||||
|
|
||||||
setToolTip(toolTip(units()));
|
|
||||||
|
|
||||||
for (int i = 0; i < _waypoints.count(); i++)
|
for (int i = 0; i < _waypoints.count(); i++)
|
||||||
_waypoints[i]->setToolTipFormat(units(), _coordinatesFormat);
|
_waypoints[i]->setToolTipFormat(u, _coordinatesFormat);
|
||||||
|
|
||||||
|
PathItem::setUnits(u);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RouteItem::setCoordinatesFormat(CoordinatesFormat format)
|
void RouteItem::setCoordinatesFormat(CoordinatesFormat format)
|
||||||
@ -66,7 +74,7 @@ void RouteItem::setCoordinatesFormat(CoordinatesFormat format)
|
|||||||
_coordinatesFormat = format;
|
_coordinatesFormat = format;
|
||||||
|
|
||||||
for (int i = 0; i < _waypoints.count(); i++)
|
for (int i = 0; i < _waypoints.count(); i++)
|
||||||
_waypoints[i]->setToolTipFormat(units(), _coordinatesFormat);
|
_waypoints[i]->setToolTipFormat(_units, _coordinatesFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RouteItem::showWaypoints(bool show)
|
void RouteItem::showWaypoints(bool show)
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "pathitem.h"
|
#include "pathitem.h"
|
||||||
#include "units.h"
|
#include "units.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
|
#include "graphicsscene.h"
|
||||||
|
|
||||||
class Map;
|
class Map;
|
||||||
class WaypointItem;
|
class WaypointItem;
|
||||||
@ -23,11 +24,12 @@ public:
|
|||||||
void showWaypoints(bool show);
|
void showWaypoints(bool show);
|
||||||
void showWaypointLabels(bool show);
|
void showWaypointLabels(bool show);
|
||||||
|
|
||||||
private:
|
QString info() const;
|
||||||
QString toolTip(Units units) const;
|
|
||||||
|
|
||||||
|
private:
|
||||||
QString _name;
|
QString _name;
|
||||||
QString _desc;
|
QString _desc;
|
||||||
|
QVector<Link> _links;
|
||||||
CoordinatesFormat _coordinatesFormat;
|
CoordinatesFormat _coordinatesFormat;
|
||||||
|
|
||||||
QVector<WaypointItem*> _waypoints;
|
QVector<WaypointItem*> _waypoints;
|
||||||
|
@ -135,6 +135,8 @@
|
|||||||
#define POWER_FILTER_DEFAULT 3
|
#define POWER_FILTER_DEFAULT 3
|
||||||
#define OUTLIER_ELIMINATE_SETTING "outlierEliminate"
|
#define OUTLIER_ELIMINATE_SETTING "outlierEliminate"
|
||||||
#define OUTLIER_ELIMINATE_DEFAULT true
|
#define OUTLIER_ELIMINATE_DEFAULT true
|
||||||
|
#define AUTOMATIC_PAUSE_SETTING "automaticPause"
|
||||||
|
#define AUTOMATIC_PAUSE_DEFAULT true
|
||||||
#define PAUSE_SPEED_SETTING "pauseSpeed"
|
#define PAUSE_SPEED_SETTING "pauseSpeed"
|
||||||
#define PAUSE_SPEED_DEFAULT 0.5 /* m/s */
|
#define PAUSE_SPEED_DEFAULT 0.5 /* m/s */
|
||||||
#define PAUSE_INTERVAL_SETTING "pauseInterval"
|
#define PAUSE_INTERVAL_SETTING "pauseInterval"
|
||||||
@ -152,7 +154,7 @@
|
|||||||
#define ENABLE_HTTP2_SETTING "enableHTTP2"
|
#define ENABLE_HTTP2_SETTING "enableHTTP2"
|
||||||
#define ENABLE_HTTP2_DEFAULT true
|
#define ENABLE_HTTP2_DEFAULT true
|
||||||
#define PIXMAP_CACHE_SETTING "pixmapCache"
|
#define PIXMAP_CACHE_SETTING "pixmapCache"
|
||||||
#define PIXMAP_CACHE_DEFAULT 64 /* MB */
|
#define PIXMAP_CACHE_DEFAULT 256 /* MB */
|
||||||
#define CONNECTION_TIMEOUT_SETTING "connectionTimeout"
|
#define CONNECTION_TIMEOUT_SETTING "connectionTimeout"
|
||||||
#define CONNECTION_TIMEOUT_DEFAULT 30 /* s */
|
#define CONNECTION_TIMEOUT_DEFAULT 30 /* s */
|
||||||
#define HIRES_PRINT_SETTING "hiresPrint"
|
#define HIRES_PRINT_SETTING "hiresPrint"
|
||||||
|
@ -18,6 +18,11 @@ SpeedGraph::SpeedGraph(QWidget *parent) : GraphTab(parent)
|
|||||||
setSliderPrecision(1);
|
setSliderPrecision(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SpeedGraph::~SpeedGraph()
|
||||||
|
{
|
||||||
|
qDeleteAll(_tracks);
|
||||||
|
}
|
||||||
|
|
||||||
void SpeedGraph::setInfo()
|
void SpeedGraph::setInfo()
|
||||||
{
|
{
|
||||||
if (_showTracks) {
|
if (_showTracks) {
|
||||||
@ -44,13 +49,18 @@ QList<GraphItem*> SpeedGraph::loadData(const Data &data)
|
|||||||
const Graph &graph = track.speed();
|
const Graph &graph = track.speed();
|
||||||
|
|
||||||
if (!graph.isValid()) {
|
if (!graph.isValid()) {
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
graphs.append(0);
|
graphs.append(0);
|
||||||
} else {
|
} else {
|
||||||
SpeedGraphItem *gi = new SpeedGraphItem(graph, _graphType,
|
SpeedGraphItem *gi = new SpeedGraphItem(graph, _graphType, _width,
|
||||||
track.movingTime());
|
_palette.nextColor(), track.movingTime());
|
||||||
gi->setTimeType(_timeType);
|
gi->setTimeType(_timeType);
|
||||||
GraphView::addGraph(gi);
|
gi->setUnits(_units);
|
||||||
|
|
||||||
|
_tracks.append(gi);
|
||||||
|
if (_showTracks)
|
||||||
|
addGraph(gi);
|
||||||
|
|
||||||
_avg.append(QPointF(track.distance(), gi->avg()));
|
_avg.append(QPointF(track.distance(), gi->avg()));
|
||||||
_mavg.append(QPointF(track.distance(), gi->mavg()));
|
_mavg.append(QPointF(track.distance(), gi->mavg()));
|
||||||
graphs.append(gi);
|
graphs.append(gi);
|
||||||
@ -58,12 +68,12 @@ QList<GraphItem*> SpeedGraph::loadData(const Data &data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < data.routes().count(); i++) {
|
for (int i = 0; i < data.routes().count(); i++) {
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
graphs.append(0);
|
graphs.append(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < data.areas().count(); i++)
|
for (int i = 0; i < data.areas().count(); i++)
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
|
|
||||||
setInfo();
|
setInfo();
|
||||||
redraw();
|
redraw();
|
||||||
@ -87,6 +97,9 @@ qreal SpeedGraph::avg() const
|
|||||||
|
|
||||||
void SpeedGraph::clear()
|
void SpeedGraph::clear()
|
||||||
{
|
{
|
||||||
|
qDeleteAll(_tracks);
|
||||||
|
_tracks.clear();
|
||||||
|
|
||||||
_avg.clear();
|
_avg.clear();
|
||||||
_mavg.clear();
|
_mavg.clear();
|
||||||
|
|
||||||
@ -121,8 +134,8 @@ void SpeedGraph::setTimeType(enum TimeType type)
|
|||||||
{
|
{
|
||||||
_timeType = type;
|
_timeType = type;
|
||||||
|
|
||||||
for (int i = 0; i < _graphs.size(); i++)
|
for (int i = 0; i < _tracks.size(); i++)
|
||||||
static_cast<SpeedGraphItem*>(_graphs.at(i))->setTimeType(type);
|
_tracks.at(i)->setTimeType(type);
|
||||||
|
|
||||||
setInfo();
|
setInfo();
|
||||||
redraw();
|
redraw();
|
||||||
@ -132,7 +145,13 @@ void SpeedGraph::showTracks(bool show)
|
|||||||
{
|
{
|
||||||
_showTracks = show;
|
_showTracks = show;
|
||||||
|
|
||||||
showGraph(show);
|
for (int i = 0; i < _tracks.size(); i++) {
|
||||||
|
if (show)
|
||||||
|
addGraph(_tracks.at(i));
|
||||||
|
else
|
||||||
|
removeGraph(_tracks.at(i));
|
||||||
|
}
|
||||||
|
|
||||||
setInfo();
|
setInfo();
|
||||||
|
|
||||||
redraw();
|
redraw();
|
||||||
|
@ -4,12 +4,15 @@
|
|||||||
#include <QList>
|
#include <QList>
|
||||||
#include "graphtab.h"
|
#include "graphtab.h"
|
||||||
|
|
||||||
|
class SpeedGraphItem;
|
||||||
|
|
||||||
class SpeedGraph : public GraphTab
|
class SpeedGraph : public GraphTab
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SpeedGraph(QWidget *parent = 0);
|
SpeedGraph(QWidget *parent = 0);
|
||||||
|
~SpeedGraph();
|
||||||
|
|
||||||
QString label() const {return tr("Speed");}
|
QString label() const {return tr("Speed");}
|
||||||
QList<GraphItem*> loadData(const Data &data);
|
QList<GraphItem*> loadData(const Data &data);
|
||||||
@ -29,7 +32,9 @@ private:
|
|||||||
|
|
||||||
Units _units;
|
Units _units;
|
||||||
TimeType _timeType;
|
TimeType _timeType;
|
||||||
|
|
||||||
bool _showTracks;
|
bool _showTracks;
|
||||||
|
QList<SpeedGraphItem *> _tracks;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SPEEDGRAPH_H
|
#endif // SPEEDGRAPH_H
|
||||||
|
@ -4,20 +4,18 @@
|
|||||||
#include "speedgraphitem.h"
|
#include "speedgraphitem.h"
|
||||||
|
|
||||||
|
|
||||||
SpeedGraphItem::SpeedGraphItem(const Graph &graph, GraphType type,
|
SpeedGraphItem::SpeedGraphItem(const Graph &graph, GraphType type, int width,
|
||||||
qreal movingTime, QGraphicsItem *parent) : GraphItem(graph, type, parent)
|
const QColor &color, qreal movingTime, QGraphicsItem *parent)
|
||||||
|
: GraphItem(graph, type, width, color, parent)
|
||||||
{
|
{
|
||||||
_units = Metric;
|
|
||||||
_timeType = Total;
|
_timeType = Total;
|
||||||
|
|
||||||
_max = GraphItem::max();
|
_max = GraphItem::max();
|
||||||
_avg = graph.last().last().s() / graph.last().last().t();
|
_avg = graph.last().last().s() / graph.last().last().t();
|
||||||
_mavg = graph.last().last().s() / movingTime;
|
_mavg = graph.last().last().s() / movingTime;
|
||||||
|
|
||||||
setToolTip(toolTip());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SpeedGraphItem::toolTip() const
|
QString SpeedGraphItem::info() const
|
||||||
{
|
{
|
||||||
ToolTip tt;
|
ToolTip tt;
|
||||||
qreal scale = (_units == Imperial) ? MS2MIH : (_units == Nautical)
|
qreal scale = (_units == Imperial) ? MS2MIH : (_units == Nautical)
|
||||||
@ -39,14 +37,7 @@ QString SpeedGraphItem::toolTip() const
|
|||||||
return tt.toString();
|
return tt.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpeedGraphItem::setUnits(Units units)
|
|
||||||
{
|
|
||||||
_units = units;
|
|
||||||
setToolTip(toolTip());
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpeedGraphItem::setTimeType(TimeType type)
|
void SpeedGraphItem::setTimeType(TimeType type)
|
||||||
{
|
{
|
||||||
_timeType = type;
|
_timeType = type;
|
||||||
setToolTip(toolTip());
|
|
||||||
}
|
}
|
||||||
|
@ -9,22 +9,19 @@ class SpeedGraphItem : public GraphItem
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SpeedGraphItem(const Graph &graph, GraphType type, qreal movingTime,
|
SpeedGraphItem(const Graph &graph, GraphType type, int width,
|
||||||
QGraphicsItem *parent = 0);
|
const QColor &color, qreal movingTime, QGraphicsItem *parent = 0);
|
||||||
|
|
||||||
qreal avg() const {return _avg;}
|
qreal avg() const {return _avg;}
|
||||||
qreal mavg() const {return _mavg;}
|
qreal mavg() const {return _mavg;}
|
||||||
qreal max() const {return _max;}
|
qreal max() const {return _max;}
|
||||||
|
|
||||||
void setUnits(Units units);
|
QString info() const;
|
||||||
|
|
||||||
void setTimeType(TimeType type);
|
void setTimeType(TimeType type);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString toolTip() const;
|
|
||||||
|
|
||||||
qreal _avg, _mavg, _max;
|
qreal _avg, _mavg, _max;
|
||||||
|
|
||||||
Units _units;
|
|
||||||
TimeType _timeType;
|
TimeType _timeType;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -14,6 +14,11 @@ TemperatureGraph::TemperatureGraph(QWidget *parent) : GraphTab(parent)
|
|||||||
setSliderPrecision(1);
|
setSliderPrecision(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TemperatureGraph::~TemperatureGraph()
|
||||||
|
{
|
||||||
|
qDeleteAll(_tracks);
|
||||||
|
}
|
||||||
|
|
||||||
void TemperatureGraph::setInfo()
|
void TemperatureGraph::setInfo()
|
||||||
{
|
{
|
||||||
if (_showTracks) {
|
if (_showTracks) {
|
||||||
@ -38,24 +43,29 @@ QList<GraphItem*> TemperatureGraph::loadData(const Data &data)
|
|||||||
const Graph &graph = track.temperature();
|
const Graph &graph = track.temperature();
|
||||||
|
|
||||||
if (!graph.isValid()) {
|
if (!graph.isValid()) {
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
graphs.append(0);
|
graphs.append(0);
|
||||||
} else {
|
} else {
|
||||||
TemperatureGraphItem *gi = new TemperatureGraphItem(graph,
|
TemperatureGraphItem *gi = new TemperatureGraphItem(graph,
|
||||||
_graphType);
|
_graphType, _width, _palette.nextColor());
|
||||||
GraphView::addGraph(gi);
|
gi->setUnits(_units);
|
||||||
|
|
||||||
|
_tracks.append(gi);
|
||||||
|
if (_showTracks)
|
||||||
|
addGraph(gi);
|
||||||
|
|
||||||
_avg.append(QPointF(track.distance(), gi->avg()));
|
_avg.append(QPointF(track.distance(), gi->avg()));
|
||||||
graphs.append(gi);
|
graphs.append(gi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < data.routes().count(); i++) {
|
for (int i = 0; i < data.routes().count(); i++) {
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
graphs.append(0);
|
graphs.append(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < data.areas().count(); i++)
|
for (int i = 0; i < data.areas().count(); i++)
|
||||||
skipColor();
|
_palette.nextColor();
|
||||||
|
|
||||||
setInfo();
|
setInfo();
|
||||||
redraw();
|
redraw();
|
||||||
@ -78,6 +88,9 @@ qreal TemperatureGraph::avg() const
|
|||||||
|
|
||||||
void TemperatureGraph::clear()
|
void TemperatureGraph::clear()
|
||||||
{
|
{
|
||||||
|
qDeleteAll(_tracks);
|
||||||
|
_tracks.clear();
|
||||||
|
|
||||||
_avg.clear();
|
_avg.clear();
|
||||||
|
|
||||||
GraphTab::clear();
|
GraphTab::clear();
|
||||||
@ -108,7 +121,13 @@ void TemperatureGraph::showTracks(bool show)
|
|||||||
{
|
{
|
||||||
_showTracks = show;
|
_showTracks = show;
|
||||||
|
|
||||||
showGraph(show);
|
for (int i = 0; i < _tracks.size(); i++) {
|
||||||
|
if (show)
|
||||||
|
addGraph(_tracks.at(i));
|
||||||
|
else
|
||||||
|
removeGraph(_tracks.at(i));
|
||||||
|
}
|
||||||
|
|
||||||
setInfo();
|
setInfo();
|
||||||
|
|
||||||
redraw();
|
redraw();
|
||||||
|
@ -3,12 +3,15 @@
|
|||||||
|
|
||||||
#include "graphtab.h"
|
#include "graphtab.h"
|
||||||
|
|
||||||
|
class TemperatureGraphItem;
|
||||||
|
|
||||||
class TemperatureGraph : public GraphTab
|
class TemperatureGraph : public GraphTab
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TemperatureGraph(QWidget *parent = 0);
|
TemperatureGraph(QWidget *parent = 0);
|
||||||
|
~TemperatureGraph();
|
||||||
|
|
||||||
QString label() const {return tr("Temperature");}
|
QString label() const {return tr("Temperature");}
|
||||||
QList<GraphItem*> loadData(const Data &data);
|
QList<GraphItem*> loadData(const Data &data);
|
||||||
@ -26,6 +29,7 @@ private:
|
|||||||
QVector<QPointF> _avg;
|
QVector<QPointF> _avg;
|
||||||
|
|
||||||
bool _showTracks;
|
bool _showTracks;
|
||||||
|
QList<TemperatureGraphItem *> _tracks;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TEMPERATUREGRAPH_H
|
#endif // TEMPERATUREGRAPH_H
|
||||||
|
@ -4,21 +4,20 @@
|
|||||||
|
|
||||||
|
|
||||||
TemperatureGraphItem::TemperatureGraphItem(const Graph &graph, GraphType type,
|
TemperatureGraphItem::TemperatureGraphItem(const Graph &graph, GraphType type,
|
||||||
QGraphicsItem *parent) : GraphItem(graph, type, parent)
|
int width, const QColor &color, QGraphicsItem *parent)
|
||||||
|
: GraphItem(graph, type, width, color, parent)
|
||||||
{
|
{
|
||||||
_min = GraphItem::min();
|
_min = GraphItem::min();
|
||||||
_max = GraphItem::max();
|
_max = GraphItem::max();
|
||||||
_avg = GraphItem::avg();
|
_avg = GraphItem::avg();
|
||||||
|
|
||||||
setToolTip(toolTip(Metric));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString TemperatureGraphItem::toolTip(Units units) const
|
QString TemperatureGraphItem::info() const
|
||||||
{
|
{
|
||||||
ToolTip tt;
|
ToolTip tt;
|
||||||
qreal scale = (units == Metric) ? 1.0 : C2FS;
|
qreal scale = (_units == Metric) ? 1.0 : C2FS;
|
||||||
qreal offset = (units == Metric) ? 0 : C2FO;
|
qreal offset = (_units == Metric) ? 0 : C2FO;
|
||||||
QString su = (units == Metric) ?
|
QString su = (_units == Metric) ?
|
||||||
QChar(0x00B0) + tr("C") : QChar(0x00B0) + tr("F");
|
QChar(0x00B0) + tr("C") : QChar(0x00B0) + tr("F");
|
||||||
QLocale l(QLocale::system());
|
QLocale l(QLocale::system());
|
||||||
|
|
||||||
@ -31,8 +30,3 @@ QString TemperatureGraphItem::toolTip(Units units) const
|
|||||||
|
|
||||||
return tt.toString();
|
return tt.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TemperatureGraphItem::setUnits(Units units)
|
|
||||||
{
|
|
||||||
setToolTip(toolTip(units));
|
|
||||||
}
|
|
||||||
|
@ -8,18 +8,16 @@ class TemperatureGraphItem : public GraphItem
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TemperatureGraphItem(const Graph &graph, GraphType type,
|
TemperatureGraphItem(const Graph &graph, GraphType type, int width,
|
||||||
QGraphicsItem *parent = 0);
|
const QColor &color, QGraphicsItem *parent = 0);
|
||||||
|
|
||||||
qreal max() const {return _max;}
|
qreal max() const {return _max;}
|
||||||
qreal min() const {return _min;}
|
qreal min() const {return _min;}
|
||||||
qreal avg() const {return _avg;}
|
qreal avg() const {return _avg;}
|
||||||
|
|
||||||
void setUnits(Units units);
|
QString info() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString toolTip(Units units) const;
|
|
||||||
|
|
||||||
qreal _min, _max, _avg;
|
qreal _min, _max, _avg;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,33 +1,42 @@
|
|||||||
#include <QImageReader>
|
#include "popup.h"
|
||||||
#include "tooltip.h"
|
#include "tooltip.h"
|
||||||
|
|
||||||
|
static QSize thumbnailSize(const ImageInfo &img, int limit)
|
||||||
|
{
|
||||||
|
int width, height;
|
||||||
|
if (img.size().width() > img.size().height()) {
|
||||||
|
width = qMin(img.size().width(), limit);
|
||||||
|
qreal ratio = img.size().width() / (qreal)img.size().height();
|
||||||
|
height = (int)(width / ratio);
|
||||||
|
} else {
|
||||||
|
height = qMin(img.size().height(), limit);
|
||||||
|
qreal ratio = img.size().height() / (qreal)img.size().width();
|
||||||
|
width = (int)(height / ratio);
|
||||||
|
}
|
||||||
|
|
||||||
#define THUMBNAIL_MAX_SIZE 240
|
return QSize(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
void ToolTip::insert(const QString &key, const QString &value)
|
void ToolTip::insert(const QString &key, const QString &value)
|
||||||
{
|
{
|
||||||
_list.append(KV(key, value));
|
_list.append(KV<QString, QString>(key, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
QString ToolTip::toString() const
|
QString ToolTip::toString() const
|
||||||
{
|
{
|
||||||
QString html;
|
QString html;
|
||||||
|
|
||||||
if (_img.isValid()) {
|
if (_images.size()) {
|
||||||
int width, height;
|
html = "<div align=\"center\">";
|
||||||
if (_img.size().width() > _img.size().height()) {
|
for (int i = 0; i < _images.size(); i++) {
|
||||||
width = qMin(_img.size().width(), THUMBNAIL_MAX_SIZE);
|
const ImageInfo &img = _images.at(i);
|
||||||
qreal ratio = _img.size().width() / (qreal)_img.size().height();
|
QSize size(thumbnailSize(img, qMin(960/_images.size(), 240)));
|
||||||
height = (int)(width / ratio);
|
|
||||||
} else {
|
|
||||||
height = qMin(_img.size().height(), THUMBNAIL_MAX_SIZE);
|
|
||||||
qreal ratio = _img.size().height() / (qreal)_img.size().width();
|
|
||||||
width = (int)(height / ratio);
|
|
||||||
}
|
|
||||||
|
|
||||||
html += "<div align=\"center\">";
|
html += QString("<a href=\"file:%0\">"
|
||||||
html += QString("<img src=\"file:%0\" width=\"%1\" height=\"%2\"/>")
|
"<img src=\"%0\" width=\"%1\" height=\"%2\"/></a>")
|
||||||
.arg(_img.path(), QString::number(width), QString::number(height));
|
.arg(img.path(), QString::number(size.width()),
|
||||||
|
QString::number(size.height()));
|
||||||
|
}
|
||||||
html += "</div>";
|
html += "</div>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
|
#include <QVector>
|
||||||
#include "common/kv.h"
|
#include "common/kv.h"
|
||||||
#include "data/imageinfo.h"
|
#include "data/imageinfo.h"
|
||||||
|
|
||||||
@ -10,12 +11,12 @@ class ToolTip
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void insert(const QString &key, const QString &value);
|
void insert(const QString &key, const QString &value);
|
||||||
void setImage(const ImageInfo &image) {_img = image;}
|
void setImages(const QVector<ImageInfo> &images) {_images = images;}
|
||||||
QString toString() const;
|
QString toString() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<KV> _list;
|
QList<KV<QString, QString> > _list;
|
||||||
ImageInfo _img;
|
QVector<ImageInfo> _images;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TOOLTIP_H
|
#endif // TOOLTIP_H
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include "trackitem.h"
|
#include "trackitem.h"
|
||||||
|
|
||||||
|
|
||||||
QString TrackItem::toolTip(Units units) const
|
QString TrackItem::info() const
|
||||||
{
|
{
|
||||||
ToolTip tt;
|
ToolTip tt;
|
||||||
|
|
||||||
@ -14,13 +14,24 @@ QString TrackItem::toolTip(Units units) const
|
|||||||
if (!_desc.isEmpty())
|
if (!_desc.isEmpty())
|
||||||
tt.insert(tr("Description"), _desc);
|
tt.insert(tr("Description"), _desc);
|
||||||
tt.insert(tr("Distance"), Format::distance(path().last().last().distance(),
|
tt.insert(tr("Distance"), Format::distance(path().last().last().distance(),
|
||||||
units));
|
_units));
|
||||||
if (_time > 0)
|
if (_time > 0)
|
||||||
tt.insert(tr("Total time"), Format::timeSpan(_time));
|
tt.insert(tr("Total time"), Format::timeSpan(_time));
|
||||||
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"), _date.toString(Qt::SystemLocaleShortDate));
|
tt.insert(tr("Date"), _date.toString(Qt::SystemLocaleShortDate));
|
||||||
|
if (!_links.isEmpty()) {
|
||||||
|
QString links;
|
||||||
|
for (int i = 0; i < _links.size(); i++) {
|
||||||
|
const Link &link = _links.at(i);
|
||||||
|
links.append(QString("<a href=\"%0\">%1</a>").arg(link.URL(),
|
||||||
|
link.text().isEmpty() ? link.URL() : link.text()));
|
||||||
|
if (i != _links.size() - 1)
|
||||||
|
links.append("<br/>");
|
||||||
|
}
|
||||||
|
tt.insert(tr("Links"), links);
|
||||||
|
}
|
||||||
|
|
||||||
return tt.toString();
|
return tt.toString();
|
||||||
}
|
}
|
||||||
@ -30,15 +41,8 @@ TrackItem::TrackItem(const Track &track, Map *map, QGraphicsItem *parent)
|
|||||||
{
|
{
|
||||||
_name = track.name();
|
_name = track.name();
|
||||||
_desc = track.description();
|
_desc = track.description();
|
||||||
|
_links = track.links();
|
||||||
_date = track.date();
|
_date = track.date();
|
||||||
_time = track.time();
|
_time = track.time();
|
||||||
_movingTime = track.movingTime();
|
_movingTime = track.movingTime();
|
||||||
|
|
||||||
setToolTip(toolTip(Metric));
|
|
||||||
}
|
|
||||||
|
|
||||||
void TrackItem::setUnits(Units units)
|
|
||||||
{
|
|
||||||
PathItem::setUnits(units);
|
|
||||||
setToolTip(toolTip(units));
|
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "data/track.h"
|
#include "data/track.h"
|
||||||
#include "pathitem.h"
|
#include "pathitem.h"
|
||||||
#include "units.h"
|
#include "units.h"
|
||||||
|
#include "graphicsscene.h"
|
||||||
|
|
||||||
class Map;
|
class Map;
|
||||||
|
|
||||||
@ -16,13 +17,12 @@ class TrackItem : public PathItem
|
|||||||
public:
|
public:
|
||||||
TrackItem(const Track &track, Map *map, QGraphicsItem *parent = 0);
|
TrackItem(const Track &track, Map *map, QGraphicsItem *parent = 0);
|
||||||
|
|
||||||
void setUnits(Units units);
|
QString info() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString toolTip(Units units) const;
|
|
||||||
|
|
||||||
QString _name;
|
QString _name;
|
||||||
QString _desc;
|
QString _desc;
|
||||||
|
QVector<Link> _links;
|
||||||
QDateTime _date;
|
QDateTime _date;
|
||||||
qreal _time;
|
qreal _time;
|
||||||
qreal _movingTime;
|
qreal _movingTime;
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
#include <QGraphicsSceneMouseEvent>
|
||||||
|
#include <QLabel>
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "tooltip.h"
|
#include "tooltip.h"
|
||||||
|
#include "popup.h"
|
||||||
#include "waypointitem.h"
|
#include "waypointitem.h"
|
||||||
|
|
||||||
|
|
||||||
@ -10,30 +13,54 @@
|
|||||||
#define FS(size) \
|
#define FS(size) \
|
||||||
((int)((qreal)size * 1.41))
|
((int)((qreal)size * 1.41))
|
||||||
|
|
||||||
QString WaypointItem::toolTip(Units units, CoordinatesFormat format)
|
QString WaypointItem::info() const
|
||||||
{
|
{
|
||||||
ToolTip tt;
|
ToolTip tt;
|
||||||
|
|
||||||
if (!_waypoint.name().isEmpty())
|
if (!_waypoint.name().isEmpty())
|
||||||
tt.insert(qApp->translate("WaypointItem", "Name"), _waypoint.name());
|
tt.insert(qApp->translate("WaypointItem", "Name"), _waypoint.name());
|
||||||
tt.insert(qApp->translate("WaypointItem", "Coordinates"),
|
tt.insert(qApp->translate("WaypointItem", "Coordinates"),
|
||||||
Format::coordinates(_waypoint.coordinates(), format));
|
Format::coordinates(_waypoint.coordinates(), _format));
|
||||||
if (_waypoint.hasElevation())
|
if (_waypoint.hasElevation())
|
||||||
tt.insert(qApp->translate("WaypointItem", "Elevation"),
|
tt.insert(qApp->translate("WaypointItem", "Elevation"),
|
||||||
Format::elevation(_waypoint.elevation(), units));
|
Format::elevation(_waypoint.elevation(), _units));
|
||||||
if (_waypoint.timestamp().isValid())
|
if (_waypoint.timestamp().isValid())
|
||||||
tt.insert(qApp->translate("WaypointItem", "Date"),
|
tt.insert(qApp->translate("WaypointItem", "Date"),
|
||||||
_waypoint.timestamp().toString(Qt::SystemLocaleShortDate));
|
_waypoint.timestamp().toString(Qt::SystemLocaleShortDate));
|
||||||
if (!_waypoint.description().isEmpty())
|
if (!_waypoint.description().isEmpty())
|
||||||
tt.insert(qApp->translate("WaypointItem", "Description"),
|
tt.insert(qApp->translate("WaypointItem", "Description"),
|
||||||
_waypoint.description());
|
_waypoint.description());
|
||||||
tt.setImage(_waypoint.image());
|
if (_waypoint.address().isValid()) {
|
||||||
|
QString addr("<address>");
|
||||||
|
addr += _waypoint.address().street();
|
||||||
|
addr += "<br/>" + _waypoint.address().city();
|
||||||
|
if (!_waypoint.address().postalCode().isEmpty())
|
||||||
|
addr += "<br/>" + _waypoint.address().postalCode();
|
||||||
|
if (!_waypoint.address().state().isEmpty())
|
||||||
|
addr += "<br/>" + _waypoint.address().state();
|
||||||
|
if (!_waypoint.address().country().isEmpty())
|
||||||
|
addr += "<br/>" + _waypoint.address().country();
|
||||||
|
addr += "</address>";
|
||||||
|
tt.insert(qApp->translate("WaypointItem", "Address"), addr);
|
||||||
|
}
|
||||||
|
if (!_waypoint.links().isEmpty()) {
|
||||||
|
QString links;
|
||||||
|
for (int i = 0; i < _waypoint.links().size(); i++) {
|
||||||
|
const Link &link = _waypoint.links().at(i);
|
||||||
|
links.append(QString("<a href=\"%0\">%1</a>").arg(link.URL(),
|
||||||
|
link.text().isEmpty() ? link.URL() : link.text()));
|
||||||
|
if (i != _waypoint.links().size() - 1)
|
||||||
|
links.append("<br/>");
|
||||||
|
}
|
||||||
|
tt.insert(qApp->translate("WaypointItem", "Links"), links);
|
||||||
|
}
|
||||||
|
tt.setImages(_waypoint.images());
|
||||||
|
|
||||||
return tt.toString();
|
return tt.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
WaypointItem::WaypointItem(const Waypoint &waypoint, Map *map,
|
WaypointItem::WaypointItem(const Waypoint &waypoint, Map *map,
|
||||||
QGraphicsItem *parent) : QGraphicsItem(parent)
|
QGraphicsItem *parent) : GraphicsItem(parent)
|
||||||
{
|
{
|
||||||
_waypoint = waypoint;
|
_waypoint = waypoint;
|
||||||
_showLabel = true;
|
_showLabel = true;
|
||||||
@ -43,10 +70,12 @@ WaypointItem::WaypointItem(const Waypoint &waypoint, Map *map,
|
|||||||
_font.setPixelSize(FS(_size));
|
_font.setPixelSize(FS(_size));
|
||||||
_font.setFamily(FONT_FAMILY);
|
_font.setFamily(FONT_FAMILY);
|
||||||
|
|
||||||
|
_units = Metric;
|
||||||
|
_format = DecimalDegrees;
|
||||||
|
|
||||||
updateCache();
|
updateCache();
|
||||||
|
|
||||||
setPos(map->ll2xy(waypoint.coordinates()));
|
setPos(map->ll2xy(waypoint.coordinates()));
|
||||||
setToolTip(toolTip(Metric, DecimalDegrees));
|
|
||||||
setCursor(Qt::ArrowCursor);
|
setCursor(Qt::ArrowCursor);
|
||||||
setAcceptHoverEvents(true);
|
setAcceptHoverEvents(true);
|
||||||
}
|
}
|
||||||
@ -116,7 +145,8 @@ void WaypointItem::setColor(const QColor &color)
|
|||||||
|
|
||||||
void WaypointItem::setToolTipFormat(Units units, CoordinatesFormat format)
|
void WaypointItem::setToolTipFormat(Units units, CoordinatesFormat format)
|
||||||
{
|
{
|
||||||
setToolTip(toolTip(units, format));
|
_units = units;
|
||||||
|
_format = format;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaypointItem::showLabel(bool show)
|
void WaypointItem::showLabel(bool show)
|
||||||
@ -148,3 +178,10 @@ void WaypointItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
|
|||||||
updateCache();
|
updateCache();
|
||||||
setZValue(zValue() - 1.0);
|
setZValue(zValue() - 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WaypointItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
|
||||||
|
{
|
||||||
|
Popup::show(event->screenPos(), info(), event->widget());
|
||||||
|
/* Do not propagate the event any further as lower stacked items (path
|
||||||
|
items) would replace the popup with their own popup */
|
||||||
|
}
|
||||||
|
@ -3,12 +3,15 @@
|
|||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <QGraphicsItem>
|
#include <QGraphicsItem>
|
||||||
|
#include <QFont>
|
||||||
#include "data/waypoint.h"
|
#include "data/waypoint.h"
|
||||||
#include "map/map.h"
|
#include "map/map.h"
|
||||||
#include "units.h"
|
#include "units.h"
|
||||||
|
#include "graphicsscene.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
|
|
||||||
class WaypointItem : public QGraphicsItem
|
|
||||||
|
class WaypointItem : public GraphicsItem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
WaypointItem(const Waypoint &waypoint, Map *map, QGraphicsItem *parent = 0);
|
WaypointItem(const Waypoint &waypoint, Map *map, QGraphicsItem *parent = 0);
|
||||||
@ -16,23 +19,26 @@ public:
|
|||||||
const Waypoint &waypoint() const {return _waypoint;}
|
const Waypoint &waypoint() const {return _waypoint;}
|
||||||
|
|
||||||
void setMap(Map *map) {setPos(map->ll2xy(_waypoint.coordinates()));}
|
void setMap(Map *map) {setPos(map->ll2xy(_waypoint.coordinates()));}
|
||||||
void setToolTipFormat(Units units, CoordinatesFormat format);
|
|
||||||
void setSize(int size);
|
void setSize(int size);
|
||||||
void setColor(const QColor &color);
|
void setColor(const QColor &color);
|
||||||
void showLabel(bool show);
|
void showLabel(bool show);
|
||||||
void setDigitalZoom(int zoom) {setScale(pow(2, -zoom));}
|
void setDigitalZoom(int zoom) {setScale(pow(2, -zoom));}
|
||||||
|
void setToolTipFormat(Units units, CoordinatesFormat format);
|
||||||
|
|
||||||
QPainterPath shape() const {return _shape;}
|
QPainterPath shape() const {return _shape;}
|
||||||
QRectF boundingRect() const {return _shape.boundingRect();}
|
QRectF boundingRect() const {return _shape.boundingRect();}
|
||||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
||||||
QWidget *widget);
|
QWidget *widget);
|
||||||
|
|
||||||
private:
|
QString info() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
|
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
|
||||||
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
|
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
|
||||||
|
void mousePressEvent(QGraphicsSceneMouseEvent *event);
|
||||||
|
|
||||||
|
private:
|
||||||
void updateCache();
|
void updateCache();
|
||||||
QString toolTip(Units units, CoordinatesFormat format);
|
|
||||||
|
|
||||||
Waypoint _waypoint;
|
Waypoint _waypoint;
|
||||||
QPainterPath _shape;
|
QPainterPath _shape;
|
||||||
@ -41,6 +47,9 @@ private:
|
|||||||
bool _showLabel;
|
bool _showLabel;
|
||||||
QFont _font;
|
QFont _font;
|
||||||
QRect _labelBB;
|
QRect _labelBB;
|
||||||
|
|
||||||
|
Units _units;
|
||||||
|
CoordinatesFormat _format;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // WAYPOINTITEM_H
|
#endif // WAYPOINTITEM_H
|
||||||
|
@ -14,7 +14,8 @@ double Coordinates::distanceTo(const Coordinates &c) const
|
|||||||
#ifndef QT_NO_DEBUG
|
#ifndef QT_NO_DEBUG
|
||||||
QDebug operator<<(QDebug dbg, const Coordinates &c)
|
QDebug operator<<(QDebug dbg, const Coordinates &c)
|
||||||
{
|
{
|
||||||
dbg.nospace() << "Coordinates(" << c.lon() << ", " << c.lat() << ")";
|
dbg.nospace() << qSetRealNumberPrecision(10) << "Coordinates(" << c.lon()
|
||||||
|
<< ", " << c.lat() << ")";
|
||||||
return dbg.space();
|
return dbg.space();
|
||||||
}
|
}
|
||||||
#endif // QT_NO_DEBUG
|
#endif // QT_NO_DEBUG
|
||||||
|
18
src/common/garmin.h
Normal file
18
src/common/garmin.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#ifndef GARMIN_H
|
||||||
|
#define GARMIN_H
|
||||||
|
|
||||||
|
#include <QtGlobal>
|
||||||
|
|
||||||
|
#define LS(val, bits) ((qint32)(((quint32)(val))<<(bits)))
|
||||||
|
|
||||||
|
inline double toWGS32(qint32 v)
|
||||||
|
{
|
||||||
|
return ((double)v / (double)(1U<<31)) * 180.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline double toWGS24(qint32 v)
|
||||||
|
{
|
||||||
|
return toWGS32(LS(v, 8));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // GARMIN_H
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user