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

Compare commits

..

215 Commits
5.12 ... 6.0

Author SHA1 Message Date
083dd39bef Fixed broken merge 2018-09-23 12:20:04 +02:00
bd64ca4f57 Merge branch 'origin/master' into Weblate 2018-09-23 12:00:15 +02:00
b382a5e674 Translated using Weblate (Russian)
Currently translated at 100.0% (323 of 323 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2018-09-23 11:57:20 +02:00
20687a1df7 Translated using Weblate (Finnish)
Currently translated at 98.1% (317 of 323 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2018-09-23 11:57:20 +02:00
bb82750e9b Translated using Weblate (German)
Currently translated at 100.0% (323 of 323 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/de/
2018-09-23 11:57:20 +02:00
51e6058960 Translated using Weblate (German)
Currently translated at 99.6% (322 of 323 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/de/
2018-09-23 11:57:20 +02:00
db3f111815 Translated using Weblate (Swedish)
Currently translated at 100.0% (323 of 323 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2018-09-23 11:57:20 +02:00
219311577f Translated using Weblate (German)
Currently translated at 99.3% (321 of 323 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/de/
2018-09-23 11:57:20 +02:00
26d4770f47 Translated using Weblate (Czech)
Currently translated at 100.0% (323 of 323 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/cs/
2018-09-23 11:57:20 +02:00
db0d9ceffb Translated using Weblate (Russian)
Currently translated at 99.3% (320 of 322 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2018-09-23 11:57:20 +02:00
fc9b01480c Translated using Weblate (Russian)
Currently translated at 99.0% (319 of 322 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2018-09-23 11:56:41 +02:00
cd8f415615 Translated using Weblate (Russian)
Currently translated at 100.0% (323 of 323 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2018-09-23 11:35:22 +02:00
824393879b Translated using Weblate (Finnish)
Currently translated at 98.1% (317 of 323 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2018-09-23 11:35:21 +02:00
f79f555d6f Translated using Weblate (German)
Currently translated at 100.0% (323 of 323 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/de/
2018-09-23 11:35:02 +02:00
13e9a50d59 Translated using Weblate (German)
Currently translated at 99.6% (322 of 323 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/de/
2018-09-23 11:23:05 +02:00
f1667e70b5 Translated using Weblate (Swedish)
Currently translated at 100.0% (323 of 323 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2018-09-23 09:23:04 +02:00
1ce347230b Translated using Weblate (German)
Currently translated at 99.3% (321 of 323 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/de/
2018-09-23 09:23:04 +02:00
d4f3e293df Translated using Weblate (Czech)
Currently translated at 100.0% (323 of 323 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/cs/
2018-09-23 09:23:03 +02:00
7492b74aed Merge branch 'origin/master' into Weblate 2018-09-22 23:31:47 +02:00
71dbb176bb Translation sources update 2018-09-22 23:30:54 +02:00
301107add1 Merge branch 'origin/master' into Weblate 2018-09-22 23:13:58 +02:00
60ae4c0268 Translations update 2018-09-22 23:12:22 +02:00
bd76e508ae Merge branch 'origin/master' into Weblate 2018-09-22 14:17:48 +02:00
e9f7642cde Code cleanup 2018-09-22 14:17:24 +02:00
5c73cb55cb Merge branch 'origin/master' into Weblate 2018-09-22 13:33:21 +02:00
c39298000d Added TMS maps support 2018-09-22 13:32:54 +02:00
e17d7d4a8f Merge branch 'origin/master' into Weblate 2018-09-22 12:43:45 +02:00
65b74b146d Added support for local (file:) URLs 2018-09-22 12:42:49 +02:00
b937b9f2cb Merge branch 'origin/master' into Weblate 2018-09-22 10:26:29 +02:00
d7fe0fa9bf Fixed broken automatic loading of MBTiles maps 2018-09-22 10:25:43 +02:00
9657104f50 Merge branch 'origin/master' into Weblate 2018-09-21 23:25:07 +02:00
5a692c71a8 Added support for tiles with a different size than 256px 2018-09-21 23:18:05 +02:00
e8ede272ae Merge branch 'origin/master' into Weblate 2018-09-21 01:59:41 +02:00
39a8a144dd Addedmissing SQL libs to the Windows installer 2018-09-21 01:58:58 +02:00
02700a485d Merge branch 'origin/master' into Weblate 2018-09-21 00:20:17 +02:00
99ea19e35a Use the map name from the metadata table if available 2018-09-21 00:19:30 +02:00
a6bb0f1520 Merge branch 'origin/master' into Weblate 2018-09-20 08:51:13 +02:00
0a74684713 Improved map validity checks 2018-09-20 08:50:52 +02:00
332a4d9393 Merge branch 'origin/master' into Weblate 2018-09-20 08:00:21 +02:00
db98f381b5 Added initial MBTiles support 2018-09-20 07:59:47 +02:00
31a600638f Translated using Weblate (Norwegian Bokmål)
Currently translated at 13.9% (45 of 322 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2018-09-20 05:29:31 +02:00
2ff18bc373 Merge branch 'origin/master' into Weblate 2018-09-19 01:06:37 +02:00
c2e301f4e8 Added Norwegian translation file 2018-09-19 01:05:49 +02:00
a25303fe98 Merge branch 'origin/master' into Weblate 2018-09-17 20:12:05 +02:00
2bee8656a4 Properly split the paths exactly at the date line 2018-09-17 20:11:23 +02:00
4a31f6f76d Merge branch 'origin/master' into Weblate 2018-09-16 19:40:06 +02:00
eaef588443 Moved maps info to a separate section 2018-09-16 19:40:02 +02:00
87a808265e Merge branch 'origin/master' into Weblate 2018-09-16 19:34:21 +02:00
a39cef2abd Fixed typo 2018-09-16 19:34:18 +02:00
960827e92b Merge branch 'origin/master' into Weblate 2018-09-16 19:32:42 +02:00
7de1b84f77 Extended build info 2018-09-16 19:32:40 +02:00
4b1fa13429 Merge branch 'origin/master' into Weblate 2018-09-16 17:51:14 +02:00
f10857eddc Added english translation file
(Language selection is broken without it on Mac when the user's languages
list contains more than one language)
2018-09-16 17:49:47 +02:00
781fc22113 Merge branch 'origin/master' into Weblate 2018-09-16 17:41:00 +02:00
9ced0fd3a7 Do not process the Danish translations until they are done 2018-09-16 17:40:22 +02:00
3e71d1b785 Merge branch 'origin/master' into Weblate 2018-09-16 17:13:31 +02:00
491bf5614b Lupdate formating 2018-09-16 17:12:49 +02:00
fc873719e1 Merge branch 'origin/master' into Weblate 2018-09-16 17:12:05 +02:00
99c3edddfd Added Danish translation stub 2018-09-16 17:11:35 +02:00
fde8ad620b Merge branch 'origin/master' into Weblate 2018-09-16 13:19:35 +02:00
7855c69729 Fixed WMS/WMTS URLs composing 2018-09-16 12:05:11 +02:00
8749be9103 Merge branch 'origin/master' into Weblate 2018-09-15 13:40:38 +02:00
7432459c93 Improved dateline crossing handling 2018-09-15 13:40:21 +02:00
6f9f49a435 Merge branch 'origin/master' into Weblate 2018-09-15 10:43:17 +02:00
eda5046518 Show the path marker on the great circle segment line 2018-09-15 10:41:00 +02:00
b867ce9a7f Code cleanup 2018-09-15 08:40:37 +02:00
cfdb12c4ae Merge branch 'origin/master' into Weblate 2018-09-15 08:40:35 +02:00
9436f98023 Merge branch 'origin/master' into Weblate 2018-09-15 00:23:12 +02:00
c89137204e Use the GreatCircle for all segments longer than 1 arc minute 2018-09-15 00:22:27 +02:00
905f80b1ce Merge branch 'origin/master' into Weblate 2018-09-14 00:09:53 +02:00
e707cc30ad Weblate import 2018-09-14 00:09:50 +02:00
4ef1fa77f8 Merge branch 'origin/master' into Weblate 2018-09-13 01:45:21 +02:00
df104b16c6 Yet another optimization 2018-09-13 01:45:17 +02:00
8f9049a8d4 Code cleanup/optimization 2018-09-13 01:15:43 +02:00
d483cd35cd Merge branch 'origin/master' into Weblate 2018-09-13 01:15:41 +02:00
c2b09df118 Merge branch 'origin/master' into Weblate 2018-09-13 00:48:49 +02:00
9957e1834e Now drawing path segments > 1 arc minute as great circle curves instead of rhumb lines 2018-09-13 00:43:28 +02:00
7e537d819a Merge branch 'origin/master' into Weblate 2018-09-12 20:13:37 +02:00
8d1be76043 Fixed Garmin CSV reader coordinates order (correct is lon, lat) 2018-09-12 20:13:09 +02:00
b68567f000 Merge branch 'origin/master' into Weblate 2018-09-12 19:58:17 +02:00
09a5f57109 Fixed POI selection when the POI radius is not >> trackpoint distance
Fixes #153
2018-09-12 19:55:32 +02:00
ca8ff6c7ee Translated using Weblate (Finnish)
Currently translated at 98.1% (316 of 322 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2018-09-11 11:42:40 +02:00
e9c15ef956 Translated using Weblate (Finnish)
Currently translated at 97.8% (315 of 322 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2018-09-11 09:15:20 +02:00
e39f0881ab Translated using Weblate (Russian)
Currently translated at 100.0% (322 of 322 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2018-09-11 08:55:41 +02:00
6f05d38d31 Translated using Weblate (Russian)
Currently translated at 99.3% (320 of 322 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2018-09-11 08:26:55 +02:00
9cb91a35ef Translated using Weblate (Russian)
Currently translated at 99.0% (319 of 322 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2018-09-11 08:21:48 +02:00
bb0073d7e7 Translated using Weblate (Swedish)
Currently translated at 100.0% (322 of 322 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2018-09-11 08:21:47 +02:00
3291ea86ef Localization update 2018-09-11 01:01:09 +02:00
97d646bb19 Merge branch 'origin/master' into Weblate 2018-09-11 01:01:05 +02:00
672df4255e Version++ 2018-09-11 00:36:11 +02:00
3fcf04daf7 Merge branch 'origin/master' into Weblate 2018-09-11 00:36:06 +02:00
3daab92b84 Merge branch 'origin/master' into Weblate 2018-09-11 00:34:31 +02:00
89f384feed Made the HiDPI display mode (of non-HiDPI maps) configurable 2018-09-11 00:33:20 +02:00
fc555fd7d0 Merge branch 'origin/master' into Weblate 2018-09-10 21:23:03 +02:00
d58322b412 Map API cleanup 2018-09-10 21:22:57 +02:00
70222f4ae2 Fixed overlapping scale numbers 2018-09-10 21:22:01 +02:00
fe1aaa73a0 Fixed compile warning 2018-09-10 21:21:40 +02:00
57741f8c2d Translated using Weblate (Swedish)
Currently translated at 100.0% (316 of 316 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2018-09-09 19:10:29 +02:00
6eb3a4f7de Translated using Weblate (Russian)
Currently translated at 100.0% (316 of 316 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2018-09-09 19:10:29 +02:00
295a89b3cc Translated using Weblate (German)
Currently translated at 100.0% (316 of 316 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/de/
2018-09-09 19:10:29 +02:00
dc3fdc4c3b Translated using Weblate (Finnish)
Currently translated at 98.7% (312 of 316 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2018-09-09 19:10:29 +02:00
3867b723a9 Translated using Weblate (Swedish)
Currently translated at 100.0% (316 of 316 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2018-09-09 19:10:29 +02:00
d7fc400d73 Translated using Weblate (Russian)
Currently translated at 100.0% (316 of 316 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2018-09-09 19:10:29 +02:00
f8f6859e7d Translated using Weblate (Finnish)
Currently translated at 98.7% (312 of 316 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2018-09-09 19:10:29 +02:00
2501f834c8 Display numbers according to the locale settings
Closes #150
2018-09-09 18:46:43 +02:00
3f4b70ee48 Localization update 2018-09-09 15:34:34 +02:00
384d20b1a5 Changed 1/min to more convenient bpm/rpm
Closes #135
2018-09-09 15:27:44 +02:00
b4a06057f8 Fixed copy&paste error 2018-09-09 15:26:45 +02:00
9f14eb7e70 Added weblate info 2018-09-09 14:51:27 +02:00
dcf1c686e5 Added support for new IGC date header format
Fixes #152
2018-09-09 14:38:37 +02:00
a8d183639e Fixed broken zoom 0 handling
Fixes #151
2018-09-09 09:41:04 +02:00
d9e025a18c String handling optimization 2018-08-27 22:25:55 +02:00
0a9077545b Make huge images work under OpenGL (at least memory-ineficient) 2018-08-24 12:26:32 +02:00
bbc1d43290 Fixed QT4 build 2018-08-24 00:46:06 +02:00
524d72ce3c Merge branch 'master' of https://github.com/tumic0/GPXSee 2018-08-24 00:15:12 +02:00
9f74bbb27a Some more code cleanup 2018-08-24 00:14:40 +02:00
ce34d449c2 Translations update (#149) 2018-08-23 23:58:06 +02:00
21dbd3958d Removed obsolete method 2018-08-23 23:56:23 +02:00
92ac7c0c10 Removed obsolete define 2018-08-23 20:33:14 +02:00
1f71b3a3b2 Code/API cleanup 2018-08-23 20:26:10 +02:00
27886ea96a Update gpxsee_sv.ts (#148)
new string translated
2018-08-23 09:10:55 +02:00
3176271955 Only create/copy the sub-images when OpenGL is used 2018-08-23 09:08:59 +02:00
d4b46a4bb6 Broken OpenGL image part drawing workaround 2018-08-22 00:14:07 +02:00
3b2d4dcd31 Update README.md 2018-08-21 22:40:38 +02:00
de196e8281 Splited the OfflineMap class to separate OziMap and GeoTIFF map classes 2018-08-21 20:01:47 +02:00
f376f7139b Report an error on HiDPI maps when HiDPI support is not enabled 2018-08-20 18:46:44 +02:00
9fe10f10b8 Fixed compiler warning 2018-08-19 10:44:12 +02:00
cdc9e51696 Added HiDPI displays/maps support 2018-08-18 21:06:36 +02:00
975d9816f4 Added maps repo link 2018-08-16 07:17:30 +02:00
187a909b4f Now using macros for the translations sections 2018-08-16 06:57:26 +02:00
1e6a49673e Added SLF info 2018-08-12 17:56:46 +02:00
3b7905fe8c Version++ 2018-08-12 14:23:02 +02:00
f70a4536b2 Translations update 2018-08-12 14:21:02 +02:00
b989d0e086 Added EPSG:102067 PCS (EPSG:5514 alias) 2018-08-12 14:10:26 +02:00
c3deab5369 Added SLF files association 2018-08-12 13:30:20 +02:00
f49e0223b2 Added SLF icns icon 2018-08-10 23:06:39 +02:00
96940c28d4 Added SLF ico file 2018-08-10 22:57:50 +02:00
e9ebc999fd Added SLF icon definition 2018-08-10 22:55:31 +02:00
c724bf134c Added support for Sigma SLF files 2018-08-10 22:46:04 +02:00
203f44b75a Update gpxsee_sv.ts (#145)
new strings translated
2018-08-10 19:10:26 +02:00
d0edd825cf Translations update 2018-08-10 00:25:11 +02:00
e3013bf815 Translations update (#144) 2018-08-10 00:19:56 +02:00
d4fd60b1d8 Fixed file association icons indexes 2018-08-10 00:14:31 +02:00
ba2347f363 Added LOC file association stuff 2018-08-09 22:48:44 +02:00
93a912a34a Updated ico icons 2018-08-09 22:47:17 +02:00
fb779840ce Broken SVG rendering workaround 2018-08-09 22:46:27 +02:00
dd183edd8d Updated icns icons 2018-08-09 22:32:52 +02:00
679bae0d67 Merge branch 'master' of https://github.com/tumic0/GPXSee 2018-08-09 22:31:44 +02:00
8fb4acc4c2 Added LOC icons generation
Broken SVG rendering workaround + code cleanup
2018-08-09 22:29:16 +02:00
6194519b18 Added support for geocaching.com LOC files 2018-08-08 20:18:08 +02:00
3ce3de119b Updated 4Umaps URL 2018-08-08 00:22:59 +02:00
872ecdfa58 Now building the windows version using Qt 5.11 2018-08-05 23:23:53 +02:00
121a262ea1 Remaining WGS84 deduplication 2018-07-26 23:51:11 +02:00
06c9fbd849 Properly unified the qmake/macros versions 2018-07-24 18:02:36 +02:00
aa928d96e0 Fixed OS X build 2018-07-24 18:00:40 +02:00
004e9bfef3 Fixed QT version handling in build process 2018-07-24 17:23:14 +02:00
34de55cf0c Do the comma substitution only on ASCII files 2018-07-24 17:21:45 +02:00
c0e458a437 Added support for HTTP/2 2018-07-23 23:53:58 +02:00
33739acafe Merge branch 'master' of https://github.com/tumic0/GPXSee 2018-07-23 21:56:29 +02:00
fe4eed8aa2 Fixed error reporting 2018-07-23 21:55:43 +02:00
f5ca757348 Update gpxsee_sv.ts (#139)
new strings translated
2018-07-22 10:19:22 +02:00
476f26752f Added explicit actions menu roles (broken qt heuristics workaround) 2018-07-21 23:25:24 +02:00
588859ca3a Code cleanup 2018-07-21 21:11:37 +02:00
cc8d237786 Translations update (#138) 2018-07-21 19:17:35 +02:00
5dde297210 Version++ 2018-07-21 18:20:48 +02:00
d1469290cf Translations update 2018-07-21 18:19:31 +02:00
51d4284ebe Layout adjustment 2018-07-21 18:11:19 +02:00
531eb256f1 Added statistics window 2018-07-21 16:13:18 +02:00
79388aa753 Improved paths dialogue formating 2018-07-21 14:24:13 +02:00
2980299a2a A better (shorter) directory description 2018-07-21 12:52:52 +02:00
796e61ada4 Improved path info dialogue 2018-07-21 12:24:08 +02:00
90473300e0 Added missing projection parameter handling 2018-07-21 10:08:26 +02:00
5706cdcfa1 Added workaround for broken nakarte.tk maps 2018-07-13 10:10:44 +02:00
d794ee4b22 Includes cleanup 2018-07-13 09:55:36 +02:00
262ee5bb5f Map API cleanup 2018-07-13 09:51:41 +02:00
5547cf668e Make Coverity happy 2018-07-10 08:58:37 +02:00
dd9e42ad27 Update gpxsee_sv.ts (#136)
new strings translated
2018-07-04 08:18:24 +02:00
e192116191 Update README.md 2018-07-03 23:53:05 +02:00
67c8602efd Code cleanup 2018-07-03 20:52:13 +02:00
a324698a67 Localization update 2018-07-03 19:29:28 +02:00
23bf3397b8 Translations update (#134) 2018-07-03 19:26:27 +02:00
db2d0b63e8 Version++ 2018-07-03 19:19:56 +02:00
e7cfeb0d1a Dismiss warnings 2018-07-03 19:16:51 +02:00
366e84c9fc Proper fix for Bryton Rider FIT files
Refactoring
2018-07-03 19:08:46 +02:00
3424b3e265 Added support for gear ratio graphs
Added support for FIT files from Bryton Rider devices
2018-07-03 01:29:14 +02:00
cb80389d74 Merge branch 'master' of https://github.com/tumic0/GPXSee 2018-07-02 18:51:47 +02:00
40276e8b95 Fixed broken path highlighting when digital zoom is set 2018-07-02 18:50:41 +02:00
106904a763 Fixed FIT parser crash 2018-07-02 18:50:13 +02:00
e21d89e998 Update gpxsee_de.ts (#133)
Improved Translation
2018-07-01 23:29:31 +02:00
a432ff3461 Now using a strict horizontal map scale
Code cleanup
2018-06-30 12:14:58 +02:00
201256d882 Fixed loading of OziExplorer maps with missing (default) projection parameters 2018-06-30 12:12:12 +02:00
b2a34bd10f Hardcode web mercator (EPSG 3857) support 2018-06-28 22:12:16 +02:00
63cf4c039a Update gpxsee_sv.ts (#130)
new strings translated
2018-06-28 08:37:24 +02:00
ca97ca392e Merge branch 'master' of https://github.com/tumic0/GPXSee 2018-06-28 08:36:44 +02:00
ec5ad67a3e Added missing cleanup 2018-06-28 08:36:11 +02:00
569ded1e25 Translations update (#129) 2018-06-24 17:29:53 +02:00
8e713a1f06 Retina app icon 2018-06-23 15:53:39 +02:00
f07173ab22 Localization update 2018-06-22 17:41:24 +02:00
cf6d27b1f5 Fixed "zero distance" graph crash
Improved "no graph data" reporting
2018-06-22 17:29:05 +02:00
fc18283172 Added speed data source setting 2018-06-21 20:54:24 +02:00
1cd726691e Fixed broken speed calculation
Optimization
2018-06-20 22:13:56 +02:00
24835db090 Version++ 2018-06-20 20:17:39 +02:00
2352827d9b Fixed broken distance computation 2018-06-20 20:15:22 +02:00
c5a060ed6b Outlier detection is now based on acceleration instead of speed 2018-06-19 23:56:36 +02:00
026cc68bf2 Includes cleanup 2018-06-04 23:40:42 +02:00
ec247d5d1d Added support for OziExplorer files with UTF8 BOMs 2018-06-02 16:41:27 +02:00
815cb6cb91 Code cleanup 2018-06-01 19:07:21 +02:00
ca7016176f Added missing pixmap caching 2018-05-30 22:10:35 +02:00
2c816a509b Refactoring 2018-05-29 21:54:25 +02:00
58e752a022 Added missing coordinate system 2018-05-29 00:37:04 +02:00
7d412a274d Added support for Krovak projection 2018-05-29 00:17:20 +02:00
6bee2a46f1 Version++ 2018-05-28 22:37:35 +02:00
eeab6a399e Fixed broken map formats list 2018-05-28 22:30:13 +02:00
9e04bf0fa7 Update gpxsee_sv.ts (#119)
new string translated
2018-05-26 11:42:06 +02:00
2842c6c125 Added Garmin JNX support info 2018-05-25 19:42:22 +02:00
193 changed files with 10170 additions and 3773 deletions

View File

@ -1,14 +1,14 @@
version: 5.12.{build} version: 6.0.{build}
configuration: Release configuration: Release
platform: Any CPU platform: Any CPU
environment: environment:
NSISDIR: C:\Program Files (x86)\NSIS NSISDIR: C:\Program Files (x86)\NSIS
matrix: matrix:
- QTDIR: C:\Qt\5.9\msvc2015 - QTDIR: C:\Qt\5.11\msvc2015
PLATFORM: x86 PLATFORM: x86
NSI: gpxsee.nsi NSI: gpxsee.nsi
OPENSSLDIR: C:\OpenSSL-Win32\bin OPENSSLDIR: C:\OpenSSL-Win32\bin
- QTDIR: C:\Qt\5.9\msvc2015_64 - QTDIR: C:\Qt\5.11\msvc2015_64
PLATFORM: x86_amd64 PLATFORM: x86_amd64
NSI: gpxsee64.nsi NSI: gpxsee64.nsi
OPENSSLDIR: C:\OpenSSL-Win64\bin OPENSSLDIR: C:\OpenSSL-Win64\bin

View File

@ -1,25 +1,31 @@
# GPXSee # GPXSee
GPXSee is a Qt-based GPS log file viewer and analyzer that supports GPX, TCX, GPXSee is a Qt-based GPS log file viewer and analyzer that supports GPX, TCX,
KML, FIT, IGC, NMEA and OziExplorer files. KML, FIT, IGC, NMEA, SLF, LOC and OziExplorer files.
## Features ## Features
* User-definable online maps (OSM/Google tiles, WMTS, WMS). * User-definable online maps (OSM/Google tiles, WMTS, WMS).
* Offline maps (OziExplorer maps, TrekBuddy maps/atlases, GeoTIFF images). * Offline maps (OziExplorer maps, TrekBuddy maps/atlases, Garmin JNX maps, GeoTIFF images).
* Elevation, speed, heart rate, cadence, power and temperature graphs. * Elevation, speed, heart rate, cadence, power, temperature and gear ratio/shifts graphs.
* Support for multiple tracks in one view. * Support for multiple tracks in one view.
* Support for POI files. * Support for POI files.
* Print/export to PDF. * Print/export to PDF.
* Full-screen mode. * Full-screen mode.
* HiDPI/Retina displays & maps support.
* Native GUI for Windows, Mac OS X and Linux. * Native GUI for Windows, Mac OS X and Linux.
* Opens GPX, TCX, FIT, KML, IGC, NMEA, OziExplorer (PLT, RTE, WPT) and Garmin CSV files. * Opens GPX, TCX, FIT, KML, IGC, NMEA, SLF, LOC, OziExplorer (PLT, RTE, WPT) and Garmin CSV files.
![GPXSee - Linux](https://a.fsdn.com/con/app/proj/gpxsee/screenshots/linux2.png) ![GPXSee - Linux](https://a.fsdn.com/con/app/proj/gpxsee/screenshots/linux2.png)
## Build ## Build
Build requirements:
* Qt 4.8 or QT 5.x (Qt >= 5.10.1 recommended for all features)
* C++03 compiler (tested: msvc2015, gcc >= 4.8, clang/Apple LLVM version 8.1.0)
Build steps:
```shell ```shell
lrelease gpxsee.pro lrelease gpxsee.pro
qmake gpxsee.pro qmake gpxsee.pro
make make # nmake on windows
``` ```
## Download ## Download
@ -31,3 +37,9 @@ make
## Homepage ## Homepage
http://www.gpxsee.org http://www.gpxsee.org
## Maps
[GPXSee maps repository](https://github.com/tumic0/GPXSee-maps)
## Translations
GPXSee uses [Weblate](https://hosted.weblate.org/projects/gpxsee) for translations.

View File

@ -1,12 +1,17 @@
TARGET = GPXSee TARGET = GPXSee
VERSION = 5.12 VERSION = 6.0
QT += core \ QT += core \
gui \ gui \
network network \
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets sql
greaterThan(QT_MAJOR_VERSION, 4): QT += printsupport greaterThan(QT_MAJOR_VERSION, 4) {
lessThan(QT_VERSION, 5.4): QT += opengl QT += widgets
macx: QT += opengl QT += printsupport
}
lessThan(QT_MAJOR_VERSION, 5) {QT += opengl}
equals(QT_MAJOR_VERSION, 5) : lessThan(QT_MINOR_VERSION, 4) {QT += opengl}
INCLUDEPATH += ./src INCLUDEPATH += ./src
HEADERS += src/config.h \ HEADERS += src/config.h \
src/common/staticassert.h \ src/common/staticassert.h \
@ -49,6 +54,7 @@ HEADERS += src/config.h \
src/GUI/format.h \ src/GUI/format.h \
src/GUI/cadencegraph.h \ src/GUI/cadencegraph.h \
src/GUI/powergraph.h \ src/GUI/powergraph.h \
src/GUI/gearratiograph.h \
src/GUI/optionsdialog.h \ src/GUI/optionsdialog.h \
src/GUI/colorbox.h \ src/GUI/colorbox.h \
src/GUI/stylecombobox.h \ src/GUI/stylecombobox.h \
@ -61,6 +67,7 @@ HEADERS += src/config.h \
src/GUI/temperaturegraphitem.h \ src/GUI/temperaturegraphitem.h \
src/GUI/cadencegraphitem.h \ src/GUI/cadencegraphitem.h \
src/GUI/powergraphitem.h \ src/GUI/powergraphitem.h \
src/GUI/gearratiographitem.h \
src/GUI/oddspinbox.h \ src/GUI/oddspinbox.h \
src/GUI/settings.h \ src/GUI/settings.h \
src/GUI/nicenum.h \ src/GUI/nicenum.h \
@ -83,7 +90,7 @@ HEADERS += src/config.h \
src/map/downloader.h \ src/map/downloader.h \
src/map/tile.h \ src/map/tile.h \
src/map/emptymap.h \ src/map/emptymap.h \
src/map/offlinemap.h \ src/map/ozimap.h \
src/map/tar.h \ src/map/tar.h \
src/map/ozf.h \ src/map/ozf.h \
src/map/atlas.h \ src/map/atlas.h \
@ -129,7 +136,16 @@ HEADERS += src/config.h \
src/map/rectd.h \ src/map/rectd.h \
src/map/geocentric.h \ src/map/geocentric.h \
src/map/mercator.h \ src/map/mercator.h \
src/map/jnxmap.h src/map/jnxmap.h \
src/map/krovak.h \
src/GUI/kv.h \
src/data/locparser.h \
src/data/slfparser.h \
src/map/geotiffmap.h \
src/map/image.h \
src/common/greatcircle.h \
src/map/mbtilesmap.h \
src/map/osm.h
SOURCES += src/main.cpp \ SOURCES += src/main.cpp \
src/common/coordinates.cpp \ src/common/coordinates.cpp \
src/common/rectc.cpp \ src/common/rectc.cpp \
@ -163,6 +179,7 @@ SOURCES += src/main.cpp \
src/GUI/format.cpp \ src/GUI/format.cpp \
src/GUI/cadencegraph.cpp \ src/GUI/cadencegraph.cpp \
src/GUI/powergraph.cpp \ src/GUI/powergraph.cpp \
src/GUI/gearratiograph.cpp \
src/GUI/optionsdialog.cpp \ src/GUI/optionsdialog.cpp \
src/GUI/colorbox.cpp \ src/GUI/colorbox.cpp \
src/GUI/stylecombobox.cpp \ src/GUI/stylecombobox.cpp \
@ -174,13 +191,14 @@ SOURCES += src/main.cpp \
src/GUI/temperaturegraphitem.cpp \ src/GUI/temperaturegraphitem.cpp \
src/GUI/cadencegraphitem.cpp \ src/GUI/cadencegraphitem.cpp \
src/GUI/powergraphitem.cpp \ src/GUI/powergraphitem.cpp \
src/GUI/gearratiographitem.cpp \
src/GUI/nicenum.cpp \ src/GUI/nicenum.cpp \
src/GUI/mapview.cpp \ src/GUI/mapview.cpp \
src/map/maplist.cpp \ src/map/maplist.cpp \
src/map/onlinemap.cpp \ src/map/onlinemap.cpp \
src/map/downloader.cpp \ src/map/downloader.cpp \
src/map/emptymap.cpp \ src/map/emptymap.cpp \
src/map/offlinemap.cpp \ src/map/ozimap.cpp \
src/map/tar.cpp \ src/map/tar.cpp \
src/map/atlas.cpp \ src/map/atlas.cpp \
src/map/ozf.cpp \ src/map/ozf.cpp \
@ -226,20 +244,33 @@ SOURCES += src/main.cpp \
src/data/oziparsers.cpp \ src/data/oziparsers.cpp \
src/map/geocentric.cpp \ src/map/geocentric.cpp \
src/map/mercator.cpp \ src/map/mercator.cpp \
src/map/jnxmap.cpp src/map/jnxmap.cpp \
src/map/krovak.cpp \
src/map/map.cpp \
src/data/locparser.cpp \
src/data/slfparser.cpp \
src/map/geotiffmap.cpp \
src/map/image.cpp \
src/common/greatcircle.cpp \
src/map/mbtilesmap.cpp \
src/map/osm.cpp
RESOURCES += gpxsee.qrc RESOURCES += gpxsee.qrc
TRANSLATIONS = lang/gpxsee_cs.ts \ TRANSLATIONS = lang/gpxsee_en.ts \
lang/gpxsee_cs.ts \
lang/gpxsee_sv.ts \ lang/gpxsee_sv.ts \
lang/gpxsee_de.ts \ lang/gpxsee_de.ts \
lang/gpxsee_ru.ts \ lang/gpxsee_ru.ts \
lang/gpxsee_fi.ts \ lang/gpxsee_fi.ts \
lang/gpxsee_fr.ts \ lang/gpxsee_fr.ts \
lang/gpxsee_pl.ts lang/gpxsee_pl.ts
macx { macx {
ICON = icons/gpxsee.icns ICON = icons/gpxsee.icns
QMAKE_INFO_PLIST = pkg/Info.plist QMAKE_INFO_PLIST = pkg/Info.plist
LOCALE.path = Contents/Resources/translations LOCALE.path = Contents/Resources/translations
LOCALE.files = lang/gpxsee_cs.qm \ LOCALE.files = lang/gpxsee_en.qm \
lang/gpxsee_cs.qm \
lang/gpxsee_de.qm \ lang/gpxsee_de.qm \
lang/gpxsee_fi.qm \ lang/gpxsee_fi.qm \
lang/gpxsee_fr.qm \ lang/gpxsee_fr.qm \
@ -259,7 +290,9 @@ macx {
icons/nmea.icns \ icons/nmea.icns \
icons/plt.icns \ icons/plt.icns \
icons/rte.icns \ icons/rte.icns \
icons/wpt.icns icons/wpt.icns \
icons/loc.icns \
icons/slf.icns
QMAKE_BUNDLE_DATA += LOCALE MAPS ICONS CSV QMAKE_BUNDLE_DATA += LOCALE MAPS ICONS CSV
} }
win32 { win32 {
@ -272,7 +305,11 @@ win32 {
icons/nmea.ico \ icons/nmea.ico \
icons/plt.ico \ icons/plt.ico \
icons/rte.ico \ icons/rte.ico \
icons/wpt.ico icons/wpt.ico \
icons/loc.ico \
icons/slf.ico
DEFINES += _USE_MATH_DEFINES DEFINES += _USE_MATH_DEFINES
} }
DEFINES += APP_VERSION=\\\"$$VERSION\\\" DEFINES += APP_VERSION=\\\"$$VERSION\\\"
DEFINES *= QT_USE_QSTRINGBUILDER

View File

@ -1,24 +1,46 @@
<RCC> <RCC>
<qresource prefix="/"> <qresource prefix="/">
<file>icons/dialog-close.png</file> <file>icons/dialog-close.png</file>
<file>icons/document-open.png</file> <file>icons/dialog-close@2x.png</file>
<file>icons/document-print.png</file> <file>icons/document-open.png</file>
<file>icons/document-export.png</file> <file>icons/document-open@2x.png</file>
<file>icons/flag.png</file> <file>icons/document-print.png</file>
<file>icons/gpxsee.png</file> <file>icons/document-print@2x.png</file>
<file>icons/application-exit.png</file> <file>icons/document-export.png</file>
<file>icons/applications-internet.png</file> <file>icons/document-export@2x.png</file>
<file>icons/view-refresh.png</file> <file>icons/flag.png</file>
<file>icons/arrow-left.png</file> <file>icons/flag@2x.png</file>
<file>icons/arrow-right.png</file> <file>icons/gpxsee.png</file>
<file>icons/arrow-left-double.png</file> <file>icons/gpxsee@2x.png</file>
<file>icons/arrow-right-double.png</file> <file>icons/application-exit.png</file>
<file>icons/view-fullscreen.png</file> <file>icons/application-exit@2x.png</file>
<file>icons/office-chart-line.png</file> <file>icons/applications-internet.png</file>
<file>icons/preferences-desktop-display.png</file> <file>icons/applications-internet@2x.png</file>
<file>icons/flag_48.png</file> <file>icons/view-refresh.png</file>
<file>icons/system-run.png</file> <file>icons/view-refresh@2x.png</file>
<file>icons/document-print-preview.png</file> <file>icons/arrow-left.png</file>
<file>icons/view-filter.png</file> <file>icons/arrow-left@2x.png</file>
</qresource> <file>icons/arrow-right.png</file>
<file>icons/arrow-right@2x.png</file>
<file>icons/arrow-left-double.png</file>
<file>icons/arrow-left-double@2x.png</file>
<file>icons/arrow-right-double.png</file>
<file>icons/arrow-right-double@2x.png</file>
<file>icons/view-fullscreen.png</file>
<file>icons/view-fullscreen@2x.png</file>
<file>icons/office-chart-line.png</file>
<file>icons/office-chart-line@2x.png</file>
<file>icons/format-stroke-color.png</file>
<file>icons/format-stroke-color@2x.png</file>
<file>icons/flag_32.png</file>
<file>icons/flag_32@2x.png</file>
<file>icons/preferences-system.png</file>
<file>icons/preferences-system@2x.png</file>
<file>icons/document-print_32.png</file>
<file>icons/document-print_32@2x.png</file>
<file>icons/view-filter.png</file>
<file>icons/view-filter@2x.png</file>
<file>icons/applications-internet_32.png</file>
<file>icons/applications-internet_32@2x.png</file>
</qresource>
</RCC> </RCC>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
icons/arrow-left@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
icons/arrow-right@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
icons/dialog-close@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 796 B

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
icons/document-open@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

BIN
icons/document-print@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
icons/document-print_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

After

Width:  |  Height:  |  Size: 302 KiB

BIN
icons/flag@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
icons/flag_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
icons/flag_32@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 KiB

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

BIN
icons/gpxsee@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 304 KiB

BIN
icons/loc.icns Normal file

Binary file not shown.

BIN
icons/loc.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 303 KiB

After

Width:  |  Height:  |  Size: 302 KiB

11
icons/scripts/extensions Normal file
View File

@ -0,0 +1,11 @@
fit:#006600
gpx:#003399
igc:#ff3300
kml:#990000
nmea:#0083d7
plt:#66ff00
rte:#66ff00
tcx:#ffcc00
wpt:#66ff00
loc:#556677
slf:#881199

View File

@ -1,9 +1,6 @@
#!/bin/bash #!/bin/bash
EXTENSIONS="fit:#006600 gpx:#003399 igc:#ff3300 kml:#990000 nmea:#0083d7 \ while read e; do
plt:#66ff00 rte:#66ff00 tcx:#ffcc00 wpt:#66ff00"
for e in $EXTENSIONS; do
IFS=":"; set $e IFS=":"; set $e
EXT=`echo $1 | tr /a-z/ /A-Z/` EXT=`echo $1 | tr /a-z/ /A-Z/`
@ -25,4 +22,4 @@ for e in $EXTENSIONS; do
iconutil -c icns -o $1.icns "$ICONSET" iconutil -c icns -o $1.icns "$ICONSET"
rm -R "$ICONSET" $1.svg rm -R "$ICONSET" $1.svg
done done < extensions

View File

@ -1,13 +1,10 @@
#!/bin/bash #!/bin/bash
EXTENSIONS="fit:#006600 gpx:#003399 igc:#ff3300 kml:#990000 nmea:#0083d7 \ while read e; do
plt:#66ff00 rte:#66ff00 tcx:#ffcc00 wpt:#66ff00"
for e in $EXTENSIONS; do
IFS=":"; set $e IFS=":"; set $e
EXT=`echo $1 | tr /a-z/ /A-Z/` EXT=`echo $1 | tr /a-z/ /A-Z/`
sed -e "s/\$EXTENSION/$EXT/" -e "s/\$COLOR/$2/" icon-template.svg > $1.svg sed -e "s/\$EXTENSION/$EXT/" -e "s/\$COLOR/$2/" icon-template.svg > $1.svg
convert -density 400 $1.svg -define icon:auto-resize $1.ico convert -density 400 $1.svg -define icon:auto-resize $1.ico
rm $1.svg rm $1.svg
done done < extensions

View File

@ -12,6 +12,9 @@
</g> </g>
<g transform="translate(16.573463,124.9782)"> <g transform="translate(16.573463,124.9782)">
<rect y="0" x="0" id="textrect" height="50" width="120" style="fill:$COLOR;fill-opacity:1;stroke:none;"/> <rect y="0" x="0" id="textrect" height="50" width="120" style="fill:$COLOR;fill-opacity:1;stroke:none;"/>
<text y="28" x="60" dominant-baseline="central" text-anchor="middle" style="fill:#FFFFFF;font-size:39px;font-family:sans-serif;font-weight:bold;">$EXTENSION</text> <!--
<text y="28" x="60" dominant-baseline="central" text-anchor="middle" style="fill:#FFFFFF;font-size:39px;font-family:Helvetica;font-weight:bold;">$EXTENSION</text>
-->
<text y="25" x="60" dy="0.36em" text-anchor="middle" style="fill:#FFFFFF;font-size:39px;font-family:Helvetica;font-weight:bold;">$EXTENSION</text>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
icons/slf.icns Normal file

Binary file not shown.

BIN
icons/slf.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 885 B

BIN
icons/view-filter@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
icons/view-refresh@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 304 KiB

File diff suppressed because it is too large Load Diff

1747
lang/gpxsee_da.ts Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

14
lang/gpxsee_en.ts Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
<name>GUI</name>
<message numerus="yes">
<source>%n files</source>
<translation>
<numerusform>%n file</numerusform>
<numerusform>%n files</numerusform>
</translation>
</message>
</context>
</TS>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1747
lang/gpxsee_no.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

View File

@ -67,6 +67,38 @@
<key>CFBundleTypeRole</key> <key>CFBundleTypeRole</key>
<string>Viewer</string> <string>Viewer</string>
</dict> </dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>loc</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/loc+xml</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/loc.icns</string>
<key>CFBundleTypeName</key>
<string>Geocaching.com Waypoint File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>slf</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/slf+xml</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/slf.icns</string>
<key>CFBundleTypeName</key>
<string>Sigma Log Format</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict> <dict>
<key>CFBundleTypeExtensions</key> <key>CFBundleTypeExtensions</key>
<array> <array>
@ -230,6 +262,48 @@
<string>application/vnd.google-earth.kml+xml</string> <string>application/vnd.google-earth.kml+xml</string>
</dict> </dict>
</dict> </dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.geocaching.loc</string>
<key>UTTypeReferenceURL</key>
<string>https://www.geocaching.com</string>
<key>UTTypeDescription</key>
<string>Geocaching.com Waypoint File</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.xml</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>loc</string>
</array>
<key>public.mime-type</key>
<string>application/loc+xml</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.sigmasport.slf</string>
<key>UTTypeReferenceURL</key>
<string>https://www.sigmasport.com</string>
<key>UTTypeDescription</key>
<string>Sigma Log Format</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.xml</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>slf</string>
</array>
<key>public.mime-type</key>
<string>application/slf+xml</string>
</dict>
</dict>
<dict> <dict>
<key>UTTypeIdentifier</key> <key>UTTypeIdentifier</key>
<string>com.thisisant.fit</string> <string>com.thisisant.fit</string>

View File

@ -21,6 +21,7 @@ ED50(ED77) / UTM zone 40N,2060,4154,16040,9001,9807,4400,8801,0,9102,8802,57,910
ED50(ED77) / UTM zone 41N,2061,4154,16041,9001,9807,4400,8801,0,9102,8802,63,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,, ED50(ED77) / UTM zone 41N,2061,4154,16041,9001,9807,4400,8801,0,9102,8802,63,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,,
Dabola 1981 / UTM zone 28N,2063,4315,16028,9001,9807,4400,8801,0,9102,8802,-15,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,, Dabola 1981 / UTM zone 28N,2063,4315,16028,9001,9807,4400,8801,0,9102,8802,-15,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,,
Dabola 1981 / UTM zone 29N,2064,4315,16029,9001,9807,4400,8801,0,9102,8802,-9,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,, Dabola 1981 / UTM zone 29N,2064,4315,16029,9001,9807,4400,8801,0,9102,8802,-9,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,,
S-JTSK (Ferro) / Krovak,2065,4818,19952,9001,9819,6501,1036,30.1717303,9110,8806,0,9001,8807,0,9001,8811,49.3,9110,8818,78.3,9110,8819,0.9999,9201,8833,42.3,9110
Naparima 1955 / UTM zone 20N,2067,4158,16020,9001,9807,4400,8801,0,9102,8802,-63,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,, Naparima 1955 / UTM zone 20N,2067,4158,16020,9001,9807,4400,8801,0,9102,8802,-63,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,,
ELD79 / Libya zone 5,2068,4159,18240,9001,9807,4499,8801,0,9102,8802,9,9102,8805,0.9999,9201,8806,200000,9001,8807,0,9001,,,,,, ELD79 / Libya zone 5,2068,4159,18240,9001,9807,4499,8801,0,9102,8802,9,9102,8805,0.9999,9201,8806,200000,9001,8807,0,9001,,,,,,
ELD79 / Libya zone 6,2069,4159,18241,9001,9807,4499,8801,0,9102,8802,11,9102,8805,0.9999,9201,8806,200000,9001,8807,0,9001,,,,,, ELD79 / Libya zone 6,2069,4159,18241,9001,9807,4499,8801,0,9102,8802,11,9102,8805,0.9999,9201,8806,200000,9001,8807,0,9001,,,,,,
@ -1571,7 +1572,6 @@ SWEREF99 / RT90 5 gon O emulation,3850,4619,17344,9001,9807,4530,8801,0,9110,880
NZGD2000 / NZCS2000,3851,4167,17964,9001,9802,4500,8821,-41,9110,8822,173,9110,8823,-37.3,9110,8824,-44.3,9110,8826,3000000,9001,8827,7000000,9001,,, NZGD2000 / NZCS2000,3851,4167,17964,9001,9802,4500,8821,-41,9110,8822,173,9110,8823,-37.3,9110,8824,-44.3,9110,8826,3000000,9001,8827,7000000,9001,,,
RSRGD2000 / DGLC2000,3852,4764,17966,9001,9802,4500,8821,-90,9110,8822,157,9110,8823,-76.4,9110,8824,-79.2,9110,8826,500000,9001,8827,0,9001,,, RSRGD2000 / DGLC2000,3852,4764,17966,9001,9802,4500,8821,-90,9110,8822,157,9110,8823,-76.4,9110,8824,-79.2,9110,8826,500000,9001,8827,0,9001,,,
County ST74,3854,4619,3853,9001,9807,4531,8801,0,9110,8802,18.0328332,9110,8805,0.99999506,9201,8806,100182.7406,9001,8807,-6500620.1207,9001,,,,,, County ST74,3854,4619,3853,9001,9807,4531,8801,0,9110,8802,18.0328332,9110,8805,0.99999506,9201,8806,100182.7406,9001,8807,-6500620.1207,9001,,,,,,
WGS 84 / Pseudo-Mercator,3857,4326,3856,9001,1024,4499,8801,0,9102,8802,0,9102,8806,0,9001,8807,0,9001,,,,,,,,,
ETRS89 / GK19FIN,3873,4258,3860,9001,9807,4500,8801,0,9102,8802,19,9102,8805,1,9201,8806,19500000,9001,8807,0,9001,,,,,, ETRS89 / GK19FIN,3873,4258,3860,9001,9807,4500,8801,0,9102,8802,19,9102,8805,1,9201,8806,19500000,9001,8807,0,9001,,,,,,
ETRS89 / GK20FIN,3874,4258,3861,9001,9807,4500,8801,0,9102,8802,20,9102,8805,1,9201,8806,20500000,9001,8807,0,9001,,,,,, ETRS89 / GK20FIN,3874,4258,3861,9001,9807,4500,8801,0,9102,8802,20,9102,8805,1,9201,8806,20500000,9001,8807,0,9001,,,,,,
ETRS89 / GK21FIN,3875,4258,3862,9001,9807,4500,8801,0,9102,8802,21,9102,8805,1,9201,8806,21500000,9001,8807,0,9001,,,,,, ETRS89 / GK21FIN,3875,4258,3862,9001,9807,4500,8801,0,9102,8802,21,9102,8805,1,9201,8806,21500000,9001,8807,0,9001,,,,,,
@ -1766,6 +1766,7 @@ Korea 2000 / West Belt 2010,5185,4737,5101,9001,9807,4530,8801,38,9102,8802,125,
Korea 2000 / Central Belt 2010,5186,4737,5102,9001,9807,4530,8801,38,9102,8802,127,9102,8805,1,9201,8806,200000,9001,8807,600000,9001,,,,,, Korea 2000 / Central Belt 2010,5186,4737,5102,9001,9807,4530,8801,38,9102,8802,127,9102,8805,1,9201,8806,200000,9001,8807,600000,9001,,,,,,
Korea 2000 / East Belt 2010,5187,4737,5103,9001,9807,4530,8801,38,9102,8802,129,9102,8805,1,9201,8806,200000,9001,8807,600000,9001,,,,,, Korea 2000 / East Belt 2010,5187,4737,5103,9001,9807,4530,8801,38,9102,8802,129,9102,8805,1,9201,8806,200000,9001,8807,600000,9001,,,,,,
Korea 2000 / East Sea Belt 2010,5188,4737,5104,9001,9807,4530,8801,38,9102,8802,131,9102,8805,1,9201,8806,200000,9001,8807,600000,9001,,,,,, Korea 2000 / East Sea Belt 2010,5188,4737,5104,9001,9807,4530,8801,38,9102,8802,131,9102,8805,1,9201,8806,200000,9001,8807,600000,9001,,,,,,
S-JTSK (Ferro) / Krovak East North,5221,4818,5218,9001,1041,4499,1036,30.1717303,9110,8806,0,9001,8807,0,9001,8811,49.3,9110,8818,78.3,9110,8819,0.9999,9201,8833,42.3,9110
WGS 84 / Gabon TM,5223,4326,5222,9001,9807,4499,8801,0,9102,8802,12,9102,8805,0.9996,9201,8806,500000,9001,8807,500000,9001,,,,,, WGS 84 / Gabon TM,5223,4326,5222,9001,9807,4499,8801,0,9102,8802,12,9102,8805,0.9996,9201,8806,500000,9001,8807,500000,9001,,,,,,
Kandawala / Sri Lanka Grid,5234,4244,5231,9001,9807,4400,8801,7.0001729,9110,8802,80.461816,9110,8805,0.9999238418,9201,8806,200000,9001,8807,200000,9001,,,,,, Kandawala / Sri Lanka Grid,5234,4244,5231,9001,9807,4400,8801,7.0001729,9110,8802,80.461816,9110,8805,0.9999238418,9201,8806,200000,9001,8807,200000,9001,,,,,,
SLD99 / Sri Lanka Grid 1999,5235,5233,5232,9001,9807,4400,8801,7.00016975,9110,8802,80.46181671,9110,8805,0.9999238418,9201,8806,500000,9001,8807,500000,9001,,,,,, SLD99 / Sri Lanka Grid 1999,5235,5233,5232,9001,9807,4400,8801,7.00016975,9110,8802,80.46181671,9110,8805,0.9999238418,9201,8806,500000,9001,8807,500000,9001,,,,,,
@ -1844,6 +1845,9 @@ RSRGD2000 / MSLC2000,5479,4764,5475,9001,9802,4500,8821,-78,9110,8822,163,9110,8
RSRGD2000 / BCLC2000,5480,4764,5476,9001,9802,4500,8821,-74.3,9110,8822,165,9110,8823,-73.4,9110,8824,-75.2,9110,8826,5000000,9001,8827,3000000,9001,,, RSRGD2000 / BCLC2000,5480,4764,5476,9001,9802,4500,8821,-74.3,9110,8822,165,9110,8823,-73.4,9110,8824,-75.2,9110,8826,5000000,9001,8827,3000000,9001,,,
RSRGD2000 / PCLC2000,5481,4764,5477,9001,9802,4500,8821,-71.3,9110,8822,166,9110,8823,-70.4,9110,8824,-72.2,9110,8826,3000000,9001,8827,1000000,9001,,, RSRGD2000 / PCLC2000,5481,4764,5477,9001,9802,4500,8821,-71.3,9110,8822,166,9110,8823,-70.4,9110,8824,-72.2,9110,8826,3000000,9001,8827,1000000,9001,,,
RGAF09 / UTM zone 20N,5490,5489,16020,9001,9807,4400,8801,0,9102,8802,-63,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,, RGAF09 / UTM zone 20N,5490,5489,16020,9001,9807,4400,8801,0,9102,8802,-63,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,,
S-JTSK / Krovak,5513,4156,5509,9001,9819,6501,1036,30.1717303,9110,8806,0,9001,8807,0,9001,8811,49.3,9110,8818,78.3,9110,8819,0.9999,9201,8833,24.5,9110
S-JTSK / Krovak East North,5514,4156,5510,9001,1041,4499,1036,30.1717303,9110,8806,0,9001,8807,0,9001,8811,49.3,9110,8818,78.3,9110,8819,0.9999,9201,8833,24.5,9110
S-JTSK / Krovak East North,102067,4156,5510,9001,1041,4499,1036,30.1717303,9110,8806,0,9001,8807,0,9001,8811,49.3,9110,8818,78.3,9110,8819,0.9999,9201,8833,24.5,9110
CI1971 / Chatham Islands Map Grid,5518,4672,5517,9001,9807,4500,8801,-44,9110,8802,-176.3,9110,8805,1,9201,8806,350000,9001,8807,650000,9001,,,,,, CI1971 / Chatham Islands Map Grid,5518,4672,5517,9001,9807,4500,8801,-44,9110,8802,-176.3,9110,8805,1,9201,8806,350000,9001,8807,650000,9001,,,,,,
CI1979 / Chatham Islands Map Grid,5519,4673,5517,9001,9807,4500,8801,-44,9110,8802,-176.3,9110,8805,1,9201,8806,350000,9001,8807,650000,9001,,,,,, CI1979 / Chatham Islands Map Grid,5519,4673,5517,9001,9807,4500,8801,-44,9110,8802,-176.3,9110,8805,1,9201,8806,350000,9001,8807,650000,9001,,,,,,
DHDN / 3-degree Gauss-Kruger zone 1,5520,4314,16261,9001,9807,4530,8801,0,9102,8802,3,9102,8805,1,9201,8806,1500000,9001,8807,0,9001,,,,,, DHDN / 3-degree Gauss-Kruger zone 1,5520,4314,16261,9001,9807,4530,8801,0,9102,8802,3,9102,8805,1,9201,8806,1500000,9001,8807,0,9001,,,,,,

Can't render this file because it is too large.

View File

@ -11,4 +11,4 @@ Icon=gpxsee
Terminal=false Terminal=false
Type=Application Type=Application
Categories=Graphics;Viewer;Maps;Qt; Categories=Graphics;Viewer;Maps;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; 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;

View File

@ -2,10 +2,35 @@
!include "x64.nsh" !include "x64.nsh"
!include "WinVer.nsh" !include "WinVer.nsh"
; Macros
!macro FILE_ASSOCIATION_ADD EXT DESC ICON
WriteRegStr HKCR ".${EXT}" "" "GPXSee.${EXT}"
WriteRegStr HKCR "GPXSee.${EXT}" "" "${DESC}"
WriteRegStr HKCR "GPXSee.${EXT}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,${ICON}"
WriteRegStr HKCR "GPXSee.${EXT}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
!macroend
!macro FILE_ASSOCIATION_REMOVE EXT
DeleteRegKey HKCR "GPXSee.${EXT}"
DeleteRegKey HKCR ".${EXT}"
!macroend
!macro LOCALIZATION LANG CODE
Section "${LANG}"
CreateDirectory "$INSTDIR\translations"
File /oname=translations\gpxsee_${CODE}.qm translations\gpxsee_${CODE}.qm
!if /FileExists translations\qt_${CODE}.qm
File /oname=translations\qt_${CODE}.qm translations\qt_${CODE}.qm
!endif
SectionEnd
!macroend
; The name of the installer ; The name of the installer
Name "GPXSee" Name "GPXSee"
; Program version ; Program version
!define VERSION "5.12" !define VERSION "6.0"
; The file to write ; The file to write
OutFile "GPXSee-${VERSION}.exe" OutFile "GPXSee-${VERSION}.exe"
@ -32,16 +57,6 @@ InstallDirRegKey HKLM "Software\GPXSee" "Install_Dir"
; Registry key for uninstaller ; Registry key for uninstaller
!define REGENTRY "Software\Microsoft\Windows\CurrentVersion\Uninstall\GPXSee" !define REGENTRY "Software\Microsoft\Windows\CurrentVersion\Uninstall\GPXSee"
; File types registry entries
!define REGGPX "GPXSee.gpx"
!define REGTCX "GPXSee.tcx"
!define REGKML "GPXSee.kml"
!define REGFIT "GPXSee.fit"
!define REGIGC "GPXSee.igc"
!define REGNMEA "GPXSee.nmea"
!define REGPLT "GPXSee.plt"
!define REGRTE "GPXSee.rte"
!define REGWPT "GPXSee.wpt"
; Start menu page configuration ; Start menu page configuration
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM" !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM"
@ -114,43 +129,17 @@ Section "GPXSee" SEC_APP
; Associate file formats ; Associate file formats
DetailPrint "Associating file types..." DetailPrint "Associating file types..."
WriteRegStr HKCR ".gpx" "" "${REGGPX}" !insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 4
WriteRegStr HKCR "${REGGPX}" "" "GPS Exchange Format" !insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 5
WriteRegStr HKCR "${REGGPX}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,2" !insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 6
WriteRegStr HKCR "${REGGPX}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\"" !insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 7
WriteRegStr HKCR ".tcx" "" "${REGTCX}" !insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 8
WriteRegStr HKCR "${REGTCX}" "" "Training Center XML" !insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 data" 9
WriteRegStr HKCR "${REGTCX}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,3" !insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 10
WriteRegStr HKCR "${REGTCX}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\"" !insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 11
WriteRegStr HKCR ".kml" "" "${REGKML}" !insertmacro FILE_ASSOCIATION_ADD "wpt" "OziExplorer Waypoint File" 1
WriteRegStr HKCR "${REGKML}" "" "Keyhole Markup Language" !insertmacro FILE_ASSOCIATION_ADD "loc" "Geocaching.com Waypoint File" 2
WriteRegStr HKCR "${REGKML}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,4" !insertmacro FILE_ASSOCIATION_ADD "slf" "Sigma Log File" 3
WriteRegStr HKCR "${REGKML}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".fit" "" "${REGFIT}"
WriteRegStr HKCR "${REGFIT}" "" "Flexible and Interoperable Data Transfer"
WriteRegStr HKCR "${REGFIT}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,5"
WriteRegStr HKCR "${REGFIT}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".igc" "" "${REGIGC}"
WriteRegStr HKCR "${REGIGC}" "" "Flight Recorder Data Format"
WriteRegStr HKCR "${REGIGC}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,6"
WriteRegStr HKCR "${REGIGC}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".nmea" "" "${REGNMEA}"
WriteRegStr HKCR "${REGNMEA}" "" "NMEA 0183 data"
WriteRegStr HKCR "${REGNMEA}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,7"
WriteRegStr HKCR "${REGNMEA}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".plt" "" "${REGPLT}"
WriteRegStr HKCR "${REGPLT}" "" "OziExplorer Track Point File"
WriteRegStr HKCR "${REGPLT}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,8"
WriteRegStr HKCR "${REGPLT}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".rte" "" "${REGRTE}"
WriteRegStr HKCR "${REGRTE}" "" "OziExplorer Route File"
WriteRegStr HKCR "${REGRTE}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,9"
WriteRegStr HKCR "${REGRTE}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".wpt" "" "${REGWPT}"
WriteRegStr HKCR "${REGWPT}" "" "OziExplorer Waypoint File"
WriteRegStr HKCR "${REGWPT}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,1"
WriteRegStr HKCR "${REGWPT}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
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
@ -164,9 +153,12 @@ Section "QT framework" SEC_QT
File "Qt5Widgets.dll" File "Qt5Widgets.dll"
File "Qt5PrintSupport.dll" File "Qt5PrintSupport.dll"
File "Qt5Network.dll" File "Qt5Network.dll"
File "Qt5Sql.dll"
File /r "platforms" File /r "platforms"
File /r "imageformats" File /r "imageformats"
File /r "printsupport" File /r "printsupport"
File /r "styles"
File /r "sqldrivers"
SectionEnd SectionEnd
@ -210,40 +202,13 @@ Section "ANGLE" SEC_ANGLE
SectionEnd SectionEnd
SectionGroup "Localization" SEC_LOCALIZATION SectionGroup "Localization" SEC_LOCALIZATION
Section "Czech" !insertmacro LOCALIZATION "Czech" "cs"
CreateDirectory "$INSTDIR\translations" !insertmacro LOCALIZATION "Finnish" "fi"
File /oname=translations\gpxsee_cs.qm translations\gpxsee_cs.qm !insertmacro LOCALIZATION "French" "fr"
File /oname=translations\qt_cs.qm translations\qt_cs.qm !insertmacro LOCALIZATION "German" "de"
SectionEnd !insertmacro LOCALIZATION "Polish" "pl"
Section "Finnish" !insertmacro LOCALIZATION "Russian" "ru"
CreateDirectory "$INSTDIR\translations" !insertmacro LOCALIZATION "Swedish" "sv"
File /oname=translations\gpxsee_fi.qm translations\gpxsee_fi.qm
File /oname=translations\qt_fi.qm translations\qt_fi.qm
SectionEnd
Section "French"
CreateDirectory "$INSTDIR\translations"
File /oname=translations\gpxsee_fr.qm translations\gpxsee_fr.qm
File /oname=translations\qt_fr.qm translations\qt_fr.qm
SectionEnd
Section "German"
CreateDirectory "$INSTDIR\translations"
File /oname=translations\gpxsee_de.qm translations\gpxsee_de.qm
File /oname=translations\qt_de.qm translations\qt_de.qm
SectionEnd
Section "Polish"
CreateDirectory "$INSTDIR\translations"
File /oname=translations\gpxsee_pl.qm translations\gpxsee_pl.qm
File /oname=translations\qt_pl.qm translations\qt_pl.qm
SectionEnd
Section "Russian"
CreateDirectory "$INSTDIR\translations"
File /oname=translations\gpxsee_ru.qm translations\gpxsee_ru.qm
File /oname=translations\qt_ru.qm translations\qt_ru.qm
SectionEnd
Section "Swedish"
CreateDirectory "$INSTDIR\translations"
File /oname=translations\gpxsee_sv.qm translations\gpxsee_sv.qm
SectionEnd
SectionGroupEnd SectionGroupEnd
;-------------------------------- ;--------------------------------
@ -266,24 +231,17 @@ Section "Uninstall"
RMDir "$SMPROGRAMS\$StartMenuFolder" RMDir "$SMPROGRAMS\$StartMenuFolder"
; Remove GPX file association ; Remove GPX file association
DeleteRegKey HKCR "${REGGPX}" !insertmacro FILE_ASSOCIATION_REMOVE "gpx"
DeleteRegKey HKCR ".gpx" !insertmacro FILE_ASSOCIATION_REMOVE "tcx"
DeleteRegKey HKCR "${REGTCX}" !insertmacro FILE_ASSOCIATION_REMOVE "kml"
DeleteRegKey HKCR ".tcx" !insertmacro FILE_ASSOCIATION_REMOVE "fit"
DeleteRegKey HKCR "${REGKML}" !insertmacro FILE_ASSOCIATION_REMOVE "igc"
DeleteRegKey HKCR ".kml" !insertmacro FILE_ASSOCIATION_REMOVE "nmea"
DeleteRegKey HKCR "${REGFIT}" !insertmacro FILE_ASSOCIATION_REMOVE "plt"
DeleteRegKey HKCR ".fit" !insertmacro FILE_ASSOCIATION_REMOVE "rte"
DeleteRegKey HKCR "${REGIGC}" !insertmacro FILE_ASSOCIATION_REMOVE "wpt"
DeleteRegKey HKCR ".igc" !insertmacro FILE_ASSOCIATION_REMOVE "loc"
DeleteRegKey HKCR "${REGNMEA}" !insertmacro FILE_ASSOCIATION_REMOVE "slf"
DeleteRegKey HKCR ".nmea"
DeleteRegKey HKCR "${REGPLT}"
DeleteRegKey HKCR ".plt"
DeleteRegKey HKCR "${REGRTE}"
DeleteRegKey HKCR ".rte"
DeleteRegKey HKCR "${REGWPT}"
DeleteRegKey HKCR ".wpt"
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

View File

@ -22,6 +22,20 @@
<glob pattern="*.kml"/> <glob pattern="*.kml"/>
</mime-type> </mime-type>
<mime-type type="application/loc+xml">
<comment>Geocaching.com Waypoint File</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="application-xml"/>
<glob pattern="*.loc"/>
</mime-type>
<mime-type type="application/slf+xml">
<comment>Sigma Log Format</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="application-xml"/>
<glob pattern="*.slf"/>
</mime-type>
<mime-type type="application/vnd.ant.fit"> <mime-type type="application/vnd.ant.fit">
<comment>Flexible and Interoperable Data Transfer</comment> <comment>Flexible and Interoperable Data Transfer</comment>
<sub-class-of type="application/octet-stream"/> <sub-class-of type="application/octet-stream"/>

View File

@ -2,10 +2,35 @@
!include "x64.nsh" !include "x64.nsh"
!include "WinVer.nsh" !include "WinVer.nsh"
; Macros
!macro FILE_ASSOCIATION_ADD EXT DESC ICON
WriteRegStr HKCR ".${EXT}" "" "GPXSee.${EXT}"
WriteRegStr HKCR "GPXSee.${EXT}" "" "${DESC}"
WriteRegStr HKCR "GPXSee.${EXT}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,${ICON}"
WriteRegStr HKCR "GPXSee.${EXT}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
!macroend
!macro FILE_ASSOCIATION_REMOVE EXT
DeleteRegKey HKCR "GPXSee.${EXT}"
DeleteRegKey HKCR ".${EXT}"
!macroend
!macro LOCALIZATION LANG CODE
Section "${LANG}"
CreateDirectory "$INSTDIR\translations"
File /oname=translations\gpxsee_${CODE}.qm translations\gpxsee_${CODE}.qm
!if /FileExists translations\qt_${CODE}.qm
File /oname=translations\qt_${CODE}.qm translations\qt_${CODE}.qm
!endif
SectionEnd
!macroend
; The name of the installer ; The name of the installer
Name "GPXSee" Name "GPXSee"
; Program version ; Program version
!define VERSION "5.12" !define VERSION "6.0"
; The file to write ; The file to write
OutFile "GPXSee-${VERSION}_x64.exe" OutFile "GPXSee-${VERSION}_x64.exe"
@ -32,16 +57,6 @@ InstallDirRegKey HKLM "Software\GPXSee" "Install_Dir"
; Registry key for uninstaller ; Registry key for uninstaller
!define REGENTRY "Software\Microsoft\Windows\CurrentVersion\Uninstall\GPXSee" !define REGENTRY "Software\Microsoft\Windows\CurrentVersion\Uninstall\GPXSee"
; File types registry entries
!define REGGPX "GPXSee.gpx"
!define REGTCX "GPXSee.tcx"
!define REGKML "GPXSee.kml"
!define REGFIT "GPXSee.fit"
!define REGIGC "GPXSee.igc"
!define REGNMEA "GPXSee.nmea"
!define REGPLT "GPXSee.plt"
!define REGRTE "GPXSee.rte"
!define REGWPT "GPXSee.wpt"
; Start menu page configuration ; Start menu page configuration
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM" !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM"
@ -121,43 +136,17 @@ Section "GPXSee" SEC_APP
; Associate file formats ; Associate file formats
DetailPrint "Associating file types..." DetailPrint "Associating file types..."
WriteRegStr HKCR ".gpx" "" "${REGGPX}" !insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 4
WriteRegStr HKCR "${REGGPX}" "" "GPS Exchange Format" !insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 5
WriteRegStr HKCR "${REGGPX}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,2" !insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 6
WriteRegStr HKCR "${REGGPX}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\"" !insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 7
WriteRegStr HKCR ".tcx" "" "${REGTCX}" !insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 8
WriteRegStr HKCR "${REGTCX}" "" "Training Center XML" !insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 data" 9
WriteRegStr HKCR "${REGTCX}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,3" !insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 10
WriteRegStr HKCR "${REGTCX}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\"" !insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 11
WriteRegStr HKCR ".kml" "" "${REGKML}" !insertmacro FILE_ASSOCIATION_ADD "wpt" "OziExplorer Waypoint File" 1
WriteRegStr HKCR "${REGKML}" "" "Keyhole Markup Language" !insertmacro FILE_ASSOCIATION_ADD "loc" "Geocaching.com Waypoint File" 2
WriteRegStr HKCR "${REGKML}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,4" !insertmacro FILE_ASSOCIATION_ADD "slf" "Sigma Log File" 3
WriteRegStr HKCR "${REGKML}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".fit" "" "${REGFIT}"
WriteRegStr HKCR "${REGFIT}" "" "Flexible and Interoperable Data Transfer"
WriteRegStr HKCR "${REGFIT}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,5"
WriteRegStr HKCR "${REGFIT}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".igc" "" "${REGIGC}"
WriteRegStr HKCR "${REGIGC}" "" "Flight Recorder Data Format"
WriteRegStr HKCR "${REGIGC}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,6"
WriteRegStr HKCR "${REGIGC}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".nmea" "" "${REGNMEA}"
WriteRegStr HKCR "${REGNMEA}" "" "NMEA 0183 data"
WriteRegStr HKCR "${REGNMEA}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,7"
WriteRegStr HKCR "${REGNMEA}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".plt" "" "${REGPLT}"
WriteRegStr HKCR "${REGPLT}" "" "OziExplorer Track Point File"
WriteRegStr HKCR "${REGPLT}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,8"
WriteRegStr HKCR "${REGPLT}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".rte" "" "${REGRTE}"
WriteRegStr HKCR "${REGRTE}" "" "OziExplorer Route File"
WriteRegStr HKCR "${REGRTE}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,9"
WriteRegStr HKCR "${REGRTE}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".wpt" "" "${REGWPT}"
WriteRegStr HKCR "${REGWPT}" "" "OziExplorer Waypoint File"
WriteRegStr HKCR "${REGWPT}\DefaultIcon" "" "$INSTDIR\GPXSee.exe,1"
WriteRegStr HKCR "${REGWPT}\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
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
@ -171,9 +160,12 @@ Section "QT framework" SEC_QT
File "Qt5Widgets.dll" File "Qt5Widgets.dll"
File "Qt5PrintSupport.dll" File "Qt5PrintSupport.dll"
File "Qt5Network.dll" File "Qt5Network.dll"
File "Qt5Sql.dll"
File /r "platforms" File /r "platforms"
File /r "imageformats" File /r "imageformats"
File /r "printsupport" File /r "printsupport"
File /r "styles"
File /r "sqldrivers"
SectionEnd SectionEnd
@ -212,40 +204,13 @@ Section "ANGLE" SEC_ANGLE
SectionEnd SectionEnd
SectionGroup "Localization" SEC_LOCALIZATION SectionGroup "Localization" SEC_LOCALIZATION
Section "Czech" !insertmacro LOCALIZATION "Czech" "cs"
CreateDirectory "$INSTDIR\translations" !insertmacro LOCALIZATION "Finnish" "fi"
File /oname=translations\gpxsee_cs.qm translations\gpxsee_cs.qm !insertmacro LOCALIZATION "French" "fr"
File /oname=translations\qt_cs.qm translations\qt_cs.qm !insertmacro LOCALIZATION "German" "de"
SectionEnd !insertmacro LOCALIZATION "Polish" "pl"
Section "Finnish" !insertmacro LOCALIZATION "Russian" "ru"
CreateDirectory "$INSTDIR\translations" !insertmacro LOCALIZATION "Swedish" "sv"
File /oname=translations\gpxsee_fi.qm translations\gpxsee_fi.qm
File /oname=translations\qt_fi.qm translations\qt_fi.qm
SectionEnd
Section "French"
CreateDirectory "$INSTDIR\translations"
File /oname=translations\gpxsee_fr.qm translations\gpxsee_fr.qm
File /oname=translations\qt_fr.qm translations\qt_fr.qm
SectionEnd
Section "German"
CreateDirectory "$INSTDIR\translations"
File /oname=translations\gpxsee_de.qm translations\gpxsee_de.qm
File /oname=translations\qt_de.qm translations\qt_de.qm
SectionEnd
Section "Polish"
CreateDirectory "$INSTDIR\translations"
File /oname=translations\gpxsee_pl.qm translations\gpxsee_pl.qm
File /oname=translations\qt_pl.qm translations\qt_pl.qm
SectionEnd
Section "Russian"
CreateDirectory "$INSTDIR\translations"
File /oname=translations\gpxsee_ru.qm translations\gpxsee_ru.qm
File /oname=translations\qt_ru.qm translations\qt_ru.qm
SectionEnd
Section "Swedish"
CreateDirectory "$INSTDIR\translations"
File /oname=translations\gpxsee_sv.qm translations\gpxsee_sv.qm
SectionEnd
SectionGroupEnd SectionGroupEnd
;-------------------------------- ;--------------------------------
@ -269,24 +234,17 @@ Section "Uninstall"
RMDir "$SMPROGRAMS\$StartMenuFolder" RMDir "$SMPROGRAMS\$StartMenuFolder"
; Remove File associations ; Remove File associations
DeleteRegKey HKCR "${REGGPX}" !insertmacro FILE_ASSOCIATION_REMOVE "gpx"
DeleteRegKey HKCR ".gpx" !insertmacro FILE_ASSOCIATION_REMOVE "tcx"
DeleteRegKey HKCR "${REGTCX}" !insertmacro FILE_ASSOCIATION_REMOVE "kml"
DeleteRegKey HKCR ".tcx" !insertmacro FILE_ASSOCIATION_REMOVE "fit"
DeleteRegKey HKCR "${REGKML}" !insertmacro FILE_ASSOCIATION_REMOVE "igc"
DeleteRegKey HKCR ".kml" !insertmacro FILE_ASSOCIATION_REMOVE "nmea"
DeleteRegKey HKCR "${REGFIT}" !insertmacro FILE_ASSOCIATION_REMOVE "plt"
DeleteRegKey HKCR ".fit" !insertmacro FILE_ASSOCIATION_REMOVE "rte"
DeleteRegKey HKCR "${REGIGC}" !insertmacro FILE_ASSOCIATION_REMOVE "wpt"
DeleteRegKey HKCR ".igc" !insertmacro FILE_ASSOCIATION_REMOVE "loc"
DeleteRegKey HKCR "${REGNMEA}" !insertmacro FILE_ASSOCIATION_REMOVE "slf"
DeleteRegKey HKCR ".nmea"
DeleteRegKey HKCR "${REGPLT}"
DeleteRegKey HKCR ".plt"
DeleteRegKey HKCR "${REGRTE}"
DeleteRegKey HKCR ".rte"
DeleteRegKey HKCR "${REGWPT}"
DeleteRegKey HKCR ".wpt"
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

View File

@ -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"> <map xmlns="http://www.gpxsee.org/map/1">
<name>4UMaps</name> <name>4UMaps</name>
<url>http://4umaps.eu/$z/$x/$y.png</url> <url>https://4umaps.com/$z/$x/$y.png</url>
<copyright>Map data: © OpenStreetMap contributors (ODbL) | Rendering: © 4UMaps.eu</copyright> <copyright>Map data: © OpenStreetMap contributors (ODbL) | Rendering: © 4UMaps.eu</copyright>
<zoom min="2" max="15"/> <zoom min="2" max="15"/>
<bounds bottom="-65"/> <bounds bottom="-65"/>

View File

@ -36,17 +36,14 @@ Ticks::Ticks(double minValue, double maxValue, int maxCount)
} }
AxisItem::AxisItem(Type type, QGraphicsItem *parent) : QGraphicsItem(parent) AxisItem::AxisItem(Type type, QGraphicsItem *parent)
: QGraphicsItem(parent), _locale(QLocale::system())
{ {
_type = type; _type = type;
_size = 0; _size = 0;
_font.setPixelSize(FONT_SIZE); _font.setPixelSize(FONT_SIZE);
_font.setFamily(FONT_FAMILY); _font.setFamily(FONT_FAMILY);
#ifndef Q_OS_MAC
setCacheMode(QGraphicsItem::DeviceCoordinateCache);
#endif // Q_OS_MAC
} }
void AxisItem::setRange(const RangeF &range) void AxisItem::setRange(const RangeF &range)
@ -60,7 +57,7 @@ void AxisItem::setRange(const RangeF &range)
for (int i = 0; i < ticks.count(); i++) { for (int i = 0; i < ticks.count(); i++) {
Tick &t = _ticks[i]; Tick &t = _ticks[i];
t.value = ticks.val(i); t.value = ticks.val(i);
t.boundingBox = fm.tightBoundingRect(QString::number(t.value)); t.boundingBox = fm.tightBoundingRect(_locale.toString(t.value));
} }
updateBoundingRect(); updateBoundingRect();
@ -130,7 +127,7 @@ void AxisItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
TICK/2, (_size/_range.size()) * (val - _range.min()), -TICK/2); TICK/2, (_size/_range.size()) * (val - _range.min()), -TICK/2);
painter->drawText(((_size/_range.size()) * (val - _range.min())) painter->drawText(((_size/_range.size()) * (val - _range.min()))
- (ts.width()/2), ts.height() + TICK/2 + PADDING, - (ts.width()/2), ts.height() + TICK/2 + PADDING,
QString::number(val)); _locale.toString(val));
} }
painter->drawText(_size/2 - _labelBB.width()/2, _labelBB.height() painter->drawText(_size/2 - _labelBB.width()/2, _labelBB.height()
@ -149,7 +146,7 @@ void AxisItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
* (val - _range.min()))); * (val - _range.min())));
painter->drawText(-(ts.width() + PADDING + TICK/2), painter->drawText(-(ts.width() + PADDING + TICK/2),
-((_size/_range.size()) * (val - _range.min())) + (ts.height()/2), -((_size/_range.size()) * (val - _range.min())) + (ts.height()/2),
QString::number(val)); _locale.toString(val));
} }
painter->rotate(-90); painter->rotate(-90);

View File

@ -3,6 +3,7 @@
#include <QGraphicsItem> #include <QGraphicsItem>
#include <QVector> #include <QVector>
#include <QLocale>
#include "common/range.h" #include "common/range.h"
class AxisItem : public QGraphicsItem class AxisItem : public QGraphicsItem
@ -39,6 +40,7 @@ private:
QVector<Tick> _ticks; QVector<Tick> _ticks;
QRectF _boundingRect; QRectF _boundingRect;
QFont _font; QFont _font;
QLocale _locale;
}; };
#endif // AXISITEM_H #endif // AXISITEM_H

View File

@ -1,3 +1,4 @@
#include <QLocale>
#include "data/data.h" #include "data/data.h"
#include "cadencegraphitem.h" #include "cadencegraphitem.h"
#include "cadencegraph.h" #include "cadencegraph.h"
@ -7,7 +8,7 @@ CadenceGraph::CadenceGraph(QWidget *parent) : GraphTab(parent)
{ {
_showTracks = true; _showTracks = true;
GraphView::setYUnits(tr("1/min")); GraphView::setYUnits(tr("rpm"));
setYLabel(tr("Cadence")); setYLabel(tr("Cadence"));
setSliderPrecision(1); setSliderPrecision(1);
@ -16,9 +17,11 @@ CadenceGraph::CadenceGraph(QWidget *parent) : GraphTab(parent)
void CadenceGraph::setInfo() void CadenceGraph::setInfo()
{ {
if (_showTracks) { if (_showTracks) {
GraphView::addInfo(tr("Average"), QString::number(avg() * yScale() QLocale l(QLocale::system());
GraphView::addInfo(tr("Average"), l.toString(avg() * yScale()
+ yOffset(), 'f', 1) + UNIT_SPACE + yUnits()); + yOffset(), 'f', 1) + UNIT_SPACE + yUnits());
GraphView::addInfo(tr("Maximum"), QString::number(max() * yScale() GraphView::addInfo(tr("Maximum"), l.toString(max() * yScale()
+ yOffset(), 'f', 1) + UNIT_SPACE + yUnits()); + yOffset(), 'f', 1) + UNIT_SPACE + yUnits());
} else } else
clearInfo(); clearInfo();

View File

@ -1,6 +1,8 @@
#include <QLocale>
#include "tooltip.h" #include "tooltip.h"
#include "cadencegraphitem.h" #include "cadencegraphitem.h"
CadenceGraphItem::CadenceGraphItem(const Graph &graph, GraphType type, CadenceGraphItem::CadenceGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent) : GraphItem(graph, type, parent) QGraphicsItem *parent) : GraphItem(graph, type, parent)
{ {
@ -16,11 +18,12 @@ CadenceGraphItem::CadenceGraphItem(const Graph &graph, GraphType type,
QString CadenceGraphItem::toolTip() const QString CadenceGraphItem::toolTip() const
{ {
ToolTip tt; ToolTip tt;
QLocale l(QLocale::system());
tt.insert(tr("Maximum"), QString::number(max(), 'f', 1) tt.insert(tr("Maximum"), l.toString(max(), 'f', 1)
+ UNIT_SPACE + tr("1/min")); + UNIT_SPACE + tr("rpm"));
tt.insert(tr("Average"), QString::number(avg(), 'f', 1) tt.insert(tr("Average"), l.toString(avg(), 'f', 1)
+ UNIT_SPACE + tr("1/min")); + UNIT_SPACE + tr("rpm"));
return tt.toString(); return tt.toString();
} }

View File

@ -1,4 +1,5 @@
#include <cmath> #include <cmath>
#include <QLocale>
#include "data/data.h" #include "data/data.h"
#include "config.h" #include "config.h"
#include "tooltip.h" #include "tooltip.h"
@ -54,13 +55,15 @@ void ElevationGraph::setInfo()
if (std::isnan(max()) || std::isnan(min())) if (std::isnan(max()) || std::isnan(min()))
clearInfo(); clearInfo();
else { else {
GraphView::addInfo(tr("Ascent"), QString::number(ascent() * yScale(), QLocale l(QLocale::system());
GraphView::addInfo(tr("Ascent"), l.toString(ascent() * yScale(),
'f', 0) + UNIT_SPACE + yUnits()); 'f', 0) + UNIT_SPACE + yUnits());
GraphView::addInfo(tr("Descent"), QString::number(descent() * yScale(), GraphView::addInfo(tr("Descent"), l.toString(descent() * yScale(),
'f', 0) + UNIT_SPACE + yUnits()); 'f', 0) + UNIT_SPACE + yUnits());
GraphView::addInfo(tr("Maximum"), QString::number(max() * yScale(), 'f', GraphView::addInfo(tr("Maximum"), l.toString(max() * yScale(), 'f',
0) + UNIT_SPACE + yUnits()); 0) + UNIT_SPACE + yUnits());
GraphView::addInfo(tr("Minimum"), QString::number(min() * yScale(), 'f', GraphView::addInfo(tr("Minimum"), l.toString(min() * yScale(), 'f',
0) + UNIT_SPACE + yUnits()); 0) + UNIT_SPACE + yUnits());
} }
} }

View File

@ -1,6 +1,8 @@
#include <QLocale>
#include "tooltip.h" #include "tooltip.h"
#include "elevationgraphitem.h" #include "elevationgraphitem.h"
ElevationGraphItem::ElevationGraphItem(const Graph &graph, GraphType type, ElevationGraphItem::ElevationGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent) : GraphItem(graph, type, parent) QGraphicsItem *parent) : GraphItem(graph, type, parent)
{ {
@ -24,14 +26,15 @@ QString ElevationGraphItem::toolTip(Units units) 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());
tt.insert(tr("Ascent"), QString::number(ascent() * scale, 'f', 0) tt.insert(tr("Ascent"), l.toString(ascent() * scale, 'f', 0)
+ UNIT_SPACE + su); + UNIT_SPACE + su);
tt.insert(tr("Descent"), QString::number(descent() * scale, 'f', 0) tt.insert(tr("Descent"), l.toString(descent() * scale, 'f', 0)
+ UNIT_SPACE + su); + UNIT_SPACE + su);
tt.insert(tr("Maximum"), QString::number(max() * scale, 'f', 0) tt.insert(tr("Maximum"), l.toString(max() * scale, 'f', 0)
+ UNIT_SPACE + su); + UNIT_SPACE + su);
tt.insert(tr("Minimum"), QString::number(min() * scale, 'f', 0) tt.insert(tr("Minimum"), l.toString(min() * scale, 'f', 0)
+ UNIT_SPACE + su); + UNIT_SPACE + su);
return tt.toString(); return tt.toString();

View File

@ -13,11 +13,6 @@ FileBrowser::FileBrowser(QObject *parent) : QObject(parent)
_index = -1; _index = -1;
} }
FileBrowser::~FileBrowser()
{
delete _watcher;
}
void FileBrowser::setCurrent(const QString &path) void FileBrowser::setCurrent(const QString &path)
{ {
QFileInfo file(path); QFileInfo file(path);

View File

@ -13,7 +13,6 @@ class FileBrowser : public QObject
public: public:
FileBrowser(QObject *parent = 0); FileBrowser(QObject *parent = 0);
~FileBrowser();
void setFilter(const QStringList &filter); void setFilter(const QStringList &filter);
void setCurrent(const QString &path); void setCurrent(const QString &path);

View File

@ -46,37 +46,41 @@ QString Format::timeSpan(qreal time, bool full)
QString Format::distance(qreal value, Units units) QString Format::distance(qreal value, Units units)
{ {
QLocale l(QLocale::system());
if (units == Imperial) { if (units == Imperial) {
if (value < MIINM) if (value < MIINM)
return QString::number(value * M2FT, 'f', 0) + UNIT_SPACE return l.toString(value * M2FT, 'f', 0) + UNIT_SPACE
+ qApp->translate("Format", "ft"); + qApp->translate("Format", "ft");
else else
return QString::number(value * M2MI, 'f', 1) + UNIT_SPACE return l.toString(value * M2MI, 'f', 1) + UNIT_SPACE
+ qApp->translate("Format", "mi"); + qApp->translate("Format", "mi");
} else if (units == Nautical) { } else if (units == Nautical) {
if (value < NMIINM) if (value < NMIINM)
return QString::number(value * M2FT, 'f', 0) + UNIT_SPACE return l.toString(value * M2FT, 'f', 0) + UNIT_SPACE
+ qApp->translate("Format", "ft"); + qApp->translate("Format", "ft");
else else
return QString::number(value * M2NMI, 'f', 1) + UNIT_SPACE return l.toString(value * M2NMI, 'f', 1) + UNIT_SPACE
+ qApp->translate("Format", "nmi"); + qApp->translate("Format", "nmi");
} else { } else {
if (value < KMINM) if (value < KMINM)
return QString::number(value, 'f', 0) + UNIT_SPACE return l.toString(value, 'f', 0) + UNIT_SPACE
+ qApp->translate("Format", "m"); + qApp->translate("Format", "m");
else else
return QString::number(value * M2KM, 'f', 1) + UNIT_SPACE return l.toString(value * M2KM, 'f', 1) + UNIT_SPACE
+ qApp->translate("Format", "km"); + qApp->translate("Format", "km");
} }
} }
QString Format::elevation(qreal value, Units units) QString Format::elevation(qreal value, Units units)
{ {
QLocale l(QLocale::system());
if (units == Metric) if (units == Metric)
return QString::number(qRound(value)) + UNIT_SPACE return l.toString(qRound(value)) + UNIT_SPACE
+ qApp->translate("Format", "m"); + qApp->translate("Format", "m");
else else
return QString::number(qRound(value * M2FT)) + UNIT_SPACE return l.toString(qRound(value * M2FT)) + UNIT_SPACE
+ qApp->translate("Format", "ft"); + qApp->translate("Format", "ft");
} }
@ -95,7 +99,8 @@ QString Format::coordinates(const Coordinates &value, CoordinatesFormat type)
+ deg2DMS(qAbs(value.lon())) + xH; + deg2DMS(qAbs(value.lon())) + xH;
break; break;
default: default:
return QString::number(qAbs(value.lat()), 'f', 5) + yH + "," QLocale l(QLocale::system());
+ QChar(0x00A0) + QString::number(qAbs(value.lon()), 'f', 5) + xH; return l.toString(qAbs(value.lat()), 'f', 5) + yH + ","
+ QChar(0x00A0) + l.toString(qAbs(value.lon()), 'f', 5) + xH;
} }
} }

View File

@ -0,0 +1,97 @@
#include <QLocale>
#include "data/data.h"
#include "gearratiographitem.h"
#include "gearratiograph.h"
GearRatioGraph::GearRatioGraph(QWidget *parent) : GraphTab(parent)
{
_showTracks = true;
GraphView::setYUnits("");
setYLabel(tr("Gear ratio"));
setSliderPrecision(2);
}
void GearRatioGraph::setInfo()
{
if (_showTracks) {
QLocale l(QLocale::system());
GraphView::addInfo(tr("Most used"), l.toString(top() * yScale(),
'f', 2) + UNIT_SPACE + yUnits());
GraphView::addInfo(tr("Minimum"), l.toString(min() * yScale(), 'f',
2) + UNIT_SPACE + yUnits());
GraphView::addInfo(tr("Maximum"), l.toString(max() * yScale(), 'f',
2) + UNIT_SPACE + yUnits());
} else
clearInfo();
}
QList<GraphItem*> GearRatioGraph::loadData(const Data &data)
{
QList<GraphItem*> graphs;
for (int i = 0; i < data.tracks().count(); i++) {
const Graph &graph = data.tracks().at(i)->ratio();
if (graph.size() < 2) {
skipColor();
graphs.append(0);
} else {
GearRatioGraphItem *gi = new GearRatioGraphItem(graph, _graphType);
GraphView::addGraph(gi);
for (QMap<qreal, qreal>::const_iterator it = gi->map().constBegin();
it != gi->map().constEnd(); ++it)
_map.insert(it.key(), _map.value(it.key()) + it.value());
graphs.append(gi);
}
}
for (int i = 0; i < data.routes().count(); i++) {
skipColor();
graphs.append(0);
}
setInfo();
redraw();
return graphs;
}
qreal GearRatioGraph::top() const
{
qreal key = NAN, val = NAN;
for (QMap<qreal, qreal>::const_iterator it = _map.constBegin();
it != _map.constEnd(); ++it) {
if (it == _map.constBegin()) {
val = it.value();
key = it.key();
} else if (it.value() > val) {
val = it.value();
key = it.key();
}
}
return key;
}
void GearRatioGraph::clear()
{
_map.clear();
GraphView::clear();
}
void GearRatioGraph::showTracks(bool show)
{
_showTracks = show;
showGraph(show);
setInfo();
redraw();
}

30
src/GUI/gearratiograph.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef GEARRATIOGRAPH_H
#define GEARRATIOGRAPH_H
#include <QMap>
#include "graphtab.h"
class GearRatioGraph : public GraphTab
{
Q_OBJECT
public:
GearRatioGraph(QWidget *parent = 0);
QString label() const {return tr("Gear ratio");}
QList<GraphItem*> loadData(const Data &data);
void clear();
void showTracks(bool show);
private:
qreal top() const;
qreal min() const {return bounds().top();}
qreal max() const {return bounds().bottom();}
void setInfo();
QMap<qreal, qreal> _map;
bool _showTracks;
};
#endif // GEARRATIOGRAPH_H

View File

@ -0,0 +1,42 @@
#include <QMap>
#include <QLocale>
#include "tooltip.h"
#include "gearratiographitem.h"
GearRatioGraphItem::GearRatioGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent) : GraphItem(graph, type, parent), _top(NAN)
{
qreal val = NAN;
for (int j = 1; j < graph.size(); j++) {
const GraphPoint &p = graph.at(j);
qreal val = _map.value(p.y());
_map.insert(p.y(), val + (p.s() - graph.at(j-1).s()));
}
for (QMap<qreal, qreal>::const_iterator it = _map.constBegin();
it != _map.constEnd(); ++it) {
if (it == _map.constBegin()) {
val = it.value();
_top = it.key();
} else if (it.value() > val) {
val = it.value();
_top = it.key();
}
}
setToolTip(toolTip());
}
QString GearRatioGraphItem::toolTip() const
{
ToolTip tt;
QLocale l(QLocale::system());
tt.insert(tr("Minimum"), l.toString(min(), 'f', 2));
tt.insert(tr("Maximum"), l.toString(max(), 'f', 2));
tt.insert(tr("Most used"), l.toString(top(), 'f', 2));
return tt.toString();
}

View File

@ -0,0 +1,28 @@
#ifndef GEARRATIOGRAPHITEM_H
#define GEARRATIOGRAPHITEM_H
#include <QMap>
#include "graphitem.h"
class GearRatioGraphItem : public GraphItem
{
Q_OBJECT
public:
GearRatioGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent = 0);
qreal min() const {return -bounds().bottom();}
qreal max() const {return -bounds().top();}
qreal top() const {return _top;}
const QMap<qreal, qreal> &map() const {return _map;}
private:
QString toolTip() const;
QMap<qreal, qreal> _map;
qreal _top;
};
#endif // GEARRATIOGRAPHITEM_H

View File

@ -3,6 +3,9 @@
#include <QMouseEvent> #include <QMouseEvent>
#include <QPaintEngine> #include <QPaintEngine>
#include <QPaintDevice> #include <QPaintDevice>
#include <QGraphicsSimpleTextItem>
#include <QPalette>
#include <QLocale>
#include "data/graph.h" #include "data/graph.h"
#include "opengl.h" #include "opengl.h"
#include "config.h" #include "config.h"
@ -41,6 +44,9 @@ GraphView::GraphView(QWidget *parent)
_sliderInfo->setZValue(3.0); _sliderInfo->setZValue(3.0);
_info = new InfoItem(); _info = new InfoItem();
_grid = new GridItem(); _grid = new GridItem();
_message = new QGraphicsSimpleTextItem(tr("Data not available"));
_message->setBrush(QPalette().brush(QPalette::Disabled,
QPalette::WindowText));
connect(_slider, SIGNAL(positionChanged(const QPointF&)), this, connect(_slider, SIGNAL(positionChanged(const QPointF&)), this,
SLOT(emitSliderPositionChanged(const QPointF&))); SLOT(emitSliderPositionChanged(const QPointF&)));
@ -63,30 +69,27 @@ GraphView::GraphView(QWidget *parent)
GraphView::~GraphView() GraphView::~GraphView()
{ {
if (_xAxis->scene() != _scene) delete _xAxis;
delete _xAxis; delete _yAxis;
if (_yAxis->scene() != _scene) delete _slider;
delete _yAxis; delete _info;
if (_slider->scene() != _scene) delete _grid;
delete _slider; delete _message;
if (_info->scene() != _scene)
delete _info;
if (_grid->scene() != _scene)
delete _grid;
for (int i = 0; i < _graphs.count(); i++) for (int i = 0; i < _graphs.count(); i++)
if (_graphs.at(i)->scene() != _scene) delete _graphs[i];
delete _graphs[i];
} }
void GraphView::createXLabel() void GraphView::createXLabel()
{ {
_xAxis->setLabel(QString("%1 [%2]").arg(_xLabel, _xUnits)); _xAxis->setLabel(QString("%1 [%2]").arg(_xLabel,
_xUnits.isEmpty() ? "-" : _xUnits));
} }
void GraphView::createYLabel() void GraphView::createYLabel()
{ {
_yAxis->setLabel(QString("%1 [%2]").arg(_yLabel, _yUnits)); _yAxis->setLabel(QString("%1 [%2]").arg(_yLabel,
_yUnits.isEmpty() ? "-" : _yUnits));
} }
void GraphView::setYLabel(const QString &label) void GraphView::setYLabel(const QString &label)
@ -163,9 +166,16 @@ void GraphView::setGraphType(GraphType type)
_bounds = QRectF(); _bounds = QRectF();
for (int i = 0; i < _graphs.count(); i++) { for (int i = 0; i < _graphs.count(); i++) {
_graphs.at(i)->setGraphType(type); GraphItem *gi = _graphs.at(i);
if (_graphs.at(i)->scene() == _scene) gi->setGraphType(type);
_bounds |= _graphs.at(i)->bounds(); if (!_hide.contains(gi->id())) {
if (gi->bounds().width() > 0)
addItem(gi);
else
removeItem(gi);
}
if (gi->scene() == _scene)
_bounds |= gi->bounds();
} }
if (type == Distance) if (type == Distance)
@ -204,8 +214,10 @@ void GraphView::addGraph(GraphItem *graph, int id)
if (!_hide.contains(id)) { if (!_hide.contains(id)) {
_visible.append(graph); _visible.append(graph);
_scene->addItem(graph); if (graph->bounds().width() > 0) {
_bounds |= graph->bounds(); _scene->addItem(graph);
_bounds |= graph->bounds();
}
setXUnits(); setXUnits();
} }
} }
@ -232,13 +244,15 @@ void GraphView::showGraph(bool show, int id)
_visible.clear(); _visible.clear();
_bounds = QRectF(); _bounds = QRectF();
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);
if (_hide.contains(gi->id())) if (_hide.contains(gi->id()))
removeItem(gi); removeItem(gi);
else { else {
addItem(gi);
_visible.append(gi); _visible.append(gi);
_bounds |= gi->bounds(); if (gi->bounds().width() > 0) {
addItem(gi);
_bounds |= gi->bounds();
}
} }
} }
} }
@ -252,7 +266,8 @@ QRectF GraphView::bounds() const
void GraphView::redraw() void GraphView::redraw()
{ {
redraw(viewport()->size() - QSizeF(MARGIN, MARGIN)); if (!_graphs.isEmpty())
redraw(viewport()->size() - QSizeF(MARGIN, MARGIN));
} }
void GraphView::redraw(const QSizeF &size) void GraphView::redraw(const QSizeF &size)
@ -263,16 +278,18 @@ void GraphView::redraw(const QSizeF &size)
qreal sx, sy; qreal sx, sy;
if (_visible.isEmpty() || _bounds.isNull()) { if (_bounds.isNull()) {
removeItem(_xAxis); removeItem(_xAxis);
removeItem(_yAxis); removeItem(_yAxis);
removeItem(_slider); removeItem(_slider);
removeItem(_info); removeItem(_info);
removeItem(_grid); removeItem(_grid);
_scene->setSceneRect(QRectF()); addItem(_message);
_scene->setSceneRect(_scene->itemsBoundingRect());
return; return;
} }
removeItem(_message);
addItem(_xAxis); addItem(_xAxis);
addItem(_yAxis); addItem(_yAxis);
addItem(_slider); addItem(_slider);
@ -330,9 +347,11 @@ void GraphView::redraw(const QSizeF &size)
_scene->setSceneRect(_scene->itemsBoundingRect()); _scene->setSceneRect(_scene->itemsBoundingRect());
} }
void GraphView::resizeEvent(QResizeEvent *) void GraphView::resizeEvent(QResizeEvent *e)
{ {
redraw(); redraw(e->size() - QSizeF(MARGIN, MARGIN));
QGraphicsView::resizeEvent(e);
} }
void GraphView::mousePressEvent(QMouseEvent *e) void GraphView::mousePressEvent(QMouseEvent *e)
@ -395,8 +414,10 @@ void GraphView::updateSliderPosition()
void GraphView::updateSliderInfo() void GraphView::updateSliderInfo()
{ {
QLocale l(QLocale::system());
qreal r, y; qreal r, y;
if (_visible.count() > 1) { if (_visible.count() > 1) {
r = 0; r = 0;
y = 0; y = 0;
@ -417,9 +438,9 @@ void GraphView::updateSliderInfo()
_sliderInfo->setSide(s); _sliderInfo->setSide(s);
_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) : QString::number(_sliderPos * _xScale, 'f', 1) bounds().width() > 3600) : l.toString(_sliderPos * _xScale, 'f', 1)
+ UNIT_SPACE + _xUnits, (_visible.count() > 1) ? QString() + UNIT_SPACE + _xUnits, (_visible.count() > 1) ? QString()
: QString::number(-y * _yScale + _yOffset, 'f', _precision) + UNIT_SPACE : l.toString(-y * _yScale + _yOffset, 'f', _precision) + UNIT_SPACE
+ _yUnits); + _yUnits);
} }

View File

@ -7,15 +7,16 @@
#include "data/graph.h" #include "data/graph.h"
#include "palette.h" #include "palette.h"
#include "units.h" #include "units.h"
#include "infoitem.h"
class AxisItem; class AxisItem;
class SliderItem; class SliderItem;
class SliderInfoItem; class SliderInfoItem;
class InfoItem;
class GraphItem; class GraphItem;
class PathItem; class PathItem;
class GridItem; class GridItem;
class QGraphicsSimpleTextItem;
class GraphView : public QGraphicsView class GraphView : public QGraphicsView
{ {
@ -26,6 +27,7 @@ public:
~GraphView(); ~GraphView();
bool isEmpty() const {return _graphs.isEmpty();} bool isEmpty() const {return _graphs.isEmpty();}
const QList<KV> &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);
@ -64,7 +66,6 @@ protected:
QRectF bounds() const; QRectF bounds() const;
void redraw(); void redraw();
void redraw(const QSizeF &size);
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 skipColor() {_palette.nextColor();}
@ -77,6 +78,7 @@ private slots:
void newSliderPosition(const QPointF &pos); void newSliderPosition(const QPointF &pos);
private: private:
void redraw(const QSizeF &size);
void setXUnits(); void setXUnits();
void createXLabel(); void createXLabel();
void createYLabel(); void createYLabel();
@ -85,8 +87,8 @@ private:
void removeItem(QGraphicsItem *item); void removeItem(QGraphicsItem *item);
void addItem(QGraphicsItem *item); void addItem(QGraphicsItem *item);
void resizeEvent(QResizeEvent *); void resizeEvent(QResizeEvent *e);
void mousePressEvent(QMouseEvent *); void mousePressEvent(QMouseEvent *e);
Units _units; Units _units;
qreal _xScale, _yScale; qreal _xScale, _yScale;
@ -104,6 +106,7 @@ private:
SliderInfoItem *_sliderInfo; SliderInfoItem *_sliderInfo;
InfoItem *_info; InfoItem *_info;
GridItem *_grid; GridItem *_grid;
QGraphicsSimpleTextItem *_message;
QList<GraphItem*> _visible; QList<GraphItem*> _visible;
QSet<int> _hide; QSet<int> _hide;

View File

@ -1,3 +1,4 @@
#include "config.h"
#include <QApplication> #include <QApplication>
#include <QSplitter> #include <QSplitter>
#include <QVBoxLayout> #include <QVBoxLayout>
@ -22,11 +23,16 @@
#include <QMimeData> #include <QMimeData>
#include <QUrl> #include <QUrl>
#include <QPixmapCache> #include <QPixmapCache>
#ifdef ENABLE_HIDPI
#include <QWindow>
#include <QScreen>
#endif // ENABLE_HIDPI
#include <QStyle>
#include "data/data.h" #include "data/data.h"
#include "data/poi.h"
#include "map/maplist.h" #include "map/maplist.h"
#include "map/emptymap.h" #include "map/emptymap.h"
#include "map/downloader.h" #include "map/downloader.h"
#include "config.h"
#include "icons.h" #include "icons.h"
#include "keys.h" #include "keys.h"
#include "settings.h" #include "settings.h"
@ -36,6 +42,7 @@
#include "temperaturegraph.h" #include "temperaturegraph.h"
#include "cadencegraph.h" #include "cadencegraph.h"
#include "powergraph.h" #include "powergraph.h"
#include "gearratiograph.h"
#include "mapview.h" #include "mapview.h"
#include "trackinfo.h" #include "trackinfo.h"
#include "filebrowser.h" #include "filebrowser.h"
@ -46,6 +53,8 @@
#include "gui.h" #include "gui.h"
#define TOOLBAR_ICON_SIZE 22
GUI::GUI() GUI::GUI()
{ {
loadMaps(); loadMaps();
@ -70,7 +79,7 @@ GUI::GUI()
_splitter->setStretchFactor(1, 1); _splitter->setStretchFactor(1, 1);
setCentralWidget(_splitter); setCentralWidget(_splitter);
setWindowIcon(QIcon(QPixmap(APP_ICON))); setWindowIcon(QIcon(APP_ICON));
setWindowTitle(APP_NAME); setWindowTitle(APP_NAME);
setUnifiedTitleAndToolBarOnMac(true); setUnifiedTitleAndToolBarOnMac(true);
setAcceptDrops(true); setAcceptDrops(true);
@ -96,14 +105,6 @@ GUI::GUI()
updateStatusBarInfo(); updateStatusBarInfo();
} }
GUI::~GUI()
{
for (int i = 0; i < _tabs.size(); i++) {
if (_graphTabWidget->indexOf(_tabs.at(i)) < 0)
delete _tabs.at(i);
}
}
void GUI::loadMaps() void GUI::loadMaps()
{ {
_ml = new MapList(this); _ml = new MapList(this);
@ -148,6 +149,7 @@ void GUI::createMapActions()
for (int i = 0; i < _ml->maps().count(); i++) { for (int i = 0; i < _ml->maps().count(); i++) {
QAction *a = new QAction(_ml->maps().at(i)->name(), this); QAction *a = new QAction(_ml->maps().at(i)->name(), this);
a->setMenuRole(QAction::NoRole);
a->setCheckable(true); a->setCheckable(true);
a->setActionGroup(_mapsActionGroup); a->setActionGroup(_mapsActionGroup);
@ -176,6 +178,7 @@ QAction *GUI::createPOIFileAction(int index)
{ {
QAction *a = new QAction(QFileInfo(_poi->files().at(index)).fileName(), QAction *a = new QAction(QFileInfo(_poi->files().at(index)).fileName(),
this); this);
a->setMenuRole(QAction::NoRole);
a->setCheckable(true); a->setCheckable(true);
_poiFilesSignalMapper->setMapping(a, index); _poiFilesSignalMapper->setMapping(a, index);
@ -199,7 +202,7 @@ void GUI::createActions()
_navigationActionGroup->setEnabled(false); _navigationActionGroup->setEnabled(false);
// General actions // General actions
_exitAction = new QAction(QIcon(QPixmap(QUIT_ICON)), tr("Quit"), this); _exitAction = new QAction(QIcon(QUIT_ICON), tr("Quit"), this);
_exitAction->setShortcut(QUIT_SHORTCUT); _exitAction->setShortcut(QUIT_SHORTCUT);
_exitAction->setMenuRole(QAction::QuitRole); _exitAction->setMenuRole(QAction::QuitRole);
connect(_exitAction, SIGNAL(triggered()), this, SLOT(close())); connect(_exitAction, SIGNAL(triggered()), this, SLOT(close()));
@ -207,61 +210,75 @@ void GUI::createActions()
// Help & About // Help & About
_pathsAction = new QAction(tr("Paths"), this); _pathsAction = new QAction(tr("Paths"), this);
_pathsAction->setMenuRole(QAction::NoRole);
connect(_pathsAction, SIGNAL(triggered()), this, SLOT(paths())); connect(_pathsAction, SIGNAL(triggered()), this, SLOT(paths()));
_keysAction = new QAction(tr("Keyboard controls"), this); _keysAction = new QAction(tr("Keyboard controls"), this);
_keysAction->setMenuRole(QAction::NoRole);
connect(_keysAction, SIGNAL(triggered()), this, SLOT(keys())); connect(_keysAction, SIGNAL(triggered()), this, SLOT(keys()));
_aboutAction = new QAction(QIcon(QPixmap(APP_ICON)), _aboutAction = new QAction(QIcon(APP_ICON), tr("About GPXSee"), this);
tr("About GPXSee"), this);
_aboutAction->setMenuRole(QAction::AboutRole); _aboutAction->setMenuRole(QAction::AboutRole);
connect(_aboutAction, SIGNAL(triggered()), this, SLOT(about())); connect(_aboutAction, SIGNAL(triggered()), this, SLOT(about()));
// File actions // File actions
_openFileAction = new QAction(QIcon(QPixmap(OPEN_FILE_ICON)), _openFileAction = new QAction(QIcon(OPEN_FILE_ICON), tr("Open..."), this);
tr("Open..."), this); _openFileAction->setMenuRole(QAction::NoRole);
_openFileAction->setShortcut(OPEN_SHORTCUT); _openFileAction->setShortcut(OPEN_SHORTCUT);
connect(_openFileAction, SIGNAL(triggered()), this, SLOT(openFile())); connect(_openFileAction, SIGNAL(triggered()), this, SLOT(openFile()));
addAction(_openFileAction); addAction(_openFileAction);
_printFileAction = new QAction(QIcon(QPixmap(PRINT_FILE_ICON)), _printFileAction = new QAction(QIcon(PRINT_FILE_ICON), tr("Print..."),
tr("Print..."), this); this);
_printFileAction->setMenuRole(QAction::NoRole);
_printFileAction->setActionGroup(_fileActionGroup); _printFileAction->setActionGroup(_fileActionGroup);
connect(_printFileAction, SIGNAL(triggered()), this, SLOT(printFile())); connect(_printFileAction, SIGNAL(triggered()), this, SLOT(printFile()));
addAction(_printFileAction); addAction(_printFileAction);
_exportFileAction = new QAction(QIcon(QPixmap(EXPORT_FILE_ICON)), _exportFileAction = new QAction(QIcon(EXPORT_FILE_ICON),
tr("Export to PDF..."), this); tr("Export to PDF..."), this);
_exportFileAction->setMenuRole(QAction::NoRole);
_exportFileAction->setShortcut(EXPORT_SHORTCUT); _exportFileAction->setShortcut(EXPORT_SHORTCUT);
_exportFileAction->setActionGroup(_fileActionGroup); _exportFileAction->setActionGroup(_fileActionGroup);
connect(_exportFileAction, SIGNAL(triggered()), this, SLOT(exportFile())); connect(_exportFileAction, SIGNAL(triggered()), this, SLOT(exportFile()));
addAction(_exportFileAction); addAction(_exportFileAction);
_closeFileAction = new QAction(QIcon(QPixmap(CLOSE_FILE_ICON)), _closeFileAction = new QAction(QIcon(CLOSE_FILE_ICON), tr("Close"), this);
tr("Close"), this); _closeFileAction->setMenuRole(QAction::NoRole);
_closeFileAction->setShortcut(CLOSE_SHORTCUT); _closeFileAction->setShortcut(CLOSE_SHORTCUT);
_closeFileAction->setActionGroup(_fileActionGroup); _closeFileAction->setActionGroup(_fileActionGroup);
connect(_closeFileAction, SIGNAL(triggered()), this, SLOT(closeAll())); connect(_closeFileAction, SIGNAL(triggered()), this, SLOT(closeAll()));
addAction(_closeFileAction); addAction(_closeFileAction);
_reloadFileAction = new QAction(QIcon(QPixmap(RELOAD_FILE_ICON)), _reloadFileAction = new QAction(QIcon(RELOAD_FILE_ICON), tr("Reload"),
tr("Reload"), this); this);
_reloadFileAction->setMenuRole(QAction::NoRole);
_reloadFileAction->setShortcut(RELOAD_SHORTCUT); _reloadFileAction->setShortcut(RELOAD_SHORTCUT);
_reloadFileAction->setActionGroup(_fileActionGroup); _reloadFileAction->setActionGroup(_fileActionGroup);
connect(_reloadFileAction, SIGNAL(triggered()), this, SLOT(reloadFile())); connect(_reloadFileAction, SIGNAL(triggered()), this, SLOT(reloadFile()));
addAction(_reloadFileAction); addAction(_reloadFileAction);
_statisticsAction = new QAction(tr("Statistics..."), this);
_statisticsAction->setMenuRole(QAction::NoRole);
_statisticsAction->setShortcut(STATISTICS_SHORTCUT);
_statisticsAction->setActionGroup(_fileActionGroup);
connect(_statisticsAction, SIGNAL(triggered()), this, SLOT(statistics()));
addAction(_statisticsAction);
// POI actions // POI actions
_openPOIAction = new QAction(QIcon(QPixmap(OPEN_FILE_ICON)), _openPOIAction = new QAction(QIcon(OPEN_FILE_ICON), tr("Load POI file..."),
tr("Load POI file..."), this); this);
_openPOIAction->setMenuRole(QAction::NoRole);
connect(_openPOIAction, SIGNAL(triggered()), this, SLOT(openPOIFile())); connect(_openPOIAction, SIGNAL(triggered()), this, SLOT(openPOIFile()));
_closePOIAction = new QAction(QIcon(QPixmap(CLOSE_FILE_ICON)), _closePOIAction = new QAction(QIcon(CLOSE_FILE_ICON), tr("Close POI files"),
tr("Close POI files"), this); this);
_closePOIAction->setMenuRole(QAction::NoRole);
connect(_closePOIAction, SIGNAL(triggered()), this, SLOT(closePOIFiles())); connect(_closePOIAction, SIGNAL(triggered()), this, SLOT(closePOIFiles()));
_overlapPOIAction = new QAction(tr("Overlap POIs"), this); _overlapPOIAction = new QAction(tr("Overlap POIs"), this);
_overlapPOIAction->setMenuRole(QAction::NoRole);
_overlapPOIAction->setCheckable(true); _overlapPOIAction->setCheckable(true);
connect(_overlapPOIAction, SIGNAL(triggered(bool)), _mapView, connect(_overlapPOIAction, SIGNAL(triggered(bool)), _mapView,
SLOT(setPOIOverlap(bool))); SLOT(setPOIOverlap(bool)));
_showPOILabelsAction = new QAction(tr("Show POI labels"), this); _showPOILabelsAction = new QAction(tr("Show POI labels"), this);
_showPOILabelsAction->setMenuRole(QAction::NoRole);
_showPOILabelsAction->setCheckable(true); _showPOILabelsAction->setCheckable(true);
connect(_showPOILabelsAction, SIGNAL(triggered(bool)), _mapView, connect(_showPOILabelsAction, SIGNAL(triggered(bool)), _mapView,
SLOT(showPOILabels(bool))); SLOT(showPOILabels(bool)));
_showPOIAction = new QAction(QIcon(QPixmap(SHOW_POI_ICON)), _showPOIAction = new QAction(QIcon(SHOW_POI_ICON), tr("Show POIs"), this);
tr("Show POIs"), this); _showPOIAction->setMenuRole(QAction::NoRole);
_showPOIAction->setCheckable(true); _showPOIAction->setCheckable(true);
_showPOIAction->setShortcut(SHOW_POI_SHORTCUT); _showPOIAction->setShortcut(SHOW_POI_SHORTCUT);
connect(_showPOIAction, SIGNAL(triggered(bool)), _mapView, connect(_showPOIAction, SIGNAL(triggered(bool)), _mapView,
@ -270,25 +287,30 @@ void GUI::createActions()
createPOIFilesActions(); createPOIFilesActions();
// Map actions // Map actions
_showMapAction = new QAction(QIcon(QPixmap(SHOW_MAP_ICON)), tr("Show map"), _showMapAction = new QAction(QIcon(SHOW_MAP_ICON), tr("Show map"),
this); this);
_showMapAction->setMenuRole(QAction::NoRole);
_showMapAction->setCheckable(true); _showMapAction->setCheckable(true);
_showMapAction->setShortcut(SHOW_MAP_SHORTCUT); _showMapAction->setShortcut(SHOW_MAP_SHORTCUT);
connect(_showMapAction, SIGNAL(triggered(bool)), _mapView, connect(_showMapAction, SIGNAL(triggered(bool)), _mapView,
SLOT(showMap(bool))); SLOT(showMap(bool)));
addAction(_showMapAction); addAction(_showMapAction);
_loadMapAction = new QAction(QIcon(QPixmap(OPEN_FILE_ICON)), _loadMapAction = new QAction(QIcon(OPEN_FILE_ICON), tr("Load map..."),
tr("Load map..."), this); this);
_loadMapAction->setMenuRole(QAction::NoRole);
connect(_loadMapAction, SIGNAL(triggered()), this, SLOT(loadMap())); connect(_loadMapAction, SIGNAL(triggered()), this, SLOT(loadMap()));
_clearMapCacheAction = new QAction(tr("Clear tile cache"), this); _clearMapCacheAction = new QAction(tr("Clear tile cache"), this);
_clearMapCacheAction->setMenuRole(QAction::NoRole);
connect(_clearMapCacheAction, SIGNAL(triggered()), _mapView, connect(_clearMapCacheAction, SIGNAL(triggered()), _mapView,
SLOT(clearMapCache())); SLOT(clearMapCache()));
createMapActions(); createMapActions();
_nextMapAction = new QAction(tr("Next map"), this); _nextMapAction = new QAction(tr("Next map"), this);
_nextMapAction->setMenuRole(QAction::NoRole);
_nextMapAction->setShortcut(NEXT_MAP_SHORTCUT); _nextMapAction->setShortcut(NEXT_MAP_SHORTCUT);
connect(_nextMapAction, SIGNAL(triggered()), this, SLOT(nextMap())); connect(_nextMapAction, SIGNAL(triggered()), this, SLOT(nextMap()));
addAction(_nextMapAction); addAction(_nextMapAction);
_prevMapAction = new QAction(tr("Next map"), this); _prevMapAction = new QAction(tr("Next map"), this);
_prevMapAction->setMenuRole(QAction::NoRole);
_prevMapAction->setShortcut(PREV_MAP_SHORTCUT); _prevMapAction->setShortcut(PREV_MAP_SHORTCUT);
connect(_prevMapAction, SIGNAL(triggered()), this, SLOT(prevMap())); connect(_prevMapAction, SIGNAL(triggered()), this, SLOT(prevMap()));
addAction(_prevMapAction); addAction(_prevMapAction);
@ -299,29 +321,35 @@ void GUI::createActions()
// Data actions // Data actions
_showTracksAction = new QAction(tr("Show tracks"), this); _showTracksAction = new QAction(tr("Show tracks"), this);
_showTracksAction->setMenuRole(QAction::NoRole);
_showTracksAction->setCheckable(true); _showTracksAction->setCheckable(true);
connect(_showTracksAction, SIGNAL(triggered(bool)), this, connect(_showTracksAction, SIGNAL(triggered(bool)), this,
SLOT(showTracks(bool))); SLOT(showTracks(bool)));
_showRoutesAction = new QAction(tr("Show routes"), this); _showRoutesAction = new QAction(tr("Show routes"), this);
_showRoutesAction->setMenuRole(QAction::NoRole);
_showRoutesAction->setCheckable(true); _showRoutesAction->setCheckable(true);
connect(_showRoutesAction, SIGNAL(triggered(bool)), this, connect(_showRoutesAction, SIGNAL(triggered(bool)), this,
SLOT(showRoutes(bool))); SLOT(showRoutes(bool)));
_showWaypointsAction = new QAction(tr("Show waypoints"), this); _showWaypointsAction = new QAction(tr("Show waypoints"), this);
_showWaypointsAction->setMenuRole(QAction::NoRole);
_showWaypointsAction->setCheckable(true); _showWaypointsAction->setCheckable(true);
connect(_showWaypointsAction, SIGNAL(triggered(bool)), _mapView, connect(_showWaypointsAction, SIGNAL(triggered(bool)), _mapView,
SLOT(showWaypoints(bool))); SLOT(showWaypoints(bool)));
_showWaypointLabelsAction = new QAction(tr("Waypoint labels"), this); _showWaypointLabelsAction = new QAction(tr("Waypoint labels"), this);
_showWaypointLabelsAction->setMenuRole(QAction::NoRole);
_showWaypointLabelsAction->setCheckable(true); _showWaypointLabelsAction->setCheckable(true);
connect(_showWaypointLabelsAction, SIGNAL(triggered(bool)), _mapView, connect(_showWaypointLabelsAction, SIGNAL(triggered(bool)), _mapView,
SLOT(showWaypointLabels(bool))); SLOT(showWaypointLabels(bool)));
_showRouteWaypointsAction = new QAction(tr("Route waypoints"), this); _showRouteWaypointsAction = new QAction(tr("Route waypoints"), this);
_showRouteWaypointsAction->setMenuRole(QAction::NoRole);
_showRouteWaypointsAction->setCheckable(true); _showRouteWaypointsAction->setCheckable(true);
connect(_showRouteWaypointsAction, SIGNAL(triggered(bool)), _mapView, connect(_showRouteWaypointsAction, SIGNAL(triggered(bool)), _mapView,
SLOT(showRouteWaypoints(bool))); SLOT(showRouteWaypoints(bool)));
// Graph actions // Graph actions
_showGraphsAction = new QAction(QIcon(QPixmap(SHOW_GRAPHS_ICON)), _showGraphsAction = new QAction(QIcon(SHOW_GRAPHS_ICON), tr("Show graphs"),
tr("Show graphs"), this); this);
_showGraphsAction->setMenuRole(QAction::NoRole);
_showGraphsAction->setCheckable(true); _showGraphsAction->setCheckable(true);
_showGraphsAction->setShortcut(SHOW_GRAPHS_SHORTCUT); _showGraphsAction->setShortcut(SHOW_GRAPHS_SHORTCUT);
connect(_showGraphsAction, SIGNAL(triggered(bool)), this, connect(_showGraphsAction, SIGNAL(triggered(bool)), this,
@ -330,39 +358,46 @@ void GUI::createActions()
ag = new QActionGroup(this); ag = new QActionGroup(this);
ag->setExclusive(true); ag->setExclusive(true);
_distanceGraphAction = new QAction(tr("Distance"), this); _distanceGraphAction = new QAction(tr("Distance"), this);
_distanceGraphAction->setMenuRole(QAction::NoRole);
_distanceGraphAction->setCheckable(true); _distanceGraphAction->setCheckable(true);
_distanceGraphAction->setActionGroup(ag); _distanceGraphAction->setActionGroup(ag);
connect(_distanceGraphAction, SIGNAL(triggered()), this, connect(_distanceGraphAction, SIGNAL(triggered()), this,
SLOT(setDistanceGraph())); SLOT(setDistanceGraph()));
addAction(_distanceGraphAction); addAction(_distanceGraphAction);
_timeGraphAction = new QAction(tr("Time"), this); _timeGraphAction = new QAction(tr("Time"), this);
_timeGraphAction->setMenuRole(QAction::NoRole);
_timeGraphAction->setCheckable(true); _timeGraphAction->setCheckable(true);
_timeGraphAction->setActionGroup(ag); _timeGraphAction->setActionGroup(ag);
connect(_timeGraphAction, SIGNAL(triggered()), this, connect(_timeGraphAction, SIGNAL(triggered()), this,
SLOT(setTimeGraph())); SLOT(setTimeGraph()));
addAction(_timeGraphAction); addAction(_timeGraphAction);
_showGraphGridAction = new QAction(tr("Show grid"), this); _showGraphGridAction = new QAction(tr("Show grid"), this);
_showGraphGridAction->setMenuRole(QAction::NoRole);
_showGraphGridAction->setCheckable(true); _showGraphGridAction->setCheckable(true);
connect(_showGraphGridAction, SIGNAL(triggered(bool)), this, connect(_showGraphGridAction, SIGNAL(triggered(bool)), this,
SLOT(showGraphGrids(bool))); SLOT(showGraphGrids(bool)));
_showGraphSliderInfoAction = new QAction(tr("Show slider info"), this); _showGraphSliderInfoAction = new QAction(tr("Show slider info"), this);
_showGraphSliderInfoAction->setMenuRole(QAction::NoRole);
_showGraphSliderInfoAction->setCheckable(true); _showGraphSliderInfoAction->setCheckable(true);
connect(_showGraphSliderInfoAction, SIGNAL(triggered(bool)), this, connect(_showGraphSliderInfoAction, SIGNAL(triggered(bool)), this,
SLOT(showGraphSliderInfo(bool))); SLOT(showGraphSliderInfo(bool)));
// Settings actions // Settings actions
_showToolbarsAction = new QAction(tr("Show toolbars"), this); _showToolbarsAction = new QAction(tr("Show toolbars"), this);
_showToolbarsAction->setMenuRole(QAction::NoRole);
_showToolbarsAction->setCheckable(true); _showToolbarsAction->setCheckable(true);
connect(_showToolbarsAction, SIGNAL(triggered(bool)), this, connect(_showToolbarsAction, SIGNAL(triggered(bool)), this,
SLOT(showToolbars(bool))); SLOT(showToolbars(bool)));
ag = new QActionGroup(this); ag = new QActionGroup(this);
ag->setExclusive(true); ag->setExclusive(true);
_totalTimeAction = new QAction(tr("Total time"), this); _totalTimeAction = new QAction(tr("Total time"), this);
_totalTimeAction->setMenuRole(QAction::NoRole);
_totalTimeAction->setCheckable(true); _totalTimeAction->setCheckable(true);
_totalTimeAction->setActionGroup(ag); _totalTimeAction->setActionGroup(ag);
connect(_totalTimeAction, SIGNAL(triggered()), this, connect(_totalTimeAction, SIGNAL(triggered()), this,
SLOT(setTotalTime())); SLOT(setTotalTime()));
_movingTimeAction = new QAction(tr("Moving time"), this); _movingTimeAction = new QAction(tr("Moving time"), this);
_movingTimeAction->setMenuRole(QAction::NoRole);
_movingTimeAction->setCheckable(true); _movingTimeAction->setCheckable(true);
_movingTimeAction->setActionGroup(ag); _movingTimeAction->setActionGroup(ag);
connect(_movingTimeAction, SIGNAL(triggered()), this, connect(_movingTimeAction, SIGNAL(triggered()), this,
@ -370,16 +405,19 @@ void GUI::createActions()
ag = new QActionGroup(this); ag = new QActionGroup(this);
ag->setExclusive(true); ag->setExclusive(true);
_metricUnitsAction = new QAction(tr("Metric"), this); _metricUnitsAction = new QAction(tr("Metric"), this);
_metricUnitsAction->setMenuRole(QAction::NoRole);
_metricUnitsAction->setCheckable(true); _metricUnitsAction->setCheckable(true);
_metricUnitsAction->setActionGroup(ag); _metricUnitsAction->setActionGroup(ag);
connect(_metricUnitsAction, SIGNAL(triggered()), this, connect(_metricUnitsAction, SIGNAL(triggered()), this,
SLOT(setMetricUnits())); SLOT(setMetricUnits()));
_imperialUnitsAction = new QAction(tr("Imperial"), this); _imperialUnitsAction = new QAction(tr("Imperial"), this);
_imperialUnitsAction->setMenuRole(QAction::NoRole);
_imperialUnitsAction->setCheckable(true); _imperialUnitsAction->setCheckable(true);
_imperialUnitsAction->setActionGroup(ag); _imperialUnitsAction->setActionGroup(ag);
connect(_imperialUnitsAction, SIGNAL(triggered()), this, connect(_imperialUnitsAction, SIGNAL(triggered()), this,
SLOT(setImperialUnits())); SLOT(setImperialUnits()));
_nauticalUnitsAction = new QAction(tr("Nautical"), this); _nauticalUnitsAction = new QAction(tr("Nautical"), this);
_nauticalUnitsAction->setMenuRole(QAction::NoRole);
_nauticalUnitsAction->setCheckable(true); _nauticalUnitsAction->setCheckable(true);
_nauticalUnitsAction->setActionGroup(ag); _nauticalUnitsAction->setActionGroup(ag);
connect(_nauticalUnitsAction, SIGNAL(triggered()), this, connect(_nauticalUnitsAction, SIGNAL(triggered()), this,
@ -387,22 +425,26 @@ void GUI::createActions()
ag = new QActionGroup(this); ag = new QActionGroup(this);
ag->setExclusive(true); ag->setExclusive(true);
_decimalDegreesAction = new QAction(tr("Decimal degrees (DD)"), this); _decimalDegreesAction = new QAction(tr("Decimal degrees (DD)"), this);
_decimalDegreesAction->setMenuRole(QAction::NoRole);
_decimalDegreesAction->setCheckable(true); _decimalDegreesAction->setCheckable(true);
_decimalDegreesAction->setActionGroup(ag); _decimalDegreesAction->setActionGroup(ag);
connect(_decimalDegreesAction, SIGNAL(triggered()), this, connect(_decimalDegreesAction, SIGNAL(triggered()), this,
SLOT(setDecimalDegrees())); SLOT(setDecimalDegrees()));
_degreesMinutesAction = new QAction(tr("Degrees and decimal minutes (DMM)"), _degreesMinutesAction = new QAction(tr("Degrees and decimal minutes (DMM)"),
this); this);
_degreesMinutesAction->setMenuRole(QAction::NoRole);
_degreesMinutesAction->setCheckable(true); _degreesMinutesAction->setCheckable(true);
_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->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(QPixmap(FULLSCREEN_ICON)), _fullscreenAction = new QAction(QIcon(FULLSCREEN_ICON),
tr("Fullscreen mode"), this); tr("Fullscreen mode"), this);
_fullscreenAction->setMenuRole(QAction::NoRole);
_fullscreenAction->setCheckable(true); _fullscreenAction->setCheckable(true);
_fullscreenAction->setShortcut(FULLSCREEN_SHORTCUT); _fullscreenAction->setShortcut(FULLSCREEN_SHORTCUT);
connect(_fullscreenAction, SIGNAL(triggered(bool)), this, connect(_fullscreenAction, SIGNAL(triggered(bool)), this,
@ -414,18 +456,20 @@ void GUI::createActions()
SLOT(openOptions())); SLOT(openOptions()));
// Navigation actions // Navigation actions
_nextAction = new QAction(QIcon(QPixmap(NEXT_FILE_ICON)), tr("Next"), this); _nextAction = new QAction(QIcon(NEXT_FILE_ICON), tr("Next"), this);
_nextAction->setActionGroup(_navigationActionGroup); _nextAction->setActionGroup(_navigationActionGroup);
_nextAction->setMenuRole(QAction::NoRole);
connect(_nextAction, SIGNAL(triggered()), this, SLOT(next())); connect(_nextAction, SIGNAL(triggered()), this, SLOT(next()));
_prevAction = new QAction(QIcon(QPixmap(PREV_FILE_ICON)), tr("Previous"), _prevAction = new QAction(QIcon(PREV_FILE_ICON), tr("Previous"), this);
this); _prevAction->setMenuRole(QAction::NoRole);
_prevAction->setActionGroup(_navigationActionGroup); _prevAction->setActionGroup(_navigationActionGroup);
connect(_prevAction, SIGNAL(triggered()), this, SLOT(prev())); connect(_prevAction, SIGNAL(triggered()), this, SLOT(prev()));
_lastAction = new QAction(QIcon(QPixmap(LAST_FILE_ICON)), tr("Last"), this); _lastAction = new QAction(QIcon(LAST_FILE_ICON), tr("Last"), this);
_lastAction->setMenuRole(QAction::NoRole);
_lastAction->setActionGroup(_navigationActionGroup); _lastAction->setActionGroup(_navigationActionGroup);
connect(_lastAction, SIGNAL(triggered()), this, SLOT(last())); connect(_lastAction, SIGNAL(triggered()), this, SLOT(last()));
_firstAction = new QAction(QIcon(QPixmap(FIRST_FILE_ICON)), tr("First"), _firstAction = new QAction(QIcon(FIRST_FILE_ICON), tr("First"), this);
this); _firstAction->setMenuRole(QAction::NoRole);
_firstAction->setActionGroup(_navigationActionGroup); _firstAction->setActionGroup(_navigationActionGroup);
connect(_firstAction, SIGNAL(triggered()), this, SLOT(first())); connect(_firstAction, SIGNAL(triggered()), this, SLOT(first()));
} }
@ -438,8 +482,9 @@ void GUI::createMenus()
fileMenu->addAction(_printFileAction); fileMenu->addAction(_printFileAction);
fileMenu->addAction(_exportFileAction); fileMenu->addAction(_exportFileAction);
fileMenu->addSeparator(); fileMenu->addSeparator();
fileMenu->addAction(_reloadFileAction); fileMenu->addAction(_statisticsAction);
fileMenu->addSeparator(); fileMenu->addSeparator();
fileMenu->addAction(_reloadFileAction);
fileMenu->addAction(_closeFileAction); fileMenu->addAction(_closeFileAction);
#ifndef Q_OS_MAC #ifndef Q_OS_MAC
fileMenu->addSeparator(); fileMenu->addSeparator();
@ -511,22 +556,28 @@ void GUI::createMenus()
void GUI::createToolBars() void GUI::createToolBars()
{ {
int is = style()->pixelMetric(QStyle::PM_ToolBarIconSize);
QSize iconSize(qMin(is, TOOLBAR_ICON_SIZE), qMin(is, TOOLBAR_ICON_SIZE));
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
setToolButtonStyle(Qt::ToolButtonTextUnderIcon); setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
#endif // Q_OS_MAC #endif // Q_OS_MAC
_fileToolBar = addToolBar(tr("File")); _fileToolBar = addToolBar(tr("File"));
_fileToolBar->setIconSize(iconSize);
_fileToolBar->addAction(_openFileAction); _fileToolBar->addAction(_openFileAction);
_fileToolBar->addAction(_reloadFileAction); _fileToolBar->addAction(_reloadFileAction);
_fileToolBar->addAction(_closeFileAction); _fileToolBar->addAction(_closeFileAction);
_fileToolBar->addAction(_printFileAction); _fileToolBar->addAction(_printFileAction);
_showToolBar = addToolBar(tr("Show")); _showToolBar = addToolBar(tr("Show"));
_showToolBar->setIconSize(iconSize);
_showToolBar->addAction(_showPOIAction); _showToolBar->addAction(_showPOIAction);
_showToolBar->addAction(_showMapAction); _showToolBar->addAction(_showMapAction);
_showToolBar->addAction(_showGraphsAction); _showToolBar->addAction(_showGraphsAction);
_navigationToolBar = addToolBar(tr("Navigation")); _navigationToolBar = addToolBar(tr("Navigation"));
_navigationToolBar->setIconSize(iconSize);
_navigationToolBar->addAction(_firstAction); _navigationToolBar->addAction(_firstAction);
_navigationToolBar->addAction(_prevAction); _navigationToolBar->addAction(_prevAction);
_navigationToolBar->addAction(_nextAction); _navigationToolBar->addAction(_nextAction);
@ -557,12 +608,13 @@ void GUI::createGraphTabs()
_graphTabWidget->setDocumentMode(true); _graphTabWidget->setDocumentMode(true);
#endif // Q_OS_WIN32 #endif // Q_OS_WIN32
_tabs.append(new ElevationGraph); _tabs.append(new ElevationGraph(_graphTabWidget));
_tabs.append(new SpeedGraph); _tabs.append(new SpeedGraph(_graphTabWidget));
_tabs.append(new HeartRateGraph); _tabs.append(new HeartRateGraph(_graphTabWidget));
_tabs.append(new CadenceGraph); _tabs.append(new CadenceGraph(_graphTabWidget));
_tabs.append(new PowerGraph); _tabs.append(new PowerGraph(_graphTabWidget));
_tabs.append(new TemperatureGraph); _tabs.append(new TemperatureGraph(_graphTabWidget));
_tabs.append(new GearRatioGraph(_graphTabWidget));
for (int i = 0; i < _tabs.count(); i++) for (int i = 0; i < _tabs.count(); i++)
connect(_tabs.at(i), SIGNAL(sliderPositionChanged(qreal)), this, connect(_tabs.at(i), SIGNAL(sliderPositionChanged(qreal)), this,
@ -646,19 +698,19 @@ void GUI::paths()
msgBox.setWindowTitle(tr("Paths")); msgBox.setWindowTitle(tr("Paths"));
msgBox.setText("<h3>" + tr("Paths") + "</h3>"); msgBox.setText("<h3>" + tr("Paths") + "</h3>");
msgBox.setInformativeText( msgBox.setInformativeText(
"<style>td {white-space: pre; padding-right: 1em;}</style>" "<style>td {white-space: pre; padding-right: 1em;}</style><h4>"
"<div><table><tr><td>" + tr("Map directory:") + "</td><td><code>" + tr("Global") + "</h4><table><tr><td>" + tr("Map directory:")
+ QDir::cleanPath(GLOBAL_MAP_DIR) + "</code></td></tr><tr><td>" + "</td><td><code>" + QDir::cleanPath(GLOBAL_MAP_DIR)
+ tr("POI directory:") + "</td><td><code>" + "</code></td></tr><tr><td>" + tr("POI directory:") + "</td><td><code>"
+ QDir::cleanPath(GLOBAL_POI_DIR) + "</code></td></tr><tr><td>" + QDir::cleanPath(GLOBAL_POI_DIR) + "</code></td></tr><tr><td>"
+ tr("GCS file:") + "</td><td><code>" + QDir::cleanPath(GLOBAL_GCS_FILE) + tr("GCS/PCS directory:") + "</td><td><code>"
+ "</code></td></tr><tr><td>" + tr("PCS file:") + "</td><td><code>" + QDir::cleanPath(GLOBAL_CSV_DIR) + "</code></td></tr></table>"
+ QDir::cleanPath(GLOBAL_PCS_FILE) + "</code></td></tr><tr><td>" + "<h4>" + tr("User-specific") + "</h4><table><tr><td>"
+ tr("Ellipsoids file:") + "</td><td><code>" + tr("Map directory:") + "</td><td><code>" + QDir::cleanPath(USER_MAP_DIR)
+ QDir::cleanPath(GLOBAL_ELLIPSOID_FILE) + "</code></td></tr>" + "</code></td></tr><tr><td>" + tr("POI directory:") + "</td><td><code>"
+ "<tr><td></td><td></td></tr></table></div><div><table><tr><td>" + QDir::cleanPath(USER_POI_DIR) + "</code></td></tr><tr><td>"
+ tr("User override directory:") + "</td><td><code>" + tr("GCS/PCS directory:") + "</td><td><code>"
+ QDir::cleanPath(USER_DIR) + "</td></tr></table></div>" + QDir::cleanPath(USER_CSV_DIR) + "</code></td></tr></table>"
); );
msgBox.exec(); msgBox.exec();
@ -867,6 +919,7 @@ void GUI::openOptions()
SET_TRACK_OPTION(outlierEliminate, setOutlierElimination); SET_TRACK_OPTION(outlierEliminate, setOutlierElimination);
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);
if (options.poiRadius != _options.poiRadius) if (options.poiRadius != _options.poiRadius)
_poi->setRadius(options.poiRadius); _poi->setRadius(options.poiRadius);
@ -874,6 +927,15 @@ void GUI::openOptions()
QPixmapCache::setCacheLimit(options.pixmapCache * 1024); QPixmapCache::setCacheLimit(options.pixmapCache * 1024);
if (options.connectionTimeout != _options.connectionTimeout) if (options.connectionTimeout != _options.connectionTimeout)
Downloader::setTimeout(options.connectionTimeout); Downloader::setTimeout(options.connectionTimeout);
#ifdef ENABLE_HTTP2
if (options.enableHTTP2 != _options.enableHTTP2)
Downloader::enableHTTP2(options.enableHTTP2);
#endif // ENABLE_HTTP2
#ifdef ENABLE_HIDPI
if (options.hidpiMap != _options.hidpiMap)
_mapView->setDevicePixelRatio(options.hidpiMap ? devicePixelRatioF()
: 1.0);
#endif // ENABLE_HIDPI
if (reload) if (reload)
reloadFile(); reloadFile();
@ -912,45 +974,112 @@ void GUI::exportFile()
plot(&printer); plot(&printer);
} }
void GUI::statistics()
{
QLocale l(QLocale::system());
#ifdef Q_OS_WIN32
QString text = "<style>td {white-space: pre; padding-right: 4em;}"
"th {text-align: left; padding-top: 0.5em;}</style><table>";
#else // Q_OS_WIN32
QString text = "<style>td {white-space: pre; padding-right: 2em;}"
"th {text-align: left; padding-top: 0.5em;}</style><table>";
#endif // Q_OS_WIN32
if (_showTracksAction->isChecked() && _trackCount > 1)
text.append("<tr><td>" + tr("Tracks") + ":</td><td>"
+ l.toString(_trackCount) + "</td></tr>");
if (_showRoutesAction->isChecked() && _routeCount > 1)
text.append("<tr><td>" + tr("Routes") + ":</td><td>"
+ l.toString(_routeCount) + "</td></tr>");
if (_showWaypointsAction->isChecked() && _waypointCount > 1)
text.append("<tr><td>" + tr("Waypoints") + ":</td><td>"
+ l.toString(_waypointCount) + "</td></tr>");
if (_dateRange.first.isValid()) {
if (_dateRange.first == _dateRange.second) {
QString format = l.dateFormat(QLocale::LongFormat);
text.append("<tr><td>" + tr("Date") + ":</td><td>"
+ _dateRange.first.toString(format) + "</td></tr>");
} else {
QString format = l.dateFormat(QLocale::ShortFormat);
text.append("<tr><td>" + tr("Date") + ":</td><td>"
+ QString("%1 - %2").arg(_dateRange.first.toString(format),
_dateRange.second.toString(format)) + "</td></tr>");
}
}
if (distance() > 0)
text.append("<tr><td>" + tr("Distance") + ":</td><td>"
+ Format::distance(distance(), units()) + "</td></tr>");
if (time() > 0) {
text.append("<tr><td>" + tr("Time") + ":</td><td>"
+ Format::timeSpan(time()) + "</td></tr>");
text.append("<tr><td>" + tr("Moving time") + ":</td><td>"
+ Format::timeSpan(movingTime()) + "</td></tr>");
}
for (int i = 0; i < _tabs.count(); i++) {
const GraphTab *tab = _tabs.at(i);
if (tab->isEmpty())
continue;
text.append("<tr><th colspan=\"2\">" + tab->label() + "</th></tr>");
for (int j = 0; j < tab->info().size(); j++) {
const KV &kv = tab->info().at(j);
text.append("<tr><td>" + kv.key() + ":</td><td>" + kv.value()
+ "</td></tr>");
}
}
text.append("</table>");
QMessageBox msgBox(this);
msgBox.setWindowTitle(tr("Statistics"));
msgBox.setText("<h3>" + tr("Statistics") + "</h3>");
msgBox.setInformativeText(text);
msgBox.exec();
}
void GUI::plot(QPrinter *printer) void GUI::plot(QPrinter *printer)
{ {
QLocale l(QLocale::system());
QPainter p(printer); QPainter p(printer);
TrackInfo info; TrackInfo info;
qreal ih, gh, mh, ratio; qreal ih, gh, mh, ratio;
qreal d = distance();
qreal t = time();
qreal tm = movingTime();
if (!_pathName.isNull() && _options.printName) if (!_pathName.isNull() && _options.printName)
info.insert(tr("Name"), _pathName); info.insert(tr("Name"), _pathName);
if (_options.printItemCount) { if (_options.printItemCount) {
if (_showTracksAction->isChecked() && _trackCount > 1) if (_showTracksAction->isChecked() && _trackCount > 1)
info.insert(tr("Tracks"), QString::number(_trackCount)); info.insert(tr("Tracks"), l.toString(_trackCount));
if (_showRoutesAction->isChecked() && _routeCount > 1) if (_showRoutesAction->isChecked() && _routeCount > 1)
info.insert(tr("Routes"), QString::number(_routeCount)); info.insert(tr("Routes"), l.toString(_routeCount));
if (_showWaypointsAction->isChecked() && _waypointCount > 2) if (_showWaypointsAction->isChecked() && _waypointCount > 1)
info.insert(tr("Waypoints"), QString::number(_waypointCount)); info.insert(tr("Waypoints"), l.toString(_waypointCount));
} }
if (_dateRange.first.isValid() && _options.printDate) { if (_dateRange.first.isValid() && _options.printDate) {
if (_dateRange.first == _dateRange.second) { if (_dateRange.first == _dateRange.second) {
QString format = QLocale::system().dateFormat(QLocale::LongFormat); QString format = l.dateFormat(QLocale::LongFormat);
info.insert(tr("Date"), _dateRange.first.toString(format)); info.insert(tr("Date"), _dateRange.first.toString(format));
} else { } else {
QString format = QLocale::system().dateFormat(QLocale::ShortFormat); QString format = l.dateFormat(QLocale::ShortFormat);
info.insert(tr("Date"), QString("%1 - %2") info.insert(tr("Date"), QString("%1 - %2")
.arg(_dateRange.first.toString(format), .arg(_dateRange.first.toString(format),
_dateRange.second.toString(format))); _dateRange.second.toString(format)));
} }
} }
if (d > 0 && _options.printDistance) if (distance() > 0 && _options.printDistance)
info.insert(tr("Distance"), Format::distance(d, units())); info.insert(tr("Distance"), Format::distance(distance(), units()));
if (t > 0 && _options.printTime) if (time() > 0 && _options.printTime)
info.insert(tr("Time"), Format::timeSpan(t)); info.insert(tr("Time"), Format::timeSpan(time()));
if (tm > 0 && _options.printMovingTime) if (movingTime() > 0 && _options.printMovingTime)
info.insert(tr("Moving time"), Format::timeSpan(tm)); info.insert(tr("Moving time"), Format::timeSpan(movingTime()));
qreal fsr = 1085.0 / (qMax(printer->width(), printer->height()) qreal fsr = 1085.0 / (qMax(printer->width(), printer->height())
/ (qreal)printer->resolution()); / (qreal)printer->resolution());
@ -1166,6 +1295,7 @@ bool GUI::loadMap(const QString &fileName)
if (_ml->loadFile(fileName)) { if (_ml->loadFile(fileName)) {
QAction *a = new QAction(_ml->maps().last()->name(), this); QAction *a = new QAction(_ml->maps().last()->name(), this);
a->setMenuRole(QAction::NoRole);
a->setCheckable(true); a->setCheckable(true);
a->setActionGroup(_mapsActionGroup); a->setActionGroup(_mapsActionGroup);
_mapsSignalMapper->setMapping(a, _ml->maps().size() - 1); _mapsSignalMapper->setMapping(a, _ml->maps().size() - 1);
@ -1638,10 +1768,16 @@ void GUI::writeSettings()
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)
settings.setValue(PAUSE_INTERVAL_SETTING, _options.pauseInterval); settings.setValue(PAUSE_INTERVAL_SETTING, _options.pauseInterval);
if (_options.useReportedSpeed != USE_REPORTED_SPEED_DEFAULT)
settings.setValue(USE_REPORTED_SPEED_SETTING, _options.useReportedSpeed);
if (_options.poiRadius != POI_RADIUS_DEFAULT) if (_options.poiRadius != POI_RADIUS_DEFAULT)
settings.setValue(POI_RADIUS_SETTING, _options.poiRadius); settings.setValue(POI_RADIUS_SETTING, _options.poiRadius);
if (_options.useOpenGL != USE_OPENGL_DEFAULT) if (_options.useOpenGL != USE_OPENGL_DEFAULT)
settings.setValue(USE_OPENGL_SETTING, _options.useOpenGL); settings.setValue(USE_OPENGL_SETTING, _options.useOpenGL);
#ifdef ENABLE_HTTP2
if (_options.enableHTTP2 != ENABLE_HTTP2_DEFAULT)
settings.setValue(ENABLE_HTTP2_SETTING, _options.enableHTTP2);
#endif // ENABLE_HTTP2
if (_options.pixmapCache != PIXMAP_CACHE_DEFAULT) if (_options.pixmapCache != PIXMAP_CACHE_DEFAULT)
settings.setValue(PIXMAP_CACHE_SETTING, _options.pixmapCache); settings.setValue(PIXMAP_CACHE_SETTING, _options.pixmapCache);
if (_options.connectionTimeout != CONNECTION_TIMEOUT_DEFAULT) if (_options.connectionTimeout != CONNECTION_TIMEOUT_DEFAULT)
@ -1667,6 +1803,10 @@ void GUI::writeSettings()
settings.setValue(SLIDER_COLOR_SETTING, _options.sliderColor); settings.setValue(SLIDER_COLOR_SETTING, _options.sliderColor);
if (_options.alwaysShowMap != ALWAYS_SHOW_MAP_DEFAULT) if (_options.alwaysShowMap != ALWAYS_SHOW_MAP_DEFAULT)
settings.setValue(ALWAYS_SHOW_MAP_SETTING, _options.alwaysShowMap); settings.setValue(ALWAYS_SHOW_MAP_SETTING, _options.alwaysShowMap);
#ifdef ENABLE_HIDPI
if (_options.hidpiMap != HIDPI_MAP_DEFAULT)
settings.setValue(HIDPI_MAP_SETTING, _options.hidpiMap);
#endif // ENABLE_HIDPI
settings.endGroup(); settings.endGroup();
} }
@ -1866,12 +2006,18 @@ void GUI::readSettings()
OUTLIER_ELIMINATE_DEFAULT).toBool(); OUTLIER_ELIMINATE_DEFAULT).toBool();
_options.pauseSpeed = settings.value(PAUSE_SPEED_SETTING, _options.pauseSpeed = settings.value(PAUSE_SPEED_SETTING,
PAUSE_SPEED_DEFAULT).toFloat(); PAUSE_SPEED_DEFAULT).toFloat();
_options.useReportedSpeed = settings.value(USE_REPORTED_SPEED_SETTING,
USE_REPORTED_SPEED_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)
.toInt(); .toInt();
_options.useOpenGL = settings.value(USE_OPENGL_SETTING, USE_OPENGL_DEFAULT) _options.useOpenGL = settings.value(USE_OPENGL_SETTING, USE_OPENGL_DEFAULT)
.toBool(); .toBool();
#ifdef ENABLE_HTTP2
_options.enableHTTP2 = settings.value(ENABLE_HTTP2_SETTING,
ENABLE_HTTP2_DEFAULT).toBool();
#endif // ENABLE_HTTP2
_options.pixmapCache = settings.value(PIXMAP_CACHE_SETTING, _options.pixmapCache = settings.value(PIXMAP_CACHE_SETTING,
PIXMAP_CACHE_DEFAULT).toInt(); PIXMAP_CACHE_DEFAULT).toInt();
_options.connectionTimeout = settings.value(CONNECTION_TIMEOUT_SETTING, _options.connectionTimeout = settings.value(CONNECTION_TIMEOUT_SETTING,
@ -1896,6 +2042,10 @@ void GUI::readSettings()
SLIDER_COLOR_DEFAULT).value<QColor>(); SLIDER_COLOR_DEFAULT).value<QColor>();
_options.alwaysShowMap = settings.value(ALWAYS_SHOW_MAP_SETTING, _options.alwaysShowMap = settings.value(ALWAYS_SHOW_MAP_SETTING,
ALWAYS_SHOW_MAP_DEFAULT).toBool(); ALWAYS_SHOW_MAP_DEFAULT).toBool();
#ifdef ENABLE_HIDPI
_options.hidpiMap = settings.value(HIDPI_MAP_SETTING, HIDPI_MAP_SETTING)
.toBool();
#endif // ENABLE_HIDPI
_mapView->setPalette(_options.palette); _mapView->setPalette(_options.palette);
_mapView->setMapOpacity(_options.mapOpacity); _mapView->setMapOpacity(_options.mapOpacity);
@ -1912,6 +2062,9 @@ void GUI::readSettings()
_mapView->setMarkerColor(_options.sliderColor); _mapView->setMarkerColor(_options.sliderColor);
if (_options.useOpenGL) if (_options.useOpenGL)
_mapView->useOpenGL(true); _mapView->useOpenGL(true);
#ifdef ENABLE_HIDPI
_mapView->setDevicePixelRatio(_options.hidpiMap ? devicePixelRatioF() : 1.0);
#endif // ENABLE_HIDPI
for (int i = 0; i < _tabs.count(); i++) { for (int i = 0; i < _tabs.count(); i++) {
_tabs.at(i)->setPalette(_options.palette); _tabs.at(i)->setPalette(_options.palette);
@ -1931,11 +2084,15 @@ void GUI::readSettings()
Track::setOutlierElimination(_options.outlierEliminate); Track::setOutlierElimination(_options.outlierEliminate);
Track::setPauseSpeed(_options.pauseSpeed); Track::setPauseSpeed(_options.pauseSpeed);
Track::setPauseInterval(_options.pauseInterval); Track::setPauseInterval(_options.pauseInterval);
Track::useReportedSpeed(_options.useReportedSpeed);
_poi->setRadius(_options.poiRadius); _poi->setRadius(_options.poiRadius);
QPixmapCache::setCacheLimit(_options.pixmapCache * 1024); QPixmapCache::setCacheLimit(_options.pixmapCache * 1024);
Downloader::setTimeout(_options.connectionTimeout); Downloader::setTimeout(_options.connectionTimeout);
#ifdef ENABLE_HTTP2
Downloader::enableHTTP2(_options.enableHTTP2);
#endif // ENABLE_HTTP2
settings.endGroup(); settings.endGroup();
} }
@ -1976,3 +2133,39 @@ qreal GUI::movingTime() const
{ {
return (_showTracksAction->isChecked()) ? _movingTime : 0; return (_showTracksAction->isChecked()) ? _movingTime : 0;
} }
void GUI::show()
{
QMainWindow::show();
#ifdef ENABLE_HIDPI
QWindow *w = windowHandle();
connect(w->screen(), SIGNAL(logicalDotsPerInchChanged(qreal)), this,
SLOT(logicalDotsPerInchChanged(qreal)));
connect(w, SIGNAL(screenChanged(QScreen*)), this,
SLOT(screenChanged(QScreen*)));
#endif // ENABLE_HIDPI
}
void GUI::screenChanged(QScreen *screen)
{
#ifdef ENABLE_HIDPI
_mapView->setDevicePixelRatio(_options.hidpiMap ? devicePixelRatioF() : 1.0);
disconnect(SIGNAL(logicalDotsPerInchChanged(qreal)), this,
SLOT(logicalDotsPerInchChanged(qreal)));
connect(screen, SIGNAL(logicalDotsPerInchChanged(qreal)), this,
SLOT(logicalDotsPerInchChanged(qreal)));
#else // ENABLE_HIDPI
Q_UNUSED(screen);
#endif // ENABLE_HIDPI
}
void GUI::logicalDotsPerInchChanged(qreal dpi)
{
Q_UNUSED(dpi)
#ifdef ENABLE_HIDPI
_mapView->setDevicePixelRatio(_options.hidpiMap ? devicePixelRatioF() : 1.0);
#endif // ENBLE_HIDPI
}

View File

@ -7,7 +7,6 @@
#include <QDate> #include <QDate>
#include <QPrinter> #include <QPrinter>
#include "data/graph.h" #include "data/graph.h"
#include "data/poi.h"
#include "units.h" #include "units.h"
#include "timetype.h" #include "timetype.h"
#include "format.h" #include "format.h"
@ -28,6 +27,8 @@ class GraphTab;
class MapView; class MapView;
class Map; class Map;
class MapList; class MapList;
class POI;
class QScreen;
class GUI : public QMainWindow class GUI : public QMainWindow
{ {
@ -35,9 +36,9 @@ class GUI : public QMainWindow
public: public:
GUI(); GUI();
~GUI();
bool openFile(const QString &fileName); bool openFile(const QString &fileName);
void show();
private slots: private slots:
void about(); void about();
@ -48,6 +49,7 @@ private slots:
void openFile(); void openFile();
void closeAll(); void closeAll();
void reloadFile(); void reloadFile();
void statistics();
void openPOIFile(); void openPOIFile();
void closePOIFiles(); void closePOIFiles();
void showGraphs(bool show); void showGraphs(bool show);
@ -83,6 +85,8 @@ private slots:
void setDMS() {setCoordinatesFormat(DMS);} void setDMS() {setCoordinatesFormat(DMS);}
void sliderPositionChanged(qreal pos); void sliderPositionChanged(qreal pos);
void screenChanged(QScreen *screen);
void logicalDotsPerInchChanged(qreal dpi);
private: private:
typedef QPair<QDate, QDate> DateRange; typedef QPair<QDate, QDate> DateRange;
@ -151,6 +155,7 @@ private:
QAction *_openFileAction; QAction *_openFileAction;
QAction *_closeFileAction; QAction *_closeFileAction;
QAction *_reloadFileAction; QAction *_reloadFileAction;
QAction *_statisticsAction;
QAction *_openPOIAction; QAction *_openPOIAction;
QAction *_closePOIAction; QAction *_closePOIAction;
QAction *_showPOIAction; QAction *_showPOIAction;

View File

@ -1,3 +1,4 @@
#include <QLocale>
#include "data/data.h" #include "data/data.h"
#include "heartrategraphitem.h" #include "heartrategraphitem.h"
#include "heartrategraph.h" #include "heartrategraph.h"
@ -7,7 +8,7 @@ HeartRateGraph::HeartRateGraph(QWidget *parent) : GraphTab(parent)
{ {
_showTracks = true; _showTracks = true;
GraphView::setYUnits(tr("1/min")); GraphView::setYUnits(tr("bpm"));
setYLabel(tr("Heart rate")); setYLabel(tr("Heart rate"));
setSliderPrecision(0); setSliderPrecision(0);
@ -16,9 +17,11 @@ HeartRateGraph::HeartRateGraph(QWidget *parent) : GraphTab(parent)
void HeartRateGraph::setInfo() void HeartRateGraph::setInfo()
{ {
if (_showTracks) { if (_showTracks) {
GraphView::addInfo(tr("Average"), QString::number(avg() * yScale(), 'f', QLocale l(QLocale::system());
GraphView::addInfo(tr("Average"), l.toString(avg() * yScale(), 'f',
0) + UNIT_SPACE + yUnits()); 0) + UNIT_SPACE + yUnits());
GraphView::addInfo(tr("Maximum"), QString::number(max() * yScale(), 'f', GraphView::addInfo(tr("Maximum"), l.toString(max() * yScale(), 'f',
0) + UNIT_SPACE + yUnits()); 0) + UNIT_SPACE + yUnits());
} else } else
clearInfo(); clearInfo();

View File

@ -1,6 +1,8 @@
#include <QLocale>
#include "tooltip.h" #include "tooltip.h"
#include "heartrategraphitem.h" #include "heartrategraphitem.h"
HeartRateGraphItem::HeartRateGraphItem(const Graph &graph, GraphType type, HeartRateGraphItem::HeartRateGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent) : GraphItem(graph, type, parent) QGraphicsItem *parent) : GraphItem(graph, type, parent)
{ {
@ -16,11 +18,12 @@ HeartRateGraphItem::HeartRateGraphItem(const Graph &graph, GraphType type,
QString HeartRateGraphItem::toolTip() const QString HeartRateGraphItem::toolTip() const
{ {
ToolTip tt; ToolTip tt;
QLocale l(QLocale::system());
tt.insert(tr("Maximum"), QString::number(max(), 'f', 0) tt.insert(tr("Maximum"), l.toString(max(), 'f', 0)
+ UNIT_SPACE + tr("1/min")); + UNIT_SPACE + tr("bpm"));
tt.insert(tr("Average"), QString::number(avg(), 'f', 0) tt.insert(tr("Average"), l.toString(avg(), 'f', 0)
+ UNIT_SPACE + tr("1/min")); + UNIT_SPACE + tr("bpm"));
return tt.toString(); return tt.toString();
} }

View File

@ -20,10 +20,11 @@
#define FULLSCREEN_ICON ":/icons/view-fullscreen.png" #define FULLSCREEN_ICON ":/icons/view-fullscreen.png"
// Options dialog icons // Options dialog icons
#define APPEARANCE_ICON ":/icons/preferences-desktop-display.png" #define APPEARANCE_ICON ":/icons/format-stroke-color.png"
#define POI_ICON ":/icons/flag_48.png" #define POI_ICON ":/icons/flag_32.png"
#define SYSTEM_ICON ":/icons/system-run.png" #define SYSTEM_ICON ":/icons/preferences-system.png"
#define PRINT_EXPORT_ICON ":/icons/document-print-preview.png" #define PRINT_EXPORT_ICON ":/icons/document-print_32.png"
#define DATA_ICON ":/icons/view-filter.png" #define DATA_ICON ":/icons/view-filter.png"
#define MAPS_ICON ":/icons/applications-internet_32.png"
#endif /* ICONS_H */ #endif /* ICONS_H */

Some files were not shown because too many files have changed in this diff Show More